M5stamp C3Uでプログラミング(2)
今回はM5stamp C3Uを用いた2つのプログラミングについて記録します。
M5stamp C3UのUART通信プログラム
以前「UnitV AI Camera(OV7740版)を使ってみる」にて行った、M5stick c PlusとUnitV AI Cameraを用いた色検知プログラムについて、M5stick c PlusをM5stamp C3Uに置き換えたプログラムです。UnitV AI Cameraとの通信はUARTにて行っていたため、M5stamp C3UでのUART通信プログラミング知識習得が目的です。
以前行ったプログラミングのリンク先↓
https://fa-vivorock-mura.com/unitv-ai-camera/
M5stamp C3UのI2C通信プログラムおよびシリアルモニタの使用
以前「M5stick c PlusとENV IIIを使用したプログラム」にて行ったプログラムを改造し、ENV III Unitからの温湿度、圧力値をI2C通信を用いてM5stamp C3Uにて取得し、測定値をArduino ideのシリアルモニタにて表示するプログラムを作成します。M5stamp C3UでのI2C通信プログラミング知識習得が目的です。
以前行ったプログラミングのリンク先↓
https://fa-vivorock-mura.com/enviii/
M5stamp C3UのUART通信プログラミング
概要
機器構成は前回のものからM5stick c PlusをM5stampに置き換えたものになります。
|
M5stamp C3Uはまとめ買いもできるようです。
|
以下のように接続しました。
UnitV AI Camera側 ⇔ M5stamp C3U側
G34 GPIO20
G35 GPIO21
V 5V
G GND
M5stamp C3Uのピン配置を見るとGPIO20と21はUART通信用のRxとTxにデフォルトで指定されているようだったので、UnitV AI Camera側の線をそこに接続しました。
M5stamp C3Uへの接続はブレッドボードを介して行いました。UnitV AI Cameraからブレッドボードへは以下のようなGROVE4ピンのジャンパーメスケーブルを用いました。
|
以下の写真のような構成になりました。
前回の投稿で使用した昇圧回路を用いてUSB端末からの電源供給ではなく乾電池からのスタンドアロンで動作確認しました。
プログラム
M5stamp C3Uのプログラムは以下のようになりました。
#include <Adafruit_NeoPixel.h>
#define LED_PIN 2
Adafruit_NeoPixel pixels(1, LED_PIN, NEO_GRB + NEO_KHZ800);
typedef struct
{
int16_t dx;
uint32_t area;
}response_t;
void setup()
{
Serial.begin(115200);
pixels.begin();
}
response_t data;
void loop()
{
Serial.write(0xAF);
if(Serial.available())
{
uint8_t buffer[5];
Serial.readBytes(buffer, 5);
data.dx = (buffer[0] << 8) | buffer[1];
data.area = (buffer[2] << 16) | (buffer[3] << 8) | buffer[4];
if(data.dx > -120 && data.dx < 120)
{
pixels.setPixelColor(0, pixels.Color(0, 255, 0)); //緑点灯
pixels.show();
}
else
{
pixels.setPixelColor(0, pixels.Color(255, 0, 0)); //赤点灯
pixels.show();
}
}
}
前回のプログラムではUnitV AI Cameraが登録した色を検知するとM5stick c Plusのディスプレイの色が緑色になり、検知しないと赤色となるプログラムでした。M5stamp C3Uではディスプレイがありませんので、本体LEDの色で代替します。色を検知するとM5stamp C3UのLEDが緑点灯し、そうでなければ赤色に点灯します。また前回はサンプルプログラムをそのまま流用したことでモーターの制御プログラムが残ったままでしたが、今回はその部分をカットしました。
上記プログラム上では、UARTのRx側Tx側それぞれのGPIOピン指定は行っておりません。M5stamp C3UではデフォルトでRx側を20、Tx側を21と割り振っており、ピン指定を行わずにプログラミングすると自動的にデフォルトのピンで通信することになります。
なおSerial.begin(115200);
の部分を以下のように変更すればUART通信のピンをデフォルトのものから変更することも可能なようです。
int RX_PIN = 18;
int TX_PIN = 19;
Serial1.begin(115200, SERIAL_8N1, RX_PIN, TX_PIN);
UnitV AI Camera側のプログラムおよび検出設定は前回と変えずに行きます。そちらの詳細は前の投稿をご確認ください。
つまづき備忘録
はまってしまった点があったため自分への戒めを含め記録します。
今回UnitV AI Cameraからの信号を受け、本体LEDが緑赤点灯するプログラムを作りましたが、最初はLEDがうんともすんとも機能しませんでした。理由としては「pixels.setPixelColor(0, pixels.Color(255, 0, 0));」でLEDの色指定をしていましたが、そのあと「pixels.show();」の記述が抜けていたことが原因でした。前に投稿した「M5stamp C3Uプログラム(1)」でのプログラムと見比べてやっと気付きました。
プログラム実行結果
プログラム実行結果は以下の通りになりました。狙い通りにUnitV AI Cameraが入っていた箱に書かれているUnitV AI Cameraイラストの青色をカメラが検知するとM5stamp C3U本体のLEDが緑色に変わり、そうでないと赤色のままとなります。M5stick c PlusからM5stamp C3Uへの置き換えができました。ただUnitV AI Camera側のしきい値設定が甘いのか誤反応が多かったです。これは調整が必要ですね。
色検知なし
色検知
M5stamp C3UのI2C通信プログラム
概要
こちらも機器構成は前回のものからM5stick c PlusをM5stampに置き換えたものになります。
以下のように接続しました。
ENV III Unit側 ⇔ M5stamp C3U
SCL GPIO9
SDA GPIO8
5V 5V
GND GND
デフォルトではGPIO8をSDA、9をSCLとなっているようでしたので、接続もそのようにしました(変更することも可能)。
こちらも接続はブレッドボードとGROVE4ピンのジャンパーメスケーブルを用いました。
以下の写真のような構成となりました。今回はシリアルモニタで測定値を確認する都合上、USB端末から電源供給されるため昇圧回路は使用しません。
プログラム
プログラムは以下のようになりました。
#include <Wire.h>
#include <Adafruit_NeoPixel.h>
#define LED_PIN 2
#include <Adafruit_Sensor.h>
#include "M5UnitENV.h"
Adafruit_NeoPixel pixels(1, LED_PIN, NEO_GRB + NEO_KHZ800);
SHT3X sht3x;
QMP6988 qmp;
float temperature = 0.0;
float humidity = 0.0;
float pressure = 0.0;
void setup() {
Serial.begin(115200);
//つまづきポイント開始
Wire.begin(8, 9);
if (!qmp.begin(&Wire, QMP6988_SLAVE_ADDRESS_L, 8, 9, 400000U)) {
Serial.println("Couldn't find QMP6988");
while (1) delay(1);
}
if (!sht3x.begin(&Wire, SHT3X_I2C_ADDR, 8, 9, 400000U)) {
Serial.println("Couldn't find SHT3X");
while (1) delay(1);
}
//つまづきポイント終了
}
void loop() {
pressure = qmp.calcPressure();
if(sht3x.update()){
temperature = sht3x.cTemp;
humidity = sht3x.humidity;
}
Serial.println(temperature);
Serial.println(humidity);
Serial.println(pressure);
delay(10000); //シリアルモニタへの書き込みは10秒ごと
}
以前のM5stick c Plusを用いたプログラムからピン番号の変更や、ディスプレイの表示をシリアルモニタへの表示に変更などを行っています。
つまづき備忘録
今回はまってしまったことを記録します。当初上記プログラムの「//つまづきポイント開始」から「//つまづきポイント終了」の間を以下の3行だけでプログラムをしていました。
Wire.begin();
qmp.begin();
sht3x.begin();
理由は前項のUART通信プログラムにおいて「ピン指定を行わずにプログラミングすると自動的にデフォルトのピンで通信する」と経験していたため、I2Cについても同様かと勘違いしていました。M5stamp C3UのI2C通信の特性なのか、ENV III Unitセンサの特性なのか、どちらかはわかりませんが、改造元のM5stick c Plusプログラムの記載方法から、ディスプレイ表示をシリアルモニタへの表示に変更したり、ピン番号を変更してうまくいきました。
ちなみに誤ってプログラムした際に実行したシリアルモニタは以下のように表示されます。
「i2c_set_pin(875):scl gpio number error」と表示されたため、SCLに設定しているGPIO9の接続に問題あるのかと勘違いして、ブレッドボードの差込口を変えたり、プルアップ抵抗を追加してみたりと試していたら、原因の特定に時間がかかってしまいました。
プログラム実行結果
書き込みモードでプログラムを書き込み、一度USBを抜いてから再度接続しました(念のためM5stamp C3Uの書き込みモードを解除)。そしてArduino IDE右上の波形マークの隣の虫眼鏡?マークがシリアルモニタのボタンなのでそれをクリックするとシリアルモニタが表示されます。
シリアルモニタは以下のように表示されました。
10秒ごとに温度、湿度、圧力が表示されます。