マイコン作例

Last-modified: 2022-05-14 (土) 10:13:33

マイコン作例

あると便利なマイクロコントローラの作例をご紹介します。

一つのスイッチで自作ドアを開閉する回路

通常のスライドドアは大きく使いづらい…なのでヒンジドアを使用しようと思った人は多いと思う。
しかしあの扉は何故か緑信号(アナログ入力)しか受け付けないのである。
じゃあスロットルレバーを使えばいいじゃないかというのも道理ではあるが
やはりボタンを押したら開いたり閉じたりするドアの方が楽だよね、という原理のもと回路を組みました。

door.png

I/O用途
Switch開閉スイッチ。トグルボタンを使う。
Lockingドアロック
Door open closeドア開閉

燃料タンクの値を集計する回路

タンク残量の集計自体はADD回路を使えば簡単にできる。
しかしタンクの数が増えれば増えるほど、船に仕込むADD回路が増えてしまう。
だったらADD回路をマイコンに押し込んでしまえばいい、という原理のもと回路を組みました。
タンクの数が増えれば増えるほど劇的な省スペース化が期待できます。

4add.png

I/O用途
Input1~4それぞれのタンクのタンク内容(中に入っている液体の量。リットル単位)の値
Output合計

Inputは、大中小タンクのタンク内容の値だけでなく、カスタムタンクに付けた液体メーターの液体レベルの値でも機能する。
Inputの数が増えてきたら、この作例のAddロジックゲートの代わりにARITHMETICのf(x,y,z,w,a,b,c,d)ロジックゲート*1で作ってみよう。その場合の式は、x+y+z+w+a+b+c+d で同じように加算できる。

スロットルを0.00へ簡単に戻せる回路

スロットルを1~-1の振れ幅で使用する際、必ずイライラするのがスロットルを零点に戻すという作業。
これをマイコンで制御してどんな値からでもスロットル値を0.00に戻せるようにする回路を作りました。

Throttle_zero.png

I/O用途
Throttleスロットルレバーのスロットル値
Switch0.00に戻す時に押すスイッチ。プッシュボタンがよいでしょう。
plus inputスロットルレバーのアップ入力
minus inputスロットルレバーのダウン入力

X秒毎に1Pulse/tickだけ出力する回路

メモリレジスタなどで、この秒間の瞬間の値が欲しい!といった際に使える回路です。
プロパティの値を10秒とセットしておけば、10秒ごとに1/60秒だけONを出力します。

pulse_v2.png

I/O用途
Output1/60秒だけON信号出力
Timerおまけ。内部のカウンタがカウントアップする値[秒]が出力されます。
Property設定値
Interval [s]動作間隔[秒]
更新履歴

初版:pulse.png
V2:バグ修正 初版では0.2秒ごと(0.1秒ON+0.1秒OFF)のBLINKERを利用しているのに、Up/Down Counterで0.1しかカウントアップしていないために、プロパティで入力した動作間隔の2倍の時間かかっていた。0.2ずつカウントアップするように修正。

一度スタートしたら放置できるタイマー

ロジックゲートに用意されているTimer4種類は、いずれもTimer Enable端子にON信号を送り続けないと時間を計測してくれません。
実際のキッチンタイマーのようにON信号を1回ぽちっと送れば、勝手に時間を計ってくれる回路を作ってみました。

Microcontroller_FFTimer.png

I/O用途
TRIGトリガー。ON信号が入力された瞬間から計測を開始する。
OUTタイマーが計測中の間ONになる。計測が終了するとOFFになる。
Property設定値
Time [s]計測する時間[秒]

計測終了時までずっとTRIG端子にON信号を入力しっぱなしにしたり、計測中に複数回ON/OFFをしてもそれらは無視され、最初の計測が継続されます。
OUT端子の直前にPulseロジックゲートをON→OFF動作で挿入すると、計測中はOFF、計測が完了した瞬間に1 Tick(1/60秒)だけONになる動作にできます。
実際のキッチンタイマーのように一時停止やリセットの機能をつけてみるのもよいでしょう。

