#1.声
作品名:「声」
— 霞展【ネット展示会実施中】 (@kasumi_ten) February 29, 2020
作者:@tueks3
所属:上智大学美術研究会
詳細:https://t.co/jQ9pqSmAOU pic.twitter.com/yg4t9wZ7Y3
3/2,3に開催する霞展のテーマ「幻」に合わせて、「声」という作品を製作しました。
手前についている白いボタンを触ってみてください。
連打・長押しなどなど、色々な声が楽しめます。
質問はTwitter@tueks3まで!
【霞展】
開催日:3/2, 3
場所:池袋ORANGE GALLERY
######新型肺炎の影響で霞展の中止が決定しました。関係者各位本当にご準備お疲れさまでした。
パワポ君に頑張ってもらった pic.twitter.com/zd2NTki0HX
— tueks (@tueks3) February 27, 2020
友人の笑い声とかその他諸々をミックスしました pic.twitter.com/Qd5SksRhQq
— tueks (@tueks3) February 24, 2020
#3.回路図
######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変調の様子。
美しきPWMの世界 pic.twitter.com/i3jfQnF0hT
— tueks (@tueks3) February 18, 2020
#4.コード
コードはDFPlayerMini公式サイトのサンプルスケッチをいじりました。
参考:https://wiki.dfrobot.com/DFPlayer_Mini_SKU_DFR0299#Sample_Code
/***************************************************
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