BTK:明るさによって喋る言葉を変えてみる

以下のスケッチをArduino IDEにコピペし、Studuino miniに転送してください。

Studuino mini上の光センサーを手で覆って暗くすると、ベゼリーが喋る言葉と動きが変わります。

・まずはスケッチを書き換えて、しゃべる言葉を変えてみましょう。
・次に動きを自分なりに変えてみましょう。
・うまくいったら、処理を切り替える明るさの値を変えてみましょう。

//----------------------------------------------------------------------
// ベゼリーおしゃべりキット(BTK) Studuino用サンプルスケッチ
// 最終更新:2016年8月20日 by Jun Toyoda (Team Bezelie)
// 機能:
// 1:電源を入れると、しゃべって動く。 
// 2:暗くなるとセリフと動きが変わる。
// 3:デジタルI/Oピン5番にサーボをつなぐとセンタリングできる。
//----------------------------------------------------------------------
#include <Servo.h> // サーボのライブラリ
#include <Wire.h> // I2C通信するためのライブラリ
#include <AquesTalk.h> // 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)svPc-40<destP<svPc+20
int destR = svRc; // サーボの目標角度(Roll) svRc-40<destR<svRc+40
int destY = svYc; // サーボの目標角度(Yaw) svYc-40<destY<svYc+40
int spd = 10; // サーボの速度。0が最速。

//----------------------------------------------------------------------
void setup() // 初期設定
{
 initServo(); // サーボの初期センタリング
 atp.SetAccent(120); // AquesTalk声色指定 アクセント 0<64<255
 atp.SetPitch(3); // AquesTalk声色指定 ピッチ 0<64<255
 atp.SetSpeed(100); // AquesTalk声色指定 スピード 50<100<300
 atp.Synthe("#J"); // AquesTalk発声「チャイム1」
 while(atp.IsBusy()) ; // AquesTalk 鳴り止むまで待つ
 delay (1000);
}
//----------------------------------------------------------------------
void loop() // メインループ
{
 if(analogRead(A6) > 200){ // 光センサの値が200以上なら以下を実行
 atp.Synthe("akaruine'-."); // AquesTalk発声
 spd = 10; // サーボの速度
 destP = svPc - 40; // 首を上に向ける指定
 servoMove(); // サーボを動かす
 delay (500); // 0.5秒待つ
 destP = svPc; // 首を水平に向ける指定
 servoMove(); // サーボを動かす
 }else{
 atp.Synthe("kuraiyo-."); // AquesTalk発声
 spd = 15; // サーボの速度
 destP = svPc + 20; // 首を上に向ける指定
 servoMove(); // サーボを動かす
 delay (500); // 0.5秒待つ
 destP = svPc; // 首を水平に向ける指定
 servoMove(); // サーボを動かす
 }
 delay (1000); // 1秒待つ
}
//----------------------------------------------------------------------
// サーボの設定
const int pinSvC = 5; // サーボ(センタリング用)をデジタルI/Oの5番に割り当てる
const int pinSvP = 9; // サーボ(Pitch)をデジタルI/Oの9番に割り当てる
const int pinSvR = 10; // サーボ(Roll)をデジタルI/Oの10番に割り当てる
const int pinSvY = 11; // サーボ(Yaw)をデジタルI/Oの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+2); 
 }
 while (posR != destR){
 svR.attach(pinSvR); 
 if (posR < destR){
 posR++;
 }else{
 posR--;
 }
 svR.write(posR);
 delay (spd+2); 
 }
 while (posY != destY){
 svY.attach(pinSvY); 
 if (posY < destY){
 posY++;
 }else{
 posY--;
 }
 svY.write(posY);
 delay (spd+2); 
 }
 svP.detach ();
 svR.detach ();
 svY.detach ();
} 

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