
Raspberry Piとサーボモータで踊るはにわ制作
あ、どうもはにわと申します。 港町横浜で専門学生やってるものづくりがそこそこ好きなメガネです。
今回はですねタイトルと名前にあるように動く┌|∵|┘←を作りたいと思うんですよね。
なぜ作るか……なんですけども何か大層なことを考えて趣味でものづくりする人ってそうそういないと思うんです(┌|∵|┘が作りたいだけ←)。
今回はRaspberry Piとサーボモータを使って、踊る┌|∵|┘を作ってみます!
Raspberry Pi?サーボモータ?┌|∵|┘?

「Raspberry Pi」は、Arduinoに似た何でもできると噂のつよいボードです。 強さの秘訣は内部でLinux OSが動いたり、直接ディスプレイやキーボード、マウス等を接続できたりすることで、超小型のパソコンと考えてもらって大丈夫です!
LANケーブルを接続すればネットにも繋がり、中にはWi-Fiモジュールが搭載されていて無線で繋がるものもあります。

「サーボモータ」は、 普通のモータとは違い回転角度・速度を細かく調整することができ、ラジコンの翼の制御やロボットのアームの制御などに使われます。
PWMという方法で制御するのですが、詳細は、ドキュメントの「PWM制御」を参考にしてください。
そして┌|∵|┘です!

みなさん知ってますよね!?可愛いですよねうん。説明不要ですようん。
今回使うもの、欲しいもの
Raspberry Pi3
[

マイクロサーボ9g SG-90
[

ジャンパピン

各機器をつなぎ合わせるために使用します。うーん説明終わり!
Amazon等で「ジャンパピン」などと検索してみると、かなり安価で大量に手に入ることがわかります。こんないらねえよ!と思いますよね?私も思います。
ブレッドボード

「ブレッドボード」と検索するとこんな感じの穴あきの板が手に入ります。ここに先ほどのピン等をさしていきます。
ブレッドボードの使い方がよくわからない、という方は、ドキュメントの「ブレッドボード」を参照してください。
実際に動かす
配線
こういった感じに配線していきましょう。

モータを動かすにはパワーを使うため通常は別で電源を用意することが多いですが、1個だけでしたらラズパイからの給電で動くので接続していきましょう。
SG90の黒をラズパイの「GND」へ、SG90の赤はラズパイの「5V」へ、そして黄色をラズパイの任意のピンへ接続します。今回は2番ピンに接続しておきましょう。近いですし。
慣習的に5Vを赤、GNDを黒、その他はそれぞれ違う色のジャンパで繋ぐと見やすいです。わかりやすさって大事!!

ラズパイのボード上にはピン名称の記載がありませんが、「Raspberry Pi ピンアサイン」などと検索すると調べることができます。
プログラム
ラズパイの初期設定等はとても詳しく説明してくださってる方がたくさんいるので割愛します!!!Python3とpipがあればOKです。
SSH接続とかNotepad++とかで遠隔で書き込むのもありですが、それができる人は自分で頑張ってください。今回はラズパイに直接書き込んでいきましょう!
ラズパイへ電源、HDMI、キーボードを接続しログイン。
シェルが起動しましたら
$ pip3 install RPi.GPIO
とPython上でGPIOを操作できるライブラリを落とします。
$ touch motor_test.py
$ nano motor_test.py
でファイルを作成して編集モードにし、以下を記述していきます。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2 // SG90の黄色を刺したピン
GPIO.setup(gp_out, GPIO.OUT)
motor = GPIO.PWM(gp_out, 50)
motor.start(0.0)
bot = 2.5
mid = 7.2
top = 12.0
motor.ChangeDutyCycle(bot)
time.sleep(0.5)
motor.ChangeDutyCycle(top)
time.sleep(0.5)
motor.ChangeDutyCycle(mid)
time.sleep(0.5)
GPIO.cleanup()
ctrl + x で終了し、yキーで保存します。
確認
プログラムを書き込めたら、動かしてみましょう。配線を確認し次のコマンドを叩きましょう。
$ python3 motor_test.py
おお!動いた!という事で
ChangeDutyCycle()
の中身を変えることで好きな角度に変えることができます。とりあえずの指標として0、90、180度をtop、mid、botという変数に入れていますが、直接数値を入力してもOKです。
モータを増やす。
一つのサーボモータを動かすことには成功しました。なので次はもっと増やしてみましょう。
具体的には上のプログラムの使いまわしで大丈夫です。使うモータ毎に名前とどのピンを使うかを記述し、名前.ChangeDutyCycle()
とすると対応するサーボモータが作動するようになります。
配線
では全部で3台動くように追加していきましょう!ラズパイからの給電ではSG90を3台も動かせないので、単3電池2本を追加して電力を補強しつつこういった感じに配線します。

電池の赤(+)をブレッドボードの+列へ、黒(-)をー列へ刺します。
各サーボモータの赤をブレッドボードの+列に、サーボモーターの黒をブレッドボードの-列に、ラズパイのGNDをボードの-列へ接続し電源を確保します。
そしてサーボモータの黄色はGPIO端子の対応するところ(今回は2、3、4番ピン)にぶっ刺します。

Oh…ゴチャゴチャ……
プログラム
さっき書いたプログラムのように記述します。さっきのを書き換えてもOKです!
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 2
GPIO.setup(gp_out, GPIO.OUT)
right = GPIO.PWM(gp_out, 50)
right.start(0.0)
gp_out = 3
GPIO.setup(gp_out, GPIO.OUT)
left = GPIO.PWM(gp_out, 50)
left.start(0.0)
gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)
chest = GPIO.PWM(gp_out, 50)
chest.start(0.0)
bot = 2.5
mid = 7.2
top = 12.0
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(bot)
time.sleep(0.5)
chest.ChangeDutyCycle(mid)
time.sleep(0.5)
right.ChangeDutyCycle(top)
chest.ChangeDutyCycle(bot)
time.sleep(0.5)
chest.ChangeDutyCycle(top)
right.ChangeDutyCycle(bot)
left.ChangeDutyCycle(top)
time.sleep(0.5)
chest.ChangeDutyCycle(mid)
right.ChangeDutyCycle(top)
left.ChangeDutyCycle(bot)
time.sleep(0.5)
GPIO.cleanup()
こんな感じで!もう好きにやっちゃってくださいな。
図工
それでは本題である┌|∵|┘を作ります!皆さん童心に帰って好きな素材で作ってください!
私は今回牛乳パックで作成していきます。

( ^ω^)
≡⊃⊂≡
こうしてこうして

( ^ω^)
⊃ .. ⊂
こうじゃ

やったぜ
さあさあここまで来たんです!動かしましょうよ!ね!
┌|∵|┘起動!!!!!
と、いう事で好きにパーツを作ってもらえればどんなものも躍らせられますね……!!踊り自体もPythonで記述しているので、forやifを駆使すれば複雑な踊りだっていけます。ここから皆さんの創造力が試されますぞ!
それでは長くなりましたがお疲れ様です!皆もなんか動かしてみようぜ!!