Processingを使ってArduinoの測定データをグラフ化する

Arduinoでデータを取得したあとにグラフ化とCSV保存したいことってありますよね?

Processingとは?

ArduinoはC言語をベースにした開発環境ですが、ProcessingはJava言語をベースにしたWindowsやMacなどのパソコン向け開発環境です。特徴としてグラフィックや音がかんたんに制御可能です。

以下のページが非常にわかりやすいです!

Arduinoでのデータ測定結果送信

Arduino側はアナログでもデジタルでもなんでもいいので、データを取得してシリアルもしくはBluetoothでデータを送信します。

Wemos?のESP32 OLED Module+GROVEシールド」とかだと簡単にBluetoothでデータを送信できます。BluetoothSerialを使えばBluetooth接続したパソコンからはシリアルポートに見えますので便利です。

パソコンでのデータ測定結果取得

パソコンから該当ArduinoへBluetooth接続することで、シリアルポートが増えます。そのシリアルポートのデータを取得すれば完成です。

どんなデータが送られてくるのかはArduinoのシリアルモニタやシリアルプロッタで確認できます。

Arduinoの問題点

普通のArduinoには時計がついていません。なのでデータ取得時間がわからないのです。リアルタイムのみであれば問題ないですが、あとでそのデータを利用しようとすると不便ですよね?

一応数百円のリアルタイムクロックを利用するとか、Wi-Fi経由でntpサーバーに問い合わせるとか解決方法がありますが、今回は多少誤差はでますが受信した時間をデータの取得時間とします。

Processingの事前準備

  • Processingのセットアップ
  • ControlP5ライブラリの追加

上記2点が必要です。両方とも上にあげた慶応大学の「デザインとプログラミング 2017」の1回目と2回目のスライドで丁寧に説明されています。

Processingのコード

import processing.serial.*;
import controlP5.*;
import java.util.*;

ControlP5 cp5;
Chart myChart;

int sizeW = 640;          // 画面横幅 640以上
int sizeH = 480;          // 画面縦幅 480以上
int samplingCount = 10;   // 未選択時のサンプリング数
int serialSpeed = 115200; // 未選択時の速度
int minValue = 0;         // グラフの最小値

Serial myPort;

int lf = 10;
int miliSec;
PrintWriter fp;
float maxValue;
Slider slider;
ArrayList<Integer> samplingList = new ArrayList<Integer>();

List<String> ls = new ArrayList<String>();
List<String> lc = new ArrayList<String>();

void settings() {
  size(sizeW, sizeH);
}

void setup() {
  int oldSec = second();
  for (int i = 0; i < 3000; i++) {
    // 起動時間からのミリ秒と時刻のミリ秒の差分を探す
    if ( oldSec != second() ) {
      miliSec = millis() % 1000;
      break;
    }
    delay(1);
  }
  cp5 = new ControlP5(this);

  // sampling
  lc.add("10");
  lc.add("20");
  lc.add("30");
  lc.add("40");
  lc.add("50");
  lc.add("100");
  lc.add("500");
  lc.add("1000");
  cp5.addScrollableList("sampling_count")
    .setPosition(sizeW-200, 0)
    .setType(ControlP5.LIST)
    .setSize(200, 200)
    .setBarHeight(20)
    .setItemHeight(20)
    .addItems(lc)
    ;

  // speed
  ls.add("9600");
  ls.add("19200");
  ls.add("38400");
  ls.add("57600");
  ls.add("115200");
  cp5.addScrollableList("serial_speed")
    .setPosition(sizeW-200, 190)
    .setType(ControlP5.LIST)
    .setSize(200, 200)
    .setBarHeight(20)
    .setItemHeight(20)
    .addItems(ls)
    ;

  List l = Arrays.asList(Serial.list());
  cp5.addScrollableList("serial_port")
    .setPosition(sizeW-200, 320)
    .setType(ControlP5.LIST)
    .setSize(200, 200)
    .setBarHeight(20)
    .setItemHeight(20)
    .addItems(l)
    ;

  String fileName = createFileName();
  fp = createWriter(fileName);

  myChart = cp5.addChart("")
    .setPosition(0, 00)
    .setSize(sizeW-250, sizeH)
    .setRange(0, 1)
    .setView(Chart.LINE);

  myChart.getColor().setBackground(color(255, 100));

  myChart.addDataSet("val");
  myChart.setColors("val", color(255, 255, 255), color(255, 0, 0));
  myChart.setData("val", new float[1000]);

  myChart.addDataSet("avg");
  myChart.setColors("avg", color(0, 255, 0), color(255, 0, 0));
  myChart.setData("avg", new float[1000]);

  myChart.addDataSet("min");
  myChart.setColors("min", color(0, 0, 255), color(255, 0, 0));
  myChart.setData("min", new float[1000]);

  myChart.setStrokeWeight(1.5);

  slider = cp5.addSlider("Value", 0, 1, 50, sizeW-250, 0, 10, sizeH);
}

float peek = 0;
float lastpeek = 0;
int mode = 0;
int lastvalue = 0;

void draw() {
  // 画面クリア
  background(0);

  // 何かデータを受信したら
  if ( myPort != null && myPort.available() > 0) {
    String data = myPort.readStringUntil(lf); // 文字列を受信
    if ( data != null ) {
      float value = float(trim(data));
      String timeStr = year()+"/"+month()+"/"+day()+" "+hour()+":"+minute()+":"+second()+".";
      int milisec = (millis()-miliSec)%1000;
      if ( milisec < 10 ) {
        timeStr = timeStr + "00";
      } else if ( milisec < 100 ) {
        timeStr = timeStr + "0";
      }
      timeStr = timeStr + milisec;

      fp.print( timeStr+",");
      fp.println(int(trim(data)));
      fp.flush();

      // 最大値更新
      if ( maxValue < value ) {
        maxValue = value;
        myChart.setRange(minValue, maxValue);
        slider.setRange(minValue, maxValue);
      }

      // 測定値追加
      samplingList.add((int)value);
      myChart.push("val", value);

      // 規定サンプル数以上の場合先頭削除
      if ( samplingCount < samplingList.size() ) {
        samplingList.remove(0);
      }

      // 移動平均計算
      int sum = 0;
      for ( int i = 0; i < samplingList.size(); i++ ) {
        sum += samplingList.get(i);
      }
      myChart.push("avg", sum / samplingList.size());
      slider.setValue(int(value));

      if ( lastvalue + 2 < ( sum / samplingList.size() ) ) {
        if ( mode == 1 ) {
          int j = myChart.getDataSet( "min" ).size() - 3;
          while ( 0 <= j && myChart.getDataSet("min").get( j ).getValue() == -1 ) {
            // 最後の値を探す
            j--;
          }
          println(j);
          if ( 0 <= j ) {
            lastpeek = peek;
            peek = sum / samplingList.size();
            j += 1;
            int jstart = j;
            println(j);
            for (; j < myChart.getDataSet( "min" ).size(); j++ ) {
              myChart.getDataSet("min").get( j ).setValue( lastpeek + ( ( peek - lastpeek)  / ( 1000 - jstart ) ) * ( j - jstart ) );
            }
          }

          mode = 0;
          myChart.push("min", peek );
        } else {
          myChart.push("min", -1 );
        }
      } else {
        myChart.push("min", -1 );
        if( ( sum / samplingList.size() ) + 20 < lastvalue ){
          mode = 1;
        }
      }
      
      lastvalue = sum / samplingList.size();
    }
  }
}

void serial_port(int n) {
  println(Serial.list()[n]);
  if ( myPort != null ) {
    myPort.stop();
  }
  myPort = new Serial(this, Serial.list()[n], serialSpeed);
}

void serial_speed(int n) {
  serialSpeed = Integer.parseInt( ls.get(n) );
}

void sampling_count(int n) {
  samplingCount = Integer.parseInt( lc.get(n) );
  samplingList.clear();
}

String createFileName() {
  String fileName= nf(year(), 2) + nf(month(), 2) + nf(day(), 2) +"-"+ nf(hour(), 2) + nf(minute(), 2) + nf(second(), 2);
  fileName += ".csv";
  return fileName;
}

いきなりですが、出来上がったコードです。

Processingはマイクロ秒が取得できないので、起動経過時間のマイクロ秒から無理やり計算しているロジックが最初にあります。

あとは移動平均とかも計算していますが、受信したデータをリストに追加して描画しているだけです。ついでにプロジェクトのフォルダに受信したデータをCSVで出力しています。

Processingを利用するとWindowsやMacの両方で動くプログラムを簡単に作ることができます。

ハンダゴテの選び方

ROVEシールド付きのESP32ボードを3枚購入したことで、200ヶ所以上のはんだ付けが必要になったので、ハンダゴテを新調しました。

はんだごての種類と選び方を調べましたので共有したいと思います。

電熱線ヒーター

いままで使っていたのがこの方式です。普通のハンダゴテに、便利な小物がついたセットでした。普通に使っている分には問題がないのですが、大量にはんだ付けをしたり、細かいものをはんだ付けするのには不便でした。

最近はダイソーでも安いものがあるので、ちょっとしたことに使うのはこの手のものでもいいと思います。ただし、非常にスキルに左右されますのではんだ付けに慣れていない人は、もう少し高いやつを購入したほうがいいと思います。

セラミックヒーター

ヒーターが電熱線から、セラミックになっているハンダゴテです。普通のヒーターに比べてすぐに温かくなります。連続して使っていても温度が落ちにくいので使いやすいです。

温度調整なしの安いタイプもありますが、あまりメリットがないかな?

安物セラミックヒーター

私が購入したのがこのタイプ。ヒーターはセラミックなのですが、温度調整が適当です。

高いハンダゴテは、指定温度になったら加熱を止めるフィードバックがあるのですが、この手の安いモデルは温度表示ですが内部的にはワット数を変えています。

低温度に設定すると最初の加熱も遅くなりますので、最初はそこそこ高温にしてから、使いたい温度に下げるのがいいと思います。本当にその温度になるのかわからないのと、温度の目安が不明なので私は半分ぐらいのメモリに合わせてつかっていました。

ステーション型

頻繁に利用する場合にはステーション型が便利なようです。高いものだと設定温度と、小手先の実際の温度が表示されていたりかなり便利です。

反面一般家庭にはちょっと大げさかな?

セット

ハンダゴテ以外にもいろいろセットにした製品も最近はあります。最初に一つ揃えるのであれば便利なセットだと思います。

まとめ

ちょっと使うのであれば安いやつでもそんなに問題はでないとは思います。ただし高いものは使いやすいですので、きれいなはんだ付けができます。

見た目と性能にも影響してくるので、予算に余裕があるのであれば国産の太洋電機産業(goot)か白光(HAKKO)あたりの製品を購入しておくのが無難だと思います。

Wemos?のESP32 OLED Module+GROVEシールド

GROVEシールド付きのESP32ボードがあったので、購入してみました。このボードは日本だと取り扱いがないのかな?

そして本当にWemosの商品なのかが怪しいです。。。

テストコード実行中

ボードの特徴

ESP-WROOM-32を使っていますので、技適マークもしっかりついて、使いやすいボードです。I2C経由でのOLEDが実装してあるのでちょっとした表示に使えて便利です。

GROVEシールド

GROVEシールド側

裏側はGROVEシールドになっており、アナログが使えるESP32って他ではあまりなかった気がします。

GROVEシールドの横には3Vと5Vを切り替えるスイッチがありますので、通常は3Vに設定して使ったほうがよいと思います。

購入元

国内だと扱っている店がなかったのでBanggoodで1つ千円強で購入しました。2018-07-01注文で2018-07-21到着となりました。海外からだと3週間ぐらいはかかっちゃいますね。

あとはAliexpressでも何個か取扱がありましたが、ちょうどセールをしていたのでBanggoodの方が安かったです。

事前準備

このボードはピンヘッダーがはんだ付けされていませんので、自分でつける必要があります。

表面26ヶ所に、裏面が二列分で52ヶ所、全部で78ヶ所もあります。特に裏側の二列部分はかなり狭いので、細い小手先がないと苦戦します。

GROVEシールドの配線

配線図
IOPrintDefineADCGroveNote
00A11/T1ADC2_CH1D3ADC2
1TXTX D10/TX 
22A12/T2ADC2_CH2D4ADC2
3RXRX D9/RX 
44A10/T0ADC2_CH0D2/SCLADC2
55SS D1/SDA 
6CL   利用不可
7S0   利用不可
8S1   利用不可
11CM   利用不可
1212A15/T5ADC2_CH5D6ADC2
1313A14/T4ADC2_CH4D7ADC2
1414A16/T6ADC2_CH6D5ADC2
1515A13/T3ADC2_CH3D8ADC2
1616    
2525A18/DAC1ADC2_CH8 ADC2
2626A19/DAC2ADC2_CH9 ADC2
36SVPA0ADC1_CH0 入力専用
39SVNA3ADC1_CH3 入力専用

注意点としてはBluetoothとかを利用する場合ADC2が利用できなくなります。なのでアナログは入力だけで出力ができません。

開発方法

Arduinoで「WEMOS LoLin32」を選択することで開発可能です。Windows環境の場合転送速度を115200に下げるか、BOOTボタンを押さないと書き込みできませんでした。

サンプルプログラム

#include <SSD1306.h>
#include <OLEDDisplay.h>
#include <BluetoothSerial.h>

SSD1306 display(0x3c, 5, 4);
BluetoothSerial SerialBT;
uint64_t chipid;
char chipname[256];

// 実行間隔(ms)
int intervalTime = 100;

void setup() {
  // チップID取得
  chipid = ESP.getEfuseMac();
  sprintf( chipname, "ESP32_%04X", (uint16_t)(chipid >> 32));

  display.init();
  display.resetDisplay();
  display.displayOn();
  display.clear();
  display.setFont(ArialMT_Plain_16);

  SerialBT.begin(chipname);
}

