* dancingRobot-1 [#xa58f404]
- 福山大学工学部みらい工学プロジェクト - フィジカルコンピューティング
-- [[福山大学:http://www.fukuyama-u.ac.jp]]工学部情報工学科 [[山之上 卓:http://www.yama-lab.org/~yamanoue/wiki/]]
** 音楽に合わせて踊るロボットを作ってみる [#ac5a2a33]
- Studuino Mini の光センサが一度暗くなってまた明るくなると、音楽が流れると同時に、ロボットの首と両腕が動き始めます。プログラムのデータを変えることによって、動作を変えることができます。音楽は市販のMP3プレイヤーを使って流しています。音楽のMP3ファイルはmini-SDカードに書き込まれていて、このファイルを変えることによって様々な音楽を流すことができます。&br;
&br;
- &ref(dancingRobot-1/ダンスロボット-1-写真-1.jpg);
- ビデオ... https://www.youtube.com/watch?v=UmPmmAhk-Js
** ハードウェア [#uab59579]
*** 概要 [#vce7d83e]
- ロボットの駆動と音楽演奏をStuduinoMini で制御します。
-- 工作用紙で作ったロボットの胴体にサーボモータをつけて、顔と左右の腕を動かします。
-- サーボモータの制御とMP3プレイヤーのOn/Offの制御はStuduino Mini によって行います。
--  MP3プレイヤをOn/Offするためにトランジスタと電磁リレーを使っています。
*** ロボットの胴体と顔と腕のペーパークラフト ... 工作用紙を利用 [#p6fac15f]
-- &ref(dancingRobot-1/みらい工学-ロボット胴体-20170321191432.pdf);

** ソフトウェア(スケッチまたはプログラム) [#pc3df5bf]

 /* 
 *  音楽に合わせてダンスを踊るロボットのスケッチ、その1。
 *  ハードウェア:
 *     Studuino mini x 1
 *     サーボ SG-90 x 3
 *     【MA-8564】APOD MP3 / MP3プレイヤー
 *     NPN トランジスタ ... 2SC1815
 *     ダイオード
 *     リレー
 *     抵抗 4.7kΩ (1kΩでも良い)
 *     5V 電源オーディオアンプ
 *     スピーカー
 *     ジャンプワイヤ, オスーオス, オスーメス
 *     ブレッドボード
 *     
 *  Studuino-mini を明るいところに置き、光センサを厚い紙などで一度覆って、
 *  その覆いを取ると、ロボットがダンスを始めると同時に、音楽の演奏が始まります。
 *  もう一度、光センサを紙で覆って、覆いを外すとダンスも音楽も止まります。
 *  以下を参考にしました。
 *  光センサの反応は、環境によってかなり変わるようなので、スイッチに変更するかも
 *  しれません。
 *  
 *  - Sweep
 *  by BARRAGAN <http://barraganstudio.com>
 *  This example code is in the public domain.
 *   
 *   modified 8 Nov 2013
 *   by Scott Fitzgerald
 *   http://www.arduino.cc/en/Tutorial/Sweep
 *   
 *   - 「Arduinoで音楽(MP3)を再生する方法-1000円未満でとりあえず鳴らせるよ」
 *   http://noboyu.hatenablog.com/entry/2016/05/03/083100
 
 */ 
 
 #include <Servo.h>
 
 Servo ss[3];  // create servo object to control a servo
 // twelve servo objects can be created on most boards
 
 int pos = 0;    // variable to store the servo position
 int runState=0; /*
                     動作状態
                     runState=0 ... stop
                     runState=1 ... stop -> run
                     runState=2 ... run
                     runState=3 ... run -> stop
                */
 int sox=5; // sound switch pin, 
 int lux=0; // 照度
 int luxThr=30; // 照度の反応の域値
 int motion[120][3]; // motion[step][servoID,0..2] //動きを格納する配列。
 int msMax=109; // 動きのステップの最大値
 int ms; // motion step // (現在の)動きのステップ。
 
 void setup() {
  ss[0].attach(9);  // attaches the servo on pin 9 to 11 to the servo object
  ss[1].attach(10);
  ss[2].attach(11);
  pinMode(sox,OUTPUT); // soxピン(5番ピン, 音楽スタートピン)を出力に設定。
  digitalWrite(sox,LOW); // soxピンの出力をLOWにします。
   
  for(int i=0;i<3;i++){
    ss[i].write(90); // サーボモータの位置を、全て中央(90度)にします。
                     // サーボモータは、0度から180度まで移動できます。
                     // 但し、ロボットの手と顔と胴体がぶつからないように注意。
  }
  for(int j=0;j<120;j++){
    motion[j][0]=90; motion[j][1]=90; motion[j][2]=90;
                     //動きを格納する配列の要素に、全て90度を入れて初期化します。
  }
  ms=0;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
     // 最初のステップでは、サーボの位置を中央にします。
  motion[ms][0]=95; motion[ms][1]=90; motion[ms][2]=90; ms++;
     // 次のステップでは、サーボ0(9番ピンのサーボ)の位置を95度にします。以下、
     // ステップによってサーボに位置を変更します。
  motion[ms][0]=100; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=105; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=110; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=115; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=120; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=125; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=130; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=135; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=130; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=125; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=120; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=115; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=110; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=105; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=100; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=95; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=85; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=80; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=75; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=70; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=65; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=60; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=55; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=50; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=45; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=50; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=55; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=60; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=65; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=70; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=75; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=80; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=85; motion[ms][1]=90; motion[ms][2]=90; ms++;
  // 36
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;  
  motion[ms][0]=90; motion[ms][1]=95; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=100; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=105; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=110; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=115; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=120; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=125; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=130; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=135; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=130; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=125; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=120; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=115; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=110; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=105; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=100; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=95; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=85; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=80; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=75; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=70; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=65; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=60; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=55; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=50; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=45; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=50; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=55; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=60; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=65; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=70; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=75; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=80; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=85; motion[ms][2]=90; ms++;
  //72
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=95; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=100; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=105; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=110; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=115; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=120; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=125; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=130; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=135; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=130; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=125; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=120; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=115; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=110; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=105; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=100; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=95; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=85; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=80; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=75; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=70; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=65; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=60; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=55; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=50; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=45; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=50; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=55; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=60; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=65; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=70; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=75; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=80; ms++;
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=85; ms++;    
  //108
  motion[ms][0]=90; motion[ms][1]=90; motion[ms][2]=90; ms++;
 //  msMax=ms;
  msMax=109; 
  ms=0;
 }
 
 void loop() {
  lux=analogRead(A6); //照度を読み取り、lux に入れます。
  /* */
  if(runState==0){ // もし、stop state で、暗くなったら、
                   // runStateを stop->run (1)にします。
     if(lux<luxThr){
         runState=1;
     } 
  }
  if(runState==1){ // もし、stop->run stateで明るくなったら、
                   // runStateを run (2) にします。
     if(lux>luxThr){
         runState=2;
         digitalWrite(sox,HIGH); // 音楽をスタートします。
     }
  }
  if(runState==2){ // もし、run state で、暗くなったら、
                   //  runState を run->stop (3)にします。
     if(lux<luxThr){
         runState=3;
     }
  }
  if(runState==3){ // もし、run->stop stateで明るくなったら、
                   // runState を stop にします。
     if(lux>luxThr){
         runState=0;
         for(int i=0;i<3;i++){
           ss[i].write(90); // 3つのサーボモータの位置を中央に戻します。
         } 
         ms=0; // 動きのステップを 0にします。
         digitalWrite(sox,LOW); // 音楽を止めます。
     }
  }
 
  if(runState==2){ // もし runState が run (2)の時は、サーボモータを動かして、
                   // 次のステップに進みます。
    for(int i=0;i<3;i++){
      ss[i].write(motion[ms][i]);
    }
    ms++;
    if(ms>=msMax){ // 最後のステップまで行ったら、最初に戻ります。
      ms=0;
    }
  }
  delay(20); // 20ms 止まります。
 } 
** ソフトウェア [#k1bd45c6]
*** 概要 [#xdad0944]
- 光センサが明るい->暗い->明るいの変化を見つけたら、音楽演奏を開始し、ロボットをプログラムに従って動かします。
** 部品・材料 [#te5135b0]
- [[部品・材料]]
** 道具 [#ue88abee]
- [[道具]]
** 作り方 [#hdc60695]
- [[作り方]]

** 参考文献 [#a96ab048]
- Arduinoで音楽(MP3)を再生する方法-1000円未満でとりあえず鳴らせるよ
-- http://noboyu.hatenablog.com/entry/2016/05/03/083100
----
#counter


トップ   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS