DragonBoard 410c(Debian)でGPIOプログラミング(Python編)

DragonBoard 410c(Debian)でGPIOプログラミング(Python編)

前回まではC言語でGPIOを触っていましたが、流石に最近はpythonとかnode.jsで触りたいですね。

uepon.hatenadiary.com

uepon.hatenadiary.com

折角、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言語とは少し違う印象ですが、割りと冗長性も少なくできるのでわかりやすいです。

入力

今度は入力になりますが、出力と同様に

  1. GPIOのピンの指定
  2. 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の方が作りやすいかなと思いました。

もうそろそろ作品ぽいものを作らないと行けないのですが、アイデアがちょっとまだまとまっていないのでどうすれば…。