//---------------------------------------------------------------------- // ベゼリーおしゃべりキット(BTK) 基本プログラム Studuino用 // 最終更新:2016年7月28日 by Jun Toyoda (Team Bezelie) // 機能: // 1:電源を入れると、しゃべって動く。 // 2:暗くなると動きが止まる。 // 3:デジタルピン用コネクタ5番でサーボのセンタリングができる。 //---------------------------------------------------------------------- #include // サーボのライブラリ #include // I2Cライブラリ #include // AquesTalk ライブラリ AquesTalk atp; // AquesTalk インスタンス定義 //サーボ初期設定 Pitch=首の縦振り, Roll=顔の回転, Yaw=体の回転 const int svPc = 90; // サーボの中心角度(Pitch) const int svRc = 90; // サーボの中心角度(Roll) const int svYc = 90; // サーボの中心角度(Yaw) int destP = svPc; // サーボの目標角度(Pitch) int destR = svRc; // サーボの目標角度(Roll) int destY = svYc; // サーボの目標角度(Yaw) int spd = 0; // サーボの速度。0が最速 //---------------------------------------------------------------------- void setup() // 初期設定 { initServo(); // サーボの初期センタリング atp.SetAccent(0x70); // AquesTalk声色指定 アクセント atp.SetPitch(0x03); // AquesTalk声色指定 ピッチ atp.SetSpeed(100); // AquesTalk声色指定 スピード atp.Synthe("#J"); // AquesTalk発声「チャイム1」 while(atp.IsBusy()) ; // AquesTalk 鳴り止むまで待つ delay (1000); } //---------------------------------------------------------------------- void loop() // メインループ { if(analogRead(A6) > 200){ // 光センサの読み込み spd = 0; // サーボの速度 destY = svYc + 15; // 体を左に回す指定 servoMove(); // サーボを動かす destY = svYc - 15; // 体を右に回す指定 servoMove(); // サーボを動かす destY = svYc; // 体を正面に向ける指定 servoMove(); // サーボを動かす atp.Synthe("konnnichiwa"); // AquesTalk発声 destP = svPc + 15; // 首を下に動かす指定 servoMove(); // サーボを動かす delay (500); // 0.5秒待つ destP = svPc ; // 首を元に戻す指定 servoMove(); // サーボを動かす destR = svRc + 10; // 首を反時計回りに回す指定 servoMove(); // サーボを動かす destR = svRc - 10; // 首を時計回りに回す指定 servoMove(); // サーボを動かす destR = svRc; // 首を元に戻す指定 servoMove(); // サーボを動かす delay (1000); // 1秒待つ } } //---------------------------------------------------------------------- // サーボの設定 const int pinSvC = 5; // サーボ(センタリング用)をGPIO 5に割り当てる const int pinSvP = 9; // サーボ(Pitch)をGPIO 9に割り当てる const int pinSvR = 10; // サーボ(Roll)をGPIO 10に割り当てる const int pinSvY = 11; // サーボ(Yaw)をGPIO 11に割り当てる Servo svC; // サーボのインスタンスを作る(センタリング用) Servo svP; // サーボのインスタンスを作る(Pitch 首の縦振り用) Servo svR; // サーボのインスタンスを作る(Roll 顔の回転用) Servo svY; // サーボのインスタンスを作る(Yaw 体の回転用) int posP = svPc; // サーボの現在の角度(Pitch) int posR = svRc; // サーボの現在の角度(Roll) int posY = svYc; // サーボの現在の角度(Yaw) //---------------------------------------------------------------------- //関数 void servoMove (){ // サーボを動かす関数 while (posP != destP){ svP.attach(pinSvP); if (posP < destP){ posP++; }else{ posP--; } svP.write(posP); delay (spd+15); } while (posR != destR){ svR.attach(pinSvR); if (posR < destR){ posR++; }else{ posR--; } svR.write(posR); delay (spd+15); } while (posY != destY){ svY.attach(pinSvY); if (posY < destY){ posY++; }else{ posY--; } svY.write(posY); delay (spd+15); } svP.detach (); svR.detach (); svY.detach (); } void centering (){ // サーボをセンタリングする関数 spd = 1; destP = svPc; destR = svRc; destY = svYc; servoMove(); } void initServo (){ // サーボの初回センタリング svC.attach(pinSvC); svP.attach(pinSvP); svR.attach(pinSvR); svY.attach(pinSvY); svC.write(100); svP.write(svPc); svR.write(svRc); svY.write(svYc); delay (500); svC.write(90); delay (500); svC.detach (); svP.detach (); svR.detach (); svY.detach (); } //---------------------------------------------------------------------- // AquesTalk pico LSIに関する情報 // 音声記号列生成サービス http://www.a-quest.com/demo/pico_kanji2roman.html // 記述ルール http://www.a-quest.com/download/manual/atp3011_datasheet.pdf // ライブラリ http://blog-yama.a-quest.com/?eid=970151 //---------------------------------------------------------------------- //end of file