ジョイスティックでぐりぐり動かせるべゼリーを作りましょう。
必要なもの
・サインスマート社製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に転送してください。
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 |
//---------------------------------------------------------------------- // ベゼリーおしゃべりキット(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 |