OrangePi-PCを使ってみる

Python GPIOライブラリ(OPI.GPIO)


OrangePi-PC のPython GPIOライブラリのOPi.GPIOを紹介します。
元々はOrangePi-ZERO専用のライブラリでしたが、いつの間にかZEROを含め、様々なボードに対応しました。
対応ボードを見ると、H3だけでなくH5にも対応しています。
対応ボードの一覧はこち らを見ればわかります。
RaspberryPiでよく使われているRPi.GPIOのOrangePi版です。

最新版(0.4.0)ではBCM番号の指定が動かなくなっています。
ソースを一部修正する必要が有ります。
インストールは以下の手順です。
$ sudo apt-get install python-setuptools
$ git clone https://github.com/rm-hull/OPi.GPIO
$ cd OPi.GPIO
ここでソースを一部修正する。
$ vi orangepi/pc.py
詳細は以下を参照
$ sudo python setup.py install

orangepi/pc.pyを以下の様に修正します。
# Orangepi PC BCM pin to actual GPIO pin
BCM = {
    2: 12,    # I2C0_SDA/PA12 (TWI0_SDA/DI_RX/PA_EINT12)
    3: 11,    # I2C0_SCL/PA11 (TWI0_SCK/DI_TX/PA_EINT11)
    4: 6,     # PA6 (SIM_PWREN/PWM1/PA_EINT6)
    14: 13,   # PA13 (SPI1_CS/UART3_TX/PA_EINT13)
    15: 14,   # PA14 (SPI1_CLK/UART3_RX/PA_EINT14)
    17: 1,    # PA1 (UART2_RX/JTAG_CK/PA_EINT1)
    18: 110,  # PD14
    27: 0,    # PA0 (UART2_TX/JTAG_MS/PA_EINT0)
    22: 3,    # PA3 (UART2_CTS/JTAG_DI/PA_EINT3)
    23: 68,   # PC4
    24: 71,   # PC7
    10: 64,   # PC0 (SPI0_MOSI)
    9: 65,    # PC1 (SPI0_MISO)
    25: 2,    # PA2 (UART2_RTS/JTAG_DO/PA_EINT2)
    11: 66,   # PC2 (SPI0_CLK)
    8: 67,    # PC3 (SPI0_CS)
    7: 21,    # PA21 (PCM0_DIN/SIM_VPPPP/PA_EINT21)
    0: 19,    # PA19 (PCM0_CLK/TWI1_SDA/PA_EINT19)
    1: 18,    # PA18 (PCM0_SYNC/TWI1_SCK/PA_EINT18)
    5: 7,     # PA7 (SIM_CLK/PA_EINT7)
    6: 8,     # PA8 (SIM_DATA/PA_EINT8)
    12: 200,  # PG8 (UART1_RTS/PG_EINT8)
    13: 9,    # PA9 (SIM_RST/PA_EINT9)
    19: 10,   # PA10 (SIM_DET/PA_EINT10)
    16: 201,  # PG9 (UART1_CTS/PG_EINT9)
    26: 20,   # PA20 (PCM0_DOUT/SIM_VPPEN/PA_EINT20)
    20: 198,  # PG6 (UART1_TX/PG_EINT6)
    21: 199,  # PG7 (UART1_RX/PG_EINT7)
}

RPi.GPIOは物理ピン番号(GPIO.BOARD)と、BCM番号(GPIO.BCM)でポートを指定することができます。
OPi.GPIOも物理ピン番号(orangepi.pc.BOARD)と、BCM番号(orangepi.pc.BCM)でポートを指定するこ とができます。

物理ピン番号で指定する場合、以下のコードでOPi-PCのPin#26のLEDがLチカします。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import orangepi.pc
import OPi.GPIO as GPIO
from time import sleep            # this lets us have a time delay

pin=26
GPIO.setmode(orangepi.pc.BOARD)   # set up BOARD numbering
GPIO.setup(pin, GPIO.OUT)         # set pin 26 as an output (LED)

try:
    print ("Press CTRL+C to exit")
    while True:
        GPIO.output(pin, 1)       # set port/pin value to 1/HIGH/True
        sleep(0.1)
        GPIO.output(pin, 0)       # set port/pin value to 0/LOW/False
        sleep(0.1)

        GPIO.output(pin, 1)       # set port/pin value to 1/HIGH/True
        sleep(0.1)
        GPIO.output(pin, 0)       # set port/pin value to 0/LOW/False
        sleep(0.1)

        sleep(0.5)

except KeyboardInterrupt:
    GPIO.output(pin, 0)           # set port/pin value to 0/LOW/False
    GPIO.cleanup()               # Clean GPIO
    print ("Bye.")

BCM番号で指定する場合、以下のコードでOPi-PCのPin#26のLEDがLチカします。
#!/usr/bin/env python
# -*- coding: utf-8 -*-

import orangepi.pc
import OPi.GPIO as GPIO
from time import sleep            # this lets us have a time delay

pin=7
GPIO.setmode(orangepi.pc.BCM)     # set up BCM numbering
GPIO.setup(pin, GPIO.OUT)         # set BCM7 (pin 26) as an output (LED)

try:
    print ("Press CTRL+C to exit")
    while True:
        GPIO.output(pin, 1)       # set port/pin value to 1/HIGH/True
        sleep(0.1)
        GPIO.output(pin, 0)       # set port/pin value to 0/LOW/False
        sleep(0.1)

        GPIO.output(pin, 1)       # set port/pin value to 1/HIGH/True
        sleep(0.1)
        GPIO.output(pin, 0)       # set port/pin value to 0/LOW/False
        sleep(0.1)

        sleep(0.5)

except KeyboardInterrupt:
    GPIO.output(pin, 0)           # set port/pin value to 0/LOW/False
    GPIO.cleanup()              # Clean GPIO
    print ("Bye.")

どちらもRPi.GPIOと完全に互換性があります。
RaspberryPi用に作られたこ ちらのコードが少しの変更で動くようになります。
BCM番号 物理ピン番号 BCM番号

1 2
2
3 4
3
5 6
4
7 8 14

9 10 15
17
11 12 18
27
13 14
22
15 16 23

17 18 24
10 19 20
9 21 22 25
11 23 24 8

25 26 7
0 27 28 1
5 29 30
6 31 32 12
13 33 34
19 35 36 16
26 37 38 20

39 40 21

色々なボードに対応しているのが嬉しいですが、SPIとi2cには対応していません。。

次回はWiringPi-Python(WiringPi-Python- OP)ライブラリを紹介します。