プラレールをマイコンで制御します。
DCモータの速度コントロール、Bluetoothによる無線通信をします。
成果物
最新の状態
NODE MCU ESP-32Sをユニバーサル基板に実装しました。
Bluetoothで速度の制御をしています。
電源はリチウムポリマーバッテリーをマイコン基板とモーターの電源にしています。
次回
コントローラ側もユニバーサル基板に実装します。
完成までの道のり(モータの制御)
あらすじ
Raspberry Pi Pico とモータドライバ、汎用モータを使ってモータの制御ができることを確認します。
DCモータを動かす
DCモータドライバと、汎用DCモータを使って速度コントロールができました。
プラレールの動力車両を動かす
このDCモータへの出力をプラレールの電池端子に接続しています。
モータへの電源はブレッドボードの下のほうにあるMicroBコネクタ搭載の基板から取り出します。
プラレールのスイッチはON位置(速)です。
プラレールの速度制御ができました。
スケッチは「DCモータとモータドライバを使う」のスケッチです。
紹介は「Raspberry Pi Pico」を使用していますが、今回「YD-RP2040」を使用しています。
どちらでも動作します。
完成までの道のり(無線通信)
あらすじ
前回作ったブレッドボードの配線を、受信機(車両側)と送信機(コントローラ)側に分離します。
無線通信(Bluetooth)するためにNODE MCU ESP-32Sに置き換えます。
無線でMCUと車両を動かすための電源は、モバイルバッテリーを使います。
無線通信
Bluetoothを使ってマイコン同士のシリアル通信ができました。
送信機と受信機
DCモータドライバの速度コントロールに使用していたスライド抵抗を送信側、DCモータドライバか
DCモータドライバをコントロールする側をレシーバにして無線通信をします。
受信機側(車両側)はマイコン電源と、モータ電源用に2ポート出力できるモバイルバッテリーを使用します。ダイソーで\1,000です。
送信機側はスライド抵抗を分離しました。
スケッチ受信側
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【スケッチの説明】
NODE MCU ESP-32S 基板で使用できます。
Bluetooth通信の受信側として動作します。
Bluetoothの検索では "ESP32-Receiver" として表示されます。
モータドライバ md08a の回転と速度の制御を行います。
Bluetooth送信側からモータの回転速度を受信します。
受信する値はアナログ(PWM)設定値で、0~255です。
シリアルでアスキーコードを受信するので、デリミタ[CR : 0x0d]を受け取ったら数値化して
PWMの設定値とします。
【ライブラリ】
esp32 > ESP32 Dev Module
【準備】
NODE MCU ESP32 - モータドライバ md08a
3.3V -> VCC, STBY
GND -> GND
GP16 -> PWM(速度制御)
GP18 -> AIN1(回転方向1)
GP19 -> AIN2(回転方向2)
モータドライバ md08a - プラレール端子
AO1 -> どちらか
AO2 -> どちらか
モータドライバ md08a - バッテリー
VMOT -> +
【バージョン情報】
2022/8/10 : 新規
**********************************************************************/
#include "BluetoothSerial.h"
#define PIN_POTADC 28 //スライド抵抗からの電圧信号
#define PIN_PWM 16 //PWMによる回転速度制御
#define PIN_DIR1 18 //モータの回転方向1
#define PIN_DIR2 19 //モータの回転方向2
BluetoothSerial SerialBT;
void setup()
{
SerialBT.begin("ESP32-Receiver");
//各ピンの出力方向の設定
pinMode(PIN_PWM,OUTPUT); //回転速度と方向の出力
pinMode(PIN_DIR1,OUTPUT);
pinMode(PIN_DIR2,OUTPUT);
analogWrite(PIN_PWM, 0); //突然動くと危ないので出力は0
//回転方向は固定。md08aのモータ出力をプラレールの端子につなぐと方向が決定するので、前進方向になるように現物合わせします。
digitalWrite(PIN_DIR1, HIGH);
digitalWrite(PIN_DIR2, LOW);
Serial.begin(115200);
}
char RcvBuffer[8] = "";
char RcvIndex = 0;
void loop()
{
char Rcv = 0;
int pwm = 0;
//Bluetooth受信があるか?
if (SerialBT.available())
{
//受信があればバッファリング
Rcv = SerialBT.read();
RcvBuffer[RcvIndex] = Rcv;
RcvIndex ++;
//デリミタを検出したか?
if(Rcv == 0x0d)
{
//デリミタをNULL文字にして、これまでに受信した文字列を数値化する。
RcvBuffer[RcvIndex - 1] = 0x00;
pwm = atoi(RcvBuffer); //受信文字列の検証はしたほうがいいが今回省略
RcvIndex = 0; //次の受信の準備
printf("pwm = %s, %d\n", RcvBuffer, pwm); //デバッグ出力
analogWrite(PIN_PWM, pwm); //PWM出力
}
}
}
スケッチ送信側
/**********************************************************************
【ライセンスについて】
Copyright(c) 2022 by tamanegi
Released under the MIT license
'http://tamanegi.digick.jp/about-licence/
【スケッチの説明】
NODE MCU ESP-32S 基板で使用できます。
Bluetooth通信の送信側として動作します。
受信側のMACアドレスを調べてコンパイルしてください。
スライド抵抗値をアナログ出力出力範囲にリスケーリングして受信機側に送信します。
スライド抵抗 0Vにしたいので、読み取り最小値が0になるように誤差オフセット(ADOffset)を設定しています。
シリアル出力のデリミタはCR = 0x0dです。
【ライブラリ】
esp32 > ESP32 Dev Module
【準備】
NODE MCU ESP32 - スライド抵抗
3.3V -> +
GND -> -
GP36 -> S
【バージョン情報】
2022/8/10 : 新規
**********************************************************************/
#include "BluetoothSerial.h"
#define PIN_POTADC 36 //スライド抵抗からの電圧信号
#define ADC_SIZE 4096 //ADCのサイズ(12bit)
#define PWM_SIZE 256 //PWMのサイズ(8bit)
BluetoothSerial SerialBT;
bool connected;
//uint8_t address[6] = {0xAA, 0xBB, 0xCC, 0xDD, 0xEE, 0xFF}; //受信機側のMACアドレスを設定して、コメントを解除します。
void setup()
{
pinMode(PIN_POTADC, INPUT); //スライド抵抗の読み取りを行う
SerialBT.begin("PRTrain-Transmitter", true); //Bluetooth開始
connected = SerialBT.connect(address);
//接続が成功するまで待機
if(connected) {
Serial.println("Connect OK");
} else {
while(!SerialBT.connected(10000)) {
Serial.println("No connect");
}
}
if (SerialBT.disconnect()) {
Serial.println("Disconnected Succesfully!");
}
SerialBT.connect();
}
void loop()
{
const int ADOffset = 500; //スライド抵抗を最大にしたときに電圧が出ているとモータが止まらないので、停止させるためのオフセット
int pot_adc = analogRead(PIN_POTADC) - ADOffset;
if(pot_adc < 0) pot_adc = 0;
int pwm = pot_adc / (ADC_SIZE / PWM_SIZE); //ADCの読み取り分解能12bit(4096)を、PWMの設定分解能8bit(256)へ変換する
SerialBT.printf("%d\x0d", pwm); //Bluetooth出力 デリミタは CR = 0x0d
Serial.printf("pwm = %d\n", pwm); //デバッグ出力
delay(10);
}
Bluetoothで動かす
完成までの道のり(ユニバーサル基板実装)
あらすじ
受信機(車両側)をユニバーサル基板に実装します。
準備
使うもの
絵 | 名称(型番) | 用途 |
---|---|---|
NODE MCU ESP-32S 2セット | Bluetooth通信の送信用と受信用 | |
DCモータドライバ (md08a) | モータの回転制御 今回方向は配線しますが使用しません | |
DC-DC昇圧モジュール | Lipo3.7Vを5Vにしてマイコンの電源にします | |
Lipoバッテリー コネクタはJST PH1.27 | マイコン基板とモータドライバの電源 | |
ユニバーサル基板 3 x 7cm ※画像は5 x 7cmです。 | 基板やモジュールを実装します | |
ピンソケット 8pin x 2 (モータドライバ用) 5pin x 4 (マイコン基板用) | 基板やモジュールを再利用するため マイコン基板は19pinですが5pinを4つ角に 使用して節約してます |
加工
DC-DC昇圧モジュールのUSBコネクタを取り外します。
NODE MCU ESP-32SのVINに5Vを供給します。
USBを外すとスルーホールが4つ出てきます。
赤〇が+5V、黄〇がGNDです。
ユニバーサル基板にピンソケットを実装します。
画像左側はマイコン側は4つ角5ピン分を実装しています。節約です。
画像右側はモータドライバ側で8ピンすべて実装します。
ワイヤを配線します。
DC-DC昇圧モジュールは、スルーホールをユニバーサル基板ごと友締めするように半田しています。
配線図は後日追加でアップします。
プラレール電池搭載箇所の電池端子に配線を絡み付けています。
そのままプラレールの外装をかぶせました。
動力車に入りきらないので、貨物トレーを連結して基板とバッテリーを運搬しています。
コメント