ガレージの信号。 プレゼント

霧雨がひどく不快でした。 気分は卑劣だった。

彼は道路の脇に横たわり、静かに錆びていた。 柱の近くで、若い仲間が光で輝いていました。

停止してトランクに入れました。

私はもう一人ではありません。

そして彼は一人ではありません。



彼はそれを田舎に持ち込み、解体し、汚れから洗い、スプレー缶で塗装しました。



アプリケーションはすぐに見つかりました。 新しい車は以前のものよりも幅が広くなり、ガレージの駐車はより問題が大きくなりました。 あらゆる種類の「弦の鐘」-これは私たちのためではありません。 だから-固定駐車センサー。



装備品


1.広範な超音波センサーHC-SR04。 2個、各壁に1個。 インターネットにはそれらに関する情報がたくさんあります。 以下の説明。



超音波測距モジュールHC-SR04



製品の特徴:


超音波測距モジュールHC-SR04は2cm-400cmの非接触測定機能を提供し、測距精度は3mmに達します。 モジュールには、超音波送信機、受信機、制御回路が含まれています。 仕事の基本原則:

10us以上の高レベル信号にIOトリガーを使用します。

モジュールは8つの40 kHzを自動的に送信し、パルス信号が戻ってくるかどうかを検出します。

信号が戻ってきた場合、高レベル、高出力IO持続時間は、超音波を送信してから戻るまでの時間です。

テスト距離=(高レベル時間×音速(340M / S)/ 2



次のように直接接続するワイヤ:


5V電源

トリガーパルス入力

エコーパルス出力

0Vグラウンド

電気パラメータ


動作電圧DC 5 V

動作電流15mA

動作周波数40Hz

最大範囲4m

最小範囲2cm

測定角度15度

トリガー入力信号10uS TTLパルス

エコー出力信号入力TTLレバー信号と比例した範囲

寸法45 * 20 * 15mm



画像



タイミング図


タイミング図を以下に示します。 レンジングを開始するには、トリガー入力に短い10uSパルスを供給するだけで、モジュールは40 kHzで8サイクルの超音波バーストを送信し、エコーを上げます。 エコーは、パルス幅と範囲に比例する距離オブジェクトであり、トリガー信号を送信してからエコー信号を受信するまでの時間間隔で範囲を計算できます。 式:US / 58 =センチメートルまたはUS / 148 =インチ。 または:範囲=高レベル時間*速度(340M / S)/ 2; エコー信号へのトリガー信号を防ぐために、60ms以上の測定サイクルを使用することをお勧めします。



画像



亜鉛メッキシートストリップを使用して、ガレージの入り口の側壁に固定されています。 マウントを使用すると、車の寸法(高さ、ボンネットの幅、翼の形状など)に応じてセンサーを「所定の位置に」調整できます。



画像



2.コントローラーはPIC16f84aです。 なぜこれ:

a)私はそれらを持っています。

b)2つのI / Oポートがあり、合計13ビットが必要です。 3個 -信号制御(赤-黄-緑)、6個。 -左右のLED(K-Zh-Z)、2個。 -左右のセンサーへの位置パルス(Trig)、2個。 -左右のセンサーからの反射パルス(エコー)。



3. 2つの3色LED、各壁に1つ。 LED赤-黄-緑が見つかりません。 たぶんそれらは存在しないかもしれませんが、私はひどく見ていました。 そのため、LEDの黄色の役割は青になります。 もちろん、完全な識別のために、個別のLEDを使用することもできます。 そして、黄色の問題はありません。 しかし、私はそのような妥協は許容できると考えました。



画像



4.信号制御ユニット。 3個、各ランプに1個。

テレビのオン/オフ制御ユニットが理想的です。



画像



低電力電源トランス(220〜7ボルト)、ダイオード整流器、KR142EN5xの安定器(またはアナログ)、トランジスタスイッチ、リレーで構成されています。 論理「1」が入力に適用されると、キーが開き、リレーがトリガーされ、220vが出力されます。 さらに、KRENは安定化された5vを提供するため、これらのユニットの1つからマイクロコントローラーに電力を供給することは合理的です。 それらはあらゆるラジオ市場でいっぱいです。 誰かがリレーのクリックを悩ます場合、サイリスタ回路を作るのは簡単です。



5. 4 MHzの水晶振動子。

これは、私が持っているマイクロコントローラーにとって非常に便利な周波数です。 読みやすい時間パラメータ。 クロックパルスの周期= 250ns、マシンサイクルは4クロックサイクルで構成されているため、1μsに等しくなります。 RISCコントローラーのコマンドは1マシンサイクルまたは2マシンサイクルで実行されるため、「どのように...から前に」経過する時間を計算しても問題はありません。 許容周波数内で別の周波数を使用できますが、タイムアウトを再カウントする必要があります。 これは非常に小さな問題です。



6.典型的なPIC16f84aスイッチング回路で推奨されるいくつかの抵抗とコンデンサ、およびLED用の2つの電流制限抵抗。 たとえば、こちらをご覧ください: link



