M5stamp C3UでUARTとI2C通信|M5stamp C3Uプログラム(2)

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ピンのジャンパーメスケーブルを用いました。

[商品価格に関しましては、リンクが作成された時点と現時点で情報が変更されている場合がございます。]

SeeedStudio GROVE – 4ピン-ジャンパメスケーブル 20cm (5本セット)【110990028】
価格:929円(税込、送料別) (2024/2/26時点)

楽天で購入

 

以下の写真のような構成になりました。

前回の投稿で使用した昇圧回路を用いて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秒ごとに温度、湿度、圧力が表示されます。

 

コメントを残す

メールアドレスが公開されることはありません。 が付いている欄は必須項目です

CAPTCHA



reCaptcha の認証期間が終了しました。ページを再読み込みしてください。