LoginSignup
4
1

More than 3 years have passed since last update.

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

Last updated at Posted at 2020-02-24

1.声

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

【霞展】
開催日:3/2, 3
場所:池袋ORANGE GALLERY

新型肺炎の影響で霞展の中止が決定しました。関係者各位本当にご準備お疲れさまでした。

2.制作風景

91620E17-DF1A-4284-95B9-5CF321E9A388.jpeg
EBF7EB97-E929-4761-A5CE-B52D93968783.jpeg
F4D731A2-8516-458F-BA34-C482905C5442.jpeg
31B4DCD4-4905-403C-BAC2-57745D3A3801.jpeg
6BA9FF4B-0BFC-4D10-8A6E-3DFE548AFDA9.jpeg
F3012507-7AB3-4A52-AB43-0CC34816232E.jpeg
6BB054A0-0EB5-43F5-94DE-A194E9BB108C.jpeg
84A78716-D2D9-4117-A78B-2F7A4D1792AC.jpeg
2AA26733-E0E5-427D-B41C-5FB0B4D36E1D.jpeg
F26CA386-C70B-4CBA-A6A9-22C79DECC26C.jpeg

3.回路図

schem.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変調の様子。

4.コード

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

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

4
1
0

Register as a new user and use Qiita more conveniently

  1. You get articles that match your needs
  2. You can efficiently read back useful information
  3. You can use dark theme
What you can do with signing up
4
1