Waffleハンズオンに参加してのTips

先日、[Waffleのハンズオン](https://dotstudio.connpass.com/event/51365/)に参加してきましたので、その時の様子と学んだことなどを記録しつつシェアしたいと思います。

なお、すでに記事にした内容は割愛させていただきます。

- [Waffleで始める、初めてのIoT＋初めてのAndroidアプリ（動作確認編）](http://qiita.com/mine820/items/46530519c3875d390925)
- [Waffleで始める、初めてのIoT＋初めてのAndroidアプリ（Arduinoアプリ編）](http://qiita.com/mine820/items/cab307d684bcc0ffed57)

# 参加者
今回は6名参加者がいました。（＋サポート2名＋講師1名）

| お名前 | 備考 |
|:--|:--|
| TN氏 | 回路設計のお仕事をしている方 |
| U氏 | Webデザインをやられている方 |
| M氏 | ITコンサルをされている方 |
| TK氏 | 大学でコンピュータの管理をされている方 |
| Y氏 | HoloLensをやられている方 |
| 私 | 元アプリケーションエンジニア |

サポートはわみさん（[Nefry](https://dotstud.io/shop/nefry-connect-internet/)の方）とのびすけさん（[IoTLT](https://iotlt.connpass.com/)主催）、講師は浜谷さん（[Waffle](https://dotstud.io/docs/waffle/)開発）です。

参加者のスキルやレベルはバラバラでしたので、講義内容は基礎的なところから始まりました。

# Arduinoについて
まずは[Arduino](https://www.arduino.cc/)に関するお話からスタートしました。
結構昔（2005年）からあったようで、イタリアの方が開発したということです。

いろいろな製品の開発時に利用され、実際に製品化されたあとも組み込まれている例もあるそうです。

基板の構成は以下のようになっています。

- 電源
- USBポート
- アナログ入力（6ピン、0～5Vの1024段階）
- デジタル入出力（14ピン、0/5V）

# Waffleについて
Waffleは、前述の全てのピンにつなげるわけではなく、

- A0
- A5 or I2C
- D5
- D9
- D13（基板上のLEDに接続済み）

だけ用意されています。

またリセットボタンが用意されています。起動中でも押すことが出来ます。
（硬いです ^^;）

なお、ファームウェア（？）の書き込みは、6つ（3x2）並んだ穴のところで繋いで書き込むそうです。
![DSC_0021.JPG](https://qiita-image-store.s3.amazonaws.com/0/130771/d6a629fa-3c28-30e3-ba9a-4bebd0c45656.jpeg)

# Arduinoプログラムについて
プログラムの口（呼び出される関数）は2つあります。

- setup()
 - 起動時に1回だけ呼び出されます
- loop()
 - 起動後、ひたすら何度も呼び出されます

1つのプログラムしか実行できず、電源が入っている間はひたすら動き続けます。
（LEDとか、すぐに劣化して壊れるんじゃないかと心配になります（笑））

Arduino IDEのスケッチ例に大量のサンプルが用意されているため、こちらを参考にしながらやりたいことを実現するのが良いとのことでした。
![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3f11af0b-adca-a652-440b-c35d8ad385ae.png)

## サンプル：Blink
今回はまず、スケッチ例から「Blink」を試してみました。
（いわゆる「Lチカ」です）

また、LEDの明るさを変えるテクニックとして、ON/OFFの合計がだいたい20ms（人がON/OFFを感知できない）の間に切り替える量を変更（PWM（パルス幅変調）と言うそうです）してみました。

## サンプル：AnalogReadSerial
次に、スケッチ例から「AnalogReadSerial」を試してみました。
そのために、全員にGroveセンサーの「Rotary Analog Sensor」が貸し出されました。
（これ、今度買ってきます！）
![grove-rotary-angle-sensor.jpg](https://qiita-image-store.s3.amazonaws.com/0/130771/8c744875-a824-ba80-91ff-8397899721d6.jpeg)
Waffleから送られてくるデータは、シリアルモニター（またはシリアルプロッタ）で確認ができます。

なお、サンプルでは値を数値のまま送っていましたが、これを受け取り側が使いやすいようにJSON形式に変換してみました。

```C++
String msg = "{\"A0\":\"";
msg += analogRead(A0);
msg +="\"}";

Serial.println(msg);
```

analogRead()は、受け取り側の方に合わせてintやStringで出力してくれます。

が、いちいち文字列を作成するのが面倒なので、ライブラリを使用して楽をします。
今回はArduinoJsonをいうものを使用しました。
ライブラリの管理で検索してインストールします。
![image2.png](https://qiita-image-store.s3.amazonaws.com/0/130771/c200a631-ac6a-7894-f73c-562abeba3fd1.png)

![image3.png](https://qiita-image-store.s3.amazonaws.com/0/130771/b54d446c-56b1-0699-138c-ffa9efefd9f9.png)

するとこんな感じに楽に書けます。

```C++
sensorValue = analogRead(A0);
json["A0"] = sensorValue;

json.printTo(Serial);
Serial.println();
```

# おすすめの本
ここでちょっと休憩。
Waffle（Arduino）開発で、おすすめの本の紹介がありました。

- [Arduinoをはじめよう](https://www.amazon.co.jp/dp/487311733X/)
- [Prototyping Lab](https://www.amazon.co.jp/dp/4873117895/)
- [ボクのArduino工作ノート](https://www.amazon.co.jp/dp/4899773994/)

# Arduinoプログラムについて（つづき）
今までは「Waffle→PC」でしたが、いよいよAndroidにつなぎ、さらにインターネットにもつなぎます。

## Androidへの接続
Google StoreからWaffleのサンプルアプリを取得します。
こちらは[別の記事](http://qiita.com/mine820/items/46530519c3875d390925)に書いたので省略。
なお、Androidのバージョンや機器によってはつながらないことがあるので注意です。

## インターネットへの接続
今回は[Milkcocoa](https://mlkcca.com/)にデータを送ります。
実は以前、Milkcocoaを試したことがあるので、登録の仕方等は[こちら](http://qiita.com/mine820/items/f75380a2359a4b38d374)を参照。

で、送り込まれ側のアプリを作成します。
今回は「Waffle」という名前のアプリを作成します。
![image4.png](https://qiita-image-store.s3.amazonaws.com/0/130771/4146e123-fff6-31a3-fcfd-5fd586d2b7fd.png)

Androidのサンプルアプリで、作成したアプリのapp_idを設定すると、5秒間隔で値が送信されるようになります。
![Screenshot_20170619-001124.png](https://qiita-image-store.s3.amazonaws.com/0/130771/39d14618-8f7a-5bc2-7856-c84c7f785353.png)　![Screenshot_20170619-001108.png](https://qiita-image-store.s3.amazonaws.com/0/130771/867810b8-3766-5aae-86f9-4197af8211d2.png)

![image.png](https://qiita-image-store.s3.amazonaws.com/0/130771/3d4d04a0-796b-9a04-7deb-917ba87be471.png)

そこでデータストアで「bucket」を見ると、値が送られてきているのが確認できます。
※「bucket」という名前は固定になっています。
![image5.png](https://qiita-image-store.s3.amazonaws.com/0/130771/bec24db1-a4fd-b219-f99b-19db4c5782a9.png)

さらにFreeBoardで可視化出来ます。
まずDATASOURCESにデータストアを設定（ADD）します。
![image6.png](https://qiita-image-store.s3.amazonaws.com/0/130771/e6f04c9a-9dd5-d279-63a5-657ccbc47376.png)

次にPAINを追加（ADD）します。
![image7.png](https://qiita-image-store.s3.amazonaws.com/0/130771/50604209-d274-95b2-0e6e-5406f9f64227.png)

すると、いい感じのグラフが表示され、リアルタイムに更新されます。
![image8.png](https://qiita-image-store.s3.amazonaws.com/0/130771/2596b09b-cc4b-634c-1942-8688236d8305.png)

これでIoTが出来たことになります！！！

# 最後に
ハンズオンの最後に、他のセンサー類の紹介やQ&Aなどを行い、アンケートを記入して終了となりました。

なお、Android側のプログラミングの参考として、

- Arduinoからのシリアル通信を受ける部分は、「[PocketDuino Tutorial](http://www.physicaloid.com/wiki/doku.php?id=hardware:pocketduino:tutorial)」が参考になる
- データをMilkcocoaに送る部分は、Milkcocoaのサンプルコード（Android/Java）が参考になる

とのことでした。
また、インターネットに送る部分は各種チャットのコードを参考にするのが良いとのことでした。

あと、Groveセンサーの購入ですが、秋葉原の実店舗であれば、以下が良いとのことでした。

- [マルツ](https://www.marutsu.co.jp/)（品揃えは豊富だが、少々お高め）
- [千石電商](http://www.sengoku.co.jp/)（あまり品揃えは良くないが、マルツよりは安い）
- [秋月電子通商](http://akizukidenshi.com/catalog/default.aspx)（ほとんど置かれていないが、マルツよりは安い）

# おまけ
懇親会も盛り上がりました！
（アルコールセンサーを動かすのに、えらい苦労していましたが（苦笑））

# 感想
これでWaffle（Arduino）のプログラムが書けそうな気がしてきました。
まずは色々とセンサーを購入するところから始めたいと思います。
あとは、Android側のプログラミングをお勉強しないと．．．