マイコンを使うのは9割甘え【オートスタート編】

# [前回](https://qiita.com/tanutanup/items/e6b1a35b7358bba9476f)の概要と追加したい機能について
前回はロボトレーサーの走行速度をトランジスタやダイオード、タイマーIC(555)、カウンタICの組み合わせで制御しました。
ところで、[ロボトレース競技](https://www.ntf.or.jp/?page_id=27)には[自律賞](https://www.ntf.or.jp/?page_id=140)という賞があり、要は最初のスタートから5回の走行を終えるまでノータッチで完走したロボットが受賞できるようです。
前回の回路に改良を加えてコレを実現できないか挑戦しました。

# 要求分析
例によって要求分析します。[マイクロマウス・ロボトレース競技規則](https://www.ntf.or.jp/?page_id=68)によれば、ゴール後は2秒以上停止しなければゴールしたとみなさないとあります。逆に言えば **自律賞を狙うためには２秒以上停止の後、再度スタート（以降オートスタートと呼びます）** できれば良さそうです。

# 設計・実装

## カウンタICのリセット
スタートSW～ゴール～停止までの1回の走行が終わったらカウンタをリセットしなければなりません。このとき他のタイマー類はリセットの必要がないので**カウンタICだけ独立したリセット回路**を考えます。しかも、4017系のカウンタICはリセットが正論理なので地味に面倒です[^1]。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/568231d5-6af4-4306-a900-c8fedfac46c6.png)
通常のリセット回路（R・C）とそれを逆さまにした回路を考案しました。
**コンデンサは抵抗を介してゆっくり充電される間はショート状態**とみなせるので、/RESETは負論理、RESET_RUN_SQは正論理のリセットを電源が十分立ち上がるまでかけ続けられます。
![reset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/965761f0-9b16-4b57-a815-bfdad2c41c9e.png)
しかも、/RESETがリセットしている間はRESET_RUN_SQがリセットを保てるよう、PchMOSFETを組み合わせました。PchMOSFETのゲートがLoの間はD・S間がONするからです。
同様に、別のPchMOSFETを使ってSQRST_DELAYがHiの間はRESET_RUN_SQがリセットされる強制リセット回路もあります。
今まで組んだことのない回路ですので、シミュレーターで動作検証しておきました。青が負論理のリセット。赤が正論理のリセットです。正論理のリセットは負論理リセットと独立して発生できています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/058052a5-26b1-429c-82ac-5214e98c8f46.png)

なお、このRESET_RUN_SQは１周後に確実にかけられるよう、555で確実なパルス幅を生成します。また555の前に妙な回路が付いていますが後述します。
![tyantoreset.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/2b44e934-8311-441a-9d9a-5af61e46d7c5.png)


## 2秒以上の停止
当然555を使うわけですが、555は前回解説したように**タイマー時間より長いトリガーが入力されるとタイマー時間より長いパルスが生成**される特性があります。

### 微分回路
この対策としてトリガーを一瞬だけしか発生させない微分回路を追加します。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/45f29a94-475b-4da2-8341-9a0a452f947f.png)
信号線に直列のコンデンサには、入力されるHi/Lo信号の立ち上がり立ち下がりエッジでのみCに電流が流れます。PNPトランジスタは負のベース電流が流れたときのみONするので立ち下がりエッジの瞬間のみNPNトランジスタのベースに電流が流れます。このNPNトランジスタが立ち下がりエッジの一瞬だけトリガーをかけるわけです。
下図がそのシミュレーション結果です。Vout(緑)が長い時間Loになっているにもかかわらず、微分回路によりトリガー(青)が一瞬しか入らないことが分かると思います。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/10853d28-8360-438e-9873-12a2687bde3b.png)

### シーケンスとタイマー
走行終了をアナログ系のON/OFF信号がLoになったタイミングから拾い、走行終了後2秒以上（余裕を持って3秒）Hiになる信号を555で生成します。ただ、この信号を走行開始SWに**直接接続するとマーカーが検出できなくなるので、出力にも微分回路が必要**です。

555の入力と出力に微分回路を組み合わせた動作をシミュレーションしました。
Vout(黄緑)が長い時間Loなのにトリガー(青)が一瞬だけ入り、555が約1msのパルスを生成。更に微分回路が作動してスタートSW用に一瞬だけパルス(アクア)が発生しています。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/7589eb0d-4fd2-4026-9699-d01b8add404b.png)
なお、スタートSW用パルスは非常に短いですが、スタートSWやマーカーの安定した検出のため元々555が付いているので短いパルスでも問題ないです。
![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/2369d9cf-f009-4b10-9ee1-c61992511223.png)

### 実際の回路
走行終了後カウンタICをリセット。同時に3秒間経過するのを待ち、待ち時間が終わったらスタートSWを勝手に押す回路がこちらになります。

![image.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/c95e0025-c4c1-4796-9149-8fbc0d209f88.png)

# 全体の回路
## 回路図
今回のオートスタート機能を組み込んだ回路がこちらです。
（シーケンスがしれっと直っているような気がしますがきっと気の所為です）
![marker_system-2.png](https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/04f98d74-86dd-40c9-b093-7a1499e26a8c.png)
## 実際の回路
元々、修正が多数発生する＆ワンオフなのでユニバーサル基板で制作していましたが、今回追加する回路も***無理くり***乗せました。***自分でも何がどうなっているのかよくわからないです^ ^***

<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/29f331ab-0213-4220-a9a1-fd126dd25f6d.png" width="480">
<img src="https://qiita-image-store.s3.ap-northeast-1.amazonaws.com/0/269597/5d40bc3f-b280-4655-8fe4-a8bf69933837.png" width="480">

# 動作

<!-- <iframe width="560" height="315" src="https://www.youtube.com/embed/aPvYI-nczXM" title="YouTube video player" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture" allowfullscreen></iframe> -->
実際に走らせる代わりにスタートスイッチを押すことで動作確認を行いました。
スタートスイッチを３回押すと自動的に停止。さらに3秒後自動的に走行を開始することが確認できました。

<iframe width="781" height="696" src="https://www.youtube.com/embed/1kQNl5ZhqMw" title="2025年2月21日" frameborder="0" allow="accelerometer; autoplay; clipboard-write; encrypted-media; gyroscope; picture-in-picture; web-share" referrerpolicy="strict-origin-when-cross-origin" allowfullscreen></iframe>

# まとめ
回路の改変が簡単なことが特徴のユニバーサル基板ですが、この規模の回路追加となると中々大変です。**回路のロジックのブランチが切れない**のも辛いですね。失敗（作業ミスも含む）しても戻すのは大変です。この辺はプログラミングのほうが楽なのかも知れません。

[^1]:大抵のリセットは負論理です。リセットは電源が立ち上がり安定するまでかけ続けなければなりません。このときリセットが正論理だと、その立ち上がりきっていない電源電圧からHiを作り出さなければならず不安があります。なので負論理が多いのでしょう。