dancingRobot-1

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

  • 以下のスケッチを 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にします。

Studuino-mini に書き込みます。

  • パソコンとStuduino Mini をusbケーブルで接続します。
  • ArduinoのIDEのツールのメニューで、下の図のように「ボード」を studuino mini、「書き込み装置」を studuino mini に設定し、右矢印のボタンをクリックして書き込みを始めます。 Arduino IDEの下部の緑の横棒の表示が、「スケッチをコンパイルしています」から「マイコンボードに書き込んでいます」に変わったら、2秒以内にStuduino mini の白いリセットボタンを押します。-> 書き込みがはじまります。
    • studuino-mini-2.jpg
  • 書き込みが終わったら、すぐに実行が始まります。
    • 最初、ちょっとサーボモータが動きます。(動かない場合もあります)
    • Studuino mini の光センサを紙などで遮って暗くし、再び明るくしたら、音楽を演奏しながら、サーボモータが動き始めます。
    • 再び、光センサを暗くし、再び明るくするとサーボモータの動作と音楽の演奏が止まります。
    • 電池ボックスのスイッチをOffにして、USBケーブルを Studuino mini から抜きます。

Counter: 1777, today: 1, yesterday: 0

添付ファイル: filestuduino-mini-2.jpg 537件 [詳細]

トップ   編集 凍結 差分 バックアップ 添付 複製 名前変更 リロード   新規 一覧 単語検索 最終更新   ヘルプ   最終更新のRSS
Last-modified: 2017-04-18 (火) 14:22:06 (2557d)