DragonBoard 410c(Debian)でGPIOプログラミング(Python編)
前回まではC言語でGPIOを触っていましたが、流石に最近はpythonとかnode.jsで触りたいですね。
折角、pythonのラッパーもインストールしてあるのでpython編となります。 早速サンプルを眺めてみます。
#!/usr/bin/python import time from gpio_96boards import GPIO GPIO_A = GPIO.gpio_id('GPIO_A') pins = ( (GPIO_A, 'out'), ) def blink(gpio): for i in range(5): gpio.digital_write(GPIO_A, GPIO.HIGH) time.sleep(i) gpio.digital_write(GPIO_A, GPIO.LOW) time.sleep(1) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser( description='Blink LED on GPIO A (pin 23)') args = parser.parse_args() with GPIO(pins) as gpio: blink(gpio)
基本はLチカなので実行すればGPIO_A
(GPIO 23pin)に接続したLEDが点灯します。
$ sudo python blink.py
サンプルのままなので実行に関しては特に問題はありません。部分を見ていきます。
モジュールの読み込み
from gpio_96boards import GPIO
gpio_96boars
がモジュールになるようです。
GPIOのピンの指定
GPIO_Aを指定します。変数名もGPIO_Aなので少しわかりにくいかも。
GPIO_A = GPIO.gpio_id('GPIO_A')
指定したPINとIN/OUTのディレクションをタプルとして保存します。
pins = ( (GPIO_A, 'out'), )
出力
設定したタプルに対して値を書き込む処理となります。
gpio.digital_write(GPIO_A, GPIO.HIGH)
ここでは引数のgpio
が先程のタプルであるpins
に相当します。
digital_write()
で値を書き込むことになります。最初はなんで引数にGPIO_A
を渡さなければいけないのか謎があったのですが、タプルの中に複数のGPIOの設定を入れればいいのかと思って納得しました。
引数にはタプルので指定したGPIOと値をいれると出力ができます。C言語とは少し違う印象ですが、割りと冗長性も少なくできるのでわかりやすいです。
入力
今度は入力になりますが、出力と同様に
- GPIOのピンの指定
- GPIOからの入力
というステップになります。
出力と入力の対比をしたほうが理解がし易いかなと思います。
GPIO_A = GPIO.gpio_id('GPIO_A') GPIO_C = GPIO.gpio_id('GPIO_C') pins = ( (GPIO_A, 'out'), (GPIO_C, 'in'), )
ピンの設定はまんま同じですが、ディレクションに関してはタプルの中に書いていくことになります。複数のピンがあると冗長性が少なくなるのがこれでわかるかと思います。
入力に関しては
t = gpio.digital_read(GPIO_C)
こんな感じになると思います。取得した値はGPIO.HIGHとGPIO.LOWとなります。
ということでGPIO_Cのタクトスイッチを押したら、GPIO_Aに接続したLEDが点灯するサンプルをかいてみました。C言語編のソースをpythonに移植しています。
#!/usr/bin/python import time from gpio_96boards import GPIO usleep = lambda x: time.sleep(x/1000000.0) GPIO_A = GPIO.gpio_id('GPIO_A') GPIO_C = GPIO.gpio_id('GPIO_C') pins = ( (GPIO_A, 'out'), (GPIO_C, 'in'), ) def blink(gpio): led_state = GPIO.HIGH last_t = GPIO.LOW while True: t = gpio.digital_read(GPIO_C) if (t and (not last_t)) : gpio.digital_write(GPIO_A, led_state) usleep(100000) if led_state == GPIO.HIGH: led_state = GPIO.LOW else: led_state = GPIO.HIGH last_t = t usleep(1) if __name__ == '__main__': import argparse parser = argparse.ArgumentParser( description='Blink LED on GPIO A (pin 23)') args = parser.parse_args() with GPIO(pins) as gpio: blink(gpio)
C言語編同様にタクトスイッチでON/OFFができるようになりました。起動時の引数を付けたときのusageメッセージはめんどくさいかったので直してませんw。
終わりに
これでC言語でもpythonでもGPIOの入力・出力ができるようになりました。C言語でも同じことはできるのですが、やっぱりpythonの方が作りやすいかなと思いました。
もうそろそろ作品ぽいものを作らないと行けないのですが、アイデアがちょっとまだまとまっていないのでどうすれば…。