ドラ○もん プログラミングタケコプター魔改造
小学一年生2021年5/6月号の付録『ドラえもん プログラミングタケコプター』をラジコンに魔改造しました。
元々はこんな感じで、前、右、左とか、10回ぐらいの操作を記録して、ドラえもんを目的地まで移動させることでプログラムとは何たるかを勉強するおもちゃです。
もちろん本来の使用方法でもそれなりに遊べますが、やっぱり付録なのであまり完成度は高くなく、まっすぐのはずが若干斜めに進んだりするので、指示通りに目的地まで到達させるのは至難の業です。
そこで、いっそのこと遠隔で操作できるラジコンにしてしまおうということで、子供の了解を得て改造することにしました。
1.回路調査
まずはどんな回路になっているかを調べるため、分解して基板をテスターであたりました。
実装されているICには刻印がなかったので、メーカーなどは不明です。
調査の結果、以下のような回路になっていると思われました。手描きで汚くてすみません。
U1,U2がモータードライバ、U4がマイコン、U3はDACかなぁ。
U4からU3に謎のプロトコルで信号が送信されていて、U3でアナログ信号に変換されてスピーカーで再生されてる感じでした。
U1、U2の2番ピン,3番ピンのHigh/Lowを切り替えることで、モーターの前転/後転を切り替えていることがわかったので、あとは別のマイコンのGPIOを2番,3番ピンに直結させたら制御できるだろうと考えました。
ただし一般的にマイコンのロジック電圧は3.3Vだと思われます。このドラえもんカーは単四電池二本駆動なので電源電圧3.0V。モータードライバの入力端子には電源電圧よりも0.3V高い電圧がかかることになります。それはたぶんよろしくない。ただ、対策するには結構面倒だと思います。
結論から言うと、3.3V直結させてますが壊れずに無事動いています。
2.使用マイコン
今回この改造のために、M5Stack core2というESP32搭載のマイコン?を新調しました。
かなりメジャーなので説明の必要はないですね。
こちらの記事などを参考にして環境構築しました。
3.配線
以下のような接続としました。
モーター | IC-ピン番号 | M5Stack GPIO |
---|---|---|
右 | U1-2 | 25 |
U1-3 | 26 | |
左 | U2-2 | 14 |
U2-3 | 19 | |
core2のGPIOの情報はこちらが詳しかったです。 | ||
https://lang-ship.com/blog/work/m5stack-core2-gpio/ | ||
汚いですが、基板加工の様子。U4のICに繋がるパターンはカッターナイフで切断しました。 | ||
ピンヘッダにはんだ付けし、ダイソーのグルーガンで補強しました。
本体の固定はマスキングテープで貼り付けているだけなので手抜きです。
4.コントローラ
本当はBluetoothのコントローラで操作したかったですが、ちょっとハードル高そうな感じがしたので、他の手法を検討し、Blynkというスマホアプリを見つけました。
スマホのコントローラのUIはコード不要で、あらかじめ用意されているパーツを選んで置いていくだけの便利アプリで、WiFiやBluetoothでマイコンと接続できます。ESP32やラズパイ、Arduinoとかが選択できるようになっています。
この辺の記事を参考に設定しました。
以下のようなUIを作成しました。横向きにして、両手持ちで操作するイメージです。
V0,V1,V2,V3というのが、プログラムで使用する変数になります。
5.プログラム
M5Stackに実装したプログラムを掲載します。
#include <M5Core2.h>
#include <WiFi.h>
#include <WiFiClient.h>
#include <BlynkSimpleEsp32.h>
char auth[] = "XXXXXXXX"; //BlynkアプリのYourAuthTokenを入力
char ssid[] = "SSID"; //WifiのI D、パスを入力
char pass[] = "PASS";
int RIGHT = 0;
int LEFT = 0;
int FOWARD = 0;
int BACK = 0;
int MR_F = 25; //右モーター前転
int MR_B = 26; //右モーター後転
int ML_F = 14; //左モーター前転
int ML_B = 19; //左モーター後転
//モーター制御関数
void motorctrl(char R_F, char R_B, char L_F, char L_B){
digitalWrite(MR_F, R_F);
digitalWrite(MR_B, R_B);
digitalWrite(ML_F, L_F);
digitalWrite(ML_B, L_B);
}
BLYNK_WRITE(V0) //右旋回
{
RIGHT = param.asInt();
M5.Lcd.setCursor(10, 10);
if(RIGHT == 1){
M5.Lcd.clear(BLACK);
M5.Lcd.printf("Turn Right!\r\n");
motorctrl(HIGH,LOW,LOW,HIGH);
}
else{
M5.Lcd.clear(BLACK);
motorctrl(LOW,LOW,LOW,LOW);
}
M5.update();
}
BLYNK_WRITE(V1) //左旋回
{
LEFT = param.asInt();
M5.Lcd.setCursor(10, 10);
if(LEFT == 1){
M5.Lcd.clear(BLACK);
M5.Lcd.printf("Turn Left!\r\n");
motorctrl(LOW,HIGH,HIGH,LOW);
}
else{
M5.Lcd.clear(BLACK);
motorctrl(LOW,LOW,LOW,LOW);
}
M5.update();
}
BLYNK_WRITE(V2) //前進
{
FOWARD = param.asInt();
M5.Lcd.setCursor(10, 10);
if(FOWARD == 1){
M5.Lcd.clear(BLACK);
M5.Lcd.printf("Foward!\r\n");
motorctrl(LOW,HIGH,LOW,HIGH);
}
else{
M5.Lcd.clear(BLACK);
motorctrl(LOW,LOW,LOW,LOW);
}
M5.update();
}
BLYNK_WRITE(V3) //後退
{
BACK = param.asInt();
M5.Lcd.setCursor(10, 10);
if(BACK == 1){
M5.Lcd.clear(BLACK);
M5.Lcd.printf("Back!\r\n");
motorctrl(HIGH,LOW,HIGH,LOW);
}
else{
M5.Lcd.clear(BLACK);
motorctrl(LOW,LOW,LOW,LOW);
}
M5.update();
}
void setup() {
// Initialize the M5Stack object
M5.begin();
pinMode(MR_F, OUTPUT);
pinMode(MR_B, OUTPUT);
pinMode(ML_F, OUTPUT);
pinMode(ML_B, OUTPUT);
M5.Lcd.setTextSize(4);
Blynk.begin(auth, ssid, pass);
}
void loop() {
Blynk.run();
delay(3);
}
6.動かしているところ
このようにラジコンとして遊べるようになりました。
若干旋回のスピードが速すぎてコントロールが難しいです。PWMとかで速度も制御するといいですね。
ボタンもたくさんあるので、うまくやればこれもM5Stackへの入力として使うことができそうです。
以上、プログラミングタケコプター魔改造の記録でした。
Discussion