![]() |
Lチカをやってみる |
JetsonはRaspberry Pi と同じGPIOがあります。
そこでお馴染みのLチカ(LEDをチカチカと点滅させる)をやってみます。 ネットでは下記のようなサンプルプログラムがあります。 while True: # LED消灯 GPIO.output(led_0, 0) # 1秒間スリープする time.sleep(1.0) # LED点灯 GPIO.output(led_0,1) # 1秒間スリープする time.sleep(1.0)Lチカは実現しています。しかし、このプログラムは配線のチェック用くらいの用途で拡張性がありません。 理由はtime.sleep(1.0)で1秒間時計を見ているだけでその間何もできません。例えばスイッチを押したら Lチカ終了とする。こんな機能を追加したいときスイッチを押しても最長1秒間スイッチの検出ができません。 次にちゃんと発展性のあるコードを示します。 ボタンを押したときだけLチカをします。(押していないときは消灯) 上のコードと決定的に違うのはタイマー割り込みを使って処理をします。 回路図です。 ![]() ブレッドボード図です。 ![]() コードです。 import RPi.GPIO as GPIO import time import threading from logging import NullHandler g_ledOn = False g_tm = NullHandler g_streamstop= False # Pin Definitions led_pin = 12 # BCM pin 18, BOARD pin 18 btn_pin = 18 # Board pin 21 def tm_callback(): global g_tm, g_ledOn g_tm.cancel() del g_tm g_tm = NullHandler # print( time.time() ) if g_streamstop == False: g_ledOn ^= 1 g_tm = threading.Timer( 0.5 , tm_callback ) g_tm.start() def main(): global g_tm, g_streamstop g_tm = threading.Timer( 0.1 , tm_callback ) g_tm.start() GPIO.setmode(GPIO.BCM) # BCM pin-numbering scheme from Raspberry Pi # set pin as an output pin with optional initial state of HIGH GPIO.setup(led_pin, GPIO.OUT, initial=GPIO.LOW) GPIO.setup(btn_pin, GPIO.IN) # button pin set as input while True: try: pass except KeyboardInterrupt: g_streamstop = True g_tm.cancel() g_tm = NullHandler break inp = GPIO.input(btn_pin) if inp == 1: GPIO.output(led_pin, 0) else: GPIO.output(led_pin, g_ledOn) GPIO.cleanup() if __name__ == '__main__': main()関数mainでタイマー割込みのセットをします。
threading.Timer( タイマー割込みが発生するまでの時間 , タイマー割込みのコールバック関数 );
になります。関数tm_callbackは0.1秒後に呼び出されます。関数tm_callbackの処理内容です。 このタイマー割り込みはいわゆるワンショット(1回だけ発生する)なので何回も使う場合は割り込み関数ないでタイマーの再セットをします。
mainのループでは、
タイマー割り込みで生成したg_ledOnを使って点滅します。LEDとスイッチの処理ができるようになりました。しかし、これ組込みソフトでは草野球以下のレベルです。次はどのように設計から始めるのかを紹介したいと思います。 |