RaspberryPi で apache から GPIO を動かす

「RaspberryPi で WS281X LEDストリップをマルチチャンネル駆動する」

https://qiita.com/nanbuwks/items/76c6ead17a469b57051b
を外部から操作できるようにするために、Webブラウザ で表示したボタンを押すと指定したパターンが動くようにします。



# 環境


- Raspberry Pi 3
- Raspberry Pi OS Lite
- Release date: February 21st 2023
- System: 32-bit
- apache2
# rpi_8chwave  コマンドを用意

https://github.com/nanbuwks/rpi_multichannel_ws281x よりレポジトリをクローン、rpi_8chwave をコンパイルしておきます。

## コマンド動作確認

配線して、コマンドをターミナルから入力し、光ることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/f7ee211e-49b6-2605-5835-02da0d400085.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/59fc02f3-837c-0069-a853-8ad512eb38c2.png)

## コマンドを /usr/local にコピー

```

# cp /home/pi/rpi_multichannel_ws281x/rpi_8chwave /usr/local
# ls -alh /usr/local
total 68K
drwxr-xr-x 10 root root 4.0K Apr 23 18:31 .
drwxr-xr-x 11 root root 4.0K Feb 21 01:02 ..
drwxr-xr-x  3 root root 4.0K Apr 23 11:38 bin
drwxr-xr-x  2 root root 4.0K Feb 21 01:02 etc
drwxr-xr-x  2 root root 4.0K Feb 21 01:02 games
drwxr-xr-x  3 root root 4.0K Apr 23 13:30 include
drwxr-xr-x  4 root root 4.0K Apr 23 13:30 lib
lrwxrwxrwx  1 root root    9 Feb 21 01:02 man -> share/man
-rwxr-xr-x  1 root root  25K Apr 23 18:31 rpi_8chwave
drwxr-xr-x  2 root root 4.0K Feb 21 01:02 sbin
drwxr-xr-x  5 root root 4.0K Feb 21 01:06 share
drwxr-xr-x  2 root root 4.0K Feb 21 01:02 src
```

# Webサーバ


apache と php をインストールします。

```

$ sudo apt install apache2 php

```

# コンテンツを作る

`/var/www/html/index.php` として以下を作ります。


```

<!DOCTYPE html>
<HTML>
<HEAD>
<META CHARSET="UTF-8">
<link href="design.css" rel="stylesheet">
</HEAD>
<BODY>
<pre>
<?php
?>
</pre>
<?php
if ( "1" == $_POST["SWITCH"])
{
    $mode = "1 ON";
    exec("sudo pkill rpi_8chwave");
    exec("sudo /usr/local/rpi_8chwave -n 100 -w 100 -B 10 -G  ff0000 ff0000 00ffff 00ffff ff0000 00ffff ff0000 000000  > /dev/null &");
}
if ( "2" == $_POST["SWITCH"])
{
    $mode = "2 ON";
    exec("sudo pkill rpi_8chwave");
    exec("sudo /usr/local/rpi_8chwave -n 100 -w 100 -B 10 -G ff0000 ff0000 00ffff 00ffff ff0000 00ffff ff00ff 000000  > /dev/null &");
}
if ( "3" == $_POST["SWITCH"])
{
     $mode = "3 ON"; 
    exec("sudo pkill rpi_8chwave");
    exec("sudo /usr/local/rpi_8chwave -n 100 -w 100 -B 10 -G ff0000 ff0000 00ffff 00ffff ff0000 00ffff 00ffff 000000 > /dev/null &");
}

.
.
.

if ( "7" == $_POST["SWITCH"])
{
     $mode = "7 ON";
    exec("sudo pkill rpi_8chwave");
    exec("sudo /usr/local/rpi_8chwave -n 100 -w 100 -B 10 -G ff0000 ff0000 000000 000000 ff0000 ff00ff 000000 ff00ff > /dev/null &");
}
if ( "0" == $_POST["SWITCH"])
{
     $mode = "OFF";
    exec("sudo pkill rpi_8chwave");
    exec("sudo /usr/local/rpi_8chwave -n 100 -w 100 -B 10 -G 000000 000000 000000 000000 000000 000000 000000 000000 > /dev/null &");
}
?>
<H1><?php echo $mode; ?></H1>
<HR>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME="SWITCH" VALUE="1">
<INPUT TYPE=SUBMIT VALUE="1 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="2">
<INPUT TYPE=SUBMIT VALUE="2 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="3">
<INPUT TYPE=SUBMIT VALUE="3 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="4">
<INPUT TYPE=SUBMIT VALUE="4 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="5">
<INPUT TYPE=SUBMIT VALUE="5 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="6">
<INPUT TYPE=SUBMIT VALUE="6 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="7">
<INPUT TYPE=SUBMIT VALUE="7 ON" >
</FORM>
<FORM ACTION=. METHOD=POST>
<INPUT TYPE=HIDDEN NAME=SWITCH VALUE="0">
<INPUT TYPE=SUBMIT VALUE="OFF" >
</FORM>
</BODY>
</HTML>
```
また、適当に css を作って反映し、以下のようにページを作ります。


![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/d669b3dd-dadf-1230-33ca-cd3476fd2cc7.png)

# www-data ユーザで sudo が使えるようにする
```
# cd /etc/sudoers.d
# ls
010_at-export  010_pi-nopasswd	010_proxy  README
# visudo www-data
```

以下の内容を作る
```
www-data ALL = (root) NOPASSWD: /usr/local/rpi_8chwave,/usr/bin/pkill
```

ボタンを押して、パターン通り光ることを確認します。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/24bc2db7-3b8f-81c8-9251-0d3a6c403be5.png)

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/139524/043acebc-44b4-dd68-179a-92b485805cc1.png)