ゆるく楽しむプログラミング

タミヤ マイコンロボットをM5AtomS3で動かしてみた

micro:bitでプログラミングできるクローラーロボットキットを買ってみました。

micro:bit V1.5が付属しています。


折角(?)なので、micro:bitと同じ形状のユニバーサル基板にM5Atomを載せて、M5Atomでフォロを動かしてみました。
今回はM5Atomでしたが、micro:bitユニバーサル基板に載せるだけなので、ArduinoでもM5Stampでも同じように置き換えることが出来ます。
 

micro:bitとクローラーロボットのインターフェイスは▼の通り
PIN クローラーロボットの機能
P8 スピーカー
P19 超音波距離センサー(I2C:SCL)
P20 超音波距離センサー(I2C:SDA)
P13 モーター右(PWM制御)
P14 モーター左(PWM制御)
P15 モーター右のブレーキ(HIGHで停止)
P16 モーター左のブレーキ(HIGHで停止)

超音波距離センサーはI2C接続
I2Cアドレス 0x2C
コマンド
測定開始 55 1:読み取り可能
レジスタアドレス
計測値 14 下位バイト
計測値 15 上位バイト
計測値 16 上位と下位の合計

モーターはPWM制御
周波数 1KHz、解像度 10Bit
アナログ出力値 動作
1023 正回転最大
   
511 停止
   
0 逆回転最大 

コレに合わせてM5Atomとmicro:bitユニバーサル基板のエッジコネクタを対応を決めます。
ピン数が足りないので、micro:bitの[A][B]ボタンはG2ピンで処理します。
M5Atomには5Vの電源が必要なので、micro:bitエッジコネクタの3V端子に5V昇圧コンバータを接続して5V電源を作っています。
 実装面積を取るために、表面実装用のチップ抵抗を使用しています。
見えない(くらい小さい)ですが、ちゃんと抵抗が付いています。

GROVEコネクタは入手困難なので、手持ちのコードを切って変換コネクタを作っています。

M5AtomS3のPWM出力

ArduinoのPWM出力は analogWrite( ) を使うだけの簡単仕様なのですが、M5AtomS3ではこのやり方だとLCDのバックライトが連動して動作してしまい、画面の明るさが変わってしまいます。
明るくなるだけならマシなのですが、暗くなると画面が見えません (;´・ω・)

M5AtomS3(ESP32)ではLED制御用のコマンドを使用してPWM出力を行います。

ledcSetup(PWMチャンネル, 周波数, 解像度)
 PWMチャンネルの周波数と解像度(ビット数)を設定します。
 PWMチャンネルは0~3の4チャンネル使用できます。
 解像度はアナログ値の範囲設定で14Bitまで指定できます。
 タミヤ マイコンエロボット工作キットでは 1KHz、10Bit(0~1023の範囲指定)を使用しています。

ledcAttachPin(GPIOピン番号, PWMチャンネル)
 GPIOピンに出力するPWMチャンネルを紐づけます。
 複数のGPIOピンに同じPWMチャンネルを割りつける事も出来るみたいです。
 ※ちゃんと検証してないので、間違ってるかも

ledcWrite(PWMチャンネル,アナログ値)
 アナログ値の設定は、GPIOピンに対してではなくPWMチャンネルに対して行います。

超音波距離センサー

普通にI2C接続のセンサーユニットなので、特筆すべきことはないのですが

読み取り開始
 I2Cアドレス0x2Cに55を送信して、1Byte受信
 受信した値が1なら読み取り可能。

センサー値の読み取り
 I2Cアドレス0x2Cに14を送信して、2Byte受信
 下位・上位の順で2バイトのデータを受信できるので2バイト整数に変換

距離計算
 ([センサー値] - 160) ÷2 × 0.315 で 反応距離(mm)が得られます。

スケッチ



解説動画