Arduinoでボタン&ソレノイドを操作し、時計変更からIDくじを引く手順を自動化しています。
時計変更の手順(タッチするポイント)について
まず操作する手順を調べます。
0.メニューから”本体設定”を起動する。
1."その他の設定"を押す。
2."日付と時刻"を押す。※1.と位置の兼用可
3."今日の日付"を押す。
4."年の△"を押す。※3.と位置の兼用可
5."決定"を押す。
6."はい"を押す。※5.と位置の兼用可
(数秒待つ)日付を変更~
7."もどる"を押す。
8."もどる"を押す。※7.と位置の兼用可
9.X("おわる")を押す。(10秒待つ)
この8回押す手順で押す部分を画像のようにフィルムにトレースし、共通範囲(画像の斜線部分)を調べ、そこを押すようにすることで必要となるソレノイドを4個に抑えています。
使用した部品について
外部端子(A、X、上、下、HOME)を増設した3DS(ひとつ前の記事参照)。
Arduino uno(ソフトはArduino IDE)。USBケーブル(Type-A⇔B)。USB電源アダプター。
ブレッドボード。ジャンパーワイヤ(単線) 。ジャンパーワイヤ(フレシキブル)。
フォトカプラ(TLP785 ボタン用)5個
フォトカプラ(TLP222A ソレノイド用)4個。
タッチ入力装置(下記)。電源供給用のACアダプタ(4.5V)。
タッチ入力装置について
使用したソレノイドは「【P-10761】ソレノイド 5V ZHO-0420S-05A4.5 プッシュ型」です(秋月で450円)。
定格は5Vですが電源は手持ちのACアダプタ4.5Vを使用しています。基板との接続は適当に切った抵抗です。コネクタ・基板・ピンソケットも適当なものを使用。
メインのプラバンは1.2㎜厚(深い意味は無いので1.0㎜でも代用可)。
ソレノイドのストロークが3.6㎜程なので3㎜角棒を貼りスペーサーにする(これも角帽である意味はないので1㎜プラバンの重ね張りで良い)。
ソレノイドの画面を打つ部分にはテープを貼って傷防止。固定には瞬間接着剤を使用。
工作精度で気を付けるのは上記「1.&2.」のポイントを正しく狙う事。
そんなに動きませんが動画のようにテープ止めしておくと安心。
※画像の寸法は旧3DSと2DS専用です。
応用について
・金稼ぎ
単純に手に入れた無数の「ポイントアップ」等を売って「タウリン」系やコインに変換する。
・ぼんぐり・きのみ集め
それらの場所の上のマスでセーブすればプログラムを流用してできる。
以下はプログラムを作れば理論上できること。
・全自動ミュウツー 道場
時計変更→戦ってセーブを繰り返す。回復が出来ないので先発をゴーストタイプにして受けて、「がくしゅうそうち」を使って攻略用ポケモンの経験値を稼ぎます。
賞金稼ぎも出来るので「おまもりこばん」を持たせておきましょう。
・全自動ふしぎなおくりもの
時計変更→贈り物をしてアイテムにかかわらず配達員に話しかけてからセーブを繰り返す。(相手側は回数制限で失敗するが問題無し)
入手が大変な「ピントレンズ」「きせきのみ」を回収できる。
・全自動アオイのあいことば
時計変更→ラジオを聞いて、クイズに正解(1/3)してポイントを貰うを繰り返す。
貯められる上限が30ポイント、クイズの答えを選べない、18:00~23:59制限と条件は悪いものの「ふしぎなアメ(3P)」を回収できる。
使用したスケッチ(参考用)
前準備として道具の空きを作って、IDくじのカウンターの前でセーブ。
3DSのメニューアイコンの並びを「金/銀/クリスタル」の下に「本体設定」に変更。
本体設定を開いた状態で以下のスケッチを使用します。
当然ながらID収集も必須ですが30種類くらい埋まっていれば時間をかければどうにかなります。マスボ狙いならもっと欲しい。
2DSで1周1分35秒、旧DSで1周1分41秒くらい。
const byte A_pin = 2 ;
const byte X_pin = 3 ;
const byte UP_pin = 4 ;
const byte HOME_pin = 5 ;
const byte DOWN_pin = 6 ;
const byte LU_pin = 7 ; //ソレノイド左上
const byte LD_pin = 8 ; //ソレノイド左下
const byte RU_pin = 9 ; //ソレノイド右上
const byte RD_pin = 10 ; //ソレノイド右上// 当然ながら=の番号は組んだ回路による
void setup() {
for (int i = 0 ; i < 11 ; i++) {
pinMode(i, OUTPUT);
}
}void loop() {
//TIMEWALK 本体設定を開いた状態から開始
digitalWrite(RU_pin,HIGH);
delay(100);
digitalWrite(RU_pin,LOW);
delay(1000);
digitalWrite(RU_pin,HIGH);
delay(100);
digitalWrite(RU_pin,LOW);
delay(1000);
digitalWrite(LU_pin,HIGH);
delay(100);
digitalWrite(LU_pin,LOW);
delay(1000);
digitalWrite(LU_pin,HIGH);
delay(100);
digitalWrite(LU_pin,LOW);
delay(1000);
digitalWrite(RD_pin,HIGH);
delay(100);
digitalWrite(RD_pin,LOW);
delay(1000);
digitalWrite(RD_pin,HIGH);
delay(100);
digitalWrite(RD_pin,LOW);
delay(5000);
digitalWrite(LD_pin,HIGH);
delay(100);
digitalWrite(LD_pin,LOW);
delay(1000);
digitalWrite(LD_pin,HIGH);
delay(100);
digitalWrite(LD_pin,LOW);
delay(1000);//OPTION to HOME
digitalWrite(X_pin,HIGH);
delay(100);
digitalWrite(X_pin,LOW);
delay(17400);//LOAD to GET
digitalWrite(UP_pin,HIGH);
delay(100);
digitalWrite(UP_pin,LOW);
delay(500);
for (int i = 0 ; i < 30 ; i++) {
digitalWrite(A_pin,HIGH);
delay(100);
digitalWrite(A_pin,LOW);
delay(400);
}
digitalWrite(UP_pin,HIGH);//会話の途中でセーブしない為に上ボタン押しっぱなし
for (int i = 0 ; i < 40 ; i++) { //通常30で十分だがマスボ考慮で40※旧DSでは処理が遅いので50// メモ:旧DSのポイントアップ当選で11秒余裕、学習装置で9秒余裕。40で問題ないか?
digitalWrite(A_pin,HIGH);
delay(100);
digitalWrite(A_pin,LOW);
delay(400);
}
digitalWrite(UP_pin,LOW);
digitalWrite(DOWN_pin,HIGH);//受付前でセーブする為に下ボタン押しっぱなし
delay(500);
digitalWrite(DOWN_pin,LOW);
delay(100);//SAVE
digitalWrite(X_pin,HIGH);//メニューを出す
delay(100);
digitalWrite(X_pin,LOW);
delay(600); //0.6秒待機※旧DSでは処理が遅いので700
for (int i = 0 ; i < 3 ; i++) { //レポートにカーソル移動
digitalWrite(UP_pin,HIGH);
delay(100);
digitalWrite(UP_pin,LOW);
delay(300);
}
digitalWrite(A_pin,HIGH);//選択
delay(300);
digitalWrite(A_pin,LOW); //はい
delay(500);
digitalWrite(A_pin,HIGH);
delay(300);
digitalWrite(A_pin,LOW); //確認
delay(1000);
digitalWrite(A_pin,HIGH);
delay(300);
digitalWrite(A_pin,LOW);
delay(5000); //5秒待機※旧DSでは処理が遅いので6000//HOME to OPTION
digitalWrite(HOME_pin,HIGH);//HOME
delay(100);
digitalWrite(HOME_pin,LOW);
delay(2000);
digitalWrite(DOWN_pin,HIGH);//本体設定にカーソル移動
delay(100);
digitalWrite(DOWN_pin,LOW);
delay(500);
for (int i = 0 ; i < 20 ; i++) { //Aボタン
digitalWrite(A_pin,HIGH);
delay(100);
digitalWrite(A_pin,LOW);
delay(400);
}
delay(5000);}