VC版ポケモンの無限IDくじ自動回収機

youtu.be

Arduinoでボタン&ソレノイドを操作し、時計変更からIDくじを引く手順を自動化しています。

時計変更の手順(タッチするポイント)について

まず操作する手順を調べます。

f:id:error_astray:20220506142359j:imagef:id:error_astray:20220506142402j:image
f:id:error_astray:20220506142408j:imagef:id:error_astray:20220506142405j:image

0.メニューから”本体設定”を起動する。
1."その他の設定"を押す。
2."日付と時刻"を押す。※1.と位置の兼用可
3."今日の日付"を押す。
4."年の△"を押す。※3.と位置の兼用可
5."決定"を押す。
6."はい"を押す。※5.と位置の兼用可
(数秒待つ)日付を変更~
7."もどる"を押す。
8."もどる"を押す。※7.と位置の兼用可
9.X("おわる")を押す。(10秒待つ)

この8回押す手順で押す部分を画像のようにフィルムにトレースし、共通範囲(画像の斜線部分)を調べ、そこを押すようにすることで必要となるソレノイドを4個に抑えています。

使用した部品について

f:id:error_astray:20220506173142j:image

外部端子(A、X、上、下、HOME)を増設した3DS(ひとつ前の記事参照)。

Arduino uno(ソフトはArduino IDE)。USBケーブル(Type-AB)。USB電源アダプター。

ブレッドボードジャンパーワイヤ(単線) ジャンパーワイヤ(フレシキブル)

フォトカプラ(TLP785 ボタン用)5個

フォトカプラ(TLP222A ソレノイド用)4個。

タッチ入力装置(下記)。電源供給用のACアダプタ(4.5V)。

タッチ入力装置について

f:id:error_astray:20220506142908j:imagef:id:error_astray:20220506142950j:image
f:id:error_astray:20220506142911j:image

使用したソレノイドは「【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);

}