<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 メニューに戻る