＜霞展作品 "声" ＞パラメトリックスピーカーの製作

#1.声
<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">作品名：「声」<br>作者：<a href="https://twitter.com/tueks3?ref_src=twsrc%5Etfw">@tueks3</a><br>所属：上智大学美術研究会<br>詳細：<a href="https://t.co/jQ9pqSmAOU">https://t.co/jQ9pqSmAOU</a> <a href="https://t.co/yg4t9wZ7Y3">pic.twitter.com/yg4t9wZ7Y3</a></p>&mdash; 霞展【ネット展示会実施中】 (@kasumi_ten) <a href="https://twitter.com/kasumi_ten/status/1233771054780207104?ref_src=twsrc%5Etfw">February 29, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

3/2,3に開催する霞展のテーマ「幻」に合わせて、「声」という作品を製作しました。
手前についている白いボタンを触ってみてください。
連打・長押しなどなど、色々な声が楽しめます。
質問はTwitter[@tueks3](https://twitter.com/tueks3)まで！

【霞展】
~~開催日：3/2, 3~~
~~場所：池袋[ORANGE GALLERY](http://www.e-tamaya.biz/og/)~~
######新型肺炎の影響で霞展の中止が決定しました。関係者各位本当にご準備お疲れさまでした。

#2.制作風景
![91620E17-DF1A-4284-95B9-5CF321E9A388.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/46e98c78-e06f-95e4-3be3-65fed5a1967a.jpeg)
![EBF7EB97-E929-4761-A5CE-B52D93968783.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/03b5ff60-e15a-a016-ec0f-2792dac0319a.jpeg)
![F4D731A2-8516-458F-BA34-C482905C5442.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/fef15ed7-8a23-d80a-3963-584f8a980038.jpeg)
![31B4DCD4-4905-403C-BAC2-57745D3A3801.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/05d1277a-413e-83bc-9ec7-ac9f95ac34e4.jpeg)
![6BA9FF4B-0BFC-4D10-8A6E-3DFE548AFDA9.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/16ace0c5-0fce-a68c-21c4-bc82f7e4b606.jpeg)
![F3012507-7AB3-4A52-AB43-0CC34816232E.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/31f4493d-3e5c-b32c-4e81-84eb0d885b07.jpeg)
![6BB054A0-0EB5-43F5-94DE-A194E9BB108C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/4eb29ac7-55b9-99b3-7595-b5f5d1092e59.jpeg)
![84A78716-D2D9-4117-A78B-2F7A4D1792AC.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/253bfa93-83b8-decd-d5dd-59d771a4a19b.jpeg)
![2AA26733-E0E5-427D-B41C-5FB0B4D36E1D.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/04d96a65-526d-b707-37fd-9fa635c04480.jpeg)
![F26CA386-C70B-4CBA-A6A9-22C79DECC26C.jpeg](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/003a8172-ef6b-de25-ec35-118e39094801.jpeg)

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">パワポ君に頑張ってもらった <a href="https://t.co/zd2NTki0HX">pic.twitter.com/zd2NTki0HX</a></p>&mdash; tueks (@tueks3) <a href="https://twitter.com/tueks3/status/1232957775698747392?ref_src=twsrc%5Etfw">February 27, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">友人の笑い声とかその他諸々をミックスしました <a href="https://t.co/Qd5SksRhQq">pic.twitter.com/Qd5SksRhQq</a></p>&mdash; tueks (@tueks3) <a href="https://twitter.com/tueks3/status/1231970753387487232?ref_src=twsrc%5Etfw">February 24, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>

#3.回路図
![schem.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/574102/b8a47c5b-5f00-3e3c-12df-40a17bb3e557.png)
######2/25:回路図修正
参考URL:http://www.zao.jp/radio/parametric/parts-list_20160913.pdf
公開してくださった作者に感謝。
超音波スピーカーの変調方式はAM変調が一般的に解説されていますが、PWMでも大丈夫なようです。

######Modulator
変調器はDCDCコンバータでおなじみのTL494です。
TL494のDTC端子（4）に加える電圧によって出力のデューティー比が変わるので、RV1で基本のデューティ比を設定します（≒音量の設定）。
Audio_Inからの音声入力を重畳させることでPWMを実現します。

######Driver
スピーカー用のドライバにIR2110を使用しています。これはゲートドライバなので本当はこの先にFETを接続すべきですが面倒なので直接スピーカーを駆動しています。
出力3A許容だしいけるやろと思ったら熱々になりながらも動きました。（ちょっと香ばしい）

######MP3 Player
音源はArduino NanoとDFPlayerMiniを使用しています。
DFPlayer単体でも駆動できますが、展示用に再生する曲のシーケンスを組みたかったこと・部屋に転がってたArduino互換機を使ってみたかったことからこの構成になりました。


######PWM変調の様子。

<blockquote class="twitter-tweet"><p lang="ja" dir="ltr">美しきPWMの世界 <a href="https://t.co/i3jfQnF0hT">pic.twitter.com/i3jfQnF0hT</a></p>&mdash; tueks (@tueks3) <a href="https://twitter.com/tueks3/status/1229658910937583616?ref_src=twsrc%5Etfw">February 18, 2020</a></blockquote> <script async src="https://platform.twitter.com/widgets.js" charset="utf-8"></script>


#4.コード

コードはDFPlayerMini公式サイトのサンプルスケッチをいじりました。
参考：https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299#Sample_Code


```cpp:DFP_randomplay.ino
/***************************************************
  DFPlayer - A Mini MP3 Player For Arduino
  <https://www.dfrobot.com/index.php?route=product/product&product_id=1121>

 ***************************************************
  This example shows the basic function of library for DFPlayer.

  Created 2016-12-07
  By [Angelo qiao](Angelo.qiao@dfrobot.com)

  GNU Lesser General Public License.
  See <http://www.gnu.org/licenses/> for details.
  All above must be included in any redistribution
 ****************************************************/

/***********Notice and Trouble shooting***************
  1.Connection and Diagram can be found here
  <https://www.dfrobot.com/wiki/index.php/DFPlayer_Mini_SKU:DFR0299#Connection_Diagram>
  2.This code is tested on Arduino Uno, Leonardo, Mega boards.
 ****************************************************/

#include "Arduino.h"
#include "SoftwareSerial.h"
#include "DFRobotDFPlayerMini.h"

SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
void printDetail(uint8_t type, int volumeue);

int volume = 24;
int SW1 = digitalRead(5);

void setup()
{
  mySoftwareSerial.begin(9600);
  Serial.begin(115200);

  Serial.println();
  Serial.println(F("DFRobot DFPlayer Mini Demo"));
  Serial.println(F("Initializing DFPlayer ... (May take 3~5 seconds)"));

  if (!myDFPlayer.begin(mySoftwareSerial)) {  //Use softwareSerial to communicate with mp3.
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1.Please recheck the connection!"));
    Serial.println(F("2.Please insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));

  myDFPlayer.volume(volume);  //Set volume volumeue. From 0 to 30
  myDFPlayer.playFolder(2,1);
  myDFPlayer.loopFolder(2);//フォルダ②の曲をループ

}

void loop()
{

  /*
    if(SW1==HIGH){
    myDFPlayer.play(random(2,5));
    }

    myDFPlayer.loop(1); //roop the first mp3
    /*
    analoginによる音量調節、これ使うと動作中に音揺れるのであまりよくない。
    volume=map(analogRead(0),0,1023,0,30);
    myDFPlayer.volume(volume);  //Set volume volumeue. From 0 to 30
  */
  /*
    static unsigned long timer = millis();

    if (millis() - timer > 3000) {
     timer = millis();
     myDFPlayer.next();  //Play next mp3 every 3 second.
    }
  
  if (volume <= 28) {
    if (digitalRead(3) == HIGH) {
      delay(40);
      volume = volume + 2;
    }
  }
  if (volume >= 0) {
    if (digitalRead(4) == HIGH) {
      delay(40);
      volume = volume - 2;
    }
  }
  myDFPlayer.volume(volume);  //Set volume volumeue. From 0 to 30

*/



  if (myDFPlayer.available()) {
    printDetail(myDFPlayer.readType(), myDFPlayer.read()); //Print the detail message from DFPlayer to handle different errors and states.
    //状態の読み取り、シリアル通信から確認
  }


  if (digitalRead(2) == HIGH) {
    delay(random(80, 450));
    myDFPlayer.play(random(1,17));
    delay(50);
    //フォルダ①の1~17の曲をランダムに再生
  }



void printDetail(uint8_t type, int volumeue) {
  switch (type) {
    case TimeOut:
      Serial.println(F("Time Out!"));
      break;
    case WrongStack:
      Serial.println(F("Stack Wrong!"));
      break;
    case DFPlayerCardInserted:
      Serial.println(F("Card Inserted!"));
      break;
    case DFPlayerCardRemoved:
      Serial.println(F("Card Removed!"));
      break;
    case DFPlayerCardOnline:
      Serial.println(F("Card Online!"));
      break;
    case DFPlayerPlayFinished:
      Serial.print(F("Number:"));
      Serial.print(volumeue);
      Serial.println(F(" Play Finished!"));
      Serial.println(type);
     // myDFPlayer.loop(1);
      myDFPlayer.loopFolder(2);  //ランダム再生終了後、フォルダ②に戻ってループ
      break;


    case DFPlayerError:
      Serial.print(F("DFPlayerError:"));
      switch (volumeue) {
        case Busy:
          Serial.println(F("Card not found"));
          break;
        case Sleeping:
          Serial.println(F("Sleeping"));
          break;
        case SerialWrongStack:
          Serial.println(F("Get Wrong Stack"));
          break;
        case CheckSumNotMatch:
          Serial.println(F("Check Sum Not Match"));
          break;
        case FileIndexOut:
          Serial.println(F("File Index Out of Bound"));
          break;
        case FileMismatch:
          Serial.println(F("Cannot Find File"));
          break;
        case Advertise:
          Serial.println(F("In Advertise"));
          break;
        default:
          break;
      }
      break;
    default:
      break;
  }
}
```

######コード解説:
展示会でやりたかった「テーマ曲をループ」「スイッチを押したときに他の曲をランダム再生」「ランダム再生終了後、テーマ曲に戻ってループ」
を行っています。

展示用に裏モードを搭載しています。スイッチの押し方で裏モードに入れますので、会場でご覧の方は是非探してみて下さい！


#5.終わりに
テーマ曲を書いてくれた友人、展示の機会を設けてくださった中央理工の皆様
協力してくださった美術研究会の渉外担当の方
そして何より作品を見にここに来てくれた皆様
心より感謝申し上げます。

tueks