OrangePi-ZEROを使ってみる

GPIO Pythonライブラリ

前回、ZERO専用のWiringOPライブラリ(WiringOP libary for the Orange Pi Zero)を紹介しました。
となると、気になるのがPythonライブラリです。
こちらこちらでOPI-PCのPythonライブラリ を 紹介しています。
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 easy_install pip
sudo pip install --upgrade OPi.GPIO

ソースを見たい場合は以下の手順です。
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と完全に互換性が有ります。
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
import time
import sys

argv = sys.argv
argc = len(argv)

if (argc  == 1) :
  print 'Usage: # python %s Physical Pin#' % argvs[0]
  quit()

PIN = int(argv[1])
print "Physical Pin#=",PIN
COUNT = 3
#PIN = 3
GPIO.setmode(GPIO.BOARD)
GPIO.setup(PIN,GPIO.OUT)

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

GPIO.cleanup()

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

argv = sys.argv
argc = len(argv)

if (argc  == 1) :
  print 'Usage: # python %s BCM Pin#' % argvs[0]
  quit()

PIN = int(argv[1])
print "BCM Pin#=",PIN
COUNT = 3
#PIN = 3
GPIO.setmode(GPIO.BCM)
GPIO.setup(PIN,GPIO.OUT)

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

GPIO.cleanup()

以下のコードで入力割り込みの動作を確認することができます。
RPi.GPIOでは入力ピンのセットアップ時にプルアップ、プルダウンを指定することができますが、OPi.GPIOではできません。
プルアップ、プルダウンの抵抗を追加する必要が有ります。
全てのポートで割り込みが使えるわけではなく、PA11/PA19/PA18のピンでは割り込みが動きませんでした。
ソースをチラ見しましたがよく分かりません。
# -*- coding: utf-8 -*-
import OPi.GPIO as GPIO
GPIO.setmode(GPIO.BCM)

#GPIO.setup(02, GPIO.IN, pull_up_down=GPIO.PUD_UP)
GPIO.setup(02, GPIO.IN)
#GPIO.setup(14, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(14, GPIO.IN)
#GPIO.setup(15, GPIO.IN, pull_up_down=GPIO.PUD_DOWN)
GPIO.setup(15, GPIO.IN)

def callback(channel):
    global Count
    print "Rising edge detected. channel=",channel
    if (channel == 14):
       Count=Count+1
    if (channel == 15):
       Count=Count-1
    print "Count=",Count


Count=0
GPIO.add_event_detect(14, GPIO.RISING, callback=callback)
GPIO.add_event_detect(15, GPIO.RISING, callback=callback)

try:
    print "Waiting for falling edge on port 2"
    GPIO.wait_for_edge(02, GPIO.FALLING)
    print "Falling edge detected. Here endeth the second lesson."

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

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