Просматривая в сети модули для робототехники, я наткнулся на ультразвуковой измеритель расстояния HC-SR04, после чего решил испытать его в действии и приобрел данный модуль в Китае за невысокую цену. На модуле установлены два пъезоизлучателя, один из которых является излучателем, а другой приемником звуковых волн. Принцип действия основан на измерении времени между излучением и приемом отраженных от объекта звуковых волн, при этом зная скорость звука в воздухе можно вычислить расстояние до объекта: S=(Vзв х t)/2, где Vзв – скорость звука в воздухе, которая составляет в среднем 330-340 м/с, t – промежуток времени между излучением и приемом отраженного звукового сигнала.
Модуль можно заказать здесь. По заявленным характеристикам модуль измеряет расстояния от 2 см до 4 м, частота ультразвука составляет 40 кГц. На следующей картинке представлена диаграмма работы модуля:
Для начала цикла измерения необходимо подать на вывод Trig положительный импульс длительностью 10 мкс, после чего модуль подает на излучатель 8 пачек импульсов с частотой 40 кГц, и переключается в режим приема эха, отраженного от объекта. На выводе Echo появляется положительный импульс, длительность которого прямо пропорциональна расстоянию до объекта. Расстояние рассчитывается по следующей формуле: S(см)=Tимп(мкс)/58, где Tимп – длительность импульса на выводе Echo в микросекундах, S – расстояние до объекта в сантиметрах. Рекомендуемая пауза между циклами измерений составляет 60 мс, пауза нужна для исчезновения эха от предыдущего измерения.
Ниже представлена схема дальномера на микроконтроллере PIC16F628A с применением ультразвукового (УЗ) модуля:
Для отображения результатов измерения я использовал цифровой индикатор на микросхеме MAX7219, в микроконтроллере включены прерывания по изменению уровня на входах RB4-RB7, вывод Echo модуля A1 подключен к линии RB4, линии RB5-RB7 настроены на выход для исключения ложного срабатывания, они используются для управления индикатором HG1. Напомню что, в микроконтроллере PIC16F628A, прерывания по изменению уровня на входах RB4-RB7 включаются для всех четырех линий, возможность индивидуальной настройки каждой линии отсутствует.
Теперь рассмотрим код программы микроконтроллера:
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213 214 215 216 217 218 219 220 221 222 223 224 225 226 227 228 229 230 231 232 233 234 235 236 237 238 239 240 241 242 243 244 245 246 247 248 249 250 251 252 253 254 255 256 257 258 259 260 261 262 263 264 265 266 267 268 269 270 271 272 273 274 275 276 277 278 279 280 281 282 283 284 285 286 287 288 289 290 291 292 293 294 295 296 297 298 299 300 301 302 303 304 305 306 307 308 309 310 311 312 313 314 315 316 317 318 319 320 321 322 323 324 325 326 327 328 329 330 331 332 333 334 335 336 337 338 339 340 341 342 343 344 345 346 347 348 349 350 351 352 353 354 355 356 357 358 359 360 361 362 363 364 365 366 367 368 369 370 371 372 373 | #include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F10' ;Конфигурация микроконтроллера Sec equ 20h ;регистры хранения временных данных для Sec1 equ 21h ;подпрограмм паузы shet equ 22h ;регистр счетчика времени scetbit equ 23h ;регистр счета для передачи по протоколу spi ctr equ 24h ;регистр хранения временных данных bcd1 equ 25h ;регистры хранения двоично-десятичных значений bcd2 equ 26h ;двоичного числа bcd3 equ 27h ; edin equ 28h ;регистры хранения десятичных значений desiat equ 29h ;двоичного числа sotni equ 2Ah ; dat_ind equ 2Bh ;регистр данных для передачи по протоколу spi adr_ind equ 2Ch ;регистр адреса для передачи по протоколу spi varLL equ 2Dh ;промежуточные регистры хранения значения varHH equ 2Eh ;времени задержки (эха) от ультразвукового модуля rezLL equ 2Fh ;регистры хранения результата деления двоичных rezHH equ 30h ;чисел flag equ 7Dh ;регистр флагов W_TEMP equ 7Eh ;регистр для хранения значения аккумулятора W STATUS_TEMP equ 7Fh ;регистр для хранения значения STATUS #DEFINE trig PORTB,3 ;линия trig ультразвукового модуля #DEFINE echo PORTB,4 ;линия echo ультразвукового модуля #DEFINE datai PORTB,5 ;линия входа данных драйвера MAX7219 #DEFINE cs PORTB,6 ;линия выбора драйвера MAX7219 #DEFINE clk PORTB,7 ;линия тактирования драйвера MAX7219 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h ;начать выполнение подпрограммы с адреса 0004h movwf W_TEMP ;сохранение значений ключевых регистров swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; btfsc PIR1,TMR1IF ;опрос флага прерывания по переп. таймера TMR1 goto prov_tmr1 ;флаг установлен: переход на метку prov_tmr1 btfss echo ;флаг прерывания по переп. таймера TMR1 сброшен: ;опрос состояния линии ввода\вывода echo goto stop_tmr1 ;линия echo равна 0: переход на метку stop_tmr1 bsf T1CON,TMR1ON ;линия echo равна 1: запуск таймера TMR1 movf PORTB,W ;чтение регистра PORTB для устранения несоответствия bcf INTCON,RBIF ;сброс флага прерывания по изменению уровня сигнала RB4:RB7 goto exxit ;переход на метку exxit stop_tmr1 bcf T1CON,TMR1ON ;остановка таймера TMR1 s_t1 movf TMR1H,W ;копирование значений регистров таймера TMR1 в промежуточные movwf varHH ;регистры хранения времени задержки (эха) movf TMR1L,W ;от ультразвукового модуля movwf varLL ; bcf INTCON,RBIE ;запрещение прерываний по изменению уровня сигнала RB4:RB7 bsf flag,0 ;установить флаг получения длительности импульса (эха) movlw .4 ;запись числа 4 в регистр счетчика времени movwf shet ; clrf TMR1L ;очистка регистров таймера TMR1 clrf TMR1H ; bcf PIR1,TMR1IF ;сброс флага прерывания по переп. TMR1 bsf T1CON,TMR1ON ;запуск таймера TMR1 goto exxit ;переход на метку exxit prov_tmr1 btfss INTCON,RBIE ;проверка разрешения прерываний по изменению ;уровня сигнала на входах RB4:RB7 goto p_t1 ;прерывания запрещены: переход на метку p_t1 bcf T1CON,TMR1ON ;прерывания разрешены: остановка таймера TMR1 movlw .156 ;запись числа 39936 в регистры таймера TMR1 movwf TMR1H ; clrf TMR1L ; goto s_t1 ;переход на метку s_t1 p_t1 decfsz shet,F ;декремент регистра shet (счетчик времени) goto exx1 ;регистр shet не равен 0: переход на метку exx1 bcf T1CON,TMR1ON ;остановка таймера TMR1 clrf TMR1L ;очистка регистров таймера TMR1 clrf TMR1H bsf flag,1 ;установить флаг готовности измерения exx1 bcf PIR1,TMR1IF ;сброс флага прерывания по переполнению TMR1 exxit swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;выход из подпрограммы обработки прерывания ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start movlw b'01000000' ;сброс регистра PORTB movwf PORTB movlw b'00000111' ;выключение компараторов movwf CMCON bsf STATUS,RP0 ;выбрать 1-й банк movlw b'00010111' ;настройка линий ввода\вывода порта B movwf TRISB ;RB0-RB2, RB4 на вход, остальные на выход bcf STATUS,RP0 ;выбрать 0-й банк clrf flag ;очистка регистра флагов movlw b'00000000' ;настройка таймера TMR1: предделитель TMR1 1:1, movwf T1CON ;внутренн источник тактового сигнала clrf TMR1L ;очистка регистров таймера TMR1 clrf TMR1H bsf INTCON,PEIE ;разрешение прерываний периферийных модулей bcf PIR1,TMR1IF ;сброс флага прерывания по переполнению TMR1 bsf STATUS,RP0 ;выбрать 1-й банк bsf PIE1,TMR1IE ;разрешение прерываний по переполнению TMR1 bcf STATUS,RP0 ;выбрать 0-й банк call init_lcd ;вызов подпрограммы инициализации драйвера(MAX7219) call signal_not ;вызоВ подпрограммы вывода знаков тире "- - -" на ;цифровое табло call start_pul ;вызов подпрограммы запуска измерения start_pul bsf INTCON,GIE ;глобальное разрешение прерываний opros btfsc flag,0 ;опрос флага получения длительности импульса (эха) call vivod ;вызов подпрограммы вывода измеренного значения ;задержки (эха) на цифровое табло btfsc flag,1 ;опрос флага готовности измерения call start_pul ;вызов подпрограммы запуска измерения start_pul goto opros ;переход на метку opros ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; vivod bcf flag,0 ;сброс флага получения времени задержки (эха) call del ;вызов подпрограммы деления двоичных чисел movf rezHH,W ;проверка результата деления двоичных чисел sublw .1 ;если результат меньше числа 400 вызываем btfss STATUS,C ;подпрограмму (bin2bcd) преобразования двоичного числа goto viv_1 ;в десятичное btfss STATUS,Z ; goto viv_2 ; movf rezLL,W ; sublw .144 ; btfss STATUS,C ; goto viv_1 ; viv_2 call bin2bcd ;вызов подпрограммы преобразования двоичного числа ;в десятичное call send_rast ;вызов подпрограммы вывода десятичного значения ;задержки (эха) на цифровое табло return ;выход из подпрограммы viv_1 call signal_not ;вызов подпрограммы вывода знаков тире "- - -" на ;цифровое табло return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; start_pul bcf flag,1 ;сброс флага готовности измерения bsf trig ;установить в 1 линию ввода/вывода trig movlw .3 ;пауза 10 мкс movwf Sec ; pul_1 decfsz Sec,F ; goto pul_1 ; bcf trig ;сбросить линию ввода/вывода trig movf PORTB,W ;чтение регистра PORTB для устранения несоответствия bcf INTCON,RBIF ;сброс флага прерывания по изменению уровня сигнала RB4:RB7 bsf INTCON,RBIE ;разрешение прерываний по изменению уровня сигнала RB4:RB7 return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; del clrf rezLL ;Подпрограмма деления двухбайтного числа на число 58 clrf rezHH ;(varLH, varLL):58 d1 movlw .58 ;Двухбайтное число предварительно загружается subwf varLL,F ;в регисты varHH, varLL btfsc STATUS,C ;Результат деления в регистрах rezLH, rezLL goto d2 ;деление целочисленное без дробной части movlw .1 ; subwf varHH,F ; btfss STATUS,C ; return ;выход из подпрограммы d2 incfsz rezLL,F ; goto d1 ; incf rezHH,F ; goto d1 ; ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; bin2bcd movlw .16 ;Подпрограмма преобразования двоичного числа movwf ctr ;в десятичное clrf bcd1 ;Двухбайтное число предварительно загружается clrf bcd2 ;в регисты rezHH, rezLL clrf bcd3 ;Результат преобразования: goto start_1 ;единицы в младшем полубайте bcd3 ;десятки в старшем полубайте bcd3 adjdec movlw 0x33 ;сотни в младшем полубайте bcd2 addwf bcd1,F ;тысячи в старшем полубайте bcd2 addwf bcd2,F ;десятки тысяч в младшем полубайте bcd1 addwf bcd3,F ; ; movlw 0x03 ; btfss bcd1,3 ; subwf bcd1,F ; btfss bcd2,3 ; subwf bcd2,F ; btfss bcd3,3 ; subwf bcd3,F ; ; movlw 0x30 ; btfss bcd1,7 ; subwf bcd1,F ; btfss bcd2,7 ; subwf bcd2,F ; btfss bcd3,7 ; subwf bcd3,F ; ; start_1 rlf rezLL,F ; rlf rezHH,F ; rlf bcd3,F ; rlf bcd2,F ; rlf bcd1,F ; decfsz ctr,F ; goto adjdec ; ; movf bcd3,W ;копирование значения единиц из младшего andlw b'00001111' ;полубайта bcd3 в регистр edin movwf edin ; swapf bcd3,W ;копирование значения десятков из старшего andlw b'00001111' ;полубайта bcd3 в регистр desiat movwf desiat ; movf bcd2,W ;копирование значения сотен из младшего andlw b'00001111' ;полубайта bcd2 в регистр sotni movwf sotni ; return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма вывода десятичного значения задержки (эха) на цифровое табло send_rast movlw 0x01 ;Вывод значения регистра edin на 1-й индикатор movwf adr_ind ; movf edin,W ; movwf dat_ind ; call send ; movlw 0x02 ;Вывод значения регистра desiat на 2-й индикатор movwf adr_ind ; movf desiat,W ; movwf dat_ind ; call send ; movlw 0x03 ;Вывод значения регистра sotni на 3-й индикатор movwf adr_ind ; movf sotni,W ; movwf dat_ind ; call send ; return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма вывода символов тире "- - - " на цифровое табло signal_not movlw 0x04 ;очистка 4-го индикатора movwf adr_ind ; movlw 0x0F ; movwf dat_ind ; call send ; movlw 0x03 ;вывод тире на 3-й индикатор movwf adr_ind ; movlw 0x0A ; movwf dat_ind ; call send ; movlw 0x02 ;вывод тире на 2-й индикатор movwf adr_ind ; movlw 0x0A ; movwf dat_ind ; call send ; movlw 0x01 ;вывод тире на 1-й индикатор movwf adr_ind ; movlw 0x0A ; movwf dat_ind ; call send ; return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма инициализации драйвера(MAX7219) цифрового табло init_lcd call pauslcd ;вызов подпрограммы паузы 2 мс movlw 0x0F ;выключить тестовый режим movwf adr_ind ; movlw 0x00 ; movwf dat_ind ; call send ; movlw 0x0C ;включение индикатора movwf adr_ind ; movlw 0x01 ; movwf dat_ind ; call send ; movlw 0x0A ;интенсивность 31/32 movwf adr_ind ; movlw 0x07 ; movwf dat_ind ; call send ; movlw 0x09 ;использовать BCD Code B для всех индикаторов movwf adr_ind ; movlw 0xFF ; movwf dat_ind ; call send ; movlw 0x0B ;использовать 4 индикатора movwf adr_ind ; movlw 0x03 ; movwf dat_ind ; call send ; return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма отправки 2-х байт на драйвер (MAX7219) цифрового табло по пртоколу SPI send bcf cs ;Сбросить линию выбора драйвера CS movlw .8 ;Отправка содержимого адресного байта adr_ind movwf scetbit ; povtor bcf clk ; btfsc adr_ind,7 ; bsf datai ; btfss adr_ind,7 ; bcf datai ; bsf clk ; rlf adr_ind,F ; decfsz scetbit,F ; goto povtor ; movlw .8 ;Отправка содержимого байта данных dat_ind movwf scetbit ; povtr1 bcf clk ; btfsc dat_ind,7 ; bsf datai ; btfss dat_ind,7 ; bcf datai ; bsf clk ; rlf dat_ind,F ; decfsz scetbit,F ; goto povtr1 ; bcf clk ; bsf cs ;установить в 1 линию выбора драйвера CS return ;выход из подпрограммы ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; pauslcd movlw .4 ;подпрограмма пауза 2 мс movwf Sec1 ; p3 movlw .166 ; movwf Sec ; p2 decfsz Sec,F ; goto p2 ; decfsz Sec1,F ; goto p3 ; return ;выход из подпрограммы end ;конец всей программы ; |
Микроконтроллер работает от внутреннего тактового генератора частотой 4 МГц. В начале основной программы выполняется настройка линий ввода\вывода, далее настраивается 16-ти разрядный таймер TMR1, с помощью него будет производиться измерение длительности импульса на выходе УЗ модуля. Коэффициент предделителя таймера устанавливается равным 1:1, выбирается внутренний источник тактового сигнала Fosc/4, при таких настройках таймер переполнится через 65536 мкс, инкремент происходит каждую микросекунду. Далее разрешаются прерывания периферийных модулей, прерывание по переполнению таймера TMR1. Вызывается подпрограмма инициализации (init_lcd) драйвера MAX7219 цифрового индикатора, после чего вызывается подпрограмма signal_not, для вывода символов тире “- – -” на цифровой индикатор. Следом идет вызов подпрограммы запуска цикла измерения start_pul, в подпрограмме выполняется сброс флага готовности измерения flag,1, на линии trig (RB3) устанавливается высокий логический уровень на 10 мкс, тем самым УЗ модуль начинает процесс измерения. После подачи команды, сбрасываем флаг и разрешаем прерывания по изменению уровня на входах RB4-RB7, после выхода из подпрограммы start_pul, разрешаем глобальные прерывания и переходим к опросу флага готовности flag,1 и флага получения длительности импульса flag,0.
Спустя некоторое время УЗ модуль устанавливает высокий логический уровень на выводе Echo, происходит прерывание по изменению уровня на линии RB4 и переход в обработчик прерываний. В подпрограмме обработки прерываний проверяется состояние линии echo (RB4), и если оно равно 1, выполняется запуск таймера TMR1, тем самым начинается процесс измерения длительности импульса. После запуска таймера выполняется сброс флага прерываний по изменению уровня на входах RB4-RB7 и выход из обработчика прерываний.
Через определенный промежуток времени (пропорциональный расстояние до объекта) на линии RB4 устанавливается низкий логический уровень, происходит очередное прерывание по изменению уровня RB4. В обработчике прерываний снова проверяется состояние линии echo (RB4), на этот раз оно равно нулю и происходит переход на метку stop_tmr1. Выполняется остановка таймера TMR1, значение регистров таймера (в микросекундах) копируется в регистры хранения длительности импульса (varHH, varLL), запрещаются прерывания по изменению уровня на RB4-RB7, устанавливается флаг получения длительности импульса flag,0. Таким образом, заканчивается цикл измерения расстояния УЗ модулем.
Далее настраивается счетчик времени для организации паузы после цикла измерения расстояния, в регистр счетчика времени shet записывается число 4, обнуляются регистры таймера TMR1, сбрасывается флаг прерывания по переполнению таймера, выполняется запуск таймера и выход из обработчика прерывания. По переполнению таймера происходит вход в обработчик прерываний и переход на метку prov_tmr1, где проверяется состояние бита разрешения прерываний по изменению уровня на RB4-RB7, и если он равен нулю выполняется декремент регистра shet. Если содержимое регистра shet не равно нулю происходит сброс флага прерываний по переполнению таймера TMR1и выход из обработчика прерываний. Когда значение регистра shet станет равным нулю, будет выполнена остановка таймера TMR1, обнуление его регистров, установка флага готовности измерения flag,1, сброс флага прерывания и выход из обработчика прерываний. Таким образом, продолжительность паузы составит (65536мкс) х 4=262,144 мс, паузу можно изменить, записав другое значение в регистр shet.
В основной программе при получении подтверждения об окончании процесса измерения (опрос флага flag,0) вызывается подпрограмма (vivod) расчета и вывода расстояния до объекта на цифровой индикатор. В подпрограмме vivod сбрасывается флаг flag,0 и вызывается подпрограмма деления (del) длительности импульса на число 58, после возврата в регистрах rezHH, rezLL, находится значение расстояния до объекта в сантиметрах. Если значение больше 400 см, на цифровой индикатор выводятся символы тире “- – -”, я применил данное ограничения опираясь на характеристики УЗ модуля.
При значениях расстояния менее 400 см, вызывается подпрограмма (bin2bcd) преобразования двоичного числа в двоично-десятичное, далее в подпрограмме send_rast десятичное значение расстояния выводится на цифровой индикатор. После вывода, происходит возврат из подпрограммы vivod и дальнейший опрос флагов flag,0 и flag,1. Если флаг готовности (flag,1) равен 1, происходит вызов подпрограммы start_pul, тем самым запускается новый цикл измерения расстояния.
В процессе измерения длительности импульса на линии echo (RB4), может возникнуть переполнение таймера TMR1, например, из-за большого расстояния до объекта или его отсутствии. Для этого случая в обработчике прерывания при переходе на метку prov_tmr1, проверяется состояние бита разрешения прерываний по изменению уровня на RB4-RB7, если значение бита равно 1, то длительность импульса превысила 65,536 мс. При этом в регистры таймера записывается число 39936 (соответствует расстоянию в 688 см) и выполняется переход на метку s_t1. Во время проверки значения расстояния в основной программе, из-за ограничения в 400 см, на индикаторе будут отображаться символы тире “- – -”.
Модуль довольно точно измеряет расстояния, по крайней мере, на коротких дистанциях, в характеристиках указано, что модуль измеряет расстояния до 4-х метров, но на самом деле больше, я получал показания вплоть до 5-ти метров.
На следующем видеоролике показан процесс измерения расстояния с применением УЗ модуля HC-SR04:
rick-braun
1 Фев 2016А от стекла отражается?
admin
1 Фев 2016да отражается
rick-braun
7 Фев 2016Отлично)). Скажите пожалуйста, а какова получилась скорость работы? Если резко дернуть вперед, значение сразу изменится? Или, если бежать стометровку на него…?
admin
7 Фев 2016в коде приведенном в статье, измерения проводятся каждые 0,26 сек + время на измерение расстояния (максимум 0,065 сек), таким образом в секунду производится 3 измерения, что достаточно быстро, но можно сделать и быстрее
rick-braun
7 Фев 2016А каким образом можно это сделать?
admin
7 Фев 2016уменьшить значение числа в регистре shet, в статье про это сказано.
rick-braun
7 Фев 2016Да просто я на c++ пишу… не оч понимаю
Юрий
14 Сен 2016Здраствуйте. Извините, а в чем смысл команды: movf PORTB,W ;чтение регистра PORTB для устранения несоответствия
admin
14 Сен 2016Это нужно для последующего сброса флага прерывания (RBIF) по изменению уровня на линиях RB4-RB7, если этого не сделать флаг прерывания не получится сбросить.
Юрий
3 Ноя 2016Великолепная работа! А если в воде? Откорректировать вычисления по скорости распространения… и загерметизировать датчик.
admin
3 Ноя 2016Сомневаюсь что это возможно, мне кажется звук будет отражаться от герметизационного материала, да и мощность излучения нужно увеличивать, так как сопротивление среды (вода) больше и сигнал будет быстро затухать.
jorj-2007
13 Апр 2017Ну что ж…. У меня все получилось. Купил такой модуль.
https://ru.aliexpress.com/item/Integrated-Ultrasonic-Module-Distance-Measuring-Sensor-Module-Reversing-Radar-Waterproof/32312190912.html?spm=2114.03010208.3.2.3i6tcw&ws_ab_test=searchweb0_0,searchweb201602_1_10152_10065_10151_10068_10136_10137_10060_10138_10062_10156_10153_10141_10056_10055_10054_10059_10099_10103_10102_10096_10148_120_10147_10052_10053_10142_10107_10050_10143_10051_10084_10117_10083_10080_10082_10081_10110_10111_10112_10113_10114_10037_10033_10032_10078_10079_10077_10073_10070_10123_10127_10124_10125-10050_10111_10033_10037_10077,searchweb201603_9,afswitch_1,ppcSwitch_5&btsid=49230e18-ff02-4c4a-b97c-b4f4a76e0501&algo_expid=42554b4e-282a-4341-bb37-ee951eecec44-0&algo_pvid=42554b4e-282a-4341-bb37-ee951eecec44
Arduino+NRF+этот датчик. На пульте Arduino+дисплей. Все. Эхолот готов. Проверял на 13 метров – простреливает на “УРА”. Больше глубины не нашел в наших краях. Думаю и на 20-30 стрелять будет.
admin
13 Апр 2017Отлично) а визуализация имеется, в виде косяка рыб?
Юрий
3 Ноя 2016Я купил на Али вот такой эхолот:
https://ru.aliexpress.com/item/Russian-Menu-Language-LUCKY-Wireless-Sonar-Sensor-River-Lake-Sea-Bed-Live-Update-Contour-131ft-40M/1786095806.html?spm=2114.03020208.3.64.ByYCnH&ws_ab_test=searchweb0_0,searchweb201602_2_10093_10091_10090_10088_10089,searchweb201603_1&btsid=82d0ea03-9ae9-4b5b-8804-3514669d173d
Он быстро перестал работать т. к. при забрасывании, от удара об воду, пропал контакт в плохой пайке. Мне пришлось вскрыть датчик. Там излучатель (пьезоэлемент) тупо залит эпоксидной смолой. То есть излучатель лежит на дне “кораблика” и налита “лужица” эпоксидки. Может быть в данном случае весь корпус “кораблика” является излучателем-приемником. Если дадите E-mail – пришлю фото внутренностей. И еще…. Думаю, что как раз в воде сигнал будет распространяться лучше. Мой эхолот в воздухе не показывает “глубину” вообще.
Подумайте! Может это Ваша золотая жила? 🙂
андрей
7 Фев 2017подключил по схеме на пустое пространство скачет 25-30 а начинает нормально работать с 20 см и меньше может что в программе кто с таким сталкивался
admin
7 Фев 2017Попробуйте другой датчик подключить, возможно ваш экземпляр выдает некорректные данные.
Иннокентий
13 Апр 2017А возможно сделать прерывания по int? Пытался переделать- не получилось
admin
13 Апр 2017Да это возможно.
Иннокентий
14 Апр 2017А не подскажите, где надо внести изменения? Можете не писать сам код, интересует только что именно надо изменить. Периодически менял option_reg,intedg но все равно выводит —
admin
14 Апр 2017Я скорректировал прошивку, но не проверял, попробуйте Прошивка_прерывание по входу INT
Иннокентий
14 Апр 2017Всё работает. Спасибо огромное! Вы меня очень выручили. Я понял, где ошибся
admin
15 Апр 2017Отлично!
vspishkin
25 Июл 2017очень полезная разработка . Хотел установить данное устройство как уровнемер в летнем душе, по заполнению до определенного значения чтобы реле отключало насос подачи воды, ну и для разных емкостей нужно делать калибровку нуля .Может ли автор внести эти изменения в прошивку?
admin
25 Июл 2017Здравствуйте, то есть вам надо добавить кнопку для калибровки нижнего и верхнего уровня воды, и выход на реле для насоса?
Валерий
13 Окт 2017Поддерживаю доработку сия очень полезного девайса. В частности пусть это будет прописано в ячейке памяти, чтоб можно было менять при прошивке, расстояние при котором на одном свободном порту МК появлялась логическая единица. Т.е. при уменьшении расстояния до заданной величины осуществлялось управление нагрузкой.
маша
14 Окт 2018Ультразвуковой дальномер
Исходные данные к работе
• Напряжение питания – 9В.
• Модуль измерения расстояния HC-SR04.
• Результаты измерения отображать на семисегментных индикаторах
• Диапазон измеряемых расстояний – от 2 до 400 см
• Точность отображения – округление результата измерения до целого, в см
• Предусмотреть кнопку сброса.
• При проектировании принципиальной схемы предусмотреть разъем для программирования микроконтроллера.
• Режим измерения – непрерывный.
4 Содержание пояснительной записки
Введение
Выбор и обоснование структурной схемы
Разработка принципиальной схемы
Алгоритм программы
Код программы
Экспериментальные результаты
Заключение
кто сможет помочь?