この記事ではいわゆるLチカと呼ばれている、LEDをチカチカするだけの電子工作をRaspberry Piを使用して作る方法について解説しています。
この記事でできること
- Raspberry Piのピンの役割を知る
- 回路を組んでみることができる
- コマンドラインからLEDをチカチカさせることができる
前の記事
前回の記事ではLチカするために必要な電子部品などを解説しました。まだブレッドボードやLED自体を手に入れていない方は、以下のページを参考にして揃えましょう!
回路を作る
部品
まずは回路の作成です。今回使う電子部品は以下の3つとなります。
名 | 備考 |
---|---|
ブレッドボード | |
LED | |
抵抗器 | 330Ωのもの(330R/橙-橙-黒-金) |
ジャンパワイヤ | オス―メスx1本、オス-オスx1本 |
ブレッドボードについて
ブレッドボードの構造について説明します。多くのブレッドボードは上のような形となっており、電源用の2行と回路用の複数行で構成されています。この行がない小さなブレッドボードもありますがその場合は、下の回路用の行にそのまま刺します。
電源用の行は横向きにつながっており、そのまま電源のプラスとマイナス(GND)用のピンとして使用します。回路用の行は縦向きにつながっており、AからEのどこに刺しても同じ列である限り同じ(とりあえずは)OKとなります。
Raspberry Piで使用するピン
Raspberry Pi側ではGND
ピンと18
番ピンを今回は使用します。番号の降られているピンはあとから実行するコマンドで変更できるのでどこでもいいのですが、なるべくコンパクトで重なりのない回路となる方がベストです。
ピン番号は以下のページを参考にしてください。
ブレッドボードにピンを刺してみる
最終的には以下のような感じの回路になります。
抵抗器には向きはありませんが、LEDには向きがあるので注意してください。
足の長い方(アノード(A))が18
ピンと繋がり、足の短い方(カソード(K))が抵抗器を通してGND
に繋がります。ダイオードなどを今後も使用するかもしれませんので、電流はアノードからカソードへ流れると覚えておきましょう。
全体の電流の動きとしては、まずはRaspberry Piの18
ピンから電流が流れていき、LEDに到達します。それから抵抗器を通してGND
ピンに流れていき、回路が完成します。
このままではまだ18
ピンから電流は流れていないです。18
ピンにつながっているワイヤを3.3V
のピンにつなぐことで常時点灯させることができます。無事点灯することが確認出来たら18
ピンに戻しておきましょう。
点灯しない場合は、ピンを刺す行列が間違っていないか、LEDの向きが逆になっていないかどうか、Raspberry Piの電源がONになっているかどうかを確認してください。
pythonで実行する
それではコマンドライン上の処理で18
ピンをオンにしてみましょう。コマンドライン上から直で実行することもできますが、おとなしく簡単なpython
を使用しましょう。
エディタを開いてled.py
というファイルを作成しましょう。
$ vim led.py
# またはnano led.py
中の処理は以下のような感じにします。
import RPi.GPIO as GPIO GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(18,GPIO.OUT) GPIO.output(18,GPIO.HIGH)
これをpython led.py
で実行するとLEDが常時点灯します。18
ピン以外を使用している場合は適宜ピン番号の部分を変更してください。
import RPi.GPIO as GPIO
は半ばおまじないのような文ですが、これを書くことでGPIO
という名前でRaspberry PiのGPIOピンの操作を行うことができます。
18
ピンを出力モードの設定、最後に18
ピンの電流をONにするという感じです。ピンは出力/入力モードのどちらかに設定する必要があり、ボタンなどの外部からのデータを取得するときには入力モード、今回のように外部の装置に電流などを送る場合には出力モードに設定します。
GPIO.output(18,GPIO.HIGH)
とすることで電流が流れます。
このままだとLEDが点いたままなので消すために一部処理を追加します。
先ほどのコードを修正して以下のようにします。
import RPi.GPIO as GPIO import time # ここを追加 GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(18,GPIO.OUT) GPIO.output(18,GPIO.HIGH) # ここ以下を追加 time.sleep(1) GPIO.output(18,GPIO.LOW)
また別のtime
というのをインポート(読み込み)しています。これはあとからtime.sleep()
という処理を一時停止するために使います。
処理の最後にピンの電源をオフにする処理を追加したことにより毎回消えるようになりました!sleep()
に指定している数値は次の行を実行するまで待つ秒なので、ここを変更することで点灯している時間を指定することができます。
コマンドを変えてチカチカさせてみる
点灯して消えるだけでは芸がないので点灯と消灯を一定間隔で実行するようにしましょう🤣
ループ処理を行うためにはwhile
文を使用します。
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(18,GPIO.OUT) count = 0 while count < 5: GPIO.output(18,GPIO.HIGH) time.sleep(1) GPIO.output(18,GPIO.LOW) time.sleep(1) count += 1
これで5回光った後、処理を終了します。実行には先ほどと同じくpython led.py
でOKです。
Pythonの場合インデントがブラケット{}
の役割をするので注意してください。また、他言語で使えるインクリメントが使用できないです。(count++
は使えない)
LED2個でチカチカさせてみる
最後に2個のLEDを使用して交互にチカチカさせてみましょう!すでに18
ピンを使用した回路は出来上がっているので、別のピンで同じ回路を作成します。
このようにしてもう一つLEDと抵抗を足します。プログラムから変更できるので度のピンでも構いませんが今回は23
ピンを使用します。画像のような感じのブレッドボードの場合、GNDを刺している行はすべて繋がっているので新たに配線する必要はありません。
プログラムは以下のようにして修正します。
import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) GPIO.setwarnings(False) GPIO.setup(18,GPIO.OUT) GPIO.setup(23,GPIO.OUT) count = 0 GPIO.output(18, GPIO.HIGH) GPIO.output(23, GPIO.LOW) time.sleep(1) while count < 10 : GPIO.output(18, not GPIO.input(18)) GPIO.output(23, not GPIO.input(23)) time.sleep(1) count += 1 GPIO.cleanup()
今回のみそはnot演算子です。1番目のLEDがONの状態からOFFにするには現在のピンのON/OFF状態を読み取って、その逆をピンに設定しなおすことで簡潔に実装できます。
出力ピンに設定しているピンでもGPIO.input()
を使用することで現在の状態を取得できます。その値の逆となるようにnot
演算子を使用しています。他言語であえて書くならば!GPIO.input()
という感じですね👏
また、最後に部分でGPIO.cleanup()
を実行してピンの状態を初期状態に戻しています。これにより処理終了時にピンの使用状況を解除することができます。解除しないと次のプログラムを実行したときに怒られたり、うまく動作しなかったりしますので必ず最後に書くようにしましょう。
最後に
無事にLチカできたでしょうか?電子工作におけるHello World的なプログラムでしたが、やっぱりちゃんと光ってくれると嬉しいですよね😉😉
GPIOを使うときの初期セットアップとピンの設定、ピンのON/OFFの管理、値の読み取りと基本的な内容はこれで経験できているはずです。LEDと違うほかのモジュールでも基本的には同じような処理となります(電源ON > Dataピンからデータを読み取り > 電源OFF)。
今回はPythonを使用して進めましたが、他にもJavaScript(Node.js)等でもできます。私個人としてはサーバー処理と組み合わせたいのでNode.jsで動かすことが多いです。
次はDHT11
というモジュールを使用して、室温と湿度を取得してみたいと思います。
次の記事
参考
以下のサイトの情報を引用・参考にしました。