安価な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のチェックに書き換えるだけなのでそんなに難しくない変更だ。
こんな感じのコードになった。
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側のプログラムも書いた。
#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につないでサーモグラフィー表示するのを試してみた