アニマトロニクスっぽいものを作ってみた 解説編
こんにちは、もりです
ひとまずカナダの学校を卒業できて時間ができたのでこの前紹介したアニマトロニクスっぽいもののプログラム、仕組みなどを解説して行きたいと思います
まだ前回の記事を読んでない方はこちらから
foreststaroswaldbog.hatenablog.com
前回の記事を書いたときはエッセイが二つ溜まっていて詳しい仕組みなどを書く時間がなかったので今回解説したいと思います
使用したもの
使用したプログラミング言語は
- arduino (主にサーボの制御)
- Processing (音声の再生、音の大きさの判断)
なるべくシンプルに作りたかったので手に入りにくい部品は一切使ってません
組み立て
組み立てに関しては適当に作っていったため製作途中の写真がないので後日書き加えます
プログラム
なんだかんだ一番苦労したのがプログラム
最初は自分ですべて動きをプログラムしようとしたが、あまりにも手間がかかるのでprocessingで音の大きさに合わせてモーターを動かすようにした ただこのコードを考えるのにかなりの時間を費やしました、なにせこのアニマトロ二クスを作ってるときはprocessingを初めて2週間、arduinoを初めて2カ月だったので分からないことが山のようにあった
自分が見つけ出した答えはProcessing側で音声を再生したときにウィンドウに音の大きさによって大きさが変わる円を描いてその円の大きさが○○以上だったらシリアル通信でarduinoにAとうい文字を○○以上だったらBを、そしてarduino側で特定の文字を受けたときに指定した角度にサーボモーターがなるようにすればアニマトロ二クスもどきの完成する
※音声ファイル作成にはBalabolkaを使用
※音声ファイルはprocessingのプログラムと同じファイルに入れないと再生できないので注意
※音声ファイルはwav
ますはarduino側のコード
#include <Servo.h>//ライブラリの読み込み
Servo myservo; //口のサーボ
Servo myservo2;//目のサーボ
void setup(){
myservo.attach(9);//口のサーボは9 pinへ
myservo2.attach(10);//目のサーボは10 pinへ
myservo.write(0);//口のサーボを0度に
myservo2.write(90);//目のサーボを90度に
Serial.begin(9600);//シリアル通信
}
int val;//変数val
void loop(){
if(Serial.available())//通信をうけたら
{
val = Serial.read();//valの値を送られてきた価に
if(val == 'p'){//もしvalがpならば
myservo.write(90);//口を90度
myservo4.write(60)//目を30度ずらす
}
if(val=='b'){//valがbならば
myservo.write(0);//サーボを0度
}
if(val == 'c'){//valがcならば
myservo.write(30);//サーボを30度
}
if(val =='d'){//valがdならば
myservo2.write(120);
delay(500);
myservo2.write(60);
delay(250);
myservo2.write(90);
delay(2);
//目を30度交互に動かす
}else{
myservo.write(0);
myservo2.write(90); }
}
}
Processing 側のコード
import ddf.minim.*; //minimファイル(音声を再生するに必要なファイル)のインポート
import processing.serial.*;//シリアル通信をインポート
Minim minim; //minimの名前を指定(下の3つも同様)
Minim minim2;
Minim minim3;
Minim minim4;
AudioPlayer song,song2, song3, song4;//音声ファイル名前を指定
float volumeIn;//音量の変数(下の3つも同様)
float volumeIn2;
float volumeIn3;
float volumeIn4;
Serial port;//シリアルポート
String val;//valを設定
void setup() {
size(250,250);//ウインドウの大きさ
minim = new Minim(this);
minim2=new Minim(this);
minim3=new Minim(this);
minim4=new Minim(this);
song = minim.loadFile("Hellow I am prototype animatronic face.wav");//音声ファイルをしてい(下の3つも同様)
song2=minim2.loadFile("thankyou.wav");
song3=minim3.loadFile("When hinges creak in doorless chambers.wav");
song4=minim4.loadFile("I can speak what you want!.wav");
fill(200,0,0);
port=new Serial(this,"COM3",9600);//シリアルポートを指定
}
void draw() {
background(0);
volumeIn =map(song.left.level(), 0, 0.5, 0, width*2);//音量の値を調節(下の3つも同様)
volumeIn2=map(song2.left.level(),0,0.5,0,width*2);
volumeIn3=map(song3.left.level(),0,0.5,0,width*2);
volumeIn4=map(song4.left.level(),0,0.5,0,width*2);
ellipse(width/2, width/2, volumeIn, volumeIn); //音量に合わせて円の大きさを変える(下の3つも同様)
ellipse(width/2, width/2, volumeIn2,volumeIn2);
ellipse(width/2, width/2, volumeIn3,volumeIn3);
ellipse(width/2, width/2, volumeIn4,volumeIn4);
float A=volumeIn;//音量をA
float B=volumeIn2;//音量をB
float C=volumeIn3;//音量をC
float d=volumeIn4;//音量をd
if(A<20||B<20||C<20||d<20){//Aの値が20以下もしくはBの値が20以下もしくは…)
port.write('b');//シリアル通信でbを送る
}
if(A<30&&A>20||B<40&&B>20||C<40&&C>20||d<40&&d>20){//(A、B、C、dのどれかの値が30以下かつ20以上のとき、シリアル通信でarduinoにcを送る
port.write('c');
}
if(A>40||B>40||C>40||d>40){//A, B、C、dのうちどれかが40以上のときpをarduinoに送る
port.write('p');
}
}
void keyPressed(){
if(key=='p')//キーボードのpが押されたとき、songを再生する
{
song.rewind();
song.play();
}
if(key=='o'){//キーボードのoが押されたとき、song2を再生する
song2.rewind();
song2.play();
}
if(key=='d'){//キーボードのpが押されたとき、dを送る
port.write('d');
}
if(key=='i'){//キーボードのiが押されたとき、song3を再生する
song3.rewind();
song3.play();
}
if(key=='u'){//キーボードのuが押されたとき、song4を再生する
song4.rewind();
song4.play();
}
}
void stop(){
//曲の停止(これがないと音声ファイルの再生が止まらない)
song.close();
song2.close();
song3.close();
song4.close();
minim.stop();
minim2.stop();
minim3.stop();
minim4.stop();
super.stop();
}
以上がアニマトロ二クスっぽいもののコードと仕組みです(組み立てに関しては後日更新します)