M5Stack で始める IoT 開発入門|研修コースに参加してみた

今回参加したコースは M5Stack で始める IoT 開発 です。
前回は IoT の特にマイコンボードとセンサを中心をどのように組み合わせて、 IoT デバイスをつくるのか、その知識を解説いただきました。
今回は実践ということで、マイコンボードを使って、基本の L チカ( LED の点滅)に始まり、センサーデータの取得、クラウドへのアップロードと可視化まで、前回学んだ知識をもとに開発します。
なお、コロナ禍でなければ、実地で操作できたのですが、オンライン開催のため、デモを視聴する形式となりました。 残念。
では、どのような内容だったのか、レポートします!
もくじ
コース情報
想定している受講者 | マイコンボードの基礎知識 |
---|---|
受講目標 |
|
講師紹介
講師は前回のコースに続き、 植田崇靖 さんが登壇されました。

「電子回路から機械学習まで、学ぶことが楽しい!」
M5Stack とは
このコースでは前回 Arduino の互換機として紹介された M5Stack というマイコンボードを使います。


まず M5Stack の仕様と機能や特徴を紹介いただきました。
- ESP32 というマイコンを搭載したマイコンボード
- 320 × 240 の TFT カラーディスプレイ
- 各種 I/O
- GPIO ピン
- USB 端子
- microSD カードスロット
- スピーカー
- Wi-Fi / Bluetooth まで使用可能
マイコンボードというより完成したデバイスという感じで、いたれりつくせりですね。
これらの機能により、センサーでとったデータを受け取り、変換処理をして、 Wi-Fi や Bluetooth でクラウドなどにアップロードするといったことがやりやすくなっています。
さらに、 M5Stack 専用に、人感センサーや GPS 、指紋認証など、さまざまなセンサ部品があり、エコシステムが充実し、使いやすいのも特徴です。
ちなみに M5Stack はシリーズになっていて、大きいものや小さいもの、カメラ搭載のもの、 e インクディスプレイ搭載のものなどもあります。
M5Stack 開発環境
M5Stack の開発環境は、 ArduinoIDE と UIFlow の 2 種類があります。
- ArduinoIDE
- 開発言語:C / C++ に Arduino 用の命令を追加
- 長所
- 歴史が長く、様々な機能が簡単に利用できるライブラリが豊富
- 短所
- 利用するためには事前にライブラリのインストールなどの準備が必要
- C 言語自体が初心者には若干難しい
- 開発言語:C / C++ に Arduino 用の命令を追加
- UIFlow
- 開発言語: Blocky / Python
- 長所
- Blockly : Scratch と同じブロックで直感的にプログラムが組める GUI プログラミング環境
- Python : Blockly で作成したプログラムを簡単に修正できる
- 短所
- Blockly と Python の連携は片方のみ( Blockly → Python のみ)
- Arduino のライブラリが今のところ、利用できない
- 開発言語: Blocky / Python
UIFlow で開発
では、最初に UIFlow で開発してみましょう。
UIFlow は公式サイトからダウンロードしてインストールします。
M5stack を PC に USB 接続すると、 UIFlow から自動で認識されます。
UIFlow の画面を見てみましょう。

Blocky でテキストを表示
まず簡単な例を試します。
- UIFlow の左側にある LCD パネル表示に、タイトルやラベルをドラッグ&ドロップ
- RUN ボタンを押す
UIFlow 上の LCD パネル表示と同じ内容が、 M5stack の実機に表示されます。

表示するだけならプログラムなしで出来るのは GUI プログラミングならではですね。
Blocky のループ処理
続いて、 Blocky でプログラミングをしてみます。
- Blocky は、 Scratch と同じく画面上で ブロック を並べてプログラミングする
- 基本文法は [UIFlowの公式ドキュメント](https://m5stack.github.io/UIFlow_doc/ja/) にある
まずは LCD パネルの背景色を、ループを使って赤と緑に交互に変えてみます。

これで実行すると、 M5Stack の背景色が 1 秒ごとに変わります。

Scratch のように簡単ですね。
Blocky でボタン処理
今度はボタンを押すと、設定した色に画面が変わるようにプログラミングします。

これで実行して、ボタンを押すと画面の色が変わることを確認します。
簡単なプログラムを書いただけでハードウェアを操作できたという感じがしますね。
Blocky でセンサーを使う
最後に 環境センサー を接続して、気圧・気温・湿度を表示してみます。
- センサを繋げて Units メニューを開いて追加したセンサを選ぶ
- ブロックを配置
実行すると、気圧・気温・湿度が表示されて、リアルタイムに変化します。

これだけで実用的な仕組みができてしまって、びっくりです。ここから詳細にアレンジしたければ、 ArduinoIDE を使ってプログラムを書くことになります。
ArduinoIDE で開発
GUI プログラミングのあとは、 CUI でのプログラミング、 ArduinoIDE を使って開発します。
またピン (電子回路) に各種電子部品の足やジャンプワイヤを挿すことで、ハンダ付けなしに簡単な電子回路を組むことができるので、これも利用します。

M5Stack のピン アサイン
このピンにはそれぞれ役割があります.

- それぞれのピンが I/O になっている
- 特殊なことができるピンがある
- 5 V 、 3.3 V など電圧ごと専用のピン
- リセットするピン
- デジタル信号 <-> アナログ信号の変換 などをおこなうピン
- 詳しくはこちら
- ブレッドボードと呼ばれる部品を使って電子回路を作成する
- 特殊なことができるピンがある
Hello World をやってみよう
ArduinoIDE は基本の文法は C 言語です。 そこで、ピンの設定や操作など Arduino 専用の命令文などが追加されている M5Stack 専用のプラグインをインストールした上で、開発を進めます。
ArduinoIDE には「スケッチ例」というメニューがありサンプルプログラムが呼び出せるので、それを使って “Hello World” で起動を確認します。
#include <M5Stack.h>
// the setup routine runs once when M5Stack starts up
// 電源が入ったときに {} 内が 1 回だけ実行される
// 必ず必要
void setup(){
// Initialize the M5Stack object
// M5Stack の命令文を書くときに必ず必要
M5.Power.begin();
// LCD display
// 液晶パネルに文字列を出力する命令
M5.Lcd.print("Hello World");
}
// the loop routine runs over and over again forever
// {} 内が電源が on の間、繰り返し実行される
// 必ず必要
void loop() {
}
- Arduino 用の命令になっているので、 C 言語の命令は、ほぼ使えない
- トランスコンパイルするので実行まで時間が掛かる
実行してみた結果がこちらです。

… ちっちゃ。 皆さんには見えますでしょうか?
何も設定していないと、こうなるのでした。
Lチカをやってみよう
続いて、マイコンボードと電子回路の Hello World ともいえる Lチカ( LED の点滅)をやってみましょう。

- 実際に回路を組む
- プログラムを書く
#include <M5Stack.h> // ピン番号 2 を表す変数 int ledPin = 2; void setup(){ M5.begin(); M5.Lcd.printf("LED ON¥r¥n"); pinMode(ledPin, OUTPUT); } void loop() { digitalWrite(ledPin, HIGH); // LED を ON delay(500); digitalWrite(ledPin, LOW); // LED を OFF delay(500); }
プログラムそのものは C 言語というより、 Java のようなオブジェクト指向のような書き方ですね。
実行してみた結果がこちらです。

実地で L チカ、デビューしたかった … 。
電気の基本
なお、 LED を点灯する回路には適切な抵抗を入れないとショートしてしまいます。 今回は 100 Ω の抵抗を入れました。この抵抗値は次のように計算します。
- オームの法則:電圧( V )= 電流( A )x 抵抗( Ω )
- 2 番ピンと GND の間は 5 V の電圧で流れる
- LED の仕様書を確認
- 絶対最大定格の順方向電流 25 mA
- 電気的特性の順電圧で 20 mA の標準値 3.2V
- 抵抗にかかる電圧は、5 – 3.2 = 1.8 V
- オームの法則により、抵抗値は (5 – 3.2) / (20 / 1000) = 90 ( Ω )
- 90 Ω の抵抗は一般にはないので、100 Ω を使用
オームの法則、学校で習ったはずなのですが、習ったきり使わない人生を歩んできたことを痛感しました(つまり、覚えてませんでした)。
センサの CDS を使ってみよう
続いて、明るさ(光の強さ)によって抵抗値が変わる CDS を使って明るいか暗いかがわかる電子回路を作ってみます!

- 回路を組む
- 電子回路図
- 抵抗分圧回路を使っている
- CDS と抵抗を使うと CDS の明るさの差が取得できる = 明るいか暗いかがわかる
- 抵抗分圧回路を使っている
- 電子回路図
- プログラムを書く
#include <M5Stack.h> int cdsPin = 35; int val; void setup(){ M5.begin(); M5.Lcd.printf("CDS"); Serial.begin(9600); } void loop() { val = analogRead(cdsPin); // 引数のピン番号の電圧を読む Serial.println(val); delay(500); }
実行すると、 ArduinoIDE のモニタに、 0.5 秒ごとに CDS の計測値が表示されます。 CDS を手で塞ぐと、値が変化します。

クラウドサービスにデータを送信
最後はセンサから取得したデータをクラウドサービスに送信してみます。
ここでは前回のコースでも解説いただいた Ambient を使います
- Ambient 側で設定を行う
- Ambient で受け取るチャネルを設定
- チャネルで受け取るデータに “温度” 、”湿度” などを名前をつける
- データのグラフ出力を設定
- プログラムを書いてみよう
- Arduino ライブラリを使うとサクッと書ける
- サンプルコード
// 各種ライブラリを読み込む #include <M5Stack.h> #include <Wire.h> #include "BME280.h" #include "Ambient.h" #define PERIOD 60 BME280 bme280; WiFiClient client; Ambient ambient; // WiFi 接続の定数 const char* ssid = "your ssid"; const char* password = "your password"; // Ambient 側で割り振られたチャネル情報から取得 unsigned int channelId = 100; // AmbientのチャネルID const char* writeKey = "writeKey"; // ライトキー void setup(){ M5.begin(); Wire.begin(); // I2Cの初期化 Serial.begin(74880); delay(100); Serial.println("\r\nM5Stack+BME280->Ambient test"); WiFi.begin(ssid, password); // Wi-Fi APに接続 while (WiFi.status() != WL_CONNECTED) { // Wi-Fi AP接続待ち delay(100); } Serial.print("WiFi connected\r\nIP address: "); Serial.println(WiFi.localIP()); pinMode(21, INPUT_PULLUP); //デファルトのSDAピン21 のプルアップの指定 pinMode(22, INPUT_PULLUP); //デファルトのSDAピン22 のプルアップの指定 bme280.begin(); // BME280の初期化 ambient.begin(channelId, writeKey, &client); // チャネルIDとライトキーを指定してAmbientの初期化 } void loop() { int t = millis(); float temp, humid, pressure; // BME280で温度、湿度、気圧を測定する temp = (float)bme280.readTemperature(); humid = (float)bme280.readHumidity(); pressure = (float)bme280.readPressure(); if (pressure > 800.0) { // 電源投入直後に異常値が読めたら捨てる M5.Lcd.printf("temp: %2.2f", temp); M5.Lcd.printf(" humid: %0.2f", humid); M5.Lcd.printf(" pressure: %f\r\n", pressure); // 温度、湿度、気圧、CO2、TVOCの値をAmbientに送信する ambient.set(1, String(temp).c_str()); ambient.set(2, String(humid).c_str()); ambient.set(3, String(pressure).c_str()); ambient.send(); } t = millis() - t; t = (t <: PERIOD * 1000) ? (PERIOD * 1000 - t) : 1; delay(t); }
bme280.readTemperature()
ambient.set()
のようにライブラリを使うと非常に簡単に書ける
では、プログラムを実行し、 Ambient の出力結果を見てみます。

最後に AWS IoT Core + DynamoDB でクラウドに IoT データを格納する流れと、 API Gateway から Lambda を起動してデータを表示する流れをデモして、このコースは修了しました。

まとめ
前回のコースで学んだ知識をもとに、 M5Stack を使って簡単な IoT システムを開発してみました。
M5Stack は、ディスプレイや Wi-Fi を最初から装備しているほか、開発環境やライブラリ、専用センサなども整備されていて、そのエコシステムの充実ぶりが素晴らしかったですね。 とても簡単に IoT の仕組みが作れて驚きです。
M5Stack にはユーザコミュニティもあり、作例も多く公開されているので、自分でいろいろ試すことができます。これから IoT のプロジェクトに入る方にはとてもオススメです!
label SEカレッジを詳しく知りたいという方はこちらから !!

IT専門の定額制研修 月額28,000円 ~/ 1社 で IT研修 制度を導入できます。
年間 670 コースをほぼ毎日開催中!!

SEプラスにしかないコンテンツや、研修サービスの運営情報を発信しています。