2021/02/12

【ポケモン×Arduino_01.1】スケッチの読み方、書き方備忘録

 ※本記事は、ポケモン剣盾をArduino Leonardoで自動化するにあたり、使用するコードをまとめた記事です。「そもそもArduinoって何?」って方は過去の記事をご覧ください。

本記事は、

・Arduinoで使用するプログラム言語

・NintendoSwitchControllライブラリのコード

について、プログラミング未経験に近い執筆者が最低限必要な知識を備忘録としてまとめたものです。

プログラミング未経験者がSwitchの自動化だけできるようになる程度のざっくりとした説明です。正確さは二の次、とりあえず使えることを重視します。細かいことは執筆者自身分かっていないかもしれません。


 

Arduino言語

Arduinoで使用するプログラミング言語は、C/C++言語をベースにしたものらしいです。

 執筆者のプログラミング歴はJavaを3日間触れた程度、C言語等は触れたことがありません。

様々な文法、演算子、関数などありますが、

これだけ組み合わせればポケモンの自動化ができる!

というものだけ記します。

本ブログでは「NintendoSwitchControll」ライブラリを使用します。

このライブラリについてのGithubのページはこちら

その元となっている「SwitchControlLibrary」ライブラリについてはこちらです。

「NintendoSwitchControll」は、元となる「SwitchControlLibrary」の関数も使えるようです。

 

基本的な骨組み

以下が、ポケモンの自動化において必須となるプログラム、つまり骨組みとなります。

スケッチのファイルでは、ファイル中の「//」の後ろや「/*」「*/」の間はプログラムとして認識されず無視されます。ここに説明文を書き込みます。

説明文を青で色分けします

// ファイル先頭 
// ファイルの先頭に「#include <ライブラリ名.h>」で指定したライブラリを使えるようにします。
// ここでは<auto_command_util.h>を指定してSwitchのコントローラーとして使用します。

#include <auto_command_util.h>
 
/* ここに関数を定義する
 *
 */
 
//ファイル末尾
/* Arduinoの電源が入ると、
 *  「void setup(){ }」>「void loop(){ }」>「void loop(){ }」>「void loop(){ }」>...
 *  のように、最初の1回だけsetupの{ }内のプログラムが、その後はloopの{ }内のプログラムが繰り返し動きます。
 */
void setup(){
    // ここにプログラムを書く
}

void loop(){
    // ここにプログラムを書く
}

 

以上を骨組みとしたうえでプログラムを書くことになります。


関数の定義と宣言

 次に、関数について説明します。上記の骨組みのsetup, loopそれぞれの{ }内にプログラムを書き続ければプログラムとして動作しますが、分かりづらかったり、また同じ動作が重複したりします。そこでプログラムを塊ごとに「関数」として定義することで分かりやすくなります

新しく出てくる内容を赤で色分けします。

/* 「void 「関数の名前」(){   }」で関数(一塊のプログラムをまとめた箱)を定義します。
 *  「{   }」内にプログラムを書くと、「関数の名前」を宣言されたときに「{ }」内プログラムを実行します。
 *  逆に呼び出されない限り実行されません。
 *  よく使うコード、一塊のプログラムをまとめる(箱に入れる)ことで分かりやすくなります。
 */

 
// 「kansu_button_ose()」を定義します。
void kansu_button_ose(){
    // ここにプログラムを書く
}
     
void setup(){ 
} 
void loop(){ 
    // 定義した関数を宣言することで関数の{ }内の処理が実行されます
    kansu_button_ose();
}

基本的には関数を定義することで一塊の動作をまとめていき、setup, loopで関数を宣言することで動作をつなげていきます。

 

ライブラリによるボタン等の入力

以下では、{ }内に書くライブラリの関数を説明します。

