Desktop Stationのサイトで、DSshield2(DSシールド2)のスケッチが公開されていまして、以前の記事「XIAO RP2040で DCCコマンドステーションの製作」では、Seeed Studio XIAO RP2040 マイコンモジュールと TB6643KQ モータードライバーを組み合わせて製作した DCCコマンドステーションを紹介しました。
その後、M5Stack社製 ATOM H-DRIVER (SKU:K050) という、M5Atom Lite (ESP32) マイコンモジュールと DRV8876 モータードライバーを組み合わせたセットが販売されていることを知りまして、今回こちらで DCCコマンドステーションを製作しました。
まずは、ATOM H-DRIVER そのままの写真です。
ケースを外した状態です。
DRV8876 モータードライバーは IPROPIピン(6ピン)に電流モニタ出力(1V/1A アナログ出力)がありますので、DCCデコーダの CV値の読出しに対応するために、これを M5Atom Liteの G25ポート(ADC2)に接続します。
CV値の読出しに非対応でよければ改造は不要です。
基板の表側にある DRV8876の 6ピン端子から裏側の G25ピンヘッダ端子に配線するためにはケースとの隙間を通る極細線を使う必要があるため、今回は基板の裏側にあるパターンのレジストを削って裏側のみで配線しました。
マイコンのスケッチは、現在公開されている「rev.RP2040.002」をベースにして、以下の修正を行いました。
項目 | 変更前 (RP2040) | 変更後 (M5Atom/ESP32) |
---|---|---|
DCC制御出力 | GPIO21 GPIO20 |
G19 (IN1) G23 (IN2) |
アナログ電圧入力 | GPIO27 (ADC1) | G33 (VIN/10)、スレッショルドの変更 |
アナログ電流入力 | GPIO28 (ADC2) | G25 (IPROPI) |
RUN LED | GPIO02 | RGB-LED (WS2812B) |
以下、ソースコードの差分です。今回は修正箇所が少なくなるようにしました。
Arduino IDEの Board設定は「M5Stack-ATOM」を選択してビルドします。
なお、hardwareフォルダの下には adc.hファイル(サイズゼロのダミーファイル)を置いています。
(Amebloブログの画像は、画像リンク末尾の「?caw=800」を削除するとオリジナルサイズで表示できます)
* フォルダ比較
* DSshield2040.ino
#ifdef ARDUINO_M5Stack_ATOM
#include <M5Atom.h>
#define A1 33 // G33 (VIN/10)
#define A2 25 // G25 (IPROPI)
#define PIN_PWMA 19 // G19 (IN1)
#define PIN_PWMB 23 // G23 (IN2)
#define PIN_RUNLED 18 // G18 (dummy)
#define THRESHOLD_EDC 1117 // 9V/10/3.3V*4096
#define THRESHOLD_OV 2482 // 20V/10/3.3V*4096
void gpio_put(unsigned char gpio, bool value) { switch (gpio) {
case 21: digitalWrite(PIN_PWMA, value); break;
case 20: digitalWrite(PIN_PWMB, value); break;
case PIN_RUNLED: M5.dis.drawpix(0, (value ? 0x00FF00 : 0)); break;
}}
void adc_init() { M5.begin(false, false, true); pinMode(A2, INPUT); }
void adc_gpio_init(unsigned char gpio) {}
void adc_select_input(unsigned char input) {}
unsigned short adc_read() { return analogRead(A2) >> 3; }
void analogWrite(uint8_t pin, int value) {}
#endif
* DSCoreM_Type.h
#ifdef ARDUINO_M5Stack_ATOM
extern void gpio_put(unsigned char gpio, bool value);
extern void adc_init();
extern void adc_gpio_init(unsigned char gpio);
extern void adc_select_input(unsigned char input);
extern unsigned short adc_read();
#endif
デスクトップステーションソフトウェアを使って、車両の速度制御やファンクション制御、CV値の読出しが問題なく行えました。
ただし、オプションのシリアルポートの設定では、「DTR有効(自動リセット)」のチェックを外す必要があります。(チェックすると ATOMがファーム更新モードに入ってしまいます)
以上です。