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