見出し画像

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とシールドを簡単につなぐためのボードでも作ろうかな。

開発したり研究したりするのに時間と費用がとてもかかるので、頂いたお気持ちはその費用に補填させていただきます。