BTK:ジョイスティックでぐりぐり

ジョイスティックでぐりぐり動かせるべゼリーを作りましょう。

必要なもの

・サインスマート社製Arduino用ジョイスティック
Amazon秋月電子通商

接続方法

・ジョイスティックの電源とGNDのケーブルをStuduino miniのアナログI/Oの電源とGNDに接続してください。

・ジョイスティックのX軸とY軸のケーブルをStuduino miniのアナログI/Oの1番と2番に接続してください。

・ジョイスティックのスイッチのケーブルをStuduino miniのデジタルI/Oの6番に接続してください。

プログラミング

・下記のサンプルスケッチをコピーして、Arduino IDEにペーストし、Studuino miniに転送してください。

//----------------------------------------------------------------------
// ベゼリーおしゃべりキット(BTK) Studuino mini用サンプルスケッチ
// 最終更新: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)
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 destP; // 変数:サーボの目標角度(Pitch)svPc-40<destP<svPc+20
int destR; // 変数:サーボの目標角度(Roll) svRc-40<destR<svRc+40
int destY; // 変数:サーボの目標角度(Yaw) svYc-40<destY<svYc+40
int posP = svPc; // 変数:サーボの現在の角度(Pitch)
int posR = svRc; // 変数:サーボの現在の角度(Roll)
int posY = svYc; // 変数:サーボの現在の角度(Yaw)

//----------------------------------------------------------------------
// ジョイスティックの設定
const int joyStickX = 1; // ジョイスティック(X軸)をアナログI/Oの1番に割り当てる
const int joyStickY = 2; // ジョイスティック(Y軸)をアナログI/Oの2番に割り当てる
const int joyStickSW = 6;// ジョイスティック(スイッチ)をデジタルI/Oの6番に割り当てる
int inputX; // 変数:ジョイスティックからの入力値(X軸)保存用
int inputY; // 変数:ジョイスティックからの入力値(Y軸)保存用
int inputSW; // 変数:ジョイスティックからの入力値(スイッチ)保存用
int counterSW = 0; // 変数:Yaw状態の保存用

//----------------------------------------------------------------------
void setup() // 初期設定
{
 pinMode (joyStickSW, INPUT_PULLUP); //回路内のプルアップ抵抗を有効にする。
 //これによりスイッチを押していない状態が1、押した状態が0になる。
 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() // メインループ
{
 inputX = constrain(analogRead(joyStickX),0,1023); // 入力値を範囲内に収める
 destP = map(inputX, 0, 1023, svPc-40, svPc+15); // 入力値をサーボの可動範囲に振り分ける
 if (abs(destP - posP) > 2){ // 変化量が大きいときだけ動かす
 svP.attach(pinSvP); 
 svP.write(destP);
 delay (100);
 svP.detach ();
 posP = destP;
 }

 inputY = constrain(analogRead(joyStickY),0,1023); // 入力値を範囲内に収める 
 destR = map(inputY, 0, 1023, svRc+35, svRc-35); // 入力値をサーボの可動範囲に振り分ける
 if (abs(destR - posR) > 2){ // 変化量が大きいときだけ動かす
 svR.attach(pinSvR); 
 svR.write(destR);
 delay (100);
 svR.detach ();
 posR = destR;
 }
 
 inputSW = digitalRead (joyStickSW); // スイッチ状態の入力
 if (inputSW == 0) { // スイッチが押されていたら以下の処理を行う
 switch(counterSW){ // 押されたのが何回目なのかによって処理を分ける
 case 0: // 初期状態
 atp.Synthe("konnnichiwa'"); // AquesTalk発声
 destY = svYc - 40; // 左を向かせる 
 counterSW = 1;
 break;
 case 1: // 左を向いている状態
 atp.Synthe("bo'ku/be'zeri-."); // AquesTalk発声
 destY = svYc; // 正面を向かせる 
 counterSW = 2;
 break;
 case 2: // 正面を向いている状態
 atp.Synthe("_tsuku'tte+kurete."); // AquesTalk発声
 destY = svYc + 40; // 右を向かせる 
 counterSW = 3;
 break;
 case 3: // 右を向いている状態
 atp.Synthe("ari'gato- "); // AquesTalk発声
 destY = svYc; // 正面を向かせる 
 counterSW = 0;
 break;
 }
 svY.attach(pinSvY); 
 svY.write(destY);
 delay (500);
 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 ();
}

//----------------------------------------------------------------------
// Studuinoに関する情報
// ライブラリ http://www.artec-kk.co.jp/studuino/docs/jp/Studuino_library_reference.pdf
// 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