[[dancingRobot-1]]
** ソフトウェア(スケッチまたはプログラム) [#pca51c3a]
- 以下のスケッチを Studuino-mini が使えるようになったArduino IDEのエディタにコピペします。

 /* 
 *  音楽に合わせてダンスを踊るロボットのスケッチ、その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 止まります。
 }

** 電子回路の作成でサーボモータ、電池ボックス、音楽演奏回路が接続された Studuino mini (ショートがないことをテスターで確認済のもの)とパソコンを USBケーブルで接続します。電池ボックスの電源スイッチをOnにします。 [#jf700b27]
** Studuino-mini に書き込みます。 [#t33eda1b]
- パソコンとStuduino Mini をusbケーブルで接続します。
- ArduinoのIDEのツールのメニューで、下の図のように「ボード」を studuino mini、「書き込み装置」を studuino mini に設定し、右矢印のボタンをクリックして書き込みを始めます。
Arduino IDEの下部の緑の横棒の表示が、「スケッチをコンパイルしています」から「マイコンボードに書き込んでいます」に変わったら、2秒以内にStuduino mini の白いリセットボタンを押します。-> 書き込みがはじまります。 
-- &ref(例題プログラムの書き込み/studuino-mini-2.jpg,50%);
- 書き込みが終わったら、すぐに実行が始まります。
-- 最初、ちょっとサーボモータが動きます。(動かない場合もあります)
-- Studuino mini の光センサを紙などで遮って暗くし、再び明るくしたら、音楽を演奏しながら、サーボモータが動き始めます。
-- 再び、光センサを暗くし、再び明るくするとサーボモータの動作と音楽の演奏が止まります。
-- 電池ボックスのスイッチをOffにして、USBケーブルを Studuino mini から抜きます。、
-- 電池ボックスのスイッチをOffにして、USBケーブルを Studuino mini から抜きます。
----
#counter

トップ   編集 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS