M5Stack で さくらのIoTを動かす
さくらインターネットのIoTキットって、低価格で魅力的ですよね。今だと、
・IchigoJam
・Raspberry Pi
・Arduino
あたりのボードは用意されているけど、もっと簡単にできないかなぁ・・・ということで、私の好きなM5Stackでやってみました。
まず用意してみる。
共立エレショップか、秋月電子通商で買うのがいいね。手軽だし、品ぞろえがいいから。M5Stackは、SwitchScienceで買うのが王道。
・SakuraIO Arduinoボード
・SakuraIO LTE通信モジュール
・M5Stack(この実験ではFacesを使いました)
開発環境
Arduino IDE を使いますがM5Stackをつかうときは、M5StackやSwitchScienceのページからダウンロードしたほうがすんなりいきます。あと、COMドライバーも一緒にダウンロードしておきましょう。
まずはボードの設定
M5StackとSakuraIOボードとは、I2Cで通信します。なので、通信ボードの説明書をみて、ジャンパーピンを正確に刺しましょう。
説明書より引用。この2つをつないでおけばいいです。あとは、説明書をよく読んでLTEボードをつけましょう。くれぐれも破損しないように注意して。(物理的な破損もさることながら、静電気などにも気を付けて。)
ボードのIOスイッチは3.3vのほうにしておきましょう。
物理的に接続する
では、次のピンを接続していきましょう。
IoTボード - M5Stack - Wire
----------------------------
VIN - 5V - R
3.3V - 3.3V - W
GND - GND - BK
SCL - SCL - G
SDA - SDA - Y
結線は5本でOKです。VINは5Vを供給します。3.3Vでも動くようにみえますが、LTEボードへの供給不足により4Gの接続がものすごく不安定になって、評価ボードのLED点滅(2回)が永遠と続くことになります。
それから、3.3VはSCL/SDAの信号処理につかうので、入れておく必要があります。
この5本を結線しておけば、I2C経由で動くようになります。
ここから難題だった-ライブラリの利用
さくらのIoTは、Arduino Uno で動くようにライブラリが組まれています。で、めんどくさいのはここから。Arduino開発環境でお決まりのイベントがおきます。そう、「同じヘッダ、同じ機能でも、中身が全然違う」イベント発動!
なので、おなじSPIライブラリを参照しているようにみえても、実際には実装がちがってコンパイルエラーがおきて動かない…という。みんなここで挫折します(^^;ってことで、直してみましょう。(実は、先駆者がいて、やっていることは、まさにこの中身。先にしらべておけばよかった!^^;)
まず、Arduinoのライブラリで、SakuraIOを入れましょう。
これを導入して、インクルードします。でも、これだけでは使えません。ここから、書き換えていきましょう。
書き換えるのは SakuraIO_SPI.ccp の中身です。
#include <Arduino.h>
#include <SPI.h>
#include "SakuraIO.h"
#include "SakuraIO/debug.h"
//M5Stack用
#define SPI_HAS_TRANSACTION
#ifdef SPI_HAS_TRANSACTION
static SPISettings settings;
#endif
void SakuraIO_SPI::begin(){
#ifdef SPI_HAS_TRANSACTION
SPI.beginTransaction(settings);
#endif
dbgln("CS=0");
digitalWrite(cs, LOW);
}
void SakuraIO_SPI::end(){
dbgln("CS=1");
digitalWrite(cs, HIGH);
#ifdef SPI_HAS_TRANSACTION
SPI.endTransaction();
#endif
delayMicroseconds(20);
}
void SakuraIO_SPI::sendByte(uint8_t data){
delayMicroseconds(20);
dbg("Send=");
dbgln(data, HEX);
SPI.transfer(data);
}
uint8_t SakuraIO_SPI::receiveByte(bool stop){
return receiveByte();
}
uint8_t SakuraIO_SPI::receiveByte(){
uint8_t ret;
delayMicroseconds(20);
ret = SPI.transfer(0x00);
dbg("Recv=");
dbgln(ret, HEX);
return ret;
}
SakuraIO_SPI::SakuraIO_SPI(int _cs){
cs = _cs;
SPI.begin();
#ifdef SPI_HAS_TRANSACTION
settings = SPISettings(350000, MSBFIRST, SPI_MODE0); // 350kHz, MSB First, SPI mode 0
#endif
pinMode(cs, OUTPUT);
digitalWrite(cs, HIGH);
}
具体的な書き換えポイントは、
① Arduino.h をインクルード。そうしないと LOW\HIGH定義がエラーに。
②SPI_HAS_TRANSACTION定義がないから、定義をする
③#if が「判定式がない」エラーになるから #ifdefに書き換える
って感じです。この修正ができたら、SakuraIOのStandardスケッチを開きましょう。
スケッチのM5Stack対応
このスケッチも、M5Stack用になっていないので、微修正が必要です。書き換えていきましょう。
#include <M5Stack.h>
#include <SakuraIO.h>
まず、M5Stackライブラリがつかえるように、インクルードします。それから、
void setup() {
M5.begin();
Serial.begin(115200);
setup 関数のところに、ハードウェア初期化関数 M5.begin()をいれましょう。シリアル通信は標準で 9600bpsになっていますが 115.2Kbpsでも問題ないです。
void loop() {
counter++;
M5.update();
それからloop関数のところに、ハードウェア更新関数 M5.update()をいれておきましょう。
これで、ソフトウェアの書き換えは完了です。
転送して動かしてみよう
では、M5Stackに転送してうごかしてみましょう。
こんな感じでうごくようになりました!
次は・・・
これで、GPSとか いろんなセンサーをバッテリーモジュール付きで動かすことができるようになりました。シビックテックとかに応用したいなー。ってことで、つぎは、M5Stackとシールドを簡単につなぐためのボードでも作ろうかな。
開発したり研究したりするのに時間と費用がとてもかかるので、頂いたお気持ちはその費用に補填させていただきます。