//---------------------------------------------------------------------- // ベゼリーおしゃべりキット(BTK) サンプルプログラム Studuino用 // 最終更新:2016年7月28日 Jun Toyoda // 機能:喋りながら動くデモ。複数の音声と動き。 //---------------------------------------------------------------------- #include // サーボのライブラリ #include // I2Cライブラリ #include // AquesTalk ライブラリ AquesTalk atp; //インスタンス定義 変数名は任意 const char mes1[] PROGMEM = "konnnichiwa'"; // const char mes2[] PROGMEM = "bo'_ku,be'zeri-."; // const char mes3[] PROGMEM = "suri-dhi-puri'nnta-de/_tsukura'reta,ro'bottode_su."; // const char mes4[] PROGMEM = "mittsu'no,sa-bomo'-ta-de/ugoka_su+kotoga/dekima_su."; // const char mes5[] PROGMEM = "unazu'ki"; // const char mes6[] PROGMEM = "miage"; // const char mes7[] PROGMEM = "kubiburi."; // const char mes8[] PROGMEM = "kubika/shige'."; // const char mes9[] PROGMEM = "migika'itenn."; // const char mes10[] PROGMEM = "hidarika'itenn."; // // 音声記号列生成サービス http://www.a-quest.com/demo/pico_kanji2roman.html // 記述ルール http://www.a-quest.com/download/manual/atp3011_datasheet.pdf // ' アクセント記号。音が高→低に切り替わる間に入れる。 // / 一文の中に複数のアクセントを設定する場合はスラッシュで区切る // _ 無声化。_suなど。決められた文字にしか指定できない。 // っ 'xtu // ライブラリ http://blog-yama.a-quest.com/?eid=970151 // サーボの設定 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 体の回転用) 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 posP = svPc; // サーボの現在の角度(Pitch) int posR = svRc; // サーボの現在の角度(Roll) int posY = svYc; // サーボの現在の角度(Yaw) int spd = 0; // サーボの速度。0が最速 // 変数設定 char key[] = "1234567890"; // コマンドの指定 const int commNum = 10; // コマンドの種類 int keyNum = 0; // コマンド番号 char keyChr; // コマンド文字 //---------------------------------------------------------------------- void setup() // 初期設定 { initServo(); // サーボの初期センタリング atp.SetAccent(0x70); // AquesTalk声色指定 アクセント atp.SetPitch(0x03); // AquesTalk声色指定 ピッチ atp.SetSpeed(100); // AquesTalk声色指定 スピード atp.Synthe("#J"); // AquesTalk発声「チャイム1」 while(atp.IsBusy()) ; // AquesTalk 鳴り止むまで待つ Serial.begin(9600); delay (500); } //---------------------------------------------------------------------- void loop() // メインループ { if(Serial.available()>0){ keyChr = Serial.read(); } else { keyChr = key[keyNum]; } switch (keyChr){ case '1': // atp.SyntheP(mes1); spd = 4; destP = svPc + 15; servoMove(); delay (500); break; case '2': // atp.SyntheP(mes2); spd = 4; destR = svRc + 20; servoMove(); destR = svRc - 20; servoMove(); break; case '3': // atp.SyntheP(mes3); for (int i=0;i<3;i++){ spd = 4; destR = svRc + 10; servoMove(); destR = svRc - 10; servoMove(); destR = svRc; servoMove(); spd = 2; destP = svPc + 10; servoMove(); destP = svPc - 10; servoMove(); } break; case '4': // atp.SyntheP(mes4); for (int i=0;i<3;i++){ spd = 4; destR = svRc + 10; servoMove(); destR = svRc - 10; servoMove(); destR = svRc; servoMove(); spd = 2; destP = svPc + 10; servoMove(); destP = svPc - 10; servoMove(); } break; case '5': // atp.SyntheP(mes5); for (int i=0;i<2;i++){ spd = 1; destP = svPc + 15; servoMove(); destP = svPc; servoMove(); } break; case '6': // atp.SyntheP(mes6); spd = 1; destP = svPc - 20; servoMove(); delay (200); break; case '7': // atp.SyntheP(mes7); spd = 1; destR = svRc + 20; servoMove(); delay (200); destR = svRc - 20; servoMove(); delay (200); break; case '8': // atp.SyntheP(mes8); destR = svRc + 20; servoMove(); delay (200); break; case '9': // atp.SyntheP(mes9); spd = 1; destY = svYc - 40; servoMove(); break; case '0': // atp.SyntheP(mes10); spd = 1; destY = svYc + 40; servoMove(); destY = svYc; delay (1000); break; } centering(); // サーボのセンタリング delay (200); keyNum += 1; if (keyNum > commNum) {keyNum = 0;} } //---------------------------------------------------------------------- //関数 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 (); } //---------------------------------------------------------------------- //end of file