IoT開発環境2020年度版ラズパイ用設定

# 1. 対象
- ラズパイとESP32でIoTを学ぶ方
- ラズパイでターミナルにコマンドを打ち込むことが出来る方
- (望ましい)最新版では記載時点と異なっても対処できる方

# 2. 準備

1. PC に Raspberry Pi Imagerをダウンロードして、Raspberry Pi OS desktop(一番上に表示されているもの)を16GB以上のSDメモリカードに焼きます。
  https://www.raspberrypi.org/software/
  SDカードとは異なるドライブを消去しないように気をつけましょう。心配がある場合は、次のキーワードで検索してしっかり調べましょう[「ラズパイ SD 作成」](https://www.google.com/search?q=%E3%83%A9%E3%82%BA%E3%83%91%E3%82%A4+SD+%E4%BD%9C%E6%88%90&tbs=cdr%3A1%2Ccd_min%3A12%2F31%2F2020%2Ccd_max%3A1%2F1%2F2020)。

2. ラズパイにSDを入れて起動し、 設定を行います。
   - 国は日本 （つまり、言語は日本語、タイムゾーンは東京）
   - パスワードは適宜変更（設定したパスワードを忘れないように）
   - ディスプレイ表示に余白がある場合は、this screen shows a black border...にチェック
   - Wi-Fiを接続
   - アップデートは、どちらでもok （次の手順でもアップデートします）
   - 再起動する

# 3. ターミナルで入力

次のコマンドをコピーしてターミナルにペーストします。(ブラウザでこのページを表示すると良いでしょう。検索キーワードは、[「Qiita IoT DevEnv RaspberryPi ESP32」](https://www.google.com/search?q=Qiita+IoT+DevEnv+RaspberryPi+ESP32)で見つかると思います。）
Node-Redのインストール画面までは、対話型操作( y を入力する場面が2回）が必要になるので、端末から離れないようにしましょう。SDメモリカードのスピードによりますが、完了までに1時間程度をみた方が良いです。

```sh
sudo apt update && sudo apt upgrade -y && sudo apt autoremove -y && cd ~/Downloads && bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) && sudo apt install -y jfbterm mosquitto mosquitto-clients jupyter-notebook python3-sklearn python3-pandas ipython3  fonts-takao libreoffice libreoffice-l10n-ja influxdb influxdb-client && wget https://downloads.arduino.cc/arduino-1.8.13-linuxarm.tar.xz && tar -Jxf arduino-1.8.13-linuxarm.tar.xz && cd arduino-1.8.13  && sh install.sh && cd ~/Downloads && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - && echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list && sudo apt update && sudo apt install -y grafana && sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable grafana-server && sudo /bin/systemctl start grafana-server && influx -execute="create database IoTSeminar" && sudo systemctl enable nodered.service && cd ~/.node-red/ && npm install node-red-dashboard node-red-contrib-dht-sensor node-red-contrib-ds18b20-sensor node-red-contrib-influxdb && sudo apt purge pulseaudio pulseaudio-utils
```

なお、このコマンド群の最後に```sudo apt purge pulseaudio pulseaudio-utils```を加えています。これは、2020年12月時点で、apt upgradeをすると音が出なくなる問題があり、その対策です。なぜかupgradeでpulseaudioがインストールされ、ボリュームがゼロに設定されているためです。


# 4. GUIでの設定

## 4.1 デスクトップのフォント設定
変な漢字（日本語のフォントらしくない漢字）になるのを防ぎます。
1. デスクトップで右クリックします。
2. 次のメニューをクリックします。
    Appearance Settings --> System  --> font
3. フォントは次にします
    Takao P ゴシック
    サイズは12

## 4.2 ターミナルの文字サイズ
小さい文字が見づらい方は大きくしましょう

 編集 --> 設定 --> 端末のフォント → 15ポイント程度

## 4.3. Arduino-IDEの設定

現在では、ARM用arduino-ESP32がリリースされたのでとても楽に設定できます。

### 4.3.1. board manager リストの設定
次のメニューをクリックしていきます
File --> Preferences
次の項目に
Additional Boards Manager URLs:
次のURLを入力します。
https://raw.githubusercontent.com/espressif/arduino-esp32/gh-pages/package_esp32_index.json

この設定について参考になるページはこちら https://github.com/espressif/arduino-esp32/blob/master/docs/arduino-ide/boards_manager.md

### 4.3.2. board managerへ esp32 の追加
次のメニューをクリックしていきます
Tools --> Board:"Arduino Uno" --> Boards Manager...
上の検索枠に次を入力し、しばらく待ちます。
ESP32
(2021.11/18追記：表示された項目の左下のバージョンが最新の2.0.0と表示されますので、1.0.6を選択して下さい。最新版では後のライブラリが使えません）
表示された項目の右下にある install をクリックし、しばらく待ちます。

### 4.3.3. ライブラリの追加
次のメニューをクリックしていきます

Sketch --> Include Library --> Manage Libraries...

#### 4.3.3.1. MQTT
検索枠に次のように入力し、しばらく待ちます。
 pubsub Client mqtt messaging
表示された候補の中で、 by Nick O’Leary のものを選び installをクリックし、しばらく待ちます。

#### 4.3.3.2. DS18
検索枠に次のように入力し、しばらく待ちます。
 dallas
表示された候補の中で、  DallasTemperature のものを選び installをクリックし、 更に追加インストールの問い合わせが出るので install ALLをクリックし、しばらく待ちます。

#### 4.3.3.3. DHT11
検索枠に次のように入力し、しばらく待ちます。
 DHT sensor

表示された候補の中で、  by Adafruit のものを選び installをクリックし、 更に追加インストールの問い合わせが出るので install ALLをクリックし、しばらく待ちます。

#### 4.3.3.4. servo for esp32
検索枠に次のように入力し、しばらく待ちます。
 esp32servo
表示された候補の中で、 esp32servo を選び installをクリックし、しばらく待ちます。


## 4.4. webブラウザのブックマーク
### 4.4.1. node-red
次のURLをブックマークします
localhost:1880

### 4.4.2. Grafana
次のURLをブックマークします
localhost:3000

## 4.5. Node-Redの設定
ブラウザでNode-redを表示します。もし、表示されない場合は、ラズベリーボタンからプログラム→Node-Redをクリックし、再度表示させます。

### 4.5.1. influxDbノードの設定

1.  influxdb out ノードを適当な場所に置き、ダブルクリックします
2. server の項目の脇にある 鉛筆ボタンをクリックします
3. 項目を次のようにします

version: 1.x
host: 127.0.0.1
port: 8086
Database: IoTSeminar

終わったら、 Addボタン , ok ボタンを押して準備完了です。
データベース名は、コマンで作成した名前と一致させます。ここでは、研修で用いたIoTSeminarというデータベースを例にしています。

なお、M5Cameraとnode-redでカメラ画像を保存する場合、次の設定が必要です。(IoT多種多様開発研修 向け)

ターミナルを起動し、
次を入力しフォルダを作成します。
``` mkdir  node-red-static```
次のようにファイルをnode-redの設定ファイルを編集します
```nano .node-red/settings.js```
を打ち込んだら次の行をカーソルキーの下を押して探します
``` //httpStatic: '/home/nol/node-red-static/', ```
この行の下に次を追加します。(最後のカンマを忘れずに。問題があるとnode-redが起動しなくなります）
``` httpStatic: '/home/pi/node-red-static/', ```
入力したら、Ctrlキーを押しながらoを押し、enterを押します。その後、Ctrlキーを押しながらxを押し、終了します。
次でnode-redを止めます。
``` node-red-stop ```
次でnode-redを起動します。
``` node-red ```
エラーが出ずに起動したら完了です。エラーが出たら、上記の設定に問題があります。

## 4.6. grafanaの設定
ブラウザでGrafanaを立ち上げます
右の歯車から 次をクリックします。
Configuration --> Data Sources --> Add data source
データのタイプを InfluxDB にして、selectを押します。

各項目、次のように設定します。(InfluxDBで作成したデータベース名に対応させます)

name: IoTSeminar
Query Langage: InfluxQL
URL: http://localhost:8086
Database: IoTSeminar

この他は入力する必要はありません。
save and test を押して、passと表示されれば成功です。
back を押して、元に戻ります。


# 5. ソフトの内容
前章で設定は完了です。秋田県で開催されたIoT基礎技術研修会および由利本荘市 にかほ市で開催されたIoT多種多様開発研修会で用いたラズパイの環境が構築されました。
ここでは、何をインストールしたのかを説明します。

## 5.1. Node-Red
Node-Redは、aptでもインストールできますが、古い場合が多いです。公式のページにある方法でインストールしました。

```sh
 bash <(curl -sL https://raw.githubusercontent.com/node-red/linux-installers/master/deb/update-nodejs-and-nodered) && sudo systemctl enable nodered.service 
```

## 5.2. Arduino-IDE
Arduino-IDEはESP32のプログラムで必要です。ARM版の現時点で最新版 1.8.13 をインストールしました。

```sh
wget https://downloads.arduino.cc/arduino-1.8.13-linuxarm.tar.xz && tar -Jxf arduino-1.8.13-linuxarm.tar.xz && cd arduino-1.8.13 && sh install.sh
```

## 5.3. influxdb
influxdbは1.6系をインストールします。現時点で、ラズパイのaptでは1.6系が入るようなのでそのままインストールします。ver2以降がインストールされるようになった場合は注意が必要です。

```sh
sudo apt install -y influxdb influxdb-client
```

## 5.4. grafana
グラフ表示するために用いました。こちらも公式の方法でインストールします。

```sh
cd ~/Downloads && wget -q -O - https://packages.grafana.com/gpg.key | sudo apt-key add - && echo "deb https://packages.grafana.com/oss/deb stable main" | sudo tee -a /etc/apt/sources.list.d/grafana.list && sudo apt update && sudo apt install -y grafana && sudo /bin/systemctl daemon-reload && sudo /bin/systemctl enable grafana-server && sudo /bin/systemctl start grafana-server
```
ただし、このgrafanaサーバは、とても重いです。
もし、grafanaを利用しない場合は、次を入力して、止めた方が良いでしょう。
sudo /bin/systemctl stop grafana-server
sudo /bin/systemctl disable grafana-server 

## 5.5. mosquitto
MQTTを試すのに必要です。

```sh
sudo apt install -y mosquitto mosquitto-clients
```

## 5.6. 日本語の環境
日本語を表示するのに必要最小限のものが、jfbtermとフォントです。 windowsやmacでもで利用可能な 隆男(たかお)フォント をここでは導入しました。

```sh
sudo apt install -y jfbterm fonts-takao
```

## 5.7. LibreOffice
表計算ソフトを使う場合は必要です。

```sh
sudo apt install -y libreoffice libreoffice-l10n-ja
```

## 5.8. python
表計算ソフトでは難しい場合に必要です。 一般的に、pythonのモジュールはpipでインストールしますが、ラズパイ上で行うと非常に遅いので、aptでインストールします。

```sh
sudo apt install -y jupyter-notebook python3-sklearn python3-pandas ipython3
```

# 6. むすび
ラズパイのIoT開発環境の構築方法を記載しました。IoTの実践方法は様々ですが、センサノードをESP32、エッジ/フォグとしてラズパイという組み合わせが、アマチュアには向いていると感じています。ESP32の開発は、UI-flowなどがラズパイに対応してくれると良いのですが、現状でArduino-IDEが最良だと思います。
そして、これらのソフトウエアが無料で手に入るということは、とても恵まれている事だと感じます。忘れていけないのは、ソフトウエアが無料なのは、**当たり前ではない**ということだと思います。これらソフトウエアは、提供してくれるメーカやコミニティがあってのもので、それは、ボランティアもあれば、企業の戦略であったり、コミニティや個々への寄付によって実現していることであったりします。それ故に、現在実施できている事は、将来も可能という保証がありません。
私自身、ソフトウエアを開発し公開してくれる方々に感謝しながら、IoTを実践していきたいと思います。

# A. Arduino core for ESP32 2.0.0 について(追記2021.11.18)
上の「4.3.2. board managerへ esp32 の追加」に追記しましたが、現在はボードマネージャに2.0.0が表示されます。これをインストールすると、他のライブラリが使えなくなります。ですので、1.0.6を選択してインストールするようにしてください。既に2.0.0がインストールされている場合は、ダウングレードが必要です。ボードマネージャを開いて、ESP32と入力し、1.0.6を選択して再インストールしてください。
![change_TargetLib_ver.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/698531/df8aa8e8-1fa2-0a38-b40b-104462867ae0.png)

最近、既存のプログラムがコンパイルで失敗するという相談が多く、詳細を聞くと共通して2.0.0がインストールされているのが原因でした。 2.0.0は、新しいESP32シリーズのESP32-Sなどもコンパイルできるバージョンです。ESP32-SやESP32-Cは、CPUが従来のxtensaではなく RISC-V が採用されており、従来のESP32と全く異なっています。
後々、これらの問題は解決されると思いますが、従来のESP32を利用する場合、現時点では1.0.6にダウングレードするのが無難でしょう。