OrangePi-ZEROを使ってみる

GPIO Pythonライブラリ

前回、ZERO専用のWiringOPライブラリ(WiringOP libary for the Orange Pi Zero)を紹介しました。
となると、気になるのがPythonライブラリです。
OrangePi-PCをサポートしているライブラリが、ZEROでも使えるのかどうか調べてみました。


orangepi_PC_gpio_pyH3

https://github.com/duxingkei33/orangepi_PC_gpio_pyH3

ライブラリ内で指定するピン番号は以下の様になります。
OPI-PCとの互換性はありません。
()内の表記のあるピンは番号で指定しても、PORTオブジェクトで指定しても構いません。
()内の表記のないピンはOPI-PCには無い(正確にはSOCにはあるが、ピンヘッダーに出ていない)ポートなので
番号で指定する必要が有ります。
ライブラリ内で指定する番号 物理Pin番号 ライブラリ内で指定する番号

1 2
12(port.PA12) 3 4
11(port.PA11) 5 6
6(port.PA6) 7 8 198(port.PG6)

9 10 199(port.PG7)
1(port.PA1) 11 12 7(port.PA7)
0(port.PA0) 13 14
3(port.PA3) 15 16 19(port.PA19)

17 18 18(port.PA18)
15 19 20
16 21 22 2(port.PA2)
14(port.PA14) 23 24 13(port.PA13)

25 26 10(port.PA10)

以下のコードで動作を確認することができます。
# -*- coding: utf-8 -*-
from pyA20.gpio import gpio
from pyA20.gpio import port
import time
import sys

PIN = port.PA10

argvs = sys.argv
argc = len(argvs)

if (argc == 2):
  PIN = int(argvs[1])

print "PIN=",PIN
gpio.init()
gpio.setcfg(PIN, gpio.OUTPUT)

for _ in xrange(5):
    gpio.output(PIN,True)
    time.sleep(1.0)
    gpio.output(PIN,False)
    time.sleep(1.0)

以下のコードでオンボードの赤のLEDがLチカします。
# -*- coding: utf-8 -*-
from pyA20.gpio import gpio
from pyA20.gpio import port
import time
import sys

PIN = 17
gpio.init()
gpio.setcfg(PIN, gpio.OUTPUT)

for _ in xrange(5):
    gpio.output(PIN,True)
    time.sleep(1.0)
    gpio.output(PIN,False)
    time.sleep(1.0)


orangepi_PC_gpio_pyH3 Update

https://github.com/nvl1109/orangepi_PC_gpio_pyH3

