今回はマイコンの乱数消費プログラムの消費回数を書き換えるにはどこをどう書き換えたらいいのかとマイコンに書き込む.hexファイルの作り方について解説します。
.hexファイルを作るにはLinuxなどの環境が必要なため前回書いた準備編も見てください。
【準備編】
手順
プログラムの中身を書き換えた時のマイコンへの書き込みの手順はこんな感じです。
- プログラムを書き換える
- hexファイルを生成する
- マイコンへ書き込む
プログラムの基本
書き換えるプログラムは「Joystick.c」ファイルです。
か_かさんの100回指定乱数消費プログラムの「Joystick.c」を例に見てみましょう。
今回はプログラムの67行目までと121行目からはプログラムを動かすため必要な「おまじない」として考えます。
乱数を100消費するためのプログラムは68行目から109行目です。
AやLEFTやNOTHINGなど
例えば72行目の{A, 1}や74行目の{LEFT, 1}はSwitchのコントローラーのAや左キーを一回押すと同じ意味です。
ところどころにある{NOTHING, 4}などはプログラムの待機時間で,画面の切り替わりを待ったりするために使われます。
DO WHILE文
{DO, 0} … {WHILE, 30}
はDOからWHILEまでのプログラムが30回繰り返されることを表しています。
繰り返し後は次のプログラムへいきます。
DO WHILE文の中でまたDO WHILE文を行うこともできます。
例
であれば「「Aを30回行う」後に次のBを1回する」という動作を3回繰り返します。
つまり
「「Aを30回行う」後に次のBを1回する」,
「「Aを30回行う」後に次のBを1回する」,
「「Aを30回行う」後に次のBを1回する」,
と動作するので合計でAは90回,Bは3回行われることになります。
乱数消費の仕様
乱数消費の仕様は,
- 現在の日付から先の日付になったら消費1
- 現在の日付から前の日付になったら消費0
となってます。
このことから,例えば2020年1月30日から2020年1月31日になったら消費1です。
しかし2020年1月31日から日にち変更のみで2020年1月1日になった場合は消費0です。
しかしここから2020年1月2日になったらまた消費1となります。
なので年と月を固定し,ひたすら日にちのみを進め続けた場合,31日ある月のときは1月ごとに30の乱数消費ができます。
乱数消費プログラムの解説
か_かさんの100回指定の乱数消費プログラムの解説を簡単にしていきます。
プログラムの基本の通りにプログラムが1行ずつ実行されていくとどのような動作になるかを想像してみてください。
78行目から88行目までのプログラムで1日日にちを進める動作になっています。
あとはそれと同じ動作が2つとDO WHILE文の組み合わせからプログラムの流れを考えます。
プログラムの流れ
プログラムの流れは
- 30回日付変更を繰り返す
- 1回日付変更をする
- 1と2を3回繰り返す
- 10回日付変更を繰り返す
となってます。
解説
なぜこれで100回の乱数消費になるかを計算してみます。
プログラムの使い方から,「31日ある月の1日にする」ので,1月1日をプログラム実行前の日付とします。
まず①と②をすることで31回日付変更されます。
すると一巡して最初のスタートの1日に戻ります。
一巡して1日に戻ると消費0なので結果30回の乱数消費がされます。
次に③で1と2の操作を3回繰り返すので90回乱数消費がされます。
そして④で残り10回の日付変更(=乱数消費)をしています。
つまり30 × 3回の繰り返し乱数消費と残りの余った10回の乱数消費で100回の乱数消費ができるようになっています。
こうすることで何月は何日まであるとか,何年後はうるう年だからとか,余計なことを考えずに日にちを進めるだけで乱数消費ができます。
任意の消費回数への書き換え
では上記の仕組みから任意の回数の乱数消費をするため,繰り返し回数と余りの消費回数を計算します。
任意の回数n回の乱数消費をするためには,
n ÷ 30 = 商 … 余り
を計算します。
95行目の{WHILE, 3}の繰り返し回数3に「商」を,109行目の{WHILE, 10}の繰り返し回数10を「余り」と書き換えることで任意の消費回数n回の消費となります。
例
例えば16918回消費したいときは,
16918 ÷ 30 = 563 … 28
となるので,95行目を{WHILE, 563},109行目を{WHILE, 28}とすることで16918回の乱数消費プログラムへ書き換えられます。(数字は必ず半角で入力してください)
hexファイルの作成
ではJoystick.cファイルからマイコンへ書き込める形のJoystick.hexファイルを生成していきます。
書き換えた.cプログラムが入っているフォルダで「Shiftキー+右クリック」をして「Linuxシェルをここに開く」を選択します。
すると前回作成したWSLのUbuntuが起動するので「make」と入力してエンターキーを押します。
Finished building project “Joystick”.と表示されたら成功です。
PowerShellを使ってJoystick.hexファイルを書き込みましょう。
マイコン販売の違法性【追記】
ここまで読んでくださった方々ならメルカリなどで販売されているマイコンと同程度のものを作れると思います。
Arduino等でSwitchのコントローラを動作させるためにポッ拳のコントローラをリバースエンジニアリングして実現しています。
そのため個人利用は問題ありませんが,これらを販売する行為は違法となりますのでメルカリのアカウントBANや任天堂からの法的措置など,販売を行った際の責任を僕は一切取りません。
TwitterのDMなどならばばれないし大丈夫だと思っているような人はこれらが多くの人々が無償で自分たちの知識と技術を提供してくれているからこそ実現しているものだということをよく考えてほしいと思います。
さいごに
今回はmakefileの説明などは省略しました。
今回までの全4回で,一応ATMEGA16U2を使ったマイコン乱数消費に関することで困ることはないと思います。
質問などは答えられる範囲で答えますのでコメント欄またはTwitterまでお願いします。
コメント
コメント一覧 (4件)
「マイコンの選び方」編から参考にさせてもらっています。ありがとうございます。
https://www.youtube.com/watch?v=oXnQt_Mbyzk
こちらで紹介されている自動孵化などのhexファイルを利用させてもらっているのですが、~.hexファイルしか手元にないので、~.cの書き換えに相当する作業はどのように行えばよいのでしょうか?
ブログ記事の内容からやや外れた質問かもしれませんが、可能であればご回答いただけないでしょうか。よろしくお願いします。
anonymousさん
おそらくhexファイルからcファイルを生成するのは事実上不可能だと思います。今回は説明を省略しましたが乱数消費のプログラムはJoystick.cと.hexだけでなくいろいろなものが付随していたと思います。それらも一応必要となります。孵化プログラムが同じ方法で作られているのならば作者が.cファイルを公開しなければ僕たちは編集することができないと思います。すみませんがもしかしたら僕の解釈が間違っているかもしれませんのでそこはご了承お願いします。
C言語ほとんど触ったことがないのでトンチンカンなこと言っていたら申し訳ないです。
int a,b,c;
a=消費;
b=a/30; //商
c=a%30; //余り
これらを用意して95,109行目の数値を自力で計算しなくてもいいように出来るのでしょうか?
そんなの自分で試せって話ですが、初めてのVSCODEで実行環境準備に何故か手こずって試せていません…。
プログラミングガチ初心者さん
できることを確認しました。
プログラムの頭の方に#define NUM (消費数)みたいな感じで定義してあげるのがいちいちスクロールしなくていいので楽だと思います。