OrangePi-PCを使ってみる

Python GPIOライブラリ(WiringPi-Python-OP)


ようやくOrangePiに対応したWiringPi-Python(WiringPi-Python-OP)ライブラリがリリースされました。
インストール手順は、こちらに 書いてある通りですが、swigのバージョンが2→3に更新されたので、
一部ファイルを修正しないとswigが通りません。
OrangePiでのインストールは以下の手順で行います。
$ git clone --recursive https://github.com/lanefu/WiringPi-Python-OP.git
$ sudo apt install python-dev python-setuptools swig
$ cd WiringPi-Python-OP
$ cd WiringPi/
$ sudo ./build
$ cd ..

ここで、「bindings.i」を一部修正する必要が有ります。
// Header file WiringPi/wiringPi/wiringPiSPI.h
int wiringPiSPIGetFd     (int channel) ;
int wiringPiSPIDataRW    (int channel, unsigned char *data, int len) ;
#int wiringPiSPISetupMode (int channel, int speed, int mode) ;
#int wiringPiSPISetup     (int channel, int speed) ;

swig3では行頭の#によるコメントが認められなくなりました。上記の部分を以下のように変更します。
// Header file WiringPi/wiringPi/wiringPiSPI.h
int wiringPiSPIGetFd     (int channel) ;
int wiringPiSPIDataRW    (int channel, unsigned char *data, int len) ;
//int wiringPiSPISetupMode (int channel, int speed, int mode) ;
//int wiringPiSPISetup     (int channel, int speed) ;

「bindings.i」を修正したらswigが通ります。
$ swig -python wiringpi.i
$ sudo python setup.py install
$ cd tests
$ sudo python test.py
0
0

まずはLチカを試してみます。Pin#3のLEDが点滅します。
# -*- coding: utf-8 -*-
import wiringpi
import time

OUTPUT = 1
HIGH = 1
LOW = 0

wiringpi.wiringPiSetup()
wiringpi.pinMode(8,OUTPUT)
wiringpi.digitalWrite(8,LOW)
for i in range(10):
  wiringpi.digitalWrite(8,HIGH)
  time.sleep(1)
  wiringpi.digitalWrite(8,LOW)
  time.sleep(1)

前から気になっていたGPIOのポート状態も正しく取れて、gpio readall と同じ結果になりました。
以下のコードで各GPIOのmodeとaltを取得することができます。
# -*- coding: utf-8 -*-
import wiringpi
INPUT = 0
OUTPUT = 1
LOW = 0
HIGH = 1
PINS = {
   0 : {'name' : 'PA12', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 3},
   1 : {'name' : 'PA11', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 5},
   2 : {'name' : 'PA6',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 7},
   3 : {'name' : 'PA13', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 8},
   4 : {'name' : 'PA14', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 10},
   5 : {'name' : 'PA1',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 11},
   6 : {'name' : 'PD14', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 12},
   7 : {'name' : 'PA0',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 13},
   8 : {'name' : 'PA3',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 15},
   9 : {'name' : 'PC4',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 16},
  10 : {'name' : 'PC7',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 18},
  11 : {'name' : 'PC0',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 19},
  12 : {'name' : 'PC1',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 21},
  13 : {'name' : 'PA2',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 22},
  14 : {'name' : 'PC2',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 23},
  15 : {'name' : 'PC3',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 24},
  16 : {'name' : 'PA21', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 26},
  17 : {'name' : 'PA19', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 27},
  18 : {'name' : 'PA18', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 28},
  19 : {'name' : 'PA7',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 29},
  20 : {'name' : 'PA8',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 31},
  21 : {'name' : 'PG8',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 32},
  22 : {'name' : 'PA9',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 33},
  23 : {'name' : 'PA10', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 35},
  24 : {'name' : 'PG9',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 36},
  25 : {'name' : 'PA20', 'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 37},
  26 : {'name' : 'PG6',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 38},
  27 : {'name' : 'PG7',  'mode' : 0, 'smode' : '' , 'value' : LOW,  'pin' : 40}
   }

ALTS = [
   "IN", "OUT", "ALT5", "ALT4", "ALT0", "ALT1", "ALT2", "ALT3"
   ]


wiringpi.wiringPiSetupPhys()

for i in PINS:
    pin = PINS[i]['pin']
    print "i=" + str(i) + " pin=" + str(pin)
    alt=wiringpi.getAlt(pin)
    value=wiringpi.digitalRead(pin)
#    print "pin=" + str(pin) + " alt=" + str(alt) + " value=" + str(value)
    print "pin=" + str(pin) + " alt=" + ALTS[alt] + " value=" + str(value)
    PINS[i]['mode']=alt
    PINS[i]['smode']=ALTS[alt]
    PINS[i]['value']=value

for i in PINS:
    print "name=" + PINS[i]['name'] + " mode=" + str(PINS[i]['mode']) + " " + PINS[i]['smode'] + " value=" + str(PINS[i]['value'])

今まで、C言語ではGPIOのポート状態を取り出すことはできましたが、
PythonでもGPIOのポート状態が正しく取れるようになったので、
次回はFlaskとWiringPi- Python(WiringPi- Python-OP)を使った、ブラウザー経由でのGPIO 操作を紹介します。