概要
SunFounderのDa Vinciキットを買ったので、まずLED点滅から勉強。実行の主要部分を強調するため一部簡略化した。流れは以下の通り。
- LEDと保護抵抗を直列に繋ぎ、アノード側を電源ライン、カソード側をGPIO17に接続
- GPIO17がHIGH (3.3V)のときは電源電圧とバランスしてLEDが消灯
- GPIO17がLOW (0V)の時は電流が流れてLEDが点灯
- MicoroPythonで、GPIO17のHIGH/LOWをタイマーでウェイトさせながら切替え
要点
- GPIOを制御するライブラリー
RPi.GPIO
をGPIO
の名前でインポート GPIO.setmode(GPIO.BCM)
でBCMナンバリングモードに設定GPIO.setup(ピン番号, GPIO.OUT, initial=GPIO.HIGH)
でGPIO17を出力に設定し、初期レベルをHIGH (LED消灯)に設定GPIO.output(ピン番号, GPIO.HIGH/LOW)
で電圧レベルを切替え- キーボード割込みに
try~except KeyboardInterrupt~
を利用 - 終了時に
GPIO.cleanup()
でリソースを解放
回路図
LEDのアノード側に220Ωの抵抗を介して3V3 (3.3V)へ、カソード側はGPIO17に繋ぐ。DavinciのLEDの定格電流は不明だが20mAとすると、この回路の場合はi = 3.3/220で15mAで定格内に納まっている。
回路組み立て
ブレッドボードにGPIO拡張ボードを挿し、Raspiと接続。
テスト
コマンドライン
RaspiのThonnyを立ち上げ、コマンドラインで以下を実行していく。
まずライブラリーのインポート。
1 |
>>> import RPi.GPIO as GPIO |
エラーが出ず無事にインポートされたので、次はGPIOのモードをBCMにセット。
1 |
>>> GPIO.setmode(GPIO.BCM) |
LEDのピン番号をBCMの17にセット。
1 |
>>> led = 17 |
GPIO17を出力用にし、初期値をHIGH (3.3V)にセット。
1 |
>>> GPIO.setup(led, GPIO.OUT, initial=GPIO.HIGH) |
GPIO17の電圧レベルをLOW (0V)にセットし、LEDの点灯を確認。
1 |
>>> GPIO.outpu(led, GPIO.LOW) |
GPIO17の電圧レベルをHIGHにセットし、LEDの消灯を確認。
1 |
>>> GPIO.output(led, GPIO.LOW) |
スクリプト
とりあえず以下のスクリプトでLEDの点滅を確認。
1 2 3 4 5 6 7 8 9 10 11 12 |
import RPi.GPIO as GPIO import time led_cathode = 17 GPIO.setmode(GPIO.BCM) GPIO.setup(led_cathode, GPIO.OUT, initial=GPIO.HIGH) while True: GPIO.output(led_cathode, GPIO.LOW) time.sleep(0.5) GPIO.output(led_cathode, GPIO.HIGH) time.sleep(0.5) |
CTRL-Cでキーボード割込みがあったときに安全に終了するための処理を導入。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 |
import RPi.GPIO as GPIO import time # Define that LED cathode is connected to GPIO17 led_cathode = 17 # Define a GPIO setup function def setup(): # Set the GPIO mode to BCM numbering GPIO.setmode(GPIO.BCM) # Set LED pin (GPIO17) to output and initial level to Hith (3.3V) GPIO.setup(led_cathode, GPIO.OUT, initial=GPIO.HIGH) # Define a destroy function for safe ending def destroy(): # Turn off LED GPIO.output(led_cathode, GPIO.HIGH) # Release resource GPIO.cleanup() # Define a main function for LED blinking process def main(): while True: # Turn on LED and wait 0.5sec GPIO.output(led_cathode, GPIO.LOW) time.sleep(0.5) # Turn off LED and wait 0.5sec GPIO.output(led_cathode, GPIO.HIGH) time.sleep(0.5) # Setup GPIO setup() # Excecute main process with keyboard interrupt exception try: # Execute main process main() # Quit process when CTRL-C is pressed except KeyboardInterrupt: # Cleanup before end process destroy() |
SunFounderサイトではsetup()以下をif __name__ == '__main__':
ブロックの中に入れているが、これはこのファイルが直接実行されたことを確認するためのもの
1 2 3 4 5 6 |
if __name__ == '__main__': setup() try: main() except KeyboardInterrupt: destroy() |
接続を反対にする
左記の回路ではLEDのアノード側に3.3Vを供給し、カソードを接続したGPIO17でHIGHの時にLED消灯、LOWの時にLED点灯とした。
一方、以下のようにアノード側の抵抗をGPIO17に接続し、カソードをGNDに接続しても動作させることができる。この場合、GPIO17がHIGHでLED点灯、LOWでLED消灯となる。
コードは以下の通り。GPIO.setup()
ではinitial
のデフォルトがGPIO.LOW
として明示的に指定していない。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 |
import RPi.GPIO as GPIO import time led_anode = 17 def setup(): GPIO.setmode(GPIO.BCM) GPIO.setup(led_anode, GPIO.OUT) def destroy(): GPIO.output(led_anode, GPIO.LOW) GPIO.cleanup() def main(): while True: GPIO.output(led_anode, GPIO.HIGH) time.sleep(0.5) GPIO.output(led_anode, GPIO.LOW) time.sleep(0.5) setup() try: main() except KeyboardInterrupt: destroy() |