MUDAなことをしよう。MUDAなことをしよう。〜ソフト(プログラム)編〜2018年11月3日お待たせ致しました、ここからオリジナルライドウォッチ改造の詳細に入ります。今回がソフト(プログラム)編、次回がハード編になります。必要な具材につきましては、前回の記事をご参照ください。プログラムの説明ですが、私の万丈ライドウォッチのプログラムをいきなり題材にしてしまうと、フォームチェンジのためのリードスイッチの処理やらフルカラーLEDの処理やら、「シンプルにDX版相当のライドウォッチを作りたい」という方からすれば邪魔でしかないコードが含まれたものを説明することになってしまいます。そのため、ここでは「シンプルにDX版相当のライドウォッチの動作を再現するためのプログラム」を説明することにします。フォームチェンジ用のリードスイッチは使いませんし、フルカラーLEDも使いません。それらを使った私の万丈ライドウォッチのソースコードは、次回のハード編のときに参考としてご紹介します。はじめに注意事項ですが、ここでご紹介するプログラムは、ジクウドライバーのLスロット側(=通常、レジェンドライダーのライドウォッチがセットされる側)にセットするライドウォッチを想定しています。Rスロット側(=通常、ジオウとゲイツのライドウォッチがセットされる側)のライドウォッチを作りたい場合は、少しソースコードの修正が必要になります。それはまた最後にご説明いたします。ライドウォッチのプログラムを書く上で避けて通れないのが、ライドウォッチの内部の状態遷移の理解です。オリジナルガシャットを作ったときも、初めは内部の状態遷移の調査からスタートしました。以下では、説明の便宜上、ライドウォッチの3つのスイッチに上記のような名前をつけます。これらのスイッチをどのように操作すれば、内部でどのように状態が変化し、その変化に伴い何が起こるのか?以下はビルドライドウォッチを題材に、自分なりにスイッチを色々触りながら調査した結果をまとめた状態遷移図になります。上図は自分が独自に調査した結果であり、玩具の状態遷移を完全に再現しているものではありませんのでご注意ください。実際の玩具では「時間が経てば初期状態に戻る」という状態遷移が発生すると思いますが、上記の図ではその線は含んでいません。自分がプログラムを作る上で必要な情報のみをまとめたものが上図になります。片方のスイッチを押しながら片方のスイッチを2回押すことで状態遷移が発生するある状態からある状態に遷移するのに2つのルート(ライダータイム&アーマータイム)が存在するということがあり、ガシャットのときよりも数段ややこしく感じました。以上がライドウォッチの状態遷移の基本ですが、ここから実際にプログラムを書こうと思うと、もうひと頑張りしなくてはいけません。「どの状態のときに、スイッチの組み合わせが何から何に変わると、どの状態に変わるのか」を一つ一つ確認していかないと、プログラムとして書き起こせないからです。これは相当に面倒だったので、詳細を知りたい方だけ、以下のPDFファイルを開いて拡大表示してみてください。ライドウォッチ状態遷移整理これは理解するのはかなりキツイ、という方は、理解しなくても大丈夫です。最終的には、以下で掲載するソースコードをまるっとコピペしてもらえば済む話になります。以上でプログラムを書くための準備は終了です。ここからは実際にソースコードを解説していきますが、最初にどこに何が書いてあるかを示しておいた方が何かと理解しやすいと思いますので、最初にプログラムの全体構造を示しておきます。上から順にこんな感じで記述していっています。以下にソースコードを載せますが、詳細説明は上図の番号順に行なっていきます。ための変数などをここで定義しています。Arduinoのピン定義で一つ注意するところとしては、このプログラムは通常の単色LEDを接続することを前提にしていて、LEDの明るさをプログラムで変更できるようにしています。これはanalogWrite()関数を使って実現しているのですが、analogWrite()関数を使うためには、LEDの接続先のピンがPWMに対応している必要があります。PWMを使えるピンはArduinoごとに違うので、事前にどのピンが使えるかを確認しておきましょう。miniの場合は5番ピンが使えます。次に、loop()の周期をLOOP_INTERVAL_MSで指定していますが、ここでは20msにしています。これを100msとかにしてしまうと、ちょっと長過ぎてうまくいかないかもしれません。いうのも、このLOOP_INTERVAL_MSの周期でスイッチの状態変化をチェックしているのですが、先で述べたとおり、ライドウォッチはスイッチの2度押しで状態遷移が発生することがあります。ジクウドライバーを勢いよく回転させてしまうと、100ms以内にスイッチの2度押しが発生してしまい、2度押されたものが1度押しとして認識されてしまう可能性があります。いって、あまり周期を短くし過ぎてしまうと、スイッチの同時押しの認識が難しくなってしまいますので、どの程度の周期に設定すべきかは、多少トライ&エラーが必要かもしれません。続いて、状態管理のための変数ですが大きく4種類の変数を使います。以前と今の状態を管理するためのprev_stateとstate「ライダータイムとアーマータイムのどちらの経路で状態遷移が発生したか」を管理するためのprev_sideとsideライダータイムとアーマータイムのためのスイッチを押された回数を管理するrider_time_counterとarmor_time_counter3つのスイッチを押されている状態を管理するためのprev_swとswちょっとややこしいですが、これらを2の状態遷移管理・リセット処理の中で変更しながらライドウォッチの状態を管理していきます。起動処理(386〜413行目)ここはそんなに大したことはしていません。行なっているだけです。2状態遷移管理・リセット処理(415〜718行目、363〜384行目)冒頭の方で説明した状態遷移をプログラムとして書き起こしているのが、この部分になります。興味のある方は、先で紹介した状態遷移のPDFファイルの詳細と、この部分のプログラムの内容を照らし合わせていただくと良いかと思います。armor_time_counterの値が変化します。「4発光処理呼出」は、ここでこれらの変数がどのように変化したのかをチェックすることで、どの音声を再生/停止させるか、どのように発光させるかを判断します。リセット処理は状態遷移管理部分の要所要所で呼び出していて、その名の通り、状態管理用の変数をまとめて初期化するための関数です。使用する変数もここで併せて初期化しています。3効果音再生処理(48〜156行目、729行目)loop()の729行目で呼び出されているplay_sound()関数の内容が48〜156行目で定義されています。大部分は「prev_stateの状態からstateの状態に変わったら、何番の音を再生する」という内容になっていることがわかると思います。先の状態遷移図と照らし合わせてみるとなおわかりやすいと思います。ような形でファイルを保存することを前提にしています。ややこしいのは、ライダータイム用の音声、アーマータイム用の音声、必殺技音声の再生です。状態遷移が発生したルート(←side変数で管理)によって再生する音声が変わることもややこしくなる要因の一つなのですが、それより問題なのは、ジクウドライバーをお持ちの方はよくご存知だと思いますが、ライダータイムの場合は「ベルト回転完了音」→「ライダータイム音」の順、アーマータイムの場合は「ベルト回転完了音」→「ライダータイム音」→「アーマータイム音」の順で音声が再生されます。必殺技(タイムブレイク、タイムバースト)のときも同様です。「状態が遷移したからといって、すぐに対応する音声が再生されるわけではない」ということになります。CRITICAL_WAIT_LONGという定数と、sound_wait_start_timeという変数を使用しています。is_rider_time_critical_waitingというフラグ変数も組み合わせて、再生すべき音声ファイルを特定できるようにしています。4発光処理(158〜361行目、730行目)loop()の730行目で呼び出されているflash_led()関数の内容が158〜361行目で定義されています。ここは、ちょっとややこしいです。sideの状態を見て、どの発光パターンでLEDを光らせれば良いかを選択しています。状態ごとに選択される各発光パターンを定義しているのが、239〜300行目になります。led_counter_ms)という関数が並んでいますが、中身は全て同じような構成になっていて、「何msから何msまでは、この基本発光パターンで光らせる」というのを並べて、その組み合わせで、それぞれの状態のときの固有の発光パターンを定義できるようになっています。その「基本発光パターン」を定義しているのが、163〜238行目で、led_base_pattern_xxx()という名の関数が6つ並んでいます。徐々に点いて徐々に消える(何msごとに、何段階で、を指定)この6パターンを組み合わせれば、大体の発光パターンは作れるかなと思っています。ガシャットのときは100msごとの色・明るさ定義を地道に記述していたのですが、今回はこんな感じで発光パターンを言うなればプログラムできるようにしたので、発光タイミングの微調整がだいぶ簡単になりました。使用するArduinoのメモリの量も大きく削減されており、動作も安定しやすくなります。以上が今回のオリジナルライドウォッチのプログラムの全容になります。プログラムがかけましたら、実際にブレッドボード上に回路を組んで、プログラムが意図通りに動作するかを確認しましょう。必要な具材については、前回の準備編をご参照ください。今回組む回路はこんな感じになります。実際にブレッドボード上に組むとこんな感じで、結構シンプルになります。https://make-muda.net/wp-content/uploads/2018/10/ridewatch_movie_2.mp4無事に動作したでしょうか。「なんか発光と音声がずれるなあ」と感じる方は、発光パターン定義のmsのところをいろいろいじってみてください。最後に、冒頭で述べた「Rスロット側(=通常、ジオウとゲイツのライドウォッチがセットされる側)のライドウォッチを作りたい場合どうするのか」について、簡単に説明しておきます。ソースコードをじっくり読まれた方はお気づきかと思いますが、これまで説明してきた「Lスロット側のライドウォッチ」では、SW-1のON/OFFによってアーマータイム、SW-2のON/OFFによってライダータイムがそれぞれ発動するようになっています。これを入れ替えて、SW-1のON/OFFによってライダータイム、SW-2のON/OFFによってアーマータイムがそれぞれ発動するように変更すれば、それで「Rスロット側のライドウォッチ」として動作するようになります。言葉にするとこれだけですが、実際にソースを修正するときは途中でこんがらがってしまわないようご注意ください。以上、オリジナルライドウォッチ作成のためのソフト(プログラム)の説明でした。冒頭に述べましたとおり、今回ご紹介したプログラムは、「シンプルにDX版相当のライドウォッチの動作を再現するためのプログラム」になります。私が作った万丈ライドウォッチのプログラムは、上記のプログラムに、さらに、フルカラーLEDやフォームチェンジのためのリードスイッチの認識処理を加えたものになります。今回のプログラムを理解できた方からすればそう難しい変更ではないと思われますので、プログラム自体は次回ご紹介しますが、説明は省略致します。音声と発光を差し替えたオリジナルライドウォッチをつくりたい、あるいは自分だけの新機能を追加したライドウォッチを作りたいという方は、今回ご紹介したプログラムをベースに、色々カスタマイズを加えていってもらえればと思います。次回でいよいよ最終回、実際に遊べる形にするためのハード改造編になります。最後までお付き合い頂けますと幸いです。時間ができたので、久しぶりに覗いてみました。サイトがリニューアルしてから、画像がきれいになりました?それはそうと、相変わらずすごい改造ですねwオリジナルベルト作成待ってます。ちなみに、ガシャット作成のほうは、LED発光までたどり着きました。mp3再生ができるようになればほぼ完成です。PMクオリア様ご連絡ありがとうございます。画像の解像度とかは変わっていないと思いますが、全体的にサイトをすっきりさせたせいかもしれません。ベルト、特にジクウドライバーは改造難易度がとても高そうなので相変わらず手が出せませんが、ライドウォッチ側の改造をもうちょっと突き詰めて、見た目に面白いものを作れないかなあと色々試しているところです。最後までがんばってみてください。PMコメント失礼致します。様ご連絡が遅くなり申し訳ありません。いくつかコメントを頂いていたかと思いますが、まとめてこちらで回答させていただきます。Arduinoのピンヘッダですが、基本的には普通のピンヘッダを使っています。このあたりのものですね。https://www.switch-science.com/catalog/92/あまり高さを出したくないときには、L字型のものを使用します。https://www.switch-science.com/catalog/2257/リチウムイオンポリマー充電池から電源をとるときなどに、たまに細めのものも使います。https://www.switch-science.com/catalog/1280/だいたいこんな感じです。基本的にピンヘッダを使うのは、ブレッドボード上でプロトタイピングをするときのみです。ライドウォッチに部品を組み込むときなどは、スペースに余裕がないことが多く、直接半田付けしてしまうことも多いです。次に参考書についてですが、すでにラズパイで電子工作の経験がおありであるなら、Arduinoの基礎の本というよりは、「こういうときにはどういう部品を手に入れてどういうソースを書けばいいの?」ということがまとめられたレシピ集のようなものの方が役に立つのではないかと思います。Lab』などが役立つかなと思います。私も勉強し始めの頃はよく参照していました。様お役に立てたなら良かったです。hidaka様のライドウォッチを見て、私も自作のライドウォッチを作ってみようと思いました。現在一通りの動作確認が終わり、自分のオリジナル機構を組み込もうとしています。break;default:;}break;のように変更してみました。音声は無事ランダムとなったのですが、ライドウォッチを取り外した時の音声[SOUND_EJECT]が再生されなくなってしまいました。アーマータイムといった他の音声は流れますし、ソースコードを元に戻すと再生されるため、自分が組み込んだ場所に間違いがあると思っています。ここ2週間ほどネットなどを見て自力で調べたのですが原因が全く分かりませんでした。不躾ですが、アドバイスなどをいただけないでしょうか。拝見しましたところ、考え方もソースコードも特に間違いはないように思えます。STATE_CRITICAL:mp3_player.playMp3Folder(SOUND_EJECT);break;default:;}break;上記のprev_stateについてのswtich文で、”default”のルートに入ってしまっている気がします。prev_stateが想定外の値になってしまっているということなのですが、他の場所でソースをいじっていない場合、それがなぜ発生しているのかが不明です。ご確認頂いているかもしれませんが、このdefaultルートに入ってしまっていないか、またそのときのprev_stateの値がどうなっているかなど、一度print文などでご確認頂き、その結果を教えていただけないでしょうか。以上、宜しくお願い致します。どれだけ選んだkΩ?私は中国人ですが、翻訳器でこれらの話をしました。様すみません、私はスピーカーの詳細はわかりません。スピーカーは他のライドウォッチに組み込まれているものと同じものです。miniに接続しています。オリジナルの変身ベルトですが、可能か不可能か問われれば、それは可能なはずです。意見を述べさせて頂くにしても、まだあまり完成形が具体化されていないようですので、ちょっと抽象的なコメントになりますがご了承ください。私が普段やっていることとして、まず、「こういう機能を持ったこういう玩具を作りたい」というアイデアを、できるだけ具体的に考えていきます。今回のライドウォッチでいうと、「リングを回転させてフォームチェンジをさせる」とか、そういうレベルです。次に、そのアイデアが実現可能かどうかを考えます。考えても無理なものは早々に諦めますが、「無理というわけではなさそう」と思えるものについては、粘り強く解決策を考えます。今回は、ネオジム磁石とリードスイッチを使えば解決できそう、という方法を思いつきました。次に、本当に自分が思いついた方法でアイデアを実現できるかを、プロトタイプを作りながら検証し、そこでOKなら実際に制作に入ります。いうわけで、アオバ様も、「仮面ライダー1号などのシンプルなベルト」というコンゼプトから、まずはもう少し機能を具体化するところから始めて、それからそれを実現する方法を考えて行くと良いと思います。単四電池x3)という組み合わせで行なっておりますので、同じように作る場合は、少なくともこれらの部品が収まるようなベルトのデザインにはしておいた方がよいと思います。ベルトの場合は、ガシャットやライドウォッチと比べて、スペース的にはそこそこ余裕があると思います。残念ながら、変身ベルトそのものに手を加えるような作品は、今のところ予定していません。昔にクウガの変身ベルトのミニマム版を作ったことがありますので、それが何かしらの参考にはなるかもしれません。https://make-muda.net/2016/09/4628/https://make-muda.net/2016/10/4505/https://make-muda.net/2016/10/4550/https://make-muda.net/2016/10/4615/https://make-muda.net/2016/10/4695/かなり初期の頃の作品なので、情報が古かったり、色々こなれていないところがあるのはご了承ください。最近の私の作品のソースなども参考にして頂いた方が良いと思います。PMアオバ様すみません、私は赤外線センサはそんなに頻繁には使いませんので、わかりません。私が先にご案内した下記の記事はご確認頂いたでしょうか。こちらに、仕組みもプログラムも全て記載しています。https://make-muda.net/2016/10/4695/このときは赤外線センサではなくモーションセンサを使用致しましたので、特定のモーションをとったときのみ変身音が鳴るよう、プログラム内で状態遷移を管理しています。そこで素人質問で申し訳ないのですが通常のライドウォッチの場合でも加速度センサを(スペース的に、プログラムの余地的になど)組み込むことが可能であるかについて教えていただきたいですいえ、申し訳なくないので大丈夫です。質問が明確なので大変答えやすいです、ありがとうございます。私自身、通常のライドウォッチに加速度センサを組み込むこと自体はまだ試したことがないのですが、ファイズフォンXに組み込んだ感じですと、おそらく通常のライドウォッチでも加速度センサを組み込むスペースはギリギリ確保できると思います。そのままだと難しいかもしれませんので、通常SW-1,2を認識するためにあった部分をカットしたり、ライドウォッチの背面に穴を開けたり、スピーカーを小型のものに交換する、などの工夫は必要かもしれません。プログラムの容量は、全然余裕です。カイザフォンXが容量ギリギリいっぱいのプログラムになってしまったのは、ディスプレイ表示のためのライブラリを使用したからで、加速度センサを使うぐらいであれば全然問題ありません。私は手先が器用とは言えないのでSW-1,2など微調整が必要そうな部分が減らせたらそれが望ましいと考えていたのですがいかがでしょうかそうですね、できれば私もあの調整は二度とやりたくないので、極力加速度センサを使っていきたいと思っています。SW-1,2の機能をなくして加速度センサオンリーで判別を行うようにすると、武器(ジカンギレード、ジカンザックス、ライドヘイセイバー)との連動の実装はかなり難しくなってしまうと思いますので、そこはベルト挿し専用のライドウォッチにするなどの割り切りは必要になると思います。カイザフォンXの装填認識用ディテクタスイッチはライドウォッチホルダーにはめた時反応しそうに見えるのですがいかがでしょうかライドウォッチホルダーにはめることは考えていなかったのですが、今カイザフォンXをライドウォッチホルダーにはめてみたら、特に問題なく着脱できました。干渉しない位置にディテクタスイッチがあるようです。リチウムイオン電池の充電は閉じたウォッチ本体を開いて直接充電する形になるという認識で間違いないでしょうか?はい。それが面倒であれば、充電のたびにウォッチ本体を開けずに済むよう、充電用のコネクタをリード線で伸ばして外から挿せるように露出させるという手もあります。Breadを使うと費用も部品点数も少なくて良いと思います。私もカイザフォンXで使用しています。加速度センサを組み込むための物理的なスペースの確保についてライドウォッチの背面に穴を開けるとの想定ですが内部に収まりきらないパーツを露出させる必要性も考慮しなくてはならないということで合っていますか?最終的にはそういう手も必要になるかもしれませんが、個人的にはそれはあくまで最終手段にしたいと思っています。内部の余分なパーツを切り取る、スピーカーを小型のものに交換するなどしてスペースをできるだけ確保し、それでもどうにもならない場合に、背面に穴を開けるという手段を取らざるを得ない可能性はあります。カイザフォンXのときに実際に背面に穴を開けましたが、ギリギリ認識プレートの内側に収まるサイズの穴で済んだので、外見上は背面に穴が空いているようには見えないようになっています。Rスロット側のライドウォッチを作りたいのですが、説明を読んでも素人の私にはどうすればいいのか、わかりませんでした。8(0008_eject.mp3)=取り外し時間があればで結構ですので、お答えして頂けると嬉しいです。PMど素人25様(1)おそらくですが、ソースコードを変更する必要はなく、配線を一つ入れ替えるだけで済む気がします。7,8行目の定義により、「ドライバー連動部分の上のスイッチを7番、下のスイッチを8番に繋ぐ」という前提になっていますが、これをソースコードをそのままに、「ドライバー連動部分の上のスイッチを8番、下のスイッチを7番に繋ぐ」というふうに配線すれば、多分そのままのソースコードでRスロット側のライドウォッチになるのではないかと思います。一度試してみて頂けますでしょうか。(2)はい、ご認識のとおりです。PMどのようにプログラムをマイクロUSBに書けばよろしいでしょうか?教えてください。mini)というマイコンに書き込んでいます。Arduinoへのプログラムの書き込みについては、たくさんの教本や入門サイトがあるかと思いますので、そちらをご参照頂けますと幸いです。miniに入ってきて、説明どうり配線したが、結局ledもdfplayerも作動しなかった。それに関しての知識が足りませんの自分が手も足も動くことができません状態になった。miniに入って”のが問題の原因なのか。(prominiやdfplayerなどの部品が貴方が使ったのと同じたと思います)お解明してくれたらとっても嬉しいです。コメントをキャンセルメールアドレスが公開されることはありません。hidaka_hirojiAmazonほしいものリストこちら自身の工作用に使いたいものがメインですが、必ずしも工作に使うわけではないのでご了承ください。MUDAなことをしよう。