void loop() {
  // データ取得と送信
  int val = analogRead(A0);
  char str[256];
  SerialBT.println(val);

  // 画面描画
  display.clear();
  display.drawString(0, 0, chipname);
  sprintf( str, "A0:%d", val );
  display.drawString(0, 24, str);
  display.drawString(0, 48, "Ver:2018/10/22");
  display.display();

  delay(intervalTime);
}

上記のプログラムで100ms間隔でA0から取得したデータをBluetoothで送信することができます。

chipidを取得して、Bluetooth待受名に追加していますので複数台動かしてもIDがかぶることはないはずです。

これはWemosの製品なのか?

ボードにはWemosと書いてありますが、WemosはOLED付きの製品はないと言っていますので、Wemosの製品ではない可能性が高いです。

総括

ちょっと出生が怪しいボードですが、GROVEのアナログセンサーなどを利用して、Bluetoothで送信したい場合にはかなり使いやすいボードではないでしょうか?

OLEDに出力値やプログラムのバージョンなどを表示することができるので、ちゃんと動いているかの確認もしやすいです。

ただしピンヘッダーのはんだ付けはかなり面倒ですし、国内で手に入りにくいって点はマイナスです。

ESP-WROOM-32(ESP32)入門

ESP-WROOM-32を購入して、試してみました。

ESP-WROOM-32とは?

Espressif Systems社の製品で、ベースとなるESP32にフラッシュメモリやアンテナなどを追加した製品です。

ESP32とESP-WROOM-32との違い

海外のサイトなどではESP-WROOM-32ではなく、ESP32などで検索したほうがヒットしやすいですが、製品としては別物です。

ESP32はWi-FiとBluetoothが利用可能なチップで、それにフラッシュメモリとアンテナなどを追加したモジュールです。ESP32を利用していても、ワンチップ化していないものや、ESP-WROOM-32とは違うパッケージになっているものがあります。

注意事項

日本の法律上電波を利用する場合には、技適を取得している必要があります。ESP-WROOM-32は技適を取得していますが、ESP-WROOM-32以外のESP32パッケージは技適を取得していないものが多いので注意しましょう。

商品の写真をみて、技適マークがあることを確認してから購入するのが無難だと思います。

購入品

Amazonで一番安かった製品を購入してみました。中国発送のため2週間ぐらい到着まで時間がかかります。すぐにほしい場合には他のを選んだほうがよいと思います。

上記がプライム対応です。今はあまり値段が変わらないので、プライムで購入したほうがいいかもしれません。個人的には一番右側のOLED画面付きが好きなのですが、画面無しのプレーンなESP32ボードも一枚持っていてもいいとは思います。

外見

ピンヘッダーははんだ付けされた状態で、特別汚いわけでもきれいなわけでもなかったです。ESP-WROOM-32に擦り傷が最初から入っていたりと、全体的にはあまりきれいな状態ではありません。

プログラムの書き込み

Arduino IDEを利用して、「DOIT ESP32 DEVKIT V1」で書き込みができました。ただし手元のWindows環境だと、自動書き込みができなかったのでbootボタンを押してからの、手動書き込みでテストしました。

#include "BluetoothSerial.h"

BluetoothSerial SerialBT;

void setup() {
    SerialBT.begin("ESP32");
}

void loop() {
    SerialBT.println(analogRead(32));
    delay(100);
}

上記のプログラムでBluetooth Serialを使ってWindows上でIO32のアナログ入力を取得することができました。

最初IO25で試したところBluetoothを使うとanalogReadが正常な値を返しませんでした。DEKOのアヤシいお部屋。- ESP-WROOM-32 が一番詳しい日本語ページと思いますが、Wi-fi利用時にはA4 (IO32) ~ A7 (IO35)とあったのでIO32に変更したところ、正常に取得できました。

obniz入門

obnizはArduinoとはちょっと違った考え方の基板ですので紹介したいと思います。

obnizとは?

メインチップにESP-WROOM-32を利用したプリスクサイズの小型基板です。小さな画面と、左右と押し込むことで決定ができる入力ボタンが左上についています。

この基板はWi-fiでインターネットに接続することが基本であり、接続すると上記画面のように機材のIDが画面に表示されます。そのIDを使いインターネット経由でアクセスすることができます。

プログラムの方法

ブラウザ上で利用できるオンラインエディタがあり、その画面を利用してJavaScriptでプログラムの作成と実行をします。

すでにサンプルとして様々なプログラムが公開されているので、自分の機材のIDを入力するだけですぐにプログラムの実行が可能です。プログラムはインターネット経由でobnizに転送され実行されます。

他の基板との差

メインチップはESP-WROOM-32ですので、他のESP-WROOM-32搭載基板とはハードウエアスペック的にはそんなに変わりません。

