AbudoriLab.

自律ロボットで誰でも遊べるよう試行錯誤するブログです。

モータドライバでモータを回してみよう③ Arduinoスケッチでモータに回転指示を出そう

前回の記事から続きとなります。前回はモータを回すための以下のような回路を組みました。 今回はこのマイコンArduinoスケッチを書き込んで、プログラムによってモータを回す方法を紹介します。

マイコンでこの回路を動かしモータを回します

www.abudorilab.com

マイコンとモータを繋いだ様子

スポンサードリンク

マイコンでH/Lの信号を出そう

High/Lowってなに

コンピュータの世界では1と0を扱います。電気回路では、電気が流れている状態、流れていない状態で扱います(本来は逆です。電気回路をソフトウェア扱うために1/0で処理します)。流れている状態をH(High)、流れていない状態をL(Low)とします。

電気が流れているか、流れていないかはほとんどの場合、電圧にて判断します。電圧が限りなく低い場合(つまりOFFの状態)はGNDと同じ電圧となります。電圧が高い場合(つまりONの場合)、は電源電圧と同じ電圧となります。マイコンやICなどの回路はGNDか電源電圧であるかを見て、電気が流れている流れていないを判定します。

これはスイッチによって簡単に実現することができます。次の図のように、H/Lを作ります。Hの時は電源電圧の出ている電源ラインを繋ぎ、Lの時はGNDのラインを繋ぐことで、H/Lの電圧を出力することができます。

ON/OFFの模式図

Lチカしてみよう

マイコンを使う上で最も基本的な動作としてLチカがあります。LEDをつけたり消したりしてチカチカさせる操作です。マイコンのGPIOの一つを使ってLEDを光らせます。

GPIOはプログラムで自由にH/Lの出力を指示できます。まずはHの出力をして3.3Vの電源電圧を出力します。この3.3Vの電圧でLEDを光らせてみましょう。 ラズベリーパイピコのデータシートによると、1ポートからデフォルトで4mA出力できるそうです。なので、3.3Vの電圧をつかって4mA以上流さないように(4mA以上流してしまうとラズベリーパイピコが壊れてしまうと考えて)計算してみましょう。

https://datasheets.raspberrypi.com/rp2040/rp2040-datasheet.pdf

使用するLEDはこちらです。 akizukidenshi.com

秋月電子のページには、LEDの抵抗の計算方法が書かれています。併せて確認してみましょう。 今回はついていることがわかれば良いので適当に10kΩを使います。以下のようにラズベリーパイピコと接続します。

ラズベリーパイピコとLEDの接続図

それでは、プログラムを書いてみましょう。 ラズベリーパイピコにはArduinoIDEを使ってプログラムを作成し、マイコンに書き込みます。

Arduino公式WebサイトからArduinoIDEをインストールします。

www.arduino.cc

ArduinoIDEの初回起動時には、ラズベリーパイピコ自体の設定が必要です。こちらのブログがわかりやすく解説してあるため参考にしましょう。

karakuri-musha.com

ArduinoIDEの準備ができたら、エディタに次のコードを入力します。

参考コード

void setup() {
  // ここでH/L操作したいピン番号を指定します。
  pinMode(16,OUTPUT); // OUTPUTでH出力、L出力できます
}

void loop() {
  // 1秒ごとに点滅します。
  digitalWrite(16,HIGH); // Hにします
  delay(1000); // 1秒待ちます
  digitalWrite(16, LOW); // Lにします
  delay(1000); // 1秒待ちます

  // loop()の先頭に戻ります
}

コードの解説

  1. Arduinoでは、まずsetup()が実行され、その後にloop()が実行されます。
  2. loop()の最後の行まで実行された後はloop()の先頭まで戻って再びloop()が実行されます。
  3. setup()では、ピンの接続の設定をプログラム上で指定します。今回は21ピンをH/L制御する書き方です。
  4. 21ピンはGP16と決められているので、コード上では"16"を指定しています。
  5. loop()では、1秒おきにON→OFF→ON→OFFにしています。
  6. digitalWrite(16,HIGH);でHに指定しています。そのあと、delay(1000)で1000ミリ秒、つまり1秒待機します。
  7. digitalWrite(16, LOW);でLに指定しています。そのあと、delay(1000)で1000ミリ秒、つまり1秒待機します。
  8. loop()が繰り返されることで以下の動画のように1秒おきにLEDが点滅します。

youtu.be

このようなプログラムを書き込むことでマイコンで好きなピンをHにしたり、Lにしたりすることができるようになりました。

スポンサードリンク

モータドライバをマイコンで動かしてみよう

前回の記事の回路を今度はマイコンの指示で組んでみます。

マイコンでこの回路を動かしモータを回します

データシートを読む回では、IN1とIN2のH/Lの組み合わせでモータの回転方向が変わることを解説しました。その解説では、回路図でONOFFの図で説明しましたが、今回はマイコンのH/Lで実現することができます。

Lチカのコードを少し書き換えて、IN1をH / IN2をL、IN1をL / IN2をH、これを1秒ごとに繰り返すコードにしました。

参考コード

void setup() {
  // 16, 17ピンをH,L出力できるようにします。
  pinMode(16, OUTPUT);
  pinMode(17, OUTPUT);
}

void loop() {
  // 16ピンをHに、17ピンをLに設定
  digitalWrite(16, HIGH);
  digitalWrite(17, LOW);
  delay(3000);

  // 16ピンをLに、17ピンをLに設定 →停止
  digitalWrite(16, LOW);
  digitalWrite(17, LOW);
  delay(3000);

  // 16ピンをLに、17ピンをHに設定
  digitalWrite(16, LOW);
  digitalWrite(17, HIGH);
  delay(3000);

  // 16ピンをHに、17ピンをLに設定 →停止
  digitalWrite(16, LOW);
  digitalWrite(17, LOW);
  delay(3000);
}

コードの解説

  1. setup()では、指定するピンを増やしました。2つのピンをモータドライバのH/Lで指示を与えるためです。
  2. loop()では、それぞれの2つ目のピンを増やしました。H/Lの指定の仕方は変わりありません。
  3. delay()で待機する方法も変わりありません。モータ回転なので3秒にしました。

このコードで実際に動かしたのが以下の動画です。 youtu.be

今回の記事では、Lチカのコードを作り、そのコードを小変更することでモータを回すコードを作りました。 ロボットを任意の速度で制御するには、この動画のようにただ前後に回すだけでは実現しません。次の記事では、狙った回転数でモータを回す方法を紹介します。