Picossci DC/サーボモータードライバ(RP2040搭載)をつかってみる
Picossci DC/サーボモータードライバ(RP2040搭載)の活用記事を、開発をお願いしている饗庭陽月さんに書いてもらいました。
どんなもの
Picossci DC/サーボモータードライバ(RP2040搭載)は最大で4個のDCモーターと8個のサーボモーターをドライブできるモーター制御基板です。
RP2040 マイコンを搭載した Raspberry Pi HATサイズの基板で、基板単体でのモーター制御もできますし、Raspberry Pi と連携したモーター制御もできます。
特徴
- Raspberry Pi Pico 互換ボード
- フラッシュメモリ:2MB
- 接続可能モーター数:4つ
- 接続可能サーボモーター数:8つ
Raspberry Piに接続しても使用できますが、スタンドアローンでも動作します!
今回は、このボードをスタンドアローンで使いラジコンを製作してみます。
Raspberry Pi PicoはESP32のように無線通信は行えませんが、USB Hostとして動作させることができます。ここではワイヤレスキーボードを接続することによってPicossci DC/サーボモータードライバ(RP2040搭載)をラジコンのように動作させます。
準備物
- Picossci DC/サーボモータードライバ(RP2040搭載)
- FEETECH 2WD/4WD スマートロボットカーキット
- AP3602A搭載 昇圧モジュール
- 電池ボックス(単4×4個)(お家にあるもの)
- USBコネクタ(手元にあった秋月電子のものを使いましたが、スイッチサイエンスで販売している USBAコネクタ・ピッチ変換基板 が同等品です)
- パソコン用のワイヤレスキーボード(専用USBドングルでつながるタイプ)
作り方
回路
1. バッテリと接続
単4電池ボックスを下図のコネクタに接続します。
2. 昇圧回路を接続
USB用電源は5Vを生成する必要があります。Picossci DC/サーボモータードライバ(RP2040搭載)の3.3V電源ラインからAP3602Aを使用して5Vに昇圧します。(乾電池4本の電圧は約4V~6Vの間で可変し、そこから5Vを生成するには昇降圧回路が必要になるため)
3. USBコネクタをはんだ付け
USB typeAの5V、GNDを接続し、D+をGP0にD-ををGP1に接続します。
4. 組み立て
写真の位置にスペーサーを立てると基板の穴にいい感じに合わせられます。
プログラム
プログラムをGitHubに公開しています。ここでは要点のみを紹介します。
GitHub URL: https://github.com/SWITCHSCIENCE/samplecodes/tree/master/Picossci_DC_Servo_blog
概要
キーボードからの入力があるとコールバック関数 tuh_hid_report_received_cb() が呼び出されます。
void tuh_hid_report_received_cb(uint8_t dev_addr, uint8_t instance, uint8_t const* report, uint16_t len)
{
(void) len;
uint8_t const itf_protocol = tuh_hid_interface_protocol(dev_addr, instance);
if(itf_protocol == HID_ITF_PROTOCOL_KEYBOARD){
process_kbd_report(dev_addr, (hid_keyboard_report_t const*) report );
}
// continue to request to receive report
if ( !tuh_hid_receive_report(dev_addr, instance) )
{
tud_cdc_write_str("Error: cannot request report\r\n");
}
}
内部で、process_kbd_repot()が呼び出され、キーボード入力をdrive_motor()関数に受け渡します。
//キーボードの入力に対する処理
static void process_kbd_report(uint8_t dev_addr, hid_keyboard_report_t const *report)
{
// ... [省略]
if (ch)
{
if (ch == '\n') tud_cdc_write("\r", 1);
tud_cdc_write(&ch, 1);
drive_motor((Action)ch);
flush = true;
}
}
}
}
if (flush) tud_cdc_write_flush();
prev_report = *report;
}
drive_motor()の内部では、モーターを駆動するために以下のような処理を行います。
//モーターの駆動処理
void drive_motor(Action action){
Serial.println(action);
switch(action){
case MOVE_FORWARD:
analogWrite(PWM0A,SPEED);digitalWrite(PWM0B,LOW);
digitalWrite(PWM1A,LOW);analogWrite(PWM1B,SPEED);
break;
case MOVE_BACKWARD:
// ... [省略]
case STOP:
digitalWrite(PWM0A,HIGH);digitalWrite(PWM0B,HIGH);
digitalWrite(PWM1A,HIGH);digitalWrite(PWM1B,HIGH);
break;
default:
Serial.println("Invalid KeyCode");
}
}
ここで、Action型では、キーボード入力とモーター動作を以下のように結びつけています。
//ascii文字コードとActionの対応付け
typedef enum {
MOVE_FORWARD=119,//w
MOVE_BACKWARD=120,//x
STOP=115,//s
TURN_RIGHT=100,//d
TURN_LEFT=97//a
} Action;
モータードライバーは、PWMA,BピンがHi,Loの状態に応じて以下のような動作をします。
PWMA | PWMB | モード |
---|---|---|
L | L | フリー |
H | L | 正転 |
L | H | 逆転 |
H | H | ブレーキ |
analogWrite(PWM0A,SPEED); digitalWrite(PWM0B,LOW);
digitalWrite(PWM1A,LOW); analogWrite(PWM1B,SPEED);
上のようなコードであった場合、motor0は正回転、フリーのトグル
motor1は、逆回転、フリーの状態を繰り返します。
うごかす
動いたー、すごーい
さいごに
Picossci DC/サーボモータードライバ(RP2040搭載)をつかって、ラジコンを作成しました。さらにサーボモーターなどを追加すれば機能を拡張することができます!!
ぜひ試してみてください!!