画面がついていることと、側面にかんたんにアクセス可能な12ピンのIOポートがあるぐらいです。IOポートはIO0が5V、IO1がGND、IO2がアナログ入力などと自由に設定が可能です。

ハードウエア的な差よりは、プログラム環境などがインターネット上に公開されており、他の人の作ったプログラムを気軽に実行できることがかなり便利です。

Arduinoなどはちょっと難しそうだなって人でも、拒否感なく利用することができると思います。

Nefry入門

フリスクサイズの基板である、Nefryを購入してみました。現在はより新しいNefry BTが販売されています。たぶんNefryはもう製造されておらず、今後はNefry BTのみの販売だと思います。

Nefryとは?

USBに接続するだけで利用することができる基板であり、Wi-fiを搭載しています。Bluetoothは搭載していませんが、Nefry BTはBluetoothが利用できます。

Groveシステムに対応していますので、Groveモジュールをケーブルで接続するだけで利用することができます。

ケース

ケースも付属していますが、自分で組み立てる必要があります。また中密度繊維板(MDF)をレーザーカットしたもののため、断面が炭で黒くなっています。組み立てる際に手がまっくろになるので注意しましょう。

メインチップ

NefryはESP8266(ESP-WROOM-02)を、Nefry BTはESP32(ESP-WROOM-32)を利用しています。両方とも技適取得済みなので、日本で安心して利用することができます。

開発環境

Arduino IDEを利用して開発することができます。NefryはUSB経由でプログラムを書き込むことができないのでちょっと面倒ですが、Nefry BTは普通のArduinoのように、USB経由で利用することができます。

他のESP環境との違い

ここまでの内容であれば、ESP32にGroveコネクタがついているだけなのですが、Nefryではwi-fi経由で管理画面にアクセスすることができます。

Nefry BTのWi-Fiセットアップ

上記のページがわかりやすいですが、Nefryに直接Wi-fi接続することによってブラウザ上で管理画面が開けます。

この機能は自分で実装することも可能ですが、最初から使えるのが便利ですね。

管理画面の機能

この管理画面がNefryの最大の特徴だと思います。以下のことが管理画面からできます。

5つまでのWi-fi接続ポイントの設定

通常のArduinoだとプログラム内部にWi-fi設定を書き込む必要があります。その端末を他の場所に持っていく場合、持っていく先に応じたプログラムに書き換える必要があります。

Nefryの場合には予め5つまで設定できるのと、その場で接続先だけ変更することができるので、プログラムは共通で利用することができます。

環境変数を文字列10個、数値10個の設定

こちらもWi-fi設定と同じく、APIの連携先やメールアドレスなどの設定をプログラムに書き込むのではなく、管理画面から簡単に変更することができます。

プログラムの更新

プログラム自体も管理画面からアップロードすることができますので、メールでプログラムを送って、現場の人が特別な機材を必要なく、プログラムの更新をすることが可能です。

コンソール表示

動作状況やデバッグなどで利用するコンソールを管理画面から確認することができます。通常のArduinoの場合USB接続をしている環境以外では確認することができないので、非常に便利な機能です。

Groveシステム対応

Groveコネクタに対応しているため、そのままGroveモジュールを接続することができます。

ただしアナログのGroveモジュールはArduino UNO以外では正しく読み取れないモジュールばかりなので注意してください。

Groveのアナログの項目を参考にしてください

Seeed社入門

電子工作をしていると利用することがあるかもしれないSeeed社の入門です。

Seeed社とは?

Seeed社は昔はSeeed Studioという名前であったが、現在はSeeedになっているらしい。ただし通販サイトのURLなどにSeeed Studioだった時代の名残が残っています。

もともと少ロットでのプリント基板製造で有名な会社でして、趣味で作った基板や、サンプル品などを時間はかかりますが、非常に安く作ってくれるサービスを提供しています。

今はプリント基板以外にも、電子工作で利用する道具や機材などの販売の他、Groveと呼ばれる統一コネクタを利用したアクセサリの販売も行っています。

本社ホームページ(英語)
通販サイト「Seeed’s Bazaar」(英語)
日本法人ホームページ
プリント基板「FUSION」

プリント基板関連

電子工作を行う場合、最初に試行錯誤しながら回路を作っていきますのでブレッドボードと呼ばれるものを利用します。

ブレッドボードは穴がたくさん空いており、縦の方向は穴の下でつながっています。このボードを利用して部品やケーブルを穴に刺して実際に動かしてみて電子回路を完成させていきます。

回路が完成したあと、ブレッドボードのままだと部品が取れてしまいますので、ハンダで固定する必要があります。そのときによく利用するのがユニバーサル基板と呼ばれるもので、穴だけ空いている板で、ハンダを利用して固定していきます。

ユニバーサル基板は安くで使いやすいのですが、見映えが悪いのと、配線が結構大変です。そこでプリント基板と呼ばれるものを利用します。

金属を表面にコーティングした板に、回路の印刷を行います。その後に酸性の液体に漬け込むことで、不要な部分の金属を溶かし、印刷をした回路の部分だけ金属が残ったものに、必要な穴を開けたものがプリント基板と呼ばれるものです。

自分で作ることも可能ですが、薬剤の処理などが大変だったり、日本の業者に頼んだ場合でも穴の数に応じて金額が変わるなど手が出にくいものでした。今は世界中から注文をとってきて、1枚の大きな基板に複数の注文をまとめて製造し、あとで切り分けるという方法で劇的に安くなっています。

Groveシステム関連

GroveとはSeeed社が製造販売しているコネクタの規格です。共通のコネクタを利用して、ケーブルでつなげるだけで利用できるというコンセプトなのですが、利用には注意が必要です。

モジュールの対応電圧と、どのコネクタに差し込んで、どのプラットフォームで動くのかが、英語のWikiページをよく見ないとわかりにくいことです。

対応電圧

5V

一般的な電圧で、ほぼすべてのGroveモジュールで利用できます。

3.3V

小型基板などに利用されている電圧です。大体のセンサーなどに対応していますが、たまに5V専用のものがありますので注意が必要です。


Grove – Alcohol Sensor(5V専用)

対応コネクタ

Groveには利用するモジュールに応じたコネクタがあり、使い分ける必要があります。

アナログ

コネクタはA0などAからはじまり、複数ある場合には数字がカウントアップしていきます。5V基板の場合には0Vから5Vまでの電圧を計測する入力と、電圧を出力することができます。

出力の場合には、0Vか5Vの2段階で出力をするのですが、PWMと呼ばれる制御で、5Vの出力時間を変更し、LEDの光を強くしたり弱くしたりなどの制御ができます。ただしPWMはすべてのアナログピンで利用できるわけではなく、特定のピンのみの場合があります。

アナログで注意しないといけないのがプラットフォーム別サポートです。基本的にArduinoはサポートされているはずですが、ほぼ同じ環境であるLinkIt ONEで動くかは確認したほうがいいです。Arduino以外の環境はアナログ入力の感度があまり良くなく、出力の低いセンサーの数値を取得することができません。LinkIt ONEなど他の環境で利用できないアナログセンサーは、上記の表にない基板でも利用できない可能性が高いです。

デジタル

デジタルはボタンなどのON/OFFでの入力と、5V基板の場合には0Vから5Vまでの電圧を出力できます。

UART

UARTは高速通信をするための端子です。Wi-fiなどの無線モジュールなどで利用されています。

I2C

I2Cは通信速度は遅いですが、複数のモジュールと通信をすることができます。ディスプレイなどに利用されていることが多いです。モジュールごとにアドレスを設定し、アドレスに対して通信を行う仕組み上、同じモジュールを複数利用する場合には、個別にアドレスが重複しないように設定をする必要があります。

SPI

一番はやい通信方式ですが、Groveでは利用することができません。Groveは4ピンコネクタを採用していますが、SPIには4ピン以上が必要なためです。

Seeed社独自製品関連

Seeed社オリジナルの製品を作っており、有名なものだけ簡単に紹介します。

各種シールド

ArduinoやRaspberry Piなど各種基板に対応した、シールドと呼ばれるものを販売しています。シールドは簡単に機能拡張するためのボードのことであり、Seeedでは主にGroveコネクタを拡張するためのシールドを販売しています。

Arduinoの場合にはピンをコネクタに接続しているだけであり、Groveコネクタを利用しなくても、自分で配線することでGroveのモジュールを利用することができます。

Raspberry Piの場合にはアナログを利用することができないので、Groveシールド上で変換することでアナログモジュールが利用できるようになっています。

Wio Node

非常に小さい基板で、2つのGroveコネクタがあります。左右で利用できるモジュールが違うので注意してください。

Wio Nodeの特徴として、Wi-fiを利用して、インターネットに常時接続していることです。そして専用アプリのWio Linkを利用して設定することで、インターネット経由でセンサーの値を読み取ったり、ディスプレイなどに表示をしたりすることができます。

簡単にインターネット連携ができるようになりますが、インターネット経由でWio Nodeに対してAPI通信をする必要がありますので、どちらかというとプログラムを動かすことができるサーバーなどを持っている人向けの商品となります。

Wio LTE JP Version

SIMカードを使うことでLTE通信ができる基板です。国によってLTEの通信方式が違うので、4種類販売されています。日本で利用する場合には日本バージョンを購入しましょう。

Wio NodeはWi-fi環境が必要でしたが、Wio LTEはそのままインターネット接続することができます。環境的にもArduino IDEで開発することができますので細かい処理まで基板上で実行することも可能です。

Arduino入門

Arduinoについて、どんなもので、どんなことができるのかを記述します。

Arduinoとは?

Arduino(アルデュイー)とはCPUの他に入出力ポートや最低限必要な部品を実装したワンボードマイコンと、その統合開発環境を含めたシステムのことです。

このようなワンボードマイコンは昔から様々な種類があり、評価用や開発用の他に、教育用として存在していました。古くはNECのTK-80などが有名です。

Arduinoの特徴としては、類似ボードよりも安価に製造できるように設計されていることと、設計図が公開されており、他社が自由に同じようなものを製造できるという点である。ただしArduinoという名前に関しては正式ライセンスを受けたもの以外は利用することはできず、互換機は様々な名前で販売をされています。

ハードウエアとしてのArduino

Arduinoには複数の基板が存在しており、日本では購入できないものも、海外では多数販売されています。

一番標準的な基板は「Arduino Uno」で、大きさが8cm×6cm程度となり、一般的なトランプよりは小さいサイズです。この他に小型の「Arduino Nano」や、洋服や帽子などに縫い付けて使う「LilyPad Arduino 328」など、様々な種類があります。

この他互換品としては、純正品とまったく同じ動きをする物の他に、独自の拡張をしたものが多数販売されています。

ソフトウエアとしてのArduino

Arduinoのプログラミングは「Arduino IDE」というアプリケーションが無償で公開されており、このソフトを使って開発を行います。

インストールした直後は純正品のArduino基板しか開発をすることができませんが、開発対象の基板を簡単に追加することができます。このことから、いろいろな会社が互換ボードを販売して気軽に利用できる環境になっています。

どんなことができるのか?

Arduinoはセンサーなどからの入力と、モーターやLEDなどへの出力を行うことができます。ざっくりとですがあとで紹介するボードのチュートリアルで扱っている内容を列挙します。この他にもインターネットを利用した通信なども可能ですが、注意事項をあとでまとめております。

  • LED点灯制御
  • ボタン、ジョイスティックなどの入力
  • サウンド出力
  • ブザーを鳴らす
  • モーターを回す
  • 距離を測る
  • 温度、湿度を測る
  • 明るさを測る
  • 赤外線リモコンの受信
  • LED画面などへの表示
  • リレーの制御

おすすめのArduino基板

こちらは純正品ではありませんが、「Arduino Uno」の完全互換機と、英語、フランス語、ドイツ語、スペイン語、イタリア語でのチュートリアル、必要な部品がキットになっています。

純正品を購入するより安く、細かい部品も付属していますので最初の一台としてこちらの基板をおすすめします。

また、IoTとしてもっと小型のArduinoを最終的に利用したい場合でも、標準基板である「Arduino Uno」は一枚持っていたほうがよく、うまく動かなかった場合などの問題の切り分けとして複数の基板で検証することが可能です。

電波を利用した通信についての注意事項

純正品の「Arduino Uno」はWi-fiやBluetoothを利用した通信機能が搭載されていません。互換機では通信の機能を追加したものなどが販売されていますが、日本国内で利用すると法律違反となってしまうボードもありますので、注意して購入してください。

上記の基板は非常に安いですが、日本国内で電波を飛ばすための「技適」と呼ばれる技術基準適合の認証を受けていない商品となります。

「技適」の認証を取るためには数百万円の費用がかかるため、海外で販売されている商品に関しては取得していないことが多々あり、取得している商品であるかを確認して購入する必要があります。

上記製品などは技適取得済みとなります。ただし、「Arduino Uno」とは若干機能が違いますのでご注意ください。

IoT時代の電子工作入門

IoTなどで利用できる電子工作を簡単に解説します。

電子工作の種類

電子部品の組み合わせ

抵抗やLEDなどの電子部品を組み合わせて作ります。一般的な電子工作といえば、こちらを想像しますが、近年は作る人が減ってきているようです。東急ハンズなどでも店舗によりますが、LEDを光らせるキットぐらいの取扱になっています。

統合環境とその拡張

複雑な動作をさせる場合は電子部品を組み立てるより、プログラミングが可能な基板などを利用し、その基板にセンサーはLED、モーターなどを追加して制御することできます。

代表的な統合環境の種類

PIC

ICにCPUやメモリ、I/Oチップなどが収められており、小さなコンピュータになっています。少し前の主流であり、非常に安価ですが動かすための環境を構築する必要があり、現在はもう少し簡単に使うことができる基板が普及してきたため、出番は減ってきています。

数百円程度から購入することができますので、比較的小規模な機能を実現するときに利用します。

