mp3サンプラー
mp3サンプラー
https://inline.inajob.tk/img/twitter-5643382/mp3%E3%82%B5%E3%83%B3%E3%83%97%E3%83%A9%E3%83%BC/075d0b23-8dc8-11eb-832d-1a53af6c85a1#.png
- タッチセンサー6個
- MP3プレイヤーモジュール
- Arduino
仕様
- Phase1
-- タップすると対応するmp3が鳴る
- Phase2 (まだやってない)
-- 8拍でループしmp3の配置を録音できる
--- 拍を示すLEDが少なくとも1つ必要
--- mp3記録の分解能は32くらい欲しい
--- 無音を挿入する方法がない リセットボタンなどを用意したい
プロトタイピング
- Arduino
-- ただし音量が小さいとノイズがすごい
--- 信号線に1K入れておくとOK
-- 見せびらかす用にはライン出力も露出したほうがいいかも
- 組み合わせ動作も確認できた
- TX,RXの間に1Kを挟むのがよさそう
- できればArduinoからリズム音を出力して合成したい気持ち、ただしその場合はアンプが必要になる・・Phase2かな
CNCプロトタイピング
- ATMega328P
- DFPlayer Mini
- 5Vレギュレータの良いのがない(ドロップが大きすぎる)
-- ひとまず大き目のドロップのレギュレータを使い 9V電池駆動にする
- ボードを1枚にすると 銅箔面は裏面になるので 基板表面にLEDやスイッチを配置することが難しい
- 電源ボードを別に設計する
-- 昇圧して5Vを作る
-- Li-Poで5Vを作る
-- USB給電
ロードマップ
Program
> code
SoftwareSerial mySoftwareSerial(10, 11); // RX, TX
DFRobotDFPlayerMini myDFPlayer;
int ref0, ref1, ref2, ref3, ref4, ref5; //reference values to remove offset
void setup()
{
// No pins to setup, pins can still be used regularly, although it will affect readings
Serial.begin(9600);
ref0 = ADCTouch.read(A0, 500); //create reference values to
ref1 = ADCTouch.read(A1, 500); //account for the capacitance of the pad
ref2 = ADCTouch.read(A2, 500);
ref3 = ADCTouch.read(A3, 500);
ref4 = ADCTouch.read(A4, 500);
ref5 = ADCTouch.read(A5, 500);
mySoftwareSerial.begin(9600);
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){
delay(0); // Code to compatible with ESP8266 watch dog.
}
}
Serial.println(F("DFPlayer Mini online."));
myDFPlayer.volume(15); //Set volume value. From 0 to 30
myDFPlayer.play(1); //Play the first mp3
}
int trigger0 = 0;
int trigger1 = 0;
int trigger2 = 0;
int trigger3 = 0;
int trigger4 = 0;
int trigger5 = 0;
void loop()
{
int value0 = ADCTouch.read(A0,10); //no second parameter
int value1 = ADCTouch.read(A1,10); // --> 100 samples
int value2 = ADCTouch.read(A2,10);
int value3 = ADCTouch.read(A3,10);
int value4 = ADCTouch.read(A4,10);
int value5 = ADCTouch.read(A5,10);
value0 -= ref0; //remove offset
value1 -= ref1;
value2 -= ref2;
value3 -= ref3;
value4 -= ref4;
value5 -= ref5;
//Serial.print(value0 > 40); //send (boolean) pressed or not pressed
//Serial.print("\t"); //use if(value > threshold) to get the state of a button
if(value0 > 40){
if(trigger0 == 0){
myDFPlayer.play(1);
}
trigger0 ++;
}else{
trigger0 = 0;
}
//Serial.print(value1 > 40);
//Serial.print("\t\t");
if(value1 > 40){
if(trigger1 == 0){
myDFPlayer.play(2);
}
trigger1 ++;
}else{
trigger1 = 0;
}
if(value2 > 40){
if(trigger2 == 0){
myDFPlayer.play(3);
}
trigger2 ++;
}else{
trigger2 = 0;
}
if(value3 > 40){
if(trigger3 == 0){
myDFPlayer.play(4);
}
trigger3 ++;
}else{
trigger3 = 0;
}
if(value4 > 40){
if(trigger4 == 0){
myDFPlayer.play(5);
}
trigger4 ++;
}else{
trigger4 = 0;
}
if(value5 > 40){
if(trigger5 == 0){
myDFPlayer.play(6);
}
trigger5 ++;
}else{
trigger5 = 0;
}
//Serial.print(value0); //send actual reading
//Serial.print("\t");
//Serial.println(value1);
//delay(100);
}
<<
記事
> oembed
<<