安価な2WDのロボットカーのキットを動かすためのmicro:bitのリモコン側をM5Stack+micro:bitモジュールで作ってみた。

リモコン側にmicro:bitそのまま使っていたのを、M5Stack+micro:bitモジュールに変更してみた。
micro:bitモジュールというのは、以前、M5Stack用のPROTOモジュールにmicro:bitを内蔵する改造をして自作したモジュールだ。
・M5Stackとmicro:bitを合体させてみる
M5Stackと、micro:bitとはUARTで接続し、micro:bitはUART-無線ブリッジとして機能させる、というものだ。
うまくいけば、特にリモコン用のM5Stack側のmicro:bitのソフトは特に変更なしで動作するのではないかと思った。
しかし、試してみるとどうもうまく動かない。
いろいろと試行錯誤して、結局、M5Stackとmicro:bitモジュールとはGPIOで接続する形でプログラムを作り直した。
M5Stackの右/左ボタンを押すとそれに対応したGPIOピンがHighになり、micro:bitモジュール側で接続されているピンのHigh/Lowを検出して、無線データを送信するというものだ。
コードとしては、micro:bitのボタンを押されるのをチェックしている部分を、GPIOのチェックに書き換えるだけなのでそんなに難しくない変更だ。
こんな感じのコードになった。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 | import radio from microbit import display, Image, button_a, button_b, pin0, pin1, sleep display.show(Image.HAPPY) radio.on() while True: if pin0.read_digital() and pin1.read_digital(): radio.send('F') display.show('F') elif pin0.read_digital(): radio.send('L') display.show('L') elif pin1.read_digital(): radio.send('R') display.show('R') else: radio.send('n') display.show('n') sleep(100) |
そして、M5Stack側のプログラムも書いた。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 | #include <M5Stack.h> void setup() { M5.begin(); M5.Lcd.setTextSize(3); M5.Lcd.setCursor(80, 10); M5.Lcd.print("2WD R/C\r\n"); //Serial.begin(9600); pinMode(16,OUTPUT); pinMode(17,OUTPUT); digitalWrite(16, LOW); digitalWrite(17, LOW); } void loop() { if ((digitalRead(BUTTON_A_PIN) == 0)&&(digitalRead(BUTTON_C_PIN) == 0)){ M5.Lcd.setCursor(140, 80); M5.Lcd.printf("F"); //Serial2.write("F"); digitalWrite(16, HIGH); digitalWrite(17, HIGH); } else if(digitalRead(BUTTON_B_PIN) == 0){ M5.Lcd.setCursor(140, 80); M5.Lcd.printf("F"); //Serial2.write("F"); digitalWrite(16, HIGH); digitalWrite(17, HIGH); } else if(digitalRead(BUTTON_A_PIN) == 0){ M5.Lcd.setCursor(140, 80); M5.Lcd.printf("L"); //Serial2.write("L"); digitalWrite(16, HIGH); digitalWrite(17, LOW); } else if(digitalRead(BUTTON_C_PIN) == 0){ M5.Lcd.setCursor(140, 80); M5.Lcd.printf("R"); //Serial2.write("R"); digitalWrite(16, LOW); digitalWrite(17, HIGH); } else { M5.Lcd.setCursor(140, 80); M5.Lcd.printf("n"); //Serial2.write("n"); digitalWrite(16, LOW); digitalWrite(17, LOW); } delay(100); } |
M5Stackとmicro:bitモジュールの接続の部分の回路は変更していないので、UARTに使っていたピンをI/Oとして使ってHigh/Lowを伝えるのに使っている。

せっかくM5Stackを使うのでちょっとだけ機能を追加して変更している。
M5Stackにはボタンが3つあるので、左右のボタンはそのまま左右のモーターを動かすのに使用して、真ん中のボタンを追加で使って直進に、つまり左右のモーターを同時にOnにするというのを追加した。
—
応用として、例えばだがAMG8833を使って熱源を追尾して走行するロボットカーみたいなのが作れるのではないかと思った。あるいは熱源を避けて走行するとか。
(参考)
・赤外線センサーアレイAMG8833をM5Stackにつないでサーモグラフィー表示するのを試してみた