初心者だけどスマートロックを作ってみたい!
そういう願望からラズベリーパイを買ってみて意外に難しい?いやいや思っていたとおり難しい。でもネットで情報を調べていくうちに何がわかってなにがわからないのかが見えてくる。
で、今回はスマートロック自作プロジェクトの3話目サーボを回す話。
初心者の方は1話、2話もちゃんと読んでからこの3話を読んだらもっとわかると思うけどいきなり3話から読み始めてもわかると思う。もちろん1話2話も読まないと作れないけどね。
【前回の記事】
ラズベリーパイを介してスマホからスマートロックを作るプロジェクト-1-基本構想
ラズベリーパイを介してスマホからスマートロックを作るプロジェクト-2-ラズパイ初期設定
ラズベリーパイを使ってスマートロックを作るプロジェクトのサーボ制御の段
1話の復習:サーボ
サーボの選定
1話で用意したサーボについて触れたがここでもういちどサーボについて触れておく。
模型工作用で広く出回っているSG90というのを使うがパワーが弱いようならもっと強いサーボに変えてやってみよう。制御のやり方はたぶん同じだ。
自分はSG90をドアに貼り付けてラジコンのようにピアノ線で間接的にサムターンを捻ろうとしたが2本のピアノ線の長さと貼り付け位置の関係がシビアでうまく行かなかった。
同軸に設置すればSG90でも回せるんじゃないかなと思って近日中にトライするつもり。つまりこの記事を書いている時点でまだ最後の機構が完成していない。
記事が追いついてまう・・・
リード線の意味について
参考サイトはArduinoでサーボモーターを制御します。Servo「SG90」。配線とプログラムスケッチ。まるでペンギンみたいで、可笑しくてかわいい。 – Mira&Luna’s nursery lab
SG90サーボのリード線は3本ありオレンジ色(または赤く見える)、ブラウン(茶色)、イエロー(黄色)となっている。
それぞれの役割は
オレンジ(赤) | 5V+ | 物理番号2(5V PWR) |
ブラウン(茶色) | ー(GND) | 物理番号6(GND) |
イエロー(黄色) | 信号線 | 物理番号7(GPIO4)本当はGPIO18(物理番号9)が正当らしい |
ちなみに今回はサーボとラズベリーパイを直接つなげているがブレッドボードというオプション部品とリード線を使うともっとやりやすいらしい。自分はサーボの端子をガワから外してラズパイに直接挿して支障なかった。
Pythonファイルを作る
サーボを指定した角度で回すプログラム
ラズベリーパイというワンボードコンピューターにはOSにはラズビアンというのが入っていて(違うものも入れられるけど)、それと同時にPythonという言語を解釈するインタプリタも同梱されている。
インタプリタだから高級言語で命令を書いてコンパイルとかすることなくそのまま動かせるのが嬉しいのだ。
でサーボを動かすのに適しているのがPythonという言語らしい。とうぜんサーボを動かすなんてのはほかの制御言語でも表現できるだろうがラズベリーパイの場合には最初から備わっているPythonという言語で簡単に書けてしまうのだ。
内容はほぼ参考サイトを丸パクリだ。参考にしたサイトはRaspberry Piでサーボモーターを回す – Qiita
下記コードを適当な名前たとえばservo_move.pyとかってする。拡張子はpyにすること。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50)
servo.start(0)
#time.sleep(1)
#デューティサイクルの値を変更することでサーボが回って角度が変わる。
servo.ChangeDutyCycle(2.5)
time.sleep(0.5)
servo.ChangeDutyCycle(7.25)
time.sleep(0.5)
servo.stop()
GPIO.cleanup()
構文の意味について
各行の構文の意味について解釈をしているが初心者のため間違っているかもしれない。といっても言葉の解釈程度の誤解でおおよそ合っているのではないか。
構文 | 解釈 |
import RPi.GPIO as GPIO | RPiというIOポート制御用のパッケージライブラリを読み込みGPIO変数に一旦格納している |
import time | システム時刻を取得してそのままtimeというのが関数だかメソッドだかとして使える 何秒スリープとか時間を使う場合に最初に宣言しておく |
GPIO.setmode(GPIO.BCM) | GPIOのピン番号の呼び方は物理的な並びで1〜40番と呼ぶ宣言方法(GPIO.BOARD)と機能番号で呼ぶGPIO.BCMとありはこれから先は機能番号で呼びますよという宣言 |
gp_out = 4 | GPIO4をパルス(信号?)出力に設定する変数宣言と代入 |
GPIO.setup(gp_out, GPIO.OUT) | GPIOの1要素であるOUTにGPIO4を割り当てるってことだと思う |
servo = GPIO.PWM(gp_out, 50) | PWMはPulse Width Modulationの略。GPIO.PWM( [ピン番号] , [周波数Hz] )と使う。周波数の50は「SG90 周波数」でググるとでてくる。それらをservo変数として宣言しつつ代入している。つまりサーボの信号端子にこのあと周波数50Hzで信号を送るよって宣言してるってこと。 |
servo.start(0,0) | 他の参考記事を読んでもあまり意味がわからなかったが必要そうなのでおまじない的にやっておく 参考例Raspberry Piでサーボモータ(SG90)を制御する|Buffer Overruns |
servo.ChangeDutyCycle(2.5) | これが回転角度指定だが単位は度ではないのがやっかい。 |
time.sleep(0.5) | 0.5秒待ち時間を設ける |
servo.ChangeDutyCycle(7.25) | これは0度に戻す意味 |
servo.stop() | 変数のメモリを開放するんだと思う |
GPIO.cleanup() | これも同様で変数のメモリを開放してるんだろう |
角度の決め方について
角度の決め方がどうもわかりにくいのでどこかのサイトでわかりやすい角度からサーボのデューティ比に変換する計算式を公開していたのでそれを流用して改造する。
servo.start(0)
def servo_angle(angle):
duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 #角度からデューティ比を求める
servo.ChangeDutyCycle(duty) #デューティ比を変更
servo_angle(-20) time.sleep(0.5)
servo.start(0)から後ろにdef・・・を追記してservo.ChangeDutyCycle(2.5)というのをservo.angle()関数に変える。
計算式の意味はよくわからないがこれでservo.angle関数に-90から90までの数値を与えれば好きな角度に回せるのでわかりやすい。
最終的なコードはこんなふうにすると角度を決めやすい。
import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
gp_out = 4
GPIO.setup(gp_out, GPIO.OUT)
servo = GPIO.PWM(gp_out, 50)
servo.start(0)
#time.sleep(1)
def servo_angle(angle):
duty = 2.5 + (12.0 - 2.5) * (angle + 90) / 180 #角度からデューティ比を求める
servo.ChangeDutyCycle(duty) #デューティ比を変更
servo_angle(ここに-90から90の範囲内の数値を入れる)
time.sleep(0.5)
servo_angle(0) #便宜上0度位置に戻しているが使わなければ消しても良いかと
time.sleep(0.5)
servo.stop()
GPIO.cleanup()
ピン番号と機能の対応を調べる
図を挿入するのが面倒だから説明してくれているページをいくつか貼っておく。これくらい貼っておけばどれかはリンク切れなくいつまでも読めるだろうと。
- Raspberry Pi 2 & 3 ピン マッピング – Windows IoT | Microsoft Docs
- ラズパイ(Raspberry Pi)のGPIOを再確認! まずは汎用入出力からマスターしよう | Device Plus – デバプラ
- 第22回 Raspberry PiのGPIO概要 | ツール・ラボ
つまり今回のプログラムではGPIO4(物理ピン番号7)を信号線に指定したが、ほかの同機能と思われる端子に繋げてプログラムでの記述を合わせればつかえるっぽい。
プログラム単体で回す
ラズベリーパイのGUI画面で左上のメニューからプログラミング→Thonny Python IDEというのを選び起動する。
ThonnyというのはPythonのデバッガーみたいなものと理解している。
そのエディターウィンドウの中に上記プログラムをコピペして保存すればRunできる。
最後は端折り気味だが自分がわかったのだから大抵の人はわかるのではないかという気がする。よほど初心者でなければ。
やりかたの手順をおさらいすると
- 前回の記事に則って初期設定を済ませる
- サーボSG90の端子とラズベリーパイをつなげる
- Thonny Python IDEを起動する
- プログラムコードを書き込む
- ピン番号とくに制御品の番号を再確認する
- プログラムを任意の名前.pyで保存する
- Thonny Python IDEでRUNボタンを押してサーボが動くかどうか・・・
まとめと予告
今回はサーボを回すことだけに専念した記事にしたがこの記事に到達した人で試したとしてちゃんとサーボが動いただろうか?
まあそれはそれとして次回は今度はblynkサービスを使ったリモートでのサーボ操作に入っていく。サーボがちゃんと動かせなかった人は次回の記事公開までにちゃんとサーボを動かせるように他のサイトも見ていいからやっといてくれよな。
次はラズベリーパイ-スマホ-スマートロックを開閉-4 blynk仮想ボタン設定
【関連】
I-O DATA Raspberry Pi メインボード Bluetooth(R) Wi-Fi対応モデル Raspberry Pi 3 model B 安心の1年間ハードウェア保証 UD-RP3
¥5,778(2021/11/03 22:03時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す
デジタル・マイクロサーボ SG90 (1個)
¥440(2021/11/03 22:05時点の価格)
平均評価点:
>>楽天市場で探す
>>Yahoo!ショッピングで探す