コンテンツにスキップ
Picossci DC/サーボモータードライバ(RP2040搭載)をつかってみる

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搭載)をラジコンのように動作させます。

準備物

作り方

回路

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搭載)をつかって、ラジコンを作成しました。さらにサーボモーターなどを追加すれば機能を拡張することができます!!

ぜひ試してみてください!!

前の記事 Luxonis製RGB-D/AIカメラ"OAK-D S2"で画像処理初心者が画像加工をしてみる