プラレールでGO!!

コンピュータ、組み込み

プラレールをマイコンで制御します。
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昇圧モジュールは、スルーホールをユニバーサル基板ごと友締めするように半田しています。
配線図は後日追加でアップします。

プラレール電池搭載箇所の電池端子に配線を絡み付けています。
そのままプラレールの外装をかぶせました。
動力車に入りきらないので、貨物トレーを連結して基板とバッテリーを運搬しています。

関連リンク

コメント

タイトルとURLをコピーしました