はじめに
たまには動くのものを作ろとう思ってこんな物を買った.
ピンを使った物理プログラミングはなかなか斬新だが,せっかくなので (?) RasPi を使って操作できるようにする.
買い物
今回の最低限必要な買い物は次の通り.uSDカード,工具,電線,等は別途揃える必要あり.
今回はモータードライバの動作確認ということで,一旦 RasPi の電源は有線とする.
モータードライバ(MX1508)について
MX1508 は H ブリッジが 2 つ入った DC モータードライバ.データシートは中国語のものしか見当たらないが,英語の情報もインターネット上にはたくさん転がっているので仕様調査はあまり困らない.入力側の端子に PWM を入力することで DC モーターの調速が可能だが,RasPi のハードウェア PWM は 2 系統しか無いらしいのでまずは単純な ON/OFF 制御のみでモータを駆動することにする.
Amazon のレビューでは IN2 と IN3 の間,MOTOR-A と MOTOR-B の間が 2.54mm になっていないとのレビューがあったが,私に届いた個体では改善されたのか 2.54mm ピッチに変更されていた.気になったのはウラ面全体がレジストであること.スルーホールで良かった...
H ブリッジの説明はペンプロッタを作ったときに説明したのでここでは省略.
Raspberry Pi Zero の準備
RaspberryPi OS をダウンロードして uSD に書き込む.
$ unzip -p 2021-05-07-raspios-buster-armhf-lite.zip | sudo dd of=/dev/sdc bs=4M conv=fsync
0+28608 レコード入力
0+28608 レコード出力
1874853888 バイト (1.9 GB) コピーされました、 79.0255 秒、 23.7 MB/秒
HDMI 接続するのが面倒なので事前に SSH と無線 LAN を設定しておく.
$ sudo mount /dev/sdc1 ${マウントポイント}
$ cd ${マウント先}/boot
$ touch ssh wpa_supplicant.conf
$ cat wpa_supplicant.conf
ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
update_config=1
country=JP
network={
ssid="${SSID}"
psk="${PASSWORD}"
}
モーター制御
RasPi とモータードライバを次の様に接続して RasPi の電源を入れる.モータードライバの項で説明した通り,今回は H ブリッジを使った ON/OFF 制御をするだけ.
適当な GPIO を有効にしてモータドライバの制御に利用する.
RasPi のピン | モータドライバのピン |
---|---|
GPIO19 | IN1 |
GPIO26 | IN2 |
GPIO16 | IN3 |
GPIO20 | IN4 |
ここでは仮想ファイルシステムから GPIO を簡易的に操作して動作確認を行う.モータードライバに接続したモーターの極性によって前進と後退が逆になるので注意.
$ # GPIO 有効化
$ echo 16 > /sys/class/gpio/export
$ echo 20 > /sys/class/gpio/export
$ echo 19 > /sys/class/gpio/export
$ echo 26 > /sys/class/gpio/export
$ # 出力設定
$ echo out > /sys/class/gpio/gpio16/direction
$ echo out > /sys/class/gpio/gpio20/direction
$ echo out > /sys/class/gpio/gpio19/direction
$ echo out > /sys/class/gpio/gpio26/direction
$ # 前進
$ echo 1 > /sys/class/gpio/gpio19/value
$ echo 1 > /sys/class/gpio/gpio16/value
$ # 停止
$ echo 0 > /sys/class/gpio/gpio19/value
$ echo 0 > /sys/class/gpio/gpio16/value
動作確認が出来たら適当なスクリプトを書いて走らせてみる.
#!/bin/bash
#################################################
# MOTOR CONTOROL SAMPLE
#
# GIPO 19: IN1 MOTOR-A (L)
# GPIO 26: IN2 MOTOR-A (L)
# GIPO 16: IN3 MOTOR-B (R)
# GPIO 20: IN4 MOTOR-B (R)
#
#################################################
#################################################
# INIT
#################################################
echo setup
echo 16 > /sys/class/gpio/export
echo 20 > /sys/class/gpio/export
echo 19 > /sys/class/gpio/export
echo 26 > /sys/class/gpio/export
sleep 1
echo out > /sys/class/gpio/gpio16/direction
echo out > /sys/class/gpio/gpio20/direction
echo out > /sys/class/gpio/gpio19/direction
echo out > /sys/class/gpio/gpio26/direction
sleep 1
#################################################
# MAIN
#################################################
echo forward
echo 1 > /sys/class/gpio/gpio19/value
echo 1 > /sys/class/gpio/gpio16/value
sleep 2
echo 0 > /sys/class/gpio/gpio19/value
echo 0 > /sys/class/gpio/gpio16/value
sleep 2
echo back
echo 1 > /sys/class/gpio/gpio26/value
echo 1 > /sys/class/gpio/gpio20/value
sleep 1
echo 0 > /sys/class/gpio/gpio26/value
echo 0 > /sys/class/gpio/gpio20/value
sleep 2
echo turn 1
echo 1 > /sys/class/gpio/gpio19/value
echo 1 > /sys/class/gpio/gpio20/value
sleep 1
echo 0 > /sys/class/gpio/gpio19/value
echo 0 > /sys/class/gpio/gpio20/value
sleep 1
echo turn 2
echo 1 > /sys/class/gpio/gpio26/value
echo 1 > /sys/class/gpio/gpio16/value
sleep 1
echo 0 > /sys/class/gpio/gpio26/value
echo 0 > /sys/class/gpio/gpio16/value
sleep 1
#################################################
# TERM
#################################################
echo 16 > /sys/class/gpio/unexport
echo 20 > /sys/class/gpio/unexport
echo 19 > /sys/class/gpio/unexport
echo 26 > /sys/class/gpio/unexport
exit
おわりに
RasPi Zero と MX1508 で カムプログラムロボットのモーター制御方法を紹介した.
PWM で調速したり,サーボ動かしたり,しばらくは楽しめそうなおもちゃになりそう.
コメント