雑に学ぶ電子工作入門
雑に学ぶ電子工作入門 第2回:ラズパイPicoで「お風呂に入れ装置」を作るd
こんにちは! フリーランスライター/編集者のシモカワです。鬼の文系&電子工作経験ほぼゼロ! そんな私が第1回に引き続き、石川大樹さんをお招きしてゆる~い電子工作に挑戦。今回も、怠惰な己に喝を入れてくれる便利グッズを作っていきますよ。
「お風呂に入れ装置」を作る
いやあ、めんどくさいですよね。何がって? お風呂に入るのがですよ……。
分かりますよ、入れば気持ちいいし、入ってしまえば「めんどくさいな」と思っていたことも忘れるってことぐらい。でも、めんどくさいんですよ。「お風呂、入らんとな~」と思いながらテレビを見たり、パソコンに向かったりしていて数時間たってたこともザラです。
「ってことは、強制的に視界を遮れるグッズがあれば良いのでは!?」と思い至り、早速石川さんに相談。「では、お風呂に入らずにいると視界がふさがれて他のことができなくなる装置を作りましょう!」ということで、電子工作と言いつつ物理で訴えるスタイルの工作に挑戦します!
作り方はこちらです!
1.垂れ幕を作る
2.サーボモーターを動かす
3.垂れ幕を付けてみる
4.プログラムについて知る
そして、今回の材料はこちら!
電子部品
- Raspberry Pi Pico WH(←今回はWHのないPicoでもOK)
- サーボモーター SG-90★
- タクトスイッチ
- USB延長ケーブル
- USBケーブル USB2.0 Type-Aオス⇔マイクロBオス
- ブレッドボード BB-801★
- ブレッドボード・ジャンパーワイヤー(オス-オス)
- 電子ブザー 3V UDB-05LFPN★
- 抵抗10kΩ
工具
- ワイヤーストリッパー DVC-WS102★ ※今回はペンチ代わりに使用。ペンチでも可
その他の材料
- コピー用紙
- 筆ペン(太めのマジックでも可)
- 乾電池(単3か単4)
- 輪ゴム
- マスキングテープ
★の部品に記載されている型番は一例です
今回購入したのはサーボモーター、タクトスイッチ、USB延長ケーブルのみ。コピー用紙や乾電池などは、自宅にあったものです。前回買った材料を再び使っていることもありますが、調達した材料は前回に比べるとすごく少ないぞ!? いいのかな?
っていうか、本題に入る前に恐縮ですが、タクトスイッチってかわい過ぎませんか!? 足! 足が生えておりますがな! 紛失したり壊したりすることを想定して少し多めに買ったので、工作する前に(石川さんに内緒で)おふざけ写真を撮りました。 自信作はこの2枚です。
あー楽しい。もう今回の記事のメイン、コレで良くないですか?
いやータクトスイッチかわいいですよね。今回は出てきませんがフォトカプラもかわいいです。それはそうとメインがこれでいいわけねえだろ、工作やるぞ!!
1.垂れ幕を作る
まず取り出しましたるは、紙と筆ペン! 好きな文字を書いて、垂れ幕を作りましょう。今回は「お風呂入れ装置」なので、シンプルに「風呂入れ!」にしてみました。
くるくるっと巻いてクセを付け、紙の下に重りとして乾電池を貼り付けます。さらに裏面に輪ゴムを貼り付けたら、完成です。わーい。
ポイントは、裏面の輪ゴムの位置をうまーく調整すること。紙の中央部分に、こんな感じで輪ゴムの上の方が短くなるように貼ります。
まあね、今でこそこんなこと言ってますけど、私、この「輪ゴムの位置をうまーく調整する」のができなさ過ぎてリテイク連発してますからね。電子工作とは? ってなりましたからね。マスキングテープさまさまですからね。詳しくは記事の後半で。
ちなみに石川さんの垂れ幕はこちら。
今回はできるだけシンプルな仕組みで垂れ幕を制御できるように考えました。
動作前:裏面の輪ゴムをストッパーに引っ掛けて、垂れ幕を留める
↓
動作時:ストッパーを外すと垂れ幕が下りる
重りや、ちょうどいい位置に輪ゴムを貼るのはそのための下準備です。実際どういう動きをするかは、電子工作してから試しましょうか。
2.サーボモーターを動かす
続いては、垂れ幕をベローンと下ろすための動力を作ります。使うのは、サーボモーターとブレッドボード、ジャンパーワイヤー、「Raspberry Pi(ラズパイ)Pico」。目指す姿は以下の図の通りです。
まずはブレッドボードにラズパイPicoをはめ込みます。覚えてますよー、ラズパイPicoは結構丈夫だから、端っこからギュギュっと押せばキレイに入るってこと! ほら見てください、一発でフラットにできちゃいました!
では次にジャンパーワイヤーと、サーボモーターを挿していきます。……ってあれ、なんだこのサーボモーターの先端は? ブレッドボードに挿さらんじゃん。
と思ったのですが、よーく見ると小さな穴が開いていて、ジャンパーワイヤーが挿せるようになっていました。しかも別に「黒い部分をスライドして差し込み口を引っ張り出す!」でも「黒い部分を抜き取って差し込み口を出す!」とかでもなく、直接挿しちゃうやつ。
しかもしかも、ジャンパーワイヤーが絶妙にすっきり入らない。いや、入ってるんですけどこう、うまく整列しないというか……え? いいのコレで? 石川さんに聞いたら「みちみちになりますよ」だそうな。えー、いいのかあ。
ぶーぶー言いながら配線し終わったら、今度はパソコンを使うターン。ラズパイPicoのボタンを押しながらUSBケーブルでパソコンと接続し、「Mu Editor」を開いてコードを書き込みます。
サーボモーターを動かすコードはこちら。角度と時間を調整することで、垂れ幕が下りる仕組みを作るそうです。
「『垂れ幕を下ろす』って、なんかトンデモ舞台装置とか作るのかな? 部屋に置けるかな?」とドキドキしていたので、角度を調整するシンプル&コンパクトなコードと、ぶきっちょでも作れる垂れ幕だけでその仕組みができることに感動しました。すっご~~~い!
前回は出力としてブザーとLEDを使いましたが、今回はサーボモーターです。
サーボモーターはモーターの一種ですが、ミニ四駆などに使うギューンと回り続けるモーターと違い、「90度まで回す」「0度に戻す」って感じで角度を指定して動かせる部品です。
実はこの部品、めちゃめちゃ多用途。物を回すのはもちろん、ひもをつないで物を引っ張る、物を倒す、ボタンを押す、ストッパーを外す、容器を傾けて水を出す、人形やロボットの関節にする……などなど、電子工作で「動く」といえばまずサーボって感じ。
それなのに、つなぎ方もプログラムもすごく簡単で、最高です!
3.垂れ幕を付けてみる
無事にコードが書き込めたら、いよいよ垂れ幕をセッティングします! セッティングはたったの3STEPで完了です。
- USBケーブルが付いた状態で、ブレッドボードをモニターのてっぺんに固定する
- その隣に垂れ幕も固定する
- Mu Editorでプログラムを動かす
あら~? こんな少しでいいんですか? 今回の記事、もう終わっちゃうよ? さあ、セッティングしましたよ。
いざ、プログラム起動! これで幕が下り…………ない。
気を取り直してもう一度!
……下りない! なんで? この後何回やっても、ぜ~んぜん幕は下りませんでした。
ここからは地獄の微調整タイム。とりあえず思いつく策を手当たり次第に試します。試した内容と結果はこちら。
- 垂れ幕を貼る位置を調整する→下りない
- コード上でサーボモーターの羽(?)の角度を調整する→下りない
- ブレッドボードと垂れ幕の距離を調整する→下りない
- サーボモーターを設置する場所をちょっとずらす→下りない
もうなんでもいいからとりあえずあらゆる場所を調整しよう! と半ばやけになりつつリテイクすること約20回……途中から数えるのをやめたので分かりませんが、たぶん約20回……ようやく幕が下りました! じゃん!
結局、垂れ幕の輪ゴムを貼る位置を微調整したらスルッと下りました。電子工作関係ないやないかい!!!!! 2回目にして、連載の意義を見失いそうです。
ていうか、今気付いたんですけど、これ毎回セットしないといけないんですよね。しかも、一回下りた幕は手作業で巻き直さないといけないですよね。だったら、さっさとお風呂に入ってしまった方がいいんじゃ……何でもありません。はい、完成完成! やったー!
シモカワさんお疲れさまでした!
さっき、サーボモーター動かすのはすごく簡単って言ったじゃないですか。でも実は、動く電子工作の大変さって、電子回路やプログラム以外のところなんですよね。
今回だったらサーボモーターと垂れ幕の位置関係、垂れ幕の裏の輪ゴムを貼る位置、サーボモーターを動かす角度、そういう細かいところの微調整で、期待する動きが得られたり得られなかったりします。試行錯誤の連続。
もちろんその先には「きちんとメカを設計して堅実に動かす」という次のステップがあるわけですが、逆に言えば、試行錯誤の回数さえ増やせばメカのノウハウがなくても動くものを作れるんです! これぞ雑の極意。
ちなみに今回、起動して10秒後に垂れ幕が下りてくるので、これは何の装置なんだ……? って感じになってますが、本来は
- あと30分後に風呂に入るぞ! という決意をしてスイッチオン
- 30分後に垂れ幕が下りて絶対に風呂に入れる というものでした。
でも10秒ですぐ結果が出た方が、シモカワさんがうれしそうなので、これでOK!
……ってことで、基本動作はいったん完成。ここからはプログラムの勉強を兼ねて、少し機能を追加してみます。
4.プログラムについて知る
……って、あれ? あのかわいいスイッチ、使ってない気がする。困った……このままではただのおふざけ写真要員になってしまう。
実は今回は連載2回目ということで、プログラムの中身を理解するという目標もありました。
そこで活躍するのが彼らというわけです。先ほど作った「お風呂入れ装置」に、プログラムを改造しながらもう少しいろいろ機能を付けて、より実用性アップを狙うことにしました。手順は、次の通りです!
- 垂れ幕が下りるときにブザーも鳴らすようにする
- スイッチを押せば垂れ幕が下りるようにする
順番にやってみましょう!
1.垂れ幕が下りるときにブザーも鳴らすようにする
垂れ幕だけでは「邪魔~」ってどかしてお風呂に入らないリスク(?)があるので、音も鳴らしてみます。先ほどのブレッドボードにブザーを追加して、コードも調整します!
ブザーを鳴らすためには、ブレッドボードにブザーを挿して、コードでも「これがブザーだよ」ということを指定しなければならないとのこと。なのでまず、以下のようにブレッドボードにブザーを挿し込みます。
そして再び、Mu Editorを使ってコードを書き込みます。先ほどのコードに、ブザーに関するコードを追加したものがこちら(赤枠内)です。
この状態で動かしてみると、この通り! 垂れ幕が下りると同時にブザーも鳴ります。あら、なんだか舞台の開演を思い出す響きですね。
マイコンからの出力と入力のプログラムを、順に見ていこうと思います。
まずは出力(マイコンから外部の部品を制御する)です。
プログラムの全体はすぐ上にシモカワさんが貼ってくれていますし、記事の末尾でもダウンロードできます。
プログラムは上から順に実行されるので、まずは上の方、
# どのピンを使うかの設定(ブザー)
BUZZER = Pin(22, Pin.OUT)
BUZZER.off()
この部分を見てください。
「#」で始まる行はコメントで、ただの説明書きです。プログラムの動作には影響しません。
2行目の「BUZZER = Pin(22, Pin.OUT)」でピンの設定をしています。22というのはブザーを接続しているピン番号。ここで改めて配線図を見てみましょう。
この図で、ブザーの赤い線がラズパイPicoの右側、上から12番目のピンにつながっていることが分かりますか。それぞれのピンがそれぞれ違った役割を持っているのですが……
矢印で示したピンが先ほどのピン。黄緑色のところに小さくGP22と書いてありますよね? このGP(番号)と書いてあるピンが入出力に使えるピンなんです。その中で今回は22番を使ったので、プログラムでも「BUZZER = Pin(22, Pin.OUT)」と22を指定しています。
その後のPin.OUTは、そのピンを出力の用途で使いますよということですね。
頭のBUZZERというのは変数名ですが、要はピンにBUZZERという名前を付けて、後で呼び出すときに分かりやすくしているわけです。
そして次の行で早速その名前を呼んでいます。「BUZZER.off()」ですが、これは「BUZZER君、OFFになってね」ということ。これたぶん書かなくても最初はOFFだと思いますが、一応書いておきました。
ここまでが設定。そして下の方に行くと、ブザーの制御をするプログラムもあります。
BUZZER.on() # ブザーを鳴らす
time.sleep(2) # 指定した秒数待つ
BUZZER.off() # ブザーを止める
この部分ですね。ここも#以降はコメントなので無視してOKです。
1行目と3行目でブザーをON、OFFしています。
2行目には、2秒待つコマンドが書いてあります。
これが上から順に実行されるので、ブザーが鳴る→2秒待って→止まる、ということで2秒間ブザーが鳴る動作が実行されるわけです。
さっきから鳴らすとか止めるとか言ってますが、実際に起きているのは、ピンに電流を流す/止める、という変化です。LEDでもブザーでも、単純に電流を流す/流さないで制御できる部品はこのやり方で簡単にコントロールできます。
一方で、サーボモーターを動かすのも出力ですが、サーボモーターは信号を送る必要があるので処理が少し複雑です。ただ、プログラムが設定のための部分+制御するための部分、の構成になっているのは同じ。設定部分の説明は割愛しますが、制御部分は「set_servo_angle(90)」「set_servo_angle(180)」など、1つのコマンドで数字を書き換えれば簡単に動かせます!
難しいところはコピペすればいいだけなので、こちらも簡単ですね!
というわけで、次は入力です。
2.スイッチを押せば垂れ幕が下りるようにする
ブザーが鳴ったのはうれしいけど、まだ肝心のタクトスイッチが出てきてませんね……? なので今度こそ、スイッチを登場させましょう。今までやってきた配線に、さらにスイッチと抵抗も追加します。
そして再びMu Editorを開いて、「スイッチはここですよ」のコードを書き込みました。(さも私が考えました! みたいに書いてますが、当然、考えたのは石川さんです。)
ここまでできたら、タクトスイッチをブレッドボードにプスッとやります。このとき、タクトスイッチの足をちょっとだけペンチで伸ばしてあげると挿しやすいとのこと。
まだペンチを買っていないので、今回はワイヤーストリッパーの先端を使用。不器用全開の震える手で、タクトスイッチの膝みたいな部分を伸ばしました。
ただこれでは、「ブレッドボードのスイッチを押しながら、Mu Editor上で『実行』ボタンを押す」という動作が必須。でも毎回Mu Editorを立ち上げてプログラムを起動させるのは難しそうだし、そもそも「スイッチってそういうやつだっけ?」状態……。
はい! まだ途中ですが、ここでいったんプログラムの説明です。
今度は入力(外部からの信号を受け取る)ということで、スイッチを付けました。
プログラムの変更箇所を見ていきましょう。
# どのピンを使うかの設定(スイッチ)
SWITCH = Pin(16, Pin.IN, Pin.PULL_UP)
まずここですね。今回はGP16のピンにスイッチをつないだので、ピン番号16を指定。入力なのでPin.INを指定。その後のPin.PULL_UPはプルアップ抵抗の指定をしていますが、説明すると長くなるので割愛。スイッチをつなぐときは書いておけばOKです。
続いてスイッチを読み取るところです。
status = SWITCH.value() # スイッチを読み取る
if status == 1: # ONなら
「status = SWITCH.value()」では、スイッチを読み取って、その値をstatusという名前の変数に入れています。これにより、スイッチがONならstatusは1になります。OFFのときは0になります。
で、次がIF文。条件分岐ってやつですね。
「if status == 1:」ということで、statusが1の場合のみ、つまりスイッチがONの場合のみ、以下の処理が実行されます。「以下の処理」というのは行頭が一段下がっている範囲、27~34行目のことです。これにより、スイッチがONのときだけサーボが動いたりブザーが鳴ったりするわけですね。
というわけで入力もできました!……と思うじゃないですか。でも1つ重大な欠陥があります。さっきも言いましたが、プログラムって上から順に実行されますよね。そうすると……
やりたいことは「スイッチが押されるまで待機して、押されたら実行」です。でも、このプログラムはスイッチの様子を1回だけ見に来て、押されてなかったら「あ、押されてないっすね。じゃあお先に失礼します~」つって勝手にお仕事終了しちゃうんですね。
これがシモカワさんの言う『「スイッチってそういうやつだっけ?」状態』です。
これではあかん!
そこで、スイッチを押しさえすれば垂れ幕が下りるようにしたいと思います。再びコードを調整しますよ! 細かい部分は石川さんが度々発する「これはおまじないなんですけど」のお言葉に頼りながら、以下のようなコードに書き換えました。
というわけで、プログラムの緑のカコミ部分がいわゆる「繰り返し」処理というやつです。
追加されたのは
while True:
この一行だけ。これは「ずっと繰り返す」という意味です。
繰り返しの範囲は、その下の行頭が一段下がっている部分。つまりこれ以下全部です。
さっきは
- スイッチの様子を見に行く
- 押されてたらブザーやサーボを動かす
- (押されてなかったら終わり)
でした。今回は繰り返し処理を追加することで
- スイッチの様子を見に行く
- 押されてたらブザーやサーボを動かす
- 1に戻る
になりました。これにより起動後に時間がたってからスイッチを押しても動きますし、またサーボが動いた後に再びスイッチを押しても、2回目が動きます。これで理想のスイッチが作れました!
「お風呂に入れ装置」の完成だ!
そして最終的な姿がこちら!
見事! 今度こそ! 「お風呂に入れ装置」の完成です。どうでしょう、なかなかのシャットアウト具合ではないでしょうか。これでお風呂に入るまでの時間がグッと短くなるはず!
そうそう、タクトスイッチが永遠にブレッドボードにぴったりはまらず困っていたら、石川さんに「それは最後まで入らないです」と言われてひっくり返りそうになりました。なんじゃそりゃ~!
いやー今回も面白かったですね。特に良かったのは、コードをちょこちょこいじって機能性を高めていく工程。ポケモンのレベルを上げていくような、シンプルなカレーにいろんなスパイスや具材を混ぜて凝ったカレーにしていくような、そんなじわじわとした進化を感じられる工程でした。
もしかして身の回りにあるいろんな電子機器も、こうやってじわじわ進化を経て今の形があるのでしょうか? う~ん壮大! そうだ! きっとこのまま電子工作を極めれば、私の代わりにお風呂に入ってくれるマシーンができる日が来る! ……はず! 来い! 頼むから!
てことで、次回もがんばります!
ちなみに、今回のウラ話。なんと、工作する日に着ていた服とサーボモーターの色が丸かぶりで、完全に同化してました。そんなことある?