【喋るサボテン】ゆっくり喋ボテン作ってみた【タッチセンサ】

#[MA2018にも応募・展示しています。](https://protopedia.net/prototype/5cf21ce30208cfffaa832c6e44bb567d)
というわけで、ここで供養することにしました。
youtubeに[ビデオプロトタイプ](https://www.youtube.com/watch?v=ryaLaqNb_wQ)もありますので、こちらも見ていってください。
#動機
元々は[静電容量式タッチセンサ](https://www.switch-science.com/catalog/3679/)をスイッチサイエンスで買ったことから始まりました。

スマホと同じ原理で、タッチの有無を僅かな静電容量の充電時間から判別し、digitalRead()で返してくれる優れもの。静電容量式なら水や植物でも反応するので、結構遊んでて面白い。
<blockquote class="twitter-tweet" data-lang="ja"><p lang="ja" dir="ltr">果汁グミでタッチセンサをつくっていくスタイル。 <a href="https://t.co/a3yaRViBpF">pic.twitter.com/a3yaRViBpF</a></p>&mdash; ぱぷりか (@p3ishunma2) <a href="https://twitter.com/p3ishunma2/status/1035103512940572673?ref_src=twsrc%5Etfw">2018年8月30日</a></blockquote>
<script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>
こうして、タッチセンサでいろいろ遊んでいた時に、こちらの記事を見かけました。

[もう観葉植物を枯らさない！ Arduinoで鉢植えをしゃべらせる - Qiita](https://qiita.com/kinu/items/6cd5da0415e31834e7da)
####これ、タッチセンサで植物を喋らせれば面白いんじゃないか？
![4d5b76f9.jpg](https://qiita-image-store.s3.amazonaws.com/0/285932/6d3541f6-061d-e6ad-9475-ca23fceb0398.jpeg)
#今回の制作イメージ
![喋ボテン.png](https://qiita-image-store.s3.amazonaws.com/0/285932/10d6426f-9cc3-7473-03e4-3051966635d0.png)
世の中には触ると痛いもの、触ってはいけないもの、たくさんありますよね。サボテンのトゲも触ると痛いものですが、
実は、厳しい環境における彼らの生存戦略の結晶なのです。

そこで、ただ愛でるだけでなく、痛みを共有することもできるように、**サボテンを触ったら「痛い」と喋ってくれるようなシステム**を提案いたします。**ただし、あんまり触りすぎると、負けじとトゲで反撃してくるので、果たしてどっちが痛いのか、わからなくなること間違いなしです！**

<img width="667" alt="IMG_D9B0588CA0DA-1.jpeg" src="https://qiita-image-store.s3.amazonaws.com/0/285932/b774aef4-88df-4227-93a5-f84a9a6ca08f.jpeg">

また、余った部品と譲り受けた土壌センサで、土の水分量を監視して土が乾いてきたら、**「喉かわいた」**と喋ってくれて、水やりすると、感想具合によって「助かったわ」、ものすごく乾いていると「死ぬかと思った」とお礼を言ってくれる回路も同時に作ってみました。
#使用ハードウェア
触ると喋る方と、水やりすると喋る方に分けてそれぞれ用意。
##触ると喋る
**Arduino UNO**
今回は外でも使えるようにスタンドアローンなシステムにしようと考え、センサの値を監視するシステムをArduinoで作ることに。
~~最初はRaspberry Piで開発を試みるも、手持ちのA/D変換を経由した出力が半波整流した正弦波みたいになっていたため、敢えなく断念。~~

**microSDとDFPlayer mini**
音声をArduinoで再生するために、microSDに音声ファイルを入れて擬似的に植物に喋らせる。
DFPlayerはアンプも内蔵されていて、シールドを使うよりもコンパクトで安いので、ArduinoでMP3を再生するにはピッタリです。

**静電容量式タッチセンサ**
土の中に線を仕込んでおく

**[３．５ｍｍステレオミニジャックＤＩＰ化キット: 半導体 秋月電子通商-電子部品・ネット通販](http://akizukidenshi.com/catalog/g/gK-05363/)**
音声出力
##水やりしたら喋る
**[土壌センサ](https://www.robotshop.com/jp/ja/gravity-moisture-sensor-corrosion-resistant.html)**
半固定抵抗をanalogRead()しても問題ないと思います。

**microSDとDFPlayer mini**
**[３．５ｍｍステレオミニジャックＤＩＰ化キット: 半導体 秋月電子通商-電子部品・ネット通販](http://akizukidenshi.com/catalog/g/gK-05363/)**
こちらも同様にして音声出力させる。

#使用ソフトウェア
Arduino IDEに、DFPlayermini用のライブラリを導入。[GitHub - DFRobot/DFPlayer-Mini-mp3](https://github.com/DFRobot/DFPlayer-Mini-mp3)
音声は出番のなくなったRaspberry Piに、AquesTalk Piを導入して、出力させてみました。[AquesTalk Pi の使い方まとめ | N.Yamazaki's blog](http://blog-yama.a-quest.com/?eid=970157)
一定時間ごとに土の水分量を喋らせたいので、タイマーには、metroを使用。
[Arduinoでタイマーをつかう - みかづきブログ その3](http://kimizuka.hatenablog.com/entry/2015/10/26/000000)
[GitHub - thomasfredericks/Metro-Arduino-Wiring: Metro library for Arduino or Wiring](https://github.com/thomasfredericks/Metro-Arduino-Wiring)

#音声ファイルをmicroSDに用意
AquesTalkPiのディレクトリに移動した後、こんな感じでゆっくり音声を.wavファイルに出力

```
$ cd aquestalkpi/
$ ./AquesTalkPi 。"あーもうめちゃくちゃだよ。" -o 0008.wav
```
DFPlayerは.mp3と.wavのどちらでも再生できるようですが、今回は、iTunesで.mp3ファイルに変換することに。
![Screenshot 2018-11-19_13-03-58-152.png](https://qiita-image-store.s3.amazonaws.com/0/285932/6a6d7591-45ed-c5ab-072a-299539cf16c4.png)



#配線図
1つのArduinoにタッチセンサと土壌センサを接続すると、GNDがとれないようで、誤作動を連発してしまいました。
コンデンサを入れても、あまり改善されなかったため、分けて配線しています。
![IMG_4667.JPG](https://qiita-image-store.s3.amazonaws.com/0/285932/b3e4a40f-fda4-dccf-920c-35a989fb2ea4.jpeg)

##タッチセンサ
こちらを参考に。｜[AT42QT101X Capacitive Touch Breakout Hookup Guide - learn.sparkfun.com](https://learn.sparkfun.com/tutorials/at42qt101x-capacitive-touch-breakout-hookup-guide?_ga=2.70437584.1949638214.1518065635-1937571979.1501724101)
##DFPlayer
Arduinoのピンのなかから、ノイズの少ない3.3Vピンを電源にして、DFPlayer MiniのRX～ArduinoのTXの間に1.0kΩの抵抗を挟んで、電位差を吸収すると、比較的ノイズのない、スムーズな音声出力ができます。
このサイトに、詳細な配線があります。
[サーバルちゃんボタンをつくる、あるいはDFPlayer Miniによる音声再生を試す - にせねこメモ](https://nixeneko.hatenablog.com/entry/2017/05/11/235927)

#スケッチ
##触ると喋る
```c++:talkativepot2.ino
//talkative2
//タッチセンサの方
//できれば、距離センサも付け足したい
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Metro.h>
SoftwareSerial mySerial(10, 11); // RX, TX

boolean touch = false;
boolean last_touch = false;
Metro metro1 = Metro(600000);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module 
  mp3_set_volume (18);  // 音量の設定(0～30)
  pinMode(8,INPUT);

}

void loop() {
  // put your main code here, to run repeatedly:

  //touch  
  if(digitalRead(8) == 1){
    touch = true;
  }else{
    touch = false;
  }
  if(touch != last_touch & touch == true){
    mp3_play(random(5, 9));
  }

  last_touch = touch;
  Serial.println(touch);
  delay(100);
}
```

##水やりすると喋る
```c++:talkativepot1.ino
//talkative1
//水やりのお礼を言ってくれる。
#include <SoftwareSerial.h>
#include <DFPlayer_Mini_Mp3.h>
#include <Metro.h>
SoftwareSerial mySerial(10, 11); // RX, TX

int val = 0;
int l_val = 0;
Metro metro1 = Metro(600000);

void setup() {
  // put your setup code here, to run once:
  Serial.begin(9600);
  mySerial.begin (9600);
  mp3_set_serial (mySerial);  //set softwareSerial for DFPlayer-mini mp3 module 
  mp3_set_volume (18);  // 音量の設定(0～30)
}

void loop() {
  // put your main code here, to run repeatedly:
    val = analogRead(1);
  
  //thirsty metroで一定時間ごとに喋らせる。
  if(metro1.check() == 1){
    if(abs(val) < 300){
      mp3_play (1);
      delay(6000);
    }
    //satisfy
    else{
      mp3_play (4);
      delay(6000);
    }  
  }

  //wasdying
  if(val - l_val >= 200){
    mp3_play (3);
    delay(6000);
  }
  //thanks
  else if(val - l_val >= 100){
    mp3_play (2);
    delay(6000);
  }

  l_val = val;
  Serial.println(val);
  delay(500);
}
```
#作って実際に使ってみて
**控えめに言って、図々しいです。**
しかも、触っていると**トゲで反撃してくる**ことがあります。

でも、とりあえず使い始めてから枯れてない！
半月ぐらい共用スペースで運用していますが、触ると反応して、水をあげるとお礼も言ってくれるので、心にゆとりを持って世話ができ、ちょっと和むと好評です。

**触ってはいけないものに触れたくなる人へ**
**植物（サボテン）の水やりを忘れてしまうあなたへ**

「喋ボテン」いかがでしょうか？