ジョイスティックでぐりぐり動かせるべゼリーを作りましょう。
必要なもの
・サインスマート社製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