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

安価な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につないでサーモグラフィー表示するのを試してみた

コメントを残す

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

Time limit is exhausted. Please reload CAPTCHA.

× 3 = 15