<Raspberry Pi-49> Raspberry Pi-48に続いて、最新OSのRaspbian stretchでの、GPIO制御についてやっていきます。 実は、GPIO制御のひとつである、WebIOPiのインストールが、今までのjessieで行った手順が、stretchでは出来なくなり 解決策にたどり着くまで、大変苦労しました。 GPIOといえばLチカと呼ばれるLEDのON/OFF動作があります。 そして、GPIOの制御には下記のような方法があります。(他にもあるかも?) 1./sys/class/gpioの仮想ファイルアクセス 2.Wiringpi付属のgpioユーティティ 3.WiringpiのC言語 4.Python言語(Python3) 5.WebIOPi(webからアクセス) 1.から4.は、2017-11-29-raspbian-stretchバージョンのOSだけのインストールで出来ました。 5.は、別途、WebIOPiのインストが必要です。 それでは、順番に見ていきますが、その前に、Raspberry Pi 3のGPIOとLEDの接続をしておくこと。 1./sys/class/gpioの仮想ファイルアクセス / ** コマンドラインでの操作 **/ pi@raspberrypi:~ $ echo 17 > /sys/class/gpio/export :GPIOポート17の使用宣言 pi@raspberrypi:~ $ echo out > /sys/class/gpio/gpio17/direction :入出力方向の設定 出力(out) 入力(in) pi@raspberrypi:~ $ echo 1 > /sys/class/gpio/gpio17/value :仮想ファイルに1を書き込むと点灯 pi@raspberrypi:~ $ echo 0 > /sys/class/gpio/gpio17/value :仮想ファイルに0を書き込むと消灯 pi@raspberrypi:~ $ echo 17 > /sys/class/gpio/unexport :GPIOポート17の終了宣言 2.Wiringpi付属のgpioユーティティ / ** コマンドラインでの操作 **/ 今回、別途Wiringpiは、インストールしていないがgpioユーティティが使えるようです。 pi@raspberrypi:~ $ gpio -v でバージョン確認 ------------------------------------------------------ gpio version: 2.44 Copyright (c) 2012-2017 Gordon Henderson This is free software with ABSOLUTELY NO WARRANTY. For details type: gpio -warranty Raspberry Pi Details: Type: Pi 3, Revision: 02, Memory: 1024MB, Maker: Sony * Device tree is enabled. *--> Raspberry Pi 3 Model B Rev 1.2 * This Raspberry Pi supports user-level GPIO access. -------------------------------------------------------- pi@raspberrypi:~ $ gpio -g mode 17 out :GPIOポート17の使用宣言 pi@raspberrypi:~ $ gpio -g write 17 1 :1を書き込むと点灯 pi@raspberrypi:~ $ gpio -g write 17 0 :0を書き込むと消灯 pi@raspberrypi:~ $ gpio unexport 17 :GPIOポート17の終了宣言 3.WiringpiのC言語 / ** コマンドラインでの操作 **/ Wiringpiは、gpioユーティティと同様特にインストールしていないがOK プログラムソース led-1.c (<は、半角に修正のこと) ------------------------------------------------- #include <wiringPi.h> #define LED_PORT 17 /* GPIO17 */ int main (void) { int i; //初期化 if(wiringPiSetupGpio() == -1) return 1; pinMode(LED_PORT, OUTPUT); for (i=0; i<10; i++) { //LED ON digitalWrite(LED_PORT, 1); delay(500); //LED OFF digitalWrite(LED_PORT, 0); delay(500); } return 0; } ------------------------------------------------- 上のプログラムソースをコンパイル pi@raspberrypi:~ $ cc -o led-1 led-1.c -lwiringPi コマンドラインから、実行(0.5SのON/OFF) pi@raspberrypi:~ $ sudo ./led-1 4.Python言語(Python3) 下記は、プログラムソース -------------------------------------------------- import RPi.GPIO as GPIO import time GPIO.setmode(GPIO.BCM) led=17 GPIO.setup(led,GPIO.OUT,initial=GPIO.LOW) time.sleep(1) while 1: GPIO.output(led,GPIO.HIGH) time.sleep(1) GPIO.output(led,GPIO.LOW) time.sleep(1) -------------------------------------------------- 5.WebIOPi(webからアクセス) 今回、このWebIOPiに手こずりました。と、言うのもOSがraspbianのjessieで出来たインストールが、stretchでは出来なくなり どうしたものかと、考え込んでしまいました。 <OSがjessieのときのインストール手順> 1.WebIOPiのインストール(http://WebIOPi.trouch.com/DOWNLOADS.html) WebIOPi-0.7.1.tar.gzをダウンロード 2.WebIOPi-0.7.1.tar.gzをを/home/piに置く 「ここでファイルを展開(X)」をマウス右クリックする。 WebIOPi-0.7.1フォルダが作成される。 3.修正(cpuinfo.c,gpio.c,version.py,WebIOPi.js) 3-1 WebIOPi-0.7.1/python/native/cpuinfo.c__40行目 ("BCM2708"から、"BCM2709"へ変更 if (strcmp(hardware, "BCM2709") == 0) 3-2 WebIOPi-0.7.1/python/native/gpio.c__32行目 0x20000000から、0x3F000000へ変更 #define BCM2708_PERI_BASE 0x3F000000 3-3 GPIO Header(/app/gpio-header)の40pin対応 ピン番号のマッピングの変更(_MAPPING[2]を変更) WebIOPi-0.7.1/python/WebIOPi/utils/version.py _MAPPING[2] = ["V33", "V50", 2, "V50", 3, "GND", 4, 14, "GND", 15, 17, 18, 27, "GND", 22, 23, "V33", 24, 10, "GND", 9, 25, 11, 8, "GND", 7, 0, 1, 5, "GND", 6, 12, 13, "GND", 19, 16, 26, 20, "GND", 21] 3-4 40ピンのテーブル作成 WebIOPi-0.7.1/htdocs/WebIOPi.jsの76行目と580行目の変更 76行目→this.PINS = Array(41); --------------------------------------------- function WebIOPi() { this.readyCallback = null; this.context = "/"; this.GPIO = Array(54); this.PINS = Array(27); →this.PINS = Array(41); --------------------------------------------- 580行目→for (var pin=1; pin<=40; pin++) { ----------------------------------------------------------------------- RPiHeader.prototype.createTable = function (containerId) { var table = $("<table>"); table.attr("id", "RPiHeader") for (var pin=1; pin<=26; pin++) { →for (var pin=1; pin<=40; pin++) { var line = $('<tr>'); line.append(this.getFunctionCell(pin)) line.append(this.getDescriptionCell(pin, "right")) line.append(this.getPinCell(pin)); ------------------------------------------------------------------------ 4.setup.shの実行 cd /home/pi/WebIOPi-0.7.1 sudo ./setup.sh 途中で「Do you want to access WebIOPi over Internet? [y/n]」と聞かれますが、ここは「n」 5.インストールが完了したら、ラズベリーパイを一度再起動してから、WebIOPiを起動 sudo /etc/init.d/webiopi start(停止はsudo /etc/init.d/webiopi stop) 起動確認 ps ax | grep WebIOPi 以上が、jessieでのWebIOPiインスト手順で、問題なくインスト出来て動作しました。 しかし、stretchでは、この手順ではインスト出来ませんでした。 それで、ネットをぐぐりまくったところ、解決策のサイトを見つけることが出来たので 自分なりに、整理したインストール手順を記載します。 参考サイト https://raspi-wannabe.com/webiopi_install/ <OSがstretchのときのインストール手順> 1.WebIOPiのインストール(http://WebIOPi.trouch.com/DOWNLOADS.html) WebIOPi-0.7.1.tar.gzをダウンロード 2.WebIOPi-0.7.1.tar.gzをを/home/piに置く 「ここでファイルを展開(X)」をマウス右クリックする。 WebIOPi-0.7.1フォルダが作成される。 3.今回は既に公開されているパッチを取得して当てる。 3-1 pi@raspberrypi:~ $ cd ./WebIOPi-0.7.1/ 3-2 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo wget https://raw.githubusercontent.com/neuralassembly/raspi2/master/webiopi-pi2bplus.patch 3-3 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo patch -p1 -i webiopi-pi2bplus.patch 4.setup.shの実行 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo ./setup.sh 途中で「Do you want to access WebIOPi over Internet? [y/n]」と聞かれますが、ここは「n」 5.起動用ファイルを適切な位置に置く 5-1 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo wget https://raw.githubusercontent.com/neuralassembly/raspi/master/webiopi.service 5-2 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo mv webiopi.service /etc/systemd/system/ 6.WebIOPi起動 pi@raspberrypi:~/WebIOPi-0.7.1 $ sudo /etc/init.d/webiopi start(停止はsudo sudo /etc/init.d/webiopi stop) 以上、この手順でインストでき無事、動作しました。 (もし、失敗したらWebIOPi-0.7.1フォルダを削除してやり直してください) Raspberry メニューに戻る