組み立てられたデバイスの一般的なビュー:



画像

画像



マイクロコントローラー付きボード:



画像



回路図


画像



アルゴリズム


シンプルでほぼ線形。 電源投入時に、ハードウェアテストが実行されます。 伝えられるところでは、テストは、美しさのためです。 1秒の間隔で赤黄緑が切り替わり、同じ間隔ですべての信号が3回点灯します。 その後-左右のチャンネルをポーリングする無限のサイクルへの移行。 各チャネルが通過すると、結果に応じて、対応するPORTBビット(フラグ)が設定され、このチャネルのLEDの1つが点灯します。 フルサイクルの最後に、両方のチャネルの赤黄緑フラグの状態が分析され、これに基づいて、対応する信号機がオンになります。 真理値表は次のようになります。



どのチャンネルもです。 トラフィックライト-

両方のチャネルがです。 トラフィックライトグリーン

他のすべての場合。 トラフィックライト- 黄色



いくつかの言葉で、ステップバイステップアルゴリズムのコア:



1.インパルストリガーを形成します。

2.応答パルスEchoの到着が予想されます。

3.タイムアウト1msを実行します。

4.タイムアウトの期限が切れた後、Echoの入力に別の「log.1」があるかどうかを確認します。

5.そうでない場合、対応するチャネルのセンサーに危険な近似値があります。 このチャンネルの赤旗をオンにして、別のチャンネルに移動します。

6.まだエコーがある場合は、手順3と4を繰り返します。

7.そうでない場合、センサーから平均距離にあります。 黄色のフラグをオンにして、別のチャンネルに移動します。

8.エコーがまだ残っている場合、私たちは遠く離れています。 終了を待って、緑色のフラグをオンにして、別のチャンネルに移動します。



画像



ポイントは何ですか? オブジェクトまでの正確な距離を計算する必要はありません。 つまり、センサーの説明で示されているように、エコーのパルス幅を58で割る必要はありません。 私たちは距離計を構築していません。 オブジェクトからセンサーまでの距離の2つの同一範囲に関連するオブジェクトの位置のみを知る必要があります。 このために、1msのタイムアウトが使用され(条項3を参照)、最終的には1000µs:58 = 17cmになります。 だから-17cmより近い-赤、17から34cm-黄色、そして34cm-緑。 「1ms一時停止」サブルーチンの定数を変更することにより、車のサイズ、ゲートの幅、運転技術に応じて距離を変えることができます。



ファームウェア


ファームウェアのリストは次のとおりです。 アセンブラー。 デバイスはビット指向であるため、タイムアウトの定数を除く定数はバイナリシステムにあります。 また、デバッグまたは分析する場合、バイナリシステムに変換する必要があります。 このプログラムは、ウォッチドッグタイマーを使用してフリーズを防ぎます。