プログラムはパソコンで作成し、PICライターという装置を使って転送します。転送前後で基板とPICライターで挿し替える必要があります。これはPICを動かす環境には最低限の回路だけ実装されており、開発が完了したあとには必要ないPICライターの機能は含まれていないためです。

Arduino

ArduinoはPICに最低限必要な部品を組み合わせたような基板です。USB端子でパソコンに繋げることで簡単にプログラムを実行させることができ、外部のセンサーなどへの接続端子も簡単に利用できます。

Arduinoはハードウエアの情報がすべて公開されており、同じものを作ることができます。また、より安いパーツに変更したものや、通信機能を追加したもの、小さい形にしたものなど、様々な商品が販売されているのも特徴です。

純正品が3000円強、互換品が1000円以下で購入することができます。複雑な計算や、大量のデータを処理することはできませんが、単純な制御であれば比較的かんたんに実現することができます。

プログラムはパソコンで作成し、USB経由でそのまま転送して動かすことができます。プログラムや周辺回路が完成した場合に、そのプログラムでは利用しない部品などを取り除いたArduino互換機を使うことなどで、より安いシステムにすることも可能です。

Raspberry Pi

Raspberry Piは上記の環境とは違い、小さなパソコンです。WindowsやLinuxなどのOSが動いており、その上でプログラムを実行します。ArduinoはC++風のArduino言語でプログラムを書く必要がありますが、Raspberry PiはOSでサポートされているプログラム言語であれば自由に選択して利用することができます。

本体が5000円以上し、SDカードや電源などの必要なものを揃えるとそれなりの値段がかかってしまいます。相当複雑な制御も可能ですが、LinuxなどのOSの知識も必要になってきてしまいます。

小さなパソコンなので、キーボードとディスプレイを繋げてRaspberry Pi自体でプログラムを作って動かすことができます。

その2 品詞のきほん

品詞とは単語の種類である。言語により文法用語や分類が違うため、代表的なもののみ書きたいと思います。

名詞

名詞とは、物や人の名前です。さらに細かく分類されており、英語の場合には以下の分類になります。

普通名詞:猫や棚、山などの、およそ一般的に何と呼ばれているかを表す名詞
集合名詞:クラスや日本人、家族など集合体を表す名詞
固有名詞:富士山など山の中で区別するときに使う名詞
物質名詞:水や金などの素材を表す名詞
抽象名詞:野球や平和など無形のものの概念を表す名詞

日本語の場合、普通名詞と固有名詞の分類だと思いますが、英語では扱いが異なるため、より細かく分類されています。このように日本語の感覚と違う場所が、外国語学習では重要になると思います。

代名詞

代名詞は名詞の中の分類の場合と、独立した品詞の場合がありますが、分類上の違いだけであり本質は同じです。人に対して使う人称代名詞と、人以外の物事や場所、方向を表す指示代名詞があります。

人称代名詞には、話し手、書き手からの関係性により人称と呼ばれるものがあります。

自称(第一人称):話し手、書き手を表し、私などを利用する
対称(第二人称):話し手、書き手の相手を表し、あなたなどを利用する
他称(第三人称):その場に居ない人を表し、あいつや彼、固有名詞などを利用する
不定称:不特定の人を表し、誰などを利用し、疑問で使われることが多い

また、対象との距離により「こそあど」と呼ばれる分類があります。

近称:話し手に近い場合で、この人やこれなどを利用する
中称:聞き手に近い場合で、その人やそれなどを利用する
遠称:どちらからも遠い場合で、あの人やあれなどを利用する
不定称:対象がわからない場合で、どの人やどれなどを利用する

分類上は上記だが、手に届く距離であればこれ、同じ室内などもう少し遠いとそれ、それ以上遠いとあれと、聞き手の場所は関係なく、話し手からの距離で使い分けている人も多いと思います。英語の場合には中称と遠称の区別がなく、話してからの距離に応じて使い分けています。

動詞

動作を表す品詞で、ウ段の音で終わります。歩く、歌うなどです。名詞にうをつけることで、動詞を作ることもあり、グーグルで検索することをググるとなります。

形容詞

名詞を説明する品詞で、いで終わります。赤いや大きいなどです。

副詞

動詞や形容詞を説明する品詞で、さらに状態や程度、陳述の分類があります。

状態の副詞:主に動詞がどのような状態、様子であるかを説明し、「ゆっくり」歩く、「すぐ」食べるなど
程度の副詞:状態や性質の程度を説明し、「とても」やさしい、「かなり」大きいなど
陳述の副詞:受ける言葉に特別な言い方を要求する副詞で、「すこしも」悪いと思わ”ない”など

これ以外にも何個かの品詞がありますが、言語により分類が違うため、ここまでとします。