オリジナルのライブラリ(https://github.com/duxingkei33/orangepi_PC_gpio_pyH3)から
以下のPORTオブジェクトを変更・追加したライブラリです。
port.STATUS_LED
port.PA15
port.PA16

機能はオリジナルと変わりません。


WiringPi-Python-OP

https://github.com/lanefu/WiringPi-Python-OP

ライブラリ内で指定するピン番号は以下の様になります。
こちらも、OPI-PCとの互換性はありません。
このライブラリはWiringOPのラップ関数ですが、ラップ元のライブラリがWiringOPです。
$HOME/WiringPi-Python-OP/WiringPi にWiringOPのコードを抱えています。
WiringOPでサポートしていないPA15(Pin#19) PA16(Pin#21) はサポートしていません。
ライブラリ内で指定する番号 物理Pin番号 ライブラリ内で指定する番号

1 2
8 3 4
9 5 6
7 7 8 28

9 10 29
0 11 12 21
2 13 14
3 15 16 30

17 18 31
使えない 19 20
使えない 21 22 6
16 23 24 15

25 26 24

以下のコードで動作を確認することができます。
# -*- coding: utf-8 -*-
import wiringpi
import time
import sys

OUTPUT = 1
HIGH = 1
LOW = 0
PIN = 15

argvs = sys.argv
argc = len(argvs)

if (argc == 2):
  PIN = int(argvs[1])

print "PIN=",PIN
wiringpi.wiringPiSetup()
wiringpi.pinMode(PIN,OUTPUT)
wiringpi.digitalWrite(PIN,LOW)
for _ in xrange(5):
  wiringpi.digitalWrite(PIN,HIGH)
  time.sleep(1)
  wiringpi.digitalWrite(PIN,LOW)
  time.sleep(1)


OPi.GPIO

https://github.com/rm-hull/OPi.GPIO

RaspberryPiでよく使われているRPi.GPIOのOrangePi版です。
当初はOrangePi-ZERO専用でしたが、いつの間にか様々なボードに対応しています。
インストールは以下の手順です。
$ sudo apt-get install python-setuptools
$ sudo easy_install pip
$ sudo pip install --upgrade OPi.GPIO

ソースを見たい場合は以下の手順です。
$ sudo apt-get install python-setuptools
$ git clone https://github.com/rm-hull/OPi.GPIO
$ cd OPi.GPIO
$ sudo python setup.py install

RPi.GPIOは物理ピン番号(GPIO.BOARD)と、BCM番号(GPIO.BCM)でポートを指定することができますが、
OPi.GPIOも物理ピン番号(GPIO.BOARD)と、BCM番号(GPIO.BCM)でポートを指定することができます。
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

以下のコードで物理ピン番号の動作を確認することができます。RPi.GPIOと完全に互換性が有ります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
import time
import sys

argv = sys.argv
argc = len(argv)

pin = int(argv[1])
print "pin#=",pin
GPIO.setmode(GPIO.BOARD)
GPIO.setup(pin, GPIO.OUT)

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

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

以下のコードでBCM番号の動作を確認することができます。RPi.GPIOと完全に互換性が有ります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
import time
import sys

argv = sys.argv
argc = len(argv)

pin = int(argv[1])
print "pin#=",pin
GPIO.setmode(GPIO.BCM)
GPIO.setup(pin, GPIO.OUT)

try:
    print ("Press CTRL+C to exit")
    while True:
        GPIO.output(pin, 1)       # set port/pin value to 1/HIGH/True
        time.sleep(0.5)
        GPIO.output(pin, 0)       # set port/pin value to 0/LOW/False
        time.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では入力ピンのセットアップ時にプルアップ、プルダウンを指定することができますが、OPi.GPIOではできません。
RISING割り込みの時はプルダウン、FALLING割り込みの時はプルアップの外部抵抗を追加する必要が有ります。
全てのポートで割り込みが使えるわけではなく、PA11/PA19/PA18のピンでは割り込みが動きませんでした。
ソースをチラ見しましたがよく分かりません。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BCM)
GPIO.setup(14, GPIO.IN)
GPIO.setup(15, GPIO.IN)

def callback(channel):
    if (channel == 14):
       print "Rising edge detected. channel=",channel
    if (channel == 15):
       print "Falling edge detected. channel=",channel

#You need external pulldown register
GPIO.add_event_detect(14, GPIO.RISING, callback=callback)
#You need external pullup register
GPIO.add_event_detect(15, GPIO.FALLING, callback=callback)

try:
    print ("Press CTRL+C to exit")
    while True:
      time.sleep(0.1)

except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    print ("Bye.")

以下のコードで入力待ちの動作を確認することができます。
こちらもRISING入力待ちの時はプルダウン、FALLING入力待ちの時はプルアップの外部抵抗を追加する必要が有ります。
#!/usr/bin/env python
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

GPIO.setup(14, GPIO.IN)
GPIO.setup(15, GPIO.IN)

try:
#You need external pulldown register
    print "Waiting for rising edge on port 14"
    GPIO.wait_for_edge(14, GPIO.RISING)
    print "Rising edge detected."

#You need external pullup register
    print "Waiting for falling edge on port 15"
    GPIO.wait_for_edge(15, GPIO.FALLING)
    print "Falling edge detected."
    GPIO.cleanup()       # clean up GPIO

except KeyboardInterrupt:
    GPIO.cleanup()       # clean up GPIO on CTRL+C exit
    print("Bye.")

次回は、WiringPi-Python-OPライブラリを、 WiringPi-Python-OP-ZEROライブラリにアップデートする方法を紹介します。