プッシュボタンでトグルボタンを切り替える回路

トグルボタンのON/OFFを、別に用意したプッシュボタンで切り替える回路です。
操作したいトグルボタンが別のビークルにある時に無線で操作するために作りました。
操作したいトグルボタンのON/OFF状態はプッシュボタン側には表示されないので、例えばドアの開閉をするトグルボタンなのでドアを見れば分かる等、何らかの状態が分かる手段がある前提です。

Wiki_ToggleButtonExternalControl.png

I/O用途
Toggle In操作したいトグルボタンのToggled出力端子に接続
Ctrl In操作する側のプッシュボタン等、ON立ち上がりで操作する信号を入力
Ctrl Out操作したいトグルボタンのExternal Input入力端子に接続

Ctrl In端子へON信号が入力される度に、操作したいトグルボタンのON/OFFが切り替わります。
Ctrl In端子への入力は、ON立ち上がりだけが有効です。どれだけ長い間ONにしていても、素早くOFFにしても何も影響がありません。
Ctrl In端子への入力がタイマーなどの自動操作の場合、トグルボタンとの同時押しによる誤動作が発生する可能性があります。
無線で操作する時は:

プッシュボタン→Composite Write(on/off)回路→アンテナ(送信)─[電波]→アンテナ(受信)→Composite Read(on/off)回路→この回路⇔操作したいトグルボタン→操作される装置

のように繋ぎます。
アンテナはコンポジット信号を送受信できますが、送受信するためには周波数 Frequencyと送信モード Transmit Mode(ONが送信/OFFが受信)の情報をこれとは別に与える必要があります。

この回路に含まれるSRラッチは、ゲームのセーブ&ロードを跨いでONの状態を保持できません*2トグルボタンがONの状態でセーブし、そのセーブデータをロードすると、場合によってはカチカチカチカチカチとすごい速さでONとOFFが繰り返される発振を起こします。これは回路内のSRラッチ(ロード後ONの状態を忘れ、必ずOFFになってしまいます)とトグルボタンが記憶している内容(トグルボタンは忘れないのでONの状態です)に齟齬が生じるためです。OFFの状態でセーブすると、SRラッチの状態は変わらない(OFFを忘れてもOFFになる)ので発振は起きないはずです。*3
これを回避するには、回路の内部のSRラッチロジックゲートの代わりに、回路の外にSRラッチのパーツを繋いでください。SRラッチパーツのための入出力端子が計4個増え、このマイコンの大きさも大きくなります。SRラッチのNOT Output端子は、Output端子からの入力をNOTに通せば等価なので、増やす端子の数は3個でも実現可能です。

燃費を計算する回路及び航続距離を計算する回路

このプログラムは現在計算式のミスが発覚したので使用しないで下さい

現状で燃料を気にするミッションは北海のミッションくらいのものですが
「燃料1kLあたりどのくらい進むのか?」を出力する回路を組んでみました。
付随して「残りの燃料から何km先までいけるのか?」を計算する回路を組みました。
Workshop

nenpi.png

A/D用途
入力0個2個速度[km/h]、燃料の合算値
出力0個2個燃費[km/1kL]、残り航続距離[km]

*1 緑の数値入力端子が付いている方。似てるけどBOOLEANでは数値は足せない。
*2 当Wikiの画像付きページへのリンクに関する制限で、閲覧環境によっては上手く表示できないことがあります。同ページ最終節の「マイクロコントローラーの値の保持に関する制限」の項をご覧ください。
*3 「場合によっては」とは、ゲームの実行環境に左右されます。低速なCPUや非常に制御の多いビークルでのプレイ、トグルボタンと回路の間に他の回路が挟まれている、トグルボタンが複数カスケード接続されているなど、処理が遅くなると発振しないこともあるようです。それを利用してわざと0.1秒/0.1秒のDELAYを挟む対処もあります。