りなっくすとらずぱい!

Raspberry Pi初心者に向けた各コマンドの説明、プログラムの作り方について紹介しています!

Raspberry Piで電子工作する (1 - pythonでLEDをチカチカさせる)

f:id:ibuquicallig:20190606094250p:plain

この記事ではいわゆるLチカと呼ばれている、LEDをチカチカするだけの電子工作をRaspberry Piを使用して作る方法について解説しています。

この記事でできること

  • Raspberry Piのピンの役割を知る
  • 回路を組んでみることができる
  • コマンドラインからLEDをチカチカさせることができる

前の記事

前回の記事ではLチカするために必要な電子部品などを解説しました。まだブレッドボードやLED自体を手に入れていない方は、以下のページを参考にして揃えましょう!

回路を作る

部品

まずは回路の作成です。今回使う電子部品は以下の3つとなります。

備考
ブレッドボード
LED
抵抗器 330Ωのもの(330R/橙-橙-黒-金)
ジャンパワイヤ オス―メスx1本、オス-オスx1本

ブレッドボードについて

f:id:ibuquicallig:20190606085753p:plain

ブレッドボードの構造について説明します。多くのブレッドボードは上のような形となっており、電源用の2行回路用の複数行で構成されています。この行がない小さなブレッドボードもありますがその場合は、下の回路用の行にそのまま刺します。

電源用の行は横向きにつながっており、そのまま電源のプラスとマイナス(GND)用のピンとして使用します。回路用の行は縦向きにつながっており、AからEのどこに刺しても同じ列である限り同じ(とりあえずは)OKとなります。

Raspberry Piで使用するピン

Raspberry Pi側ではGNDピンと18番ピンを今回は使用します。番号の降られているピンはあとから実行するコマンドで変更できるのでどこでもいいのですが、なるべくコンパクトで重なりのない回路となる方がベストです。

ピン番号は以下のページを参考にしてください。

ブレッドボードにピンを刺してみる

最終的には以下のような感じの回路になります。

f:id:ibuquicallig:20190606090108p:plain

抵抗器には向きはありませんが、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ピンを使用した回路は出来上がっているので、別のピンで同じ回路を作成します。

f:id:ibuquicallig:20190606090216p:plain

このようにしてもう一つ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というモジュールを使用して、室温と湿度を取得してみたいと思います。

次の記事

参考

以下のサイトの情報を引用・参考にしました。