Світлофор у гаражі. Справжній

Йшов дрібний і противний дощ. Настрій було огидним.
Він лежав на узбіччі і тихо іржавів. Поряд на стовпі виблискував вогнями молодий побратим.
Я зупинився й поклав його в багажник.
Я вже не один.
І він не один.

Привіз на дачу, розібрав, відмив від бруду і пофарбував з балончика.

Застосування знайшлося відразу. Нова машина виявилася ширше попередньої і заїзд в гараж став більш проблематичним. Всякі «дзвіночки-на-мотузочках» — це не для нас. Отже — стаціонарний парктронік.

Апаратура
1. Широко поширені ультразвукові датчики HC-SR04. 2 штуки, по одному на кожну стінку. В інтернеті повно інформації про них. Опис нижче.

Ultrasonic Ranging Module HC — SR04

Product features:

Ultrasonic ranging module HC — SR04 provides 2cm — 400cm non-contact measurement function, the ranging accuracy can reach to 3mm. The modules includes ultrasonic transmitters, receiver and control circuit. The basic principle of work:
Using IO trigger for at least 10us high level signal.
The Module automatically sends eight 40 kHz detect and whether there is a pulse signal back.
IF the signal back, through high level, time of high output IO duration is the time from sending ultrasonic returning to.
Test distance = (high level time × velocity of sound (340M/S) / 2


Wire connecting direct as following:

5V Supply
Trigger Pulse Input
Echo Pulse Output
0V Ground

Electric Parameter

Working Voltage DC 5 V
Current Working 15mA
Working Frequency 40Hz
Max Range 4m
Min Range 2cm
Measuring Angle 15 degree
Trigger Input Signal 10uS TTL pulse
Echo Output Signal Input TTL lever signal and the range in proportion
Dimension 45*20*15mm


image

Timing diagram

The Timing diagram is shown below. You only need to supply a short 10uS pulse to the trigger input to start the ranging, and then the module will send out an 8 cycle burst of ultrasound at 40 kHz and raise its echo. The Echo is a distance object that is pulse width and the range in proportion .You can calculate the range through the time interval between sending trigger signal and receiving echo signal. Formula: uS / 58 = centimeters or uS / 148 =inch; or: the range = high-level time * velocity (340M/S) / 2; we suggest to use over 60ms measurement cycle, in order to prevent trigger signal to the echo signal.

image

Закріплені на бічних стінках на в'їзді в гараж за допомогою смужок з оцинкованої жерсті. Кріплення повинно дозволити відрегулювати датчики «за місцем» у залежності від габаритів авто (висота, ширина капота, форма крил...).

image

2. Контролер — PIC16f84a. Чому це:
а) їх є у мене;
б) у нього 2 порти вводу-виводу, сумарно 13 розрядів, якраз стільки і треба. 3шт. — управління світлофором (Червоний — Жовтий — Зелений), 6шт. — лівий і правий світлодіоди (До-З-З), 2шт. — імпульс локації (Trig) на лівий і правий датчики, 2шт. — відбитий імпульс (Echo) від лівого і правого датчиків.

3. Два триколірних світлодіода, по одному на кожну стінку. Світлодіодів Червоний — Жовтий — Зелений не знайшов. Може і не буває, а може погано шукав. Тому роль жовтого у світлодіодів грає синій колір. Для повної ідентичності, звичайно, можна було використовувати роздільні світлодіоди. І не було б з жовтим проблем. Але такий компроміс я вважав допустимим.

image

4. Блоки керування лампами світлофора. 3шт., по одному на кожну лампу.
Ідеально підходить блок керування включенням-виключенням телевізора.

image

Складається з малопотужного силового трансформатора (220 в 7 вольт), діодного випрямляча, стабілізатора на КР142ЕН5х (або аналог), транзисторного ключа і реле. При подачі на вхід логічної «1» ключ відкривається, реле спрацьовує і 220в подається на вихід. Крім того, оскільки КРЕН забезпечує стабілізовані 5в, від одного з цих блоків резонно живити мікроконтролер. Їх повно на будь-якому радіоринку. Якщо когось дратує клацання реле, нескладно зробити схему на тиристорах.

