GPIOを操作するRaspberry Pi向けライブラリのひとつであるWiringPiをArmadillo-640上で動くように移植してみました。
WiringPiはコマンドラインでGPIOを制御するgpioコマンドと、C言語やPythonなど主要なプログラム内で使用できるライブラリを提供します。
制限はありますが、一部のコマンド/ライブラリはArmadillo上で使用可能です。
Armadillo-640上で以下のコマンドを実行し、WiringPiのソースコードをダウンロードしてきます。
[armadillo]$ sudo apt update && sudo apt upgrade [armadillo]$ sudo apt install -y git build-essential [armadillo]$ git clone https://github.com/WiringPi/WiringPi.git
上記のWiringPiそのままではうまく動作しない部分がありますので、一部修正してみました。
こちら からパッチをダウンロードし、Armadillo-640上でWiringPiのソースコードに当てた上で、ビルド&インストールしてください。
[armadillo]$ cd WiringPi [armadillo ~/WringPi]$ ls wiringpi_armadillo.patch wiringpi_armadillo.patch [armadillo ~/WringPi]$ patch -p1 < wiringpi_armadillo.patch
以下のコマンドを実行し、インストールします。
[armadillo ~/WiringPi]$ ./build
gpioコマンドを使用する
使用上の制限事項と注意
gpioコマンドには様々なサブコマンドが実装されていますが、Armadillo上で動作可能なサブコマンドは以下の通りです。
- -h
- -R, -V
- -v
- -warranty
- exports
- export
- edge
- unexport
- unexportall
- read
- write
- toggle
- blink
- mode
また、以下のコマンドは/sys/class/gpio/以下にexport済みのGPIOに対してのみ実行可能です。
- unexport
- read
- write
- toggle
- blink
- mode
また、modeはinかoutのみ指定可能です。
[armadillo]$ gpio mode 22 in // OK [armadillo]$ gpio mode 22 pwm // NG pinMode: Invalid mode: should be INPUT or OUTPUT in Armadillo board
使用例
実行可能なgpioコマンドの一部を紹介します。
以下のコマンドを実行することでヘルプを確認できます。
[armadillo]$ gpio -h
以下のコマンドを実行することで指定したピンをinputモードでexportできます。
[armadillo]$ gpio export 22 in
以下のコマンドを実行することで指定したピンのvalueを取得できます。
[armadillo]$ gpio read 22 1
以下のコマンドを実行することで指定したピンの出力値を設定できます(outputモードでexportされているピンに対してのみ使用可能)。
[armadillo]$ gpio export 22 low [armadillo]$ gpio write 22 1
以下のコマンドを実行することで/sys/class/gpio/以下にexportされている全てのGPIOをunexportします。
[armadillo]$ gpio unexportall
C言語から使用する
wiringPi.hをインクルードすることで、C言語のプログラムから各ライブラリを使用可能になります。
使用上の制限事項と注意
wiringPiの実行時に初めに行うセットアップは必ずwiringPiSetupSys()をご使用ください。
wiringPiSetupGpio()などの他のセットアップライブラリは、Armadilloに対応しておりませんので正しく動作しません。
また、C言語での利用につきましても、セットアップ前にexport済みのGPIOのみ操作対象となりますので、あらかじめexportしておいてください。
動作確認済みのAPI
- wiringPiSetup
- wiringPiSetupSys
- pinMode
- digitalRead
- digitalWrite
- piGpioLayout
- piBoardRev
- piBoardId
- waitForInterrupt
- delay
- delayMicroseconds
- millis
- micros
使用例
以下、赤色LEDをGPIOで制御するため、Armadillo-640に以下のarmadillo-640-led.dtbを書き込みます。
dtb書き換え手順は こちら を参考にしてください。
dtb書き換え後にはreboot
コマンドを実行して再起動してください。
準備段階として以下のコマンドを実行し、赤色LEDを制御するGPIO(GPIO番号: 5)をexportします。
[armadillo]$ gpio export 5 in
その後、以下のサンプルコードをコンパイル・実行することで、赤色LEDが点滅します。
#include <stdio.h> #include <wiringPi.h> #define LED GPIO(1, 5) // LED(赤) -> GPIO1_IO05 int main(void) { wiringPiSetupSys(); // WiringPiでGPIOを扱う前に必ず実行する pinMode(LED, OUTPUT); // GPIO1_IO05のdirectionをOUTに設定 // 0.5秒間隔でLED(赤)が点滅する while (1) { digitalWrite(LED, HIGH); delay(500); digitalWrite(LED, LOW); delay(500); } return 0; }
サンプルコードは こちら からダウンロードできます。
コンパイル時には-lwiringPiをオプションに追加してください。
[armadillo]$ gcc -o test test.c -lwiringPi [armadillo]$ sudo ./test