void kansu_button_ose(){
    
    // ボタン等の入力の仕方
    /* <auto_command_util.h>では、
     *  ボタンを100ms(ミリ秒)押して離す>指定した秒数だけ待機
     *  という動作を1文で書くことができます。
     *  「pushButton(Button::「ボタン名」, 「押してからの待機時間(ms)」);」と書きます。
     *  「ボタン名」はA,B,X,Y,L,R,HOME,PLUSのようになります(大文字)。
     */
    // Aボタンを押して500 ms = 0.5秒待機

    pushButton(Button::A, 500);
    // ちなみにこれ↑もライブラリに保存されている「関数」です。
    
    // 「pushButton(Button::「ボタン名」, 「押してからの待機時間(ms)」, 「回数」);」で、「回数」分だけボタンを押して待機を繰り返します。
    // Bボタンを押して300 ms待機を5回繰り返す

    pushButton(Button::B, 300, 5);
    
    /* 「pushHatButton(Hat::「方向」, 「押してからの待機時間(ms)」);」で十字ボタンを押します。Aボタン等と同様
     *  「方向」はUP,DOWN,LEFT,RIGHTの他、UP_RIGHT,DOWN_LEFTのように斜めも指定できます。
     *  「回数」も同様に指定できます。
     */

    pushHatButton(Hat::UP, 1000);
    pushHatButton(Hat::LEFT, 500, 3);

    // 「pushHatButtonContinuous(Hat::「方向」, 「長押し時間(ms)」);」で、ボタンを離さずに長押しさせることもできます。
    pushHatButtonContinuous(Hat::UP, 1500);

    /* 「tiltJoystick(「Lスティック横軸座標」, 「Lスティック縦軸座標」, 「Rスティック横軸座標」, 「Rスティック縦軸座標」, 「傾ける時間(ms)」);」で、
     *  L, Rスティックを指定した時間、指定した座標へと傾けます。
     *  横軸は右を正として、縦軸は下を正として-100~0~100で指定可能。
     */
    // Lスティックを右へ、Rスティックを上へ5秒間倒し続ける

    tiltJoystick(100, 0, 0, -100, 5000);
    
}

上記のライブラリ関数を使用することでコントローラーとして入力できます。

 

その他もろもろ(雑)

以下では、自動化のために最低限必要となるであろう、その他のプログラムを雑に説明します。時間を調節するために使用する「delay」と、繰り返し処理を行う「for文」についてです。

(単純な自動化であれば)

void kansu_sonota(){
    
    // delayについて
    /* 「delay(「時間(ms)」);」で、指定の時間だけ待機します。
     *  時間の調節に使用してください。
     */
    // 3秒間待機します(=3秒間何もしません)

    delay(3000);
    
    // 制御文について
    /* ポケモン自動化には、繰り返し処理「for文」が便利です。
     *  「for文」では
     *  for(int i=0; i<「回数」; i++){
     *     「任意のプログラム」
     *     }
     *  と書くことで、「任意のプログラム」を「回数」分だけ繰り返します。
     */
     // 上の関数「kansu_button_ose()」の{ }内を一通り動かしてからAボタンを押す、という動作を5回繰り返す。

     for(int i=0; i<5; i++){
        kansu_button_ose();
        pushButton(Button::A, 500);
     }


    /* だいたいの操作は「for文」とライブラリの関数(上記「ボタンの入力の仕方」)で何とかなります。
     *
     * 「if文」「int(整数型)」を知っていた方が簡単に書ける場合もあります。気になるようなら調べてみてください。
     */

}

これまでの内容を組み合わせることで一通りの自動化が可能になります。

 

以上がポケモンの自動化を行うための最低限の知識となります。これを元に、サンプルスケッチなどを読んだり、自分で作成したりしてみてください。

もし自分の書いたスケッチがエラーを吐く場合はまず、括弧やセミコロンが適切か確認してください(n敗)。 

また、こちらに、本記事作成のために作成したスケッチを公開します。 このスケッチをArduino IDEで開いてみてください。プログラム自体に不備はないかと思いますが、これをArduinoに書き込んでも変な動作をするだけです。

次回からは、執筆者が作成、改変したスケッチを公開していきます。


Arduino Arduino Leonardo (ピンソケット・ピンヘッダ実装済) 【A000057】
by カエレバ


 

0 件のコメント:

コメントを投稿

【ポケモンSV×arduino06】道具プリンター乱数自動化(藍の円盤)

 ※本記事は、ポケモンSVの藍の円盤(DLC)にて、 道具プリンター を決まった日時に起動することで 特定のアイテム、ボールを狙って量産する操作を自動化 するプログラムについて解説した記事です。ポケモンSVの操作をArduino Leonardoで自動化しております。 本記事の内...