5. Кварцовий резонатор на 4мгц.
Це дуже зручна частота для тих мікроконтролерів, що у мене є. Легко вважати тимчасові параметри. Період тактових імпульсів = 250нс, машинний цикл складається з чотирьох тактів, отже, дорівнює 1мкс. Команди в RISC-контролерах виконуються за 1 або 2 машинних циклу, так що з обчисленням часу, який пройде «від того, як… до того, як» проблем немає. Можна використовувати інший в межах допустимих частот, але доведеться перераховувати таймаут. Це зовсім невелика проблема.

6. Кілька резисторів і конденсаторів, рекомендованих типовою схемою включення PIC16f84a і два токоограничивающих резистори для світлодіодів. Даташит дивитися, наприклад, тут: посилання.

Загальний вигляд зібраного девайса:

image
image

Плата з мікроконтролером:

image

Принципова схема
image

Алгоритм
Простий, практично лінійний. По включенні живлення проводиться тест апаратури. Нібито тест, більше для краси. З інтервалом в 1сек перемикаються червоний-жовтий-зелений, потім з тим же інтервалом три рази включаються всі лампи світлофора. Після цього — перехід до нескінченного циклу опитування лівого і правого каналів. При проході кожного каналу, в залежності від отриманого результату, встановлюється відповідний біт (прапор) PORTB і включається один з світлодіодів даного каналу. По закінченні повного циклу проводиться аналіз стану прапорів Red-Yellow-Green обох каналів і на підставі цього включається відповідна лампа світлофора. Таблиця істинності виглядає так:

Будь канал Червоний. Світлофор — Червоний.
Обидва канали Зелений. Світлофор — Зелений.
Всі інші випадки. Світлофор — Жовтий.

В кількох словах серцевина алгоритму «по кроках»:

1. Формуємо імпульс Trig;
2. Очікуємо приходу відповідного імпульсу Echo;
3. Запускаємо таймаут 1ms;
4. Після закінчення тайм-ауту перевіряємо чи є ще «лог.1» на вході Echo;
5. Якщо ні, значить ми на небезпечному наближенні до датчика відповідного каналу. Включаємо червоний прапор даного каналу і переходимо на інший канал;
6. Якщо Echo ще є, повторюємо п.п.3 і 4;
7. Якщо ні, значить ми на середньому відстані від датчика. Включаємо жовтий прапор і переходимо на інший канал;
8. Якщо Echo ще є, значить ми далеко. Чекаємо його закінчення, включаємо зелений прапор і переходимо на інший канал.

image

В чому суть? Нам не потрібно обчислювати точне відстань до об'єкта. Тобто не треба тривалість імпульсу Echo ділити на 58, як зазначено в описі датчика. Ми, не далекомір будуємо. Нам потрібно дізнатися лише положення об'єкта по відношенню до двох однакових діапазонах відстані від об'єкта до датчика. Для цього використовується таймаут 1ms (див.п.3), що в підсумку дає: 1000µs: 58 = 17см. Отже — ближче 17см — червоний, від 17 до 34см — жовтий, далі 34см — зелений. Змінюючи константи в підпрограмі «Pause 1ms», можна варіювати відстані в залежності від розмірів авто, ширини воріт та навичок водіння.

Мікропрограма
Лістинг мікропрограми наведено нижче. Асемблер. Константи, крім тих, що таймаутах, — в двійковій системі, оскільки пристрій, біт-орієнтований. І при налагодженні чи аналізі все одно довелося б переводити в двійкову систему. Для запобігання зависань в програмі використовується Watchdog Timer.
ЛістингВміст</ 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 the 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


Відео


Подяки та зобов'язання
Автор висловлює подяку своїй дружині, яка під час реальних випробувань безстрашно стояла у воротах гаража і стежила за тим, щоб автор не в'їхав ні лівим, ні правим крилом авто в стіну на в'їзді. Якщо знайдуться безстрашні послідовники, які бажають повторити проект, автор із задоволенням відповість всім.

Джерело: Хабрахабр

0 коментарів

Тільки зареєстровані та авторизовані користувачі можуть залишати коментарі.