リスティング
list p=16F84A ; list directive to define processor #include <p16F84A.inc> ; processor specific variable definitions __CONFIG _CP_OFF & _WDT_ON & _PWRTE_ON & _XT_OSC ;********************** Contact Assignment ***************************** ; Contact # Name Function ; 17 RA0 output TrigLeft ; 18 RA1 output TrigRight ; 01 RA2 input EchoLeft ; 02 RA3 input EchoRight ; 03 RA4 output GenRed ; 06 RB0 output RedLeft ; 07 RB1 output YellowLeft ; 08 RB2 output GreenLeft ; 09 RB3 output RedRight ; 10 RB4 output YellowRight ; 11 RB5 output GreenRight ; 12 RB6 output GenYellow ; 13 RB7 output GenGreen ; ;******************* Constants ************************** ; Red 00000001 Left channel ; Yellow 00000010 Left channel ; Green 00000100 Left channel ; ; Red 00001000 Right channel ; Yellow 00010000 Right channel ; Green 00100000 Right channel ;***** VARIABLE DEFINITIONS ***************************** CBLOCK 0x0C Reg_1 ; 0x0C use within Pause subroutine Reg_2 ; 0x0D use within Pause subroutine Reg_3 ; 0x0E use within Pause subroutine ENDC #define bank0 bcf STATUS,RP0 ; set bank0 #define bank1 bsf STATUS,RP0 ; set bank1 #define TrigLeft_1 bsf PORTA,0 ; set Trigleft #define TrigLeft_0 bcf PORTA,0 ; clean Trigleft #define TrigRight_1 bsf PORTA,1 ; set Trigright #define TrigRight_0 bcf PORTA,1 ; clean Trigright #define EchoLeft PORTA,2 #define EchoRight PORTA,3 #define RedLeft b'00000001 #define YellowLeft b'00000010 #define GreenLeft b'00000100 #define RedRight b'00001000 #define YellowRight b'00010000 #define GreenRight b'00100000 ;********************************************************************** ORG 0x000 ; processor reset vector goto main ; go to beginning of program ;---------------------------------------------------------------------- ;------------------ SUBROUTINE Pulse -------- ;delay = 10 machine cycles = 10 µs Pulse movlw .3 movwf Reg_1 wr0 decfsz Reg_1,F goto wr0 return ;------------------ SUBROUTINE Pause 1ms -------- ;delay = 1'000 machine cycles Pause movlw .75 movwf Reg_1 movlw .3 movwf Reg_2 wr1 decfsz Reg_1,F goto wr1 clrwdt decfsz Reg_2,F goto wr1 nop return ;-------------------- SUBROUTINE Pause 1sec --- ;delay = 1'000'000 machine cycles Pause1 movlw .254 movwf Reg_1 movlw .17 movwf Reg_2 movlw .6 movwf Reg_3 wr2 decfsz Reg_1,F goto wr2 clrwdt decfsz Reg_2,F goto wr2 decfsz Reg_3,F goto wr2 nop nop return ;-------------------- SUBROUTINE Pause 50ms -------- ;delay = 50'000 machine cycles Pause2 movlw .216 movwf Reg_1 movlw .65 movwf Reg_2 wr3 decfsz Reg_1,F goto wr3 clrwdt decfsz Reg_2,F goto wr3 return ;--------------------- SUBROUTINE General Red --------------- GenRed bsf PORTA,4 bcf PORTB,6 bcf PORTB,7 return ;--------------------- SUBROUTINE General Green ------------- GenGreen bsf PORTB,7 bcf PORTA,4 bcf PORTB,6 return ;--------------------- SUBROUTINE General Yellow ------------ GenYellow bsf PORTB,6 bcf PORTA,4 bcf PORTB,7 return ;--------------------- SUBROUTINE General All ------------ GenAll bsf PORTA,4 bsf PORTB,6 bsf PORTB,7 return ;--------------------------------------------------------- main bank1 ; set Bank 1 movlw 0x00 movwf TRISB ; PORTB - out movlw b'00001100 movwf TRISA ; RA2,RA3 - input; RA0,RA1,RA4 - output bank0 ; return to Bank 0 clrf PORTA clrf PORTB ; turn off all lights ;---------------------- TEST ----------------------------- call GenRed call Pause1 call GenYellow call Pause1 call GenGreen call Pause1 bcf PORTA,4 bcf PORTB,6 bcf PORTB,7 call Pause1 call GenAll call Pause1 bcf PORTA,4 bcf PORTB,6 bcf PORTB,7 call Pause1 call GenAll call Pause1 bcf PORTA,4 bcf PORTB,6 bcf PORTB,7 call Pause1 call GenAll call Pause1 bcf PORTA,4 bcf PORTB,6 bcf PORTB,7 call Pause1 goto SoundRight ;------------------LEFT---------------------- SoundLeft TrigLeft_1 call Pulse TrigLeft_0 btfss EchoLeft goto $-1 call Pause btfss EchoLeft goto SetRedLeft call Pause btfss EchoLeft goto SetYellowLeft goto SetGreenLeft SetRedLeft movlw RedLeft iorwf PORTB,1 bcf PORTB,1 bcf PORTB,2 goto SoundRight SetYellowLeft movlw YellowLeft iorwf PORTB,1 bcf PORTB,0 bcf PORTB,2 goto SoundRight SetGreenLeft movlw GreenLeft iorwf PORTB,1 bcf PORTB,0 bcf PORTB,1 clrwdt btfsc EchoLeft ; wait Echo end goto $-2 goto SoundRight ;----------------RIGHT--------------------- SoundRight call Pause2 TrigRight_1 call Pulse TrigRight_0 btfss EchoRight goto $-1 call Pause btfss EchoRight goto SetRedRight call Pause btfss EchoRight goto SetYellowRight goto SetGreenRight SetRedRight movlw RedRight iorwf PORTB,1 bcf PORTB,4 bcf PORTB,5 goto SetGenLight SetYellowRight movlw YellowRight iorwf PORTB,1 bcf PORTB,3 bcf PORTB,5 goto SetGenLight SetGreenRight movlw GreenRight iorwf PORTB,1 bcf PORTB,3 bcf PORTB,4 clrwdt btfsc EchoRight ; wait Echo end goto $-2 ;------------------------ Set General Lights ---------------- SetGenLight btfss PORTB,0 ; check RedLeft goto CheckRedRight call GenRed goto SoundLeft CheckRedRight btfss PORTB,3 goto CheckGreenLeft call GenRed goto SoundLeft CheckGreenLeft btfss PORTB,2 goto SetGenYellow btfss PORTB,5 goto SetGenYellow call GenGreen goto SoundLeft SetGenYellow call GenYellow goto SoundLeft END
      
      







映像








謝辞と義務


著者は妻に感謝の意を表明します。妻は実際の裁判で大胆にガレージのドアに立っており、車の左翼も右翼も入り口の壁に押し込まないようにしました。 プロジェクトを繰り返したい大胆不敵なフォロワーがいる場合、著者は全員に答えます。



All Articles