LEDを光らせた次は、モーターです。ところが、LEDと同じようにマイコンのピンへつなぐことはできません。
流せる電流が、数十倍ちがう
Raspberry Pi Pico のピン1本から流せる電流は、十数ミリアンペアです。いっぽう、サッカーロボットのモーターは動き出すときに500ミリアンペアから1アンペア以上が必要です。
マイコンは「どちらへ、どれくらいの速さで回せ」という合図を出すだけになります。大きな電流は、電池からドライバを通ってモーターへ流れます。
ドライバの役目① 大きな電流を通す
家の壁にあるスイッチと同じです。指で押す力はごくわずかですが、その先では大きな電気が動いています。
ドライバは、そのスイッチを押す役をマイコンに任せるための部品です。
ドライバの役目② 向きを変える
モーターは、流す電流の向きを逆にすると逆に回ります。向きを切り替えるために、4つのスイッチを H の形に組みます。これをHブリッジといいます。
入れるスイッチの組み合わせで、4とおりの状態をつくれます。
A と C を同時に入れると、電池の+と-が直接つながってショートします。これはドライバが中で防いでいます。
速さを変える
いつも全速とは限りません。ゆっくり動きたいときもあります。止まるか全速かの2通りしかないと、それができません。
そこで PWM という方法を使います。電気をものすごく速くON/OFFして、平均の力を変えます。
この回のプログラムでは、1秒間に約1000回で切り替わります。速すぎて目には見えませんが、モーターからは小さな高い音が聞こえます。耳に聞こえる速さで切り替えているからです。
あとの回で、この回数を1秒間に2万回まで上げます。そうすると音は聞こえなくなります。
使っている部品
この講座では DRV8835 というドライバを使っています。
| 項目 | 値 |
|---|---|
| モーター用の電源(VM) | 11V まで |
| マイコン側の電源(VCC) | 2 〜 7V(Picoの3.3Vで動く) |
| 出力できる電流 | 1チャンネルあたり 1.5A |
| PWMの周波数 | 250kHz まで |
| 動かせるモーター | 2個(2回路を並列にすれば、1個を3Aで) |
モーターの数が、設計のときに効いてきます。オムニホイール4輪の機体なら、モーターは4個です。1枚で2個までなので、ドライバが2枚いります。
つなぎ方
| Pico 側 | DRV8835 側 | 役目 |
|---|---|---|
| GP16 | AIN1 | 合図を送る1本目 |
| GP17 | AIN2 | 合図を送る2本目 |
| 3V3 | VCC | ドライバを動かす電源 |
| GND | GND・MODE | 基準。MODE と電池の − もここへ |
| (つながない) | VM | モーター用の電源。電池の + から直接 |
いちばん下が大事なところです。モーターの電源は Pico を通しません。電池から VM へ直接つなぎます。
ただし、電池のマイナス側は Pico の GND につなぎます。ここが離れていると、合図の HIGH・LOW を測る基準がなくなり、モーターは回りません。電源は別々、基準は共通、と覚えてください。
そして MODE は GND につなぎます。この記事で説明してきた方式(IN/IN モード)になります。HIGH にすると、もう一方の方式(PHASE/ENABLE モード)に切りかわります。
AIN1 と AIN2 で、動きが決まる
LEDを光らせたときのことを思い出してください。使ったのは、この2つだけでした。
digitalWrite(LED, HIGH); // 点く
digitalWrite(LED, LOW); // 消える
HIGH は「電気を出す」、LOW は「出さない」という意味です。ピンから出る電圧が、3.3V か 0V のどちらかになります。
| 書き方 | 数字で書くと | ピンの電圧 | 意味 |
|---|---|---|---|
HIGH | 1 | 3.3V | 電気を出す |
LOW | 0 | 0V | 出さない |
データシートでは H と L、あるいは 1 と 0 と書かれていますが、どれも同じことです。
モーターは、この2つを2本の線で使い分けます。LEDは1本だったので「点く・消える」しかできませんでした。2本あると、向きまで決められます。
| AIN1 | AIN2 | モーターの動き |
|---|---|---|
LOW | LOW | フリー(力がかからず空回り) |
HIGH | LOW | 正転 |
LOW | HIGH | 逆転 |
HIGH | HIGH | ブレーキ |
覚え方はひとつです。HIGH にしたほうへ回ります。両方が同じときは回りません。
この4つは、さきほどのHブリッジの4つの状態とそのまま対応しています。A側の2本で1個、B側の BIN1・BIN2 でもう1個を動かします。
プログラム① HIGH と LOW で動かす
さきほどの表を、そのまま書いたものです。正転・フリー・逆転・ブレーキを順にくり返します。
const int AIN1 = 16; // GP16
const int AIN2 = 17; // GP17
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
}
void loop() {
digitalWrite(AIN1, HIGH); // 正転
digitalWrite(AIN2, LOW);
delay(2000);
digitalWrite(AIN1, LOW); // フリー
digitalWrite(AIN2, LOW);
delay(1000);
digitalWrite(AIN1, LOW); // 逆転
digitalWrite(AIN2, HIGH);
delay(2000);
digitalWrite(AIN1, HIGH); // ブレーキ
digitalWrite(AIN2, HIGH);
delay(1000);
}
LEDのときと同じ digitalWrite です。ちがうのは、2本の線に別々の指示を出しているところだけです。
プログラム② analogWrite で速さを変える
digitalWrite では「出す・出さない」の2通りしかありません。速さを変えるには analogWrite を使います。
const int AIN1 = 16;
const int AIN2 = 17;
void setup() {
pinMode(AIN1, OUTPUT);
pinMode(AIN2, OUTPUT);
}
void loop() {
analogWrite(AIN1, 64); // ゆっくり
digitalWrite(AIN2, LOW);
delay(2000);
analogWrite(AIN1, 128); // 半分くらい
digitalWrite(AIN2, LOW);
delay(2000);
analogWrite(AIN1, 255); // 全速
digitalWrite(AIN2, LOW);
delay(2000);
analogWrite(AIN1, 0); // 止まる
digitalWrite(AIN2, LOW);
delay(2000);
}
数字は 0 から 255 までです。0 が止まる、255 が全速。その間が、PWM で作ったとちゅうの速さになります。
| 書き方 | 意味 |
|---|---|
analogWrite(AIN1, 0) | digitalWrite(AIN1, LOW) と同じ |
analogWrite(AIN1, 128) | 半分くらいの速さ |
analogWrite(AIN1, 255) | digitalWrite(AIN1, HIGH) と同じ |
もう片方の線は LOW のままにしておきます。逆に回したいときは、analogWrite を出す線を AIN2 に入れかえます。
ロボカップジュニア2027 に向けて、レスキュー(災害救助)とサッカーの2種目に取り組みます。プログラミングと電子工作の経験は問いません。