Я давно думал о подключении радиомодулей к микроконтроллеру для осуществления беспроводной передачи данных, и однажды просматривая сеть, наткнулся на дешевые радио-модули под платформу Arduino. Это простые радиомодули, передатчик (модель FS1000A) собран на двух транзисторах, модуляция сигнала амплитудная, несущая частота равна 433 Мгц, стабилизирована ПАВ резонатором. Плата передатчика имеет три вывода: Vcc, Gnd для питания (3,5-12В), вывод data является входом для модуляции данных, высокий логический уровень на этом выводе включает передатчик.
Приемник (модель XY-MK-5V) представляет собой сверхгенератор, на выходе которого стоит компаратор, приемники такого типа являются очень простыми из-за малого количества деталей, обладают высокой чувствительностью и автоматической регулировкой усиления, однако есть и недостатки, из-за высокой чувствительности и широкой полосы пропускания, он ловит много помех, на выходе всегда присутствует шум. Плата приемника имеет четыре вывода: Vcc, Gnd – питание 5В, и выход в виде двух совмещенных выводов (data). Комплект модулей можно приобрести здесь.
С виду кажется, что осуществить беспроводную передачу данных просто, подавать импульсы на передатчик и ловить их с приемника, но не все так гладко. Если подключить к выходу приемника светодиод (через резистор), то он будет светиться средней яркостью, при этом хаотически наблюдаются яркие вспышки и полное гашение светодиода, то есть на выходе приемника присутствует шум, о чем было сказано выше. При включении передатчика светодиод кратковременно вспыхивает, после чего светиться средней яркостью, отключение передатчика вызывает кратковременное гашение светодиода с последующим восстановлением средней яркости.
Получается, что приемник не может принимать длинные импульсы, это указывает на наличие определенной минимальной скорости передачи данных. Если передавать байт с числом 255 (все биты равны 1) или число 0 (все биты равны 0), то передача может сорваться. То есть для нормальной работы приемника необходимо постоянно менять логические уровни. Для устранения этой проблемы советуют использовать манчестерский код, где логической единице соответствует переход от низкого к высокому логическому уровню, логический ноль – переход от высокого к низкому уровню. При этом данный код увеличивает количество передаваемой информации в два раза, я не стал его применять, воспользовавшись другим алгоритмом, о котором будет сказано ниже.
Для передатчика написать программу несложно, нужно лишь через определенные промежутки времени менять логический уровень в соответствии с передаваемыми данными. На стороне приемника все сложнее, поначалу я пробовал непрерывно опрашивать выход приемника через равные промежутки времени, после 8-ми опросов сравнивал принятый байт с отправленным, если было совпадение то включал светодиод, при очередном совпадении выключал его. При таком алгоритме происходило много ложных срабатываний, двухбайтная передача не изменила ситуацию. Таким образом сделать все по-простому не вышло.
После раздумий мне пришла идея кодировать биты длительностью логических сигналов. Биты передаются комбинацией низкого и высокого логического уровня различной длительности, для нуля продолжительность сигналов составляет 500 и 250 мкс, для единицы наоборот 250 и 500 мкс. Таким образом, отпадает надобность в манчестерском коде, хотя в этом случае количество передаваемой информации также увеличивается. С выхода приемника микроконтроллер измеряет время между изменениями уровня сигнала, при правильных характеристиках сигнала выделяется лог.1 или лог.0, допустимое отклонение длительности сигнала установлено на уровне ±100 мкс (250±100 мкс , 500±100 мкс). При таком алгоритме контролируется правильность каждого бита информации, также устраняется проблема ложного срабатывания.
Этот алгоритм работал, но приемник не всегда получал команды, иногда они терялись. Почитав статьи по данной тематике, я разобрался в причине неуверенного приема, перед отправкой данных необходимо передать преамбулу в виде последовательности нулей и единиц, в результате чего приемник лучше подстраивается под несущую частоту передатчика и в дальнейшем ведет уверенный прием. Кроме этого, преамбула дает возможность синхронизироваться, то есть определить начало передачи информационных данных. Теперь перед посылкой команды я отправляю последовательность нулей и единиц длиной в 16 бит (2 байта), длительность логических уровней для каждого бита составляет 500 мкс, в результате чего приемник начал стабильно принимать команды.
Приемник собран на микроконтроллере PIC16F628A (схема представлена ниже), выход (data) радио-модуля подключен к линии ввода-вывода RB4, прием ведется на прерываниях, в микроконтроллере включены прерывания по изменению уровня на входах RB4-RB7. Причем линии RB5-RB7 настроены на выход, чтобы не вызывать ложных прерываний, так как в данном микроконтроллере нельзя разрешать прерывания по отдельности на каждую линию. Микроконтроллер работает от внутреннего тактового генератора в 4 Мгц. Ниже представлен код программы:
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 |
#include <P16F628A.INC> LIST p=16F628A __CONFIG H'3F18' ;внутренний тактовый генератор 4Мгц flag equ 20h ;дополнительный регистр флагов vremya equ 21h ;регистр хранения фактического времени kolbyte equ 22h ;регистр кол-ва принятых байт reg equ 23h ;регистр приема данных от приемника shets equ 24h ;регистр кол-ва принятых бит FSR_osn equ 25h ;регистры для временного хранения значений FSR_prer equ 26h ;во время прерываний W_TEMP equ 7Eh ; STATUS_TEMP equ 7Fh ; data1 equ 60h ;первый регистр хранения принятых команд #DEFINE dat PORTB,4 ;присвоение названий линиям ввода-вывода #DEFINE led PORTB,0 ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; org 0000h ;начать выполнение программы с адреса 0000h goto Start ;переход на метку Start ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Подпрограмма обработки прерываний org 0004h ;начать выполнение подпрограммы с адреса 0004h movwf W_TEMP ;сохранение значений ключевых регистров swapf STATUS,W ; clrf STATUS ; movwf STATUS_TEMP ; movf TMR0,W ;сохранение значения счетчика TMR0 movwf vremya ;в регистр vremya movlw .0 ;запись числа 0 в счетчик TMR0 movwf TMR0 movf FSR,W ;запись содержимого регистра FSR в movwf FSR_osn ;регистр FSR_osn movf FSR_prer,W ;запись содержимого регистра FSR_prer в movwf FSR ;регистр FSR btfsc INTCON,T0IF ;опрос флага прерывания по переполнению TMR0 goto outshet ;переполнение TMR0:переход в подпрограмму outshet btfss dat ;нет переполнения TMR0:сохранение состояния линии bcf flag,0 ;dat в 0-й бит регистра flag1 btfsc dat bsf flag,0 movlw .37 ;проверка длительности между subwf vremya,W ;прерываниями:больше-меньше 150мкс btfss STATUS,C ; goto eror ;длительность меньше 150мкс:переход на метку eror movlw .87 ;длительность больше 150мкс:проверка длительности: subwf vremya,W ;больше-меньше 350мкс btfsc STATUS,C ; goto int1 ;длительность больше 350мкс:переход на метку int1 bcf flag,1 ;длительность меньше 350мкс:сброс 1-го бита регистра flag: ;приравниваем длительность к 250мкс goto opred ;переход на метку opred int1 movlw .100 ;проверка длительности: больше-меньше 400мкс subwf vremya,W ; btfss STATUS,C ; goto eror ;длительность меньше 400мкс:переход на метку eror movlw .150 ;длительность больше 400мкс:проверка длительности: subwf vremya,W ;больше-меньше 600мкс btfsc STATUS,C ; goto eror ;длительность больше 600мкс:переход на метку eror bsf flag,1 ;длительность меньше 600мкс:устанавливаем 1-й бит регистра ;flag:приравниваем длительность к 500мкс opred btfss flag,0 ;опрос ранее сохраненного состояния линии dat goto int2 ;низкий уровень линии dat:переход на метку int2 btfsc flag,1 ;высокий уровень линии dat(произведено измерение длительности- ;-сигнала низкого уровня):проверка длительности импульса bsf flag,2 ;устанавливаем 2-й бит регистра flag:зафиксирован низкий btfss flag,1 ;уровень сигнала длительностью 500мкс bcf flag,2 ;сбрасываем 2-й бит регистра flag:зафиксирован низкий ;уровень сигнала длительностью 250мкс bsf flag,7 ;устанавливаем 7-й бит регистра flag:зафиксирован ;низкий уровень сигнала с правильной длительностью- ;-разрешаем прием сигнала высокого уровня goto vihod ;переход на метку vihod int2 btfss flag,7 ;низкий уровень линии dat:(произведено измерение длительности- ;-сигнала высокого уровня):проверка разрешение приема сигнала ;высокого уровня goto vihod ;нет разрешение приема сигнала высокого уровня:переход на ;метку vihod btfsc flag,2 ;есть разрешение приема сигнала высокого уровня:проверка- ;-длительности предыдущего сигнала низкого уровня goto int3 ;низкий уровень сигнала равен 500мкс:переход на метку int3 btfss flag,1 ;низкий уровень сигнала равен 250мкс:проверка длительности ;сигнала высокого уровня goto eror ;высокий уровень равен 250мкс(предыдущий низкий равен 250мкс)- ;-неверная последовательность:переход на метку eror bsf flag,3 ;высокий уровень равен 500мкс(предыдущий низкий 250мкс)- ;-принят бит единица (лог.1) goto intpriem ;переход на метку intpriem int3 btfsc flag,1 ;низкий уровень сигнала равен 500мкс:проверка длительности ;сигнала высокого уровня goto eror ;высокий уровень равен 500мкс(предыдущий низкий равен 500мкс)- ;-неверная последовательность:переход на метку eror bcf flag,3 ;высокий уровень равен 250мкс(предыдущий низкий 500мкс)- ;-принят бит ноль (лог.0) intpriem btfsc flag,3 ;опрос значения принятого бита и запись в 0-й бит- bsf reg,0 ;-регистра reg btfss flag,3 ; bcf reg,0 ; incf shets,F ;инкремент счетчика (shets) принятых битов movlw .8 ;проверка счетчика (shets) принятых битов на совпадение xorwf shets,W ;с числом 8 btfsc STATUS,Z ; goto srav ;есть совпадение,приняты 8 бит(1 байт):переход на метку srav rlf reg,F ;нет совпадения:смещение регистра reg на один бит влево ;для приема следующего бита goto vihod ;переход на метку vihod srav movf reg,W ;сохранение значения принятого байта- movwf INDF ;-в регистры хранения incf FSR,F ;инкремент регистра FSR:подготовка следующего регистра ;хранения clrf shets ;очистка счетчика бит incf kolbyte,F ;инкремент счетчика кол-ва принятых байт movlw .2 ;проверка счетчика (shets) принятых битов на совпадение xorwf kolbyte,W ;с числом 2 btfss STATUS,Z ; goto vihod ;нет совпадения:переход на метку vihod bsf flag,4 ;есть совпадение,приняты 2 байта:установка флага получения- ;-команды! goto eror ;переход на метку eror outshet bcf INTCON,T0IF ;сброс флага прерывания по переплнению TMR0 eror clrf shets ;очистка счетчика бит clrf kolbyte ;очистка счетчика байт bcf flag,7 ;сброс флага разрешения приема высокой лог. уровня movlw data1 ;запись адреса первого регистра хранения принятых movwf FSR ;команд в регистр FSR vihod movf PORTB,W ;чтение регистра PORTB для устранения несоответствия bcf INTCON,RBIF ;сброс флага прерывания по изменению уровня сигнала ;на выводах RB4-RB7 kon1 movf FSR,W ;запись содержимого регистра FSR в movwf FSR_prer ;регистр FSR_prer movf FSR_osn,W ;запись содержимого регистра FSR_osn в movwf FSR ;регистр FSR swapf STATUS_TEMP,W ;восстановление содержимого ключевых регистров movwf STATUS ; swapf W_TEMP,F ; swapf W_TEMP,W ; ; retfie ;выход из подпрограммы обработки прерывания ;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;;; ;Основная программа Start clrf PORTB ;очистка выходных защелок портов A и B clrf PORTA ; movlw b'00000111' ;выключение компараторов movwf CMCON bsf STATUS,RP0 ;выбрать 1-й банк movlw b'00011110' ;настройка линий ввода\вывода порта B movwf TRISB ;RB0,RB5-RB7 на выход,остальные на вход movlw b'10000001' ;коэффициент предделителя TMR0 1:4, внутрен. movwf OPTION_REG ;тактовый сигнал bcf STATUS,RP0 bcf flag,5 ;сброс флага состояния светодиода led bcf flag,7 ;сброс флага разрешения приема высокой лог.уровня bcf flag,4 ;сброс флага приема пакета данных clrf shets ;очистка счетчика бит clrf kolbyte ;очистка счетчика байт movlw data1 ;запись адреса первого регистра хранения команд movwf FSR_prer ;в регистр FSR_prer bcf INTCON,T0IF ;сброс флага прерывания по переполнению TMR0 movlw .0 ;запись 0 в TMR0 movwf TMR0 ; bsf INTCON,T0IE ;разрешение прерываний по переполнению TMR0 movf PORTB,W ;чтение регистра PORTB для устранения несоответствия bcf INTCON,RBIF ;сброс флага прерывания по изменению уровня сигнала RB4:RB7 bsf INTCON,RBIE ;разрешение прерываний по изменению уровня сигнала RB4:RB7 bsf INTCON,GIE ;глобальное разрешение прерываний opros btfss flag,4 ;опрос флага получения команды goto opros ;команда не получена:переход на метку opros bcf flag,4 ;команда получена:сброс флага полуения команды movlw data1 ;проверка первого и второго байта команды на соответствие movwf FSR ;с командой, отправленной с передатчика movf INDF,W xorlw .196 btfss STATUS,Z goto opros ;первый байт команды неверный:переход на метку opros incf FSR,F movf INDF,W xorlw .46 btfss STATUS,Z goto opros ;второй байт команда неверный:переход на метку opros int4 btfsc flag,5 ;поочередное включение и выключение светодиода led- goto pro21 ;-при получении правильной команды bsf led bsf flag,5 goto opros pro21 bcf led bcf flag,5 goto opros end ;конец всей программы |
Между прерываниями запускается таймер TMR0 , в подпрограмме обработки прерываний проверяется его значение, и если оно соответствует установленным значениям с учетом допустимых отклонений (250±100 мкс , 500±100 мкс), то далее определяется уровень сигнала. Если зафиксирован низкий уровень сигнала, дается разрешение для приема сигнала с высоким логическим уровнем в следующем прерывании. После фиксации высокого логического уровня с правильной длительностью, происходит определение полученного бита (0 или 1). Таким образом, прием бита происходит в два прерывания. При правильной идентификации бита начинается отсчет количества полученных бит, то есть происходит синхронизация. В моем варианте команда состоит из 2-ух байт со значениями 196 и 46, которые хранятся и считываются при помощи косвенной адресации. После приема 16-го бита, в подпрограмме обработки прерываний устанавливается флаг получения команды, который опрашивается в основной программе. После получения команды она проверяется, при совпадении происходит включение или выключение светодиода (HL1 на схеме) в зависимости от его предыдущего состояния. Если во время приема будет зафиксирован сигнал с неправильной длительностью либо бит не прошедший идентификацию, то прием начнется заново, сбросятся регистры отсчета количества полученных байт и бит, также сбросится бит разрешения приема высокого логического уровня. Для большей стабильности приема лучше установить внешний кварцевый резонатор для микроконтроллера, так как частота внутреннего генератора меняется в зависимости от напряжения питания и температуры, что может привести к неуверенному приему. Кроме этого была выявлена зависимость стабильного приема от емкости сглаживающего конденсатора C2, малая емкость может привести к неуверенному приему, желательно устанавливать конденсатор емкостью не менее 100 мкФ.
Передатчик собран на микроконтроллере PIC12F675, конструкция питается от батарейки “Крона” напряжением 9В, от величины напряжения зависит мощность передаваемого сигнала и соответственно дальнодействие, для питания микроконтроллера установлен стабилизатор напряжения 78L05. Микроконтроллер работает на частоте 4 Мгц от внешнего кварцевого резонатора. Код программы представлен ниже:
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 |
#include <p12f675.inc> LIST p=12F675 ; Установка типа микроконтроллера. __CONFIG 03F81H ;внешний кварцевый генератор 4Мгц Sec equ 20h Sec0 equ 21h Sec1 equ 22h var equ 23h kod equ 24h shetbit equ 25h #define knp1 GPIO,1 ;присвоение названий линиям ввода-вывода #define dat GPIO,2 org 0 ; Начать выполнение программы с адреса 0 PC. goto Start ; Переход в ПП Start. Start movlw b'00000111' ;выключение компараторов movwf CMCON ; movlw b'00000000' ;запись нулей в выходные защелки порта GPIO movwf GPIO ; bsf STATUS,RP0 ;выбрать 1-й банк movlw b'00111011' ;настройка линий ввода\вывода порта GPIO movwf TRISIO ;GP2-на выход,остальные на вход bcf ANSEL,ANS1 ;GP1-цифровой вход bsf IOCB,IOCB1 ;разрешение прерываний по изменению уровня ;на входе GP1 bcf STATUS,RP0 ;выбрать 0-й банк son movf GPIO,W ;чтение регистра GPIO для устранения несоответствия bcf INTCON,GPIF ;сброс флага прерывания по изменению уровня сигнала GP0-GP5 bsf INTCON,GPIE ;разрешение прерываний по изменению уровня сигнала GP0-GP5 SLEEP ;переход в спящий режим bcf INTCON,GPIE ;сброс флага прерывания по изменению уровня сигнала GP0-GP5 metka3 btfsc knp1 ;опрос состояния кнопки knp1 goto metka4 ;высокий уровень(кнопка отжата):переход на метку metka4 call nagat ;низки уровень(кнопка нажата):вызов подпрограммы nagat call paus200 ;вызов подпрограммы паузы 200мс goto metka3 ;переход на метку metka3:очередной опрос кнопки knp1 metka4 call pausknp ;вызов подпрограммы паузы 10мс goto son ;переход на метку son nagat call preamb ;вызов подпрограммы передачи преамбулы movlw .196 ;передача числа 196 на передатчик call send ; movlw .46 ;передача числа 46 на передатчик call send ; return ;выход из подпрограммы send movwf kod movlw .8 ;запись числа 8 в регистр shetbit, для отсчета movwf shetbit ;количества отправленных бит opros btfsc kod,7 ;опрос 7-го бита регистра kod goto prdedin ;бит равен 1:переход на метку prdedin prdnol bcf dat ;бит равен 0:передача логического нуля call paus500 bsf dat call paus250 goto metka1 prdedin bcf dat ;передача логической единицы call paus250 bsf dat call paus500 metka1 rlf kod,F ;смещение содержимого регистра kod влево для передачи ;очередного бита decfsz shetbit,F ;декремент счетчика отправленных бит goto opros ;счетчик не равен нулю:переход на метку opros bcf dat ;счетчик равен нулю: сброс вывода dat(установка низкого ;логического уровня на входе передатчика) return ;выход из подпрограммы preamb movlw .8 ;подпрограмма передачи преамбулы в виде- movwf var ;-последовательности нулей и единиц bb1 bcf dat ;(010101...01) 16 бит - 2 байта call paus500 bsf dat call paus500 decfsz var,F goto bb1 return pausknp movlw .13 ;подпрограмма паузы 10мс movwf Sec a2 movlw .255 movwf Sec0 a1 decfsz Sec0,F goto a1 decfsz Sec,F goto a2 return paus250 movlw .83 ;подпрограмма паузы 250мкс movwf Sec0 aa1 decfsz Sec0,F goto aa1 return paus500 movlw .166 ;подпрограмма паузы 500мкс movwf Sec0 aa2 decfsz Sec0,F goto aa2 return paus200 movlw .4 ;подпрограмма паузы 200мс movwf Sec as2 movlw .66 movwf Sec0 as3 movlw .255 movwf Sec1 as1 decfsz Sec1,F goto as1 decfsz Sec0,F goto as3 decfsz Sec,F goto as2 return End ;конец всей программы |
После подачи питания микроконтроллер настраивает внутренние регистры, и засыпает. При нажатии кнопки SB1 происходит прерывание по изменению уровня на линии GP1, в результате чего микроконтроллер просыпается, далее опрашивается состояние кнопки, переход в обработчик прерываний не происходит, так как глобальные прерывания запрещены. Если кнопка находится в нажатом состоянии (низкий логический уровень на линии GP1), вызывается подпрограмма передачи преамбулы, далее идет передача команды в виде двух байт со значениями 196 и 46, после передачи вызывается подпрограмма паузы в 200мс. Если кнопка удерживается нажатой, то выполняется повторная передача команды, соответственно на приемнике светодиод будет поочередно включаться и выключаться. При отжатии кнопки происходит переход в спящий режим. Как видно, в случае передатчика все просто, в целях экономии батареи вместо микросхемы 78L05 следует применить микромощный стабилизатор напряжения на 5В, с малым током покоя.
Скорость передачи данных в моем варианте составляет 1333 бит/сек, один бит передается за 750мкс. Дальность уверенной связи в пределах прямой видимости составила 50-60м, при увеличении расстояния до 100м наблюдался неуверенный прием, думаю для таких простых и дешёвых модулей это нормальный результат. В качестве антенны использовался медный провод диаметром 0,5мм и длиной 17см (четверть от длины волны). На основе кода рассмотренного в статье можно использовать радиомодули в различных конструкциях, например для беспроводного звонка, дистанционное радиоуправление, беспроводной датчик температуры и т.д. На данных модулях я собрал для себя радиоуправляемую поворотную платформу и беспроводной термометр.
После множества экспериментов выяснились следующие особенности радиомодулей:
1. Модуль приемника чувствителен к помехам на линии питания. В одной моей конструкции на линии питания с приемником стоял драйвер светодиодных семисегментных индикаторов MAX7219, при этом приемник не ловил команды или ловил очень редко, стоило отключить драйвер, и приемник начинал получать команды. Вероятно, драйвер создает низкочастотные помехи на линии питания, которые влияют на приемник. Это явление наблюдалось и с другими драйверами для семисегментников, а также при совместной работе с сервоприводами. Установка всяких фильтров не помогало полностью избавиться от помех. Лучшим решением оказалась установка отдельного стабилизатора напряжения для приемника. В любом случае в цепи питания приемника желательно ставить конденсатор емкостью от 100 мкФ.
2. При увеличении напряжения питания модуля передатчика больше 9В, нарушалась радиопередача данных, приемник ничего не ловил. Хотя везде указано, что максимальное напряжение питания передатчика составляет 12В.
3. Я не силен в СВЧ радиотехнике, но читая различную информацию выделил следующие особенности: для лучшей эффективности несимметричной антенны (штыревая антенна) необходим противовес (аналог заземления). В качестве противовеса могут выступать провода подводящие питание, дорожки на печатной плате подключенные к общему проводу, при этом длина и площадь дорожек, должны быть как можно большими. В случае использования двусторонней платы, роль противовеса может выполнять одна из фольгированных сторон. Если устройство является портативным, например брелок, то тело человека также является дополнительным противовесом.
Я провел тестирование другого комплекта подобных модулей с названиями WL101-341 и WL102-341, они показали лучший результат по сравнению с модулями описанными в этой статье, подробнее можно почитать в статье Радиомодули WL101-341 WL102-341 – подключение и тестирование. Кроме этого, я тестировал радиомодули HC-12 с UART интерфейсом, они представляют собой приемопередатчик на основе трансивера Si4463, дальность связи может достигать 1,8 км, более подробно читайте в статье Подключение модулей HC-12.
Обновление: В конце статьи дополнительно прикрепил прошивку и схему двух-режимного приемника на PIC16F628A. В данном приемнике с помощью переключателя можно выбрать два режима:
1 – Поочередное включение и выключение светодиода при поступлении команды с передатчика, то что было описано выше в статье.
2 – Режим повторения, светодиод светится пока нажата кнопка на передатчике.
Прошивка и исходник передатчика (PIC12F675)
Прошивка и исходник приемника (PIC16F628A)
Прошивка приемника на два режима (PIC16F628A)
Прошивка приемника (PIC12F675)
Пожалуйста помогите собрать приёмник на PIC12F675 и прицепить это дело к “Музыкальный звонок на микроконтроллере” . Звонок собрал. всё отлично работает. А вот беспроводную кнопку никак не могу найти приемлемую схему. Если повторить то что здесь получится два PIC16F628A что по моему слишком для этого. К сожалению в программировании чайник, код сам написать не могу (хотя пытаюсь). Есть модули FS1000A, XY-MK-5V. Или если знаете дайте ссылку где это описано. Передатчик отличный а 12 вольтовую батарейку к нему можно прицепить ? Приемник бы к нему такой же.
Я постараюсь в ближайщее время перенести приемник на PIC12F675, передатчик останется таким же.
При 12В скорее всего передатчик не будет работать, из моих опытов стабильно работает до 9В, в схеме моего передатчика для питания микроконтроллера стоит стабилизатор напряжения 78L05, который в свою очередь постоянно потребялет ток несколько миллиампер, что не очень хорошо для батарейки, вместо него лучше собрать микромощный стабилизатор с малым потреблением.
Схемы стабилизаторов в интернете есть. А вот радиокнопок с кодировкой на 1 канал не нашел. Подождем.
Привет, отправил тебе на почту прошивку для PIC12F675
Большое спасибо!
Попытаюсь разобраться в программе благо пример есть.
Я пока временно приспособил вот такой пульт
http://ru.aliexpress.com/item/1set-2pcs-2262-2272-Four-Ways-Wireless-Remote-Control-Kit-M4-the-lock-Receiver-with-4/1752500196.html?http_swift_null= . Выход подключил через транзисторный ключ вроде всё работает.
Подскажи пожалуйста в PIC16F628A есть энергонезависимая память ? Просто хочу переделать твою программу , убрать режим плеера оставить только две копки (одна звонок, другая выбор мелодии). Файлы назвать 01.wav 02wav, и так далее (больше 10-20 и ненужно) и нужно что бы при нажатии 2-й кнопки происходила смена мелодии с запоминанием . Можно так сделать или нужно на карту памяти выбор сохранять?
Добрый день, выложите, пожалуйста прошивку для приемника на. Pic12f675.
Здравствуйте, прошивку выложил в конце статьи.
Благодарю Вас!!! Что с модулями на 2,4 ГГц NRF24L01? Есть два таких модуля а простейшего применения на pic16f628 не могу найти.
Про модули NRF24L01 ничего сказать не могу, я пока не изучал их.
Все отлично работает!! Респект! А можно прошивку и схему двух-режимного приемника на PIC12F675? Пожалуйста!
Зачем изобретать велосипед-есть формат keeloq -апноты на него есть и исходники согласно им и надо было кодер и декодер.Если рядом будет сигналка с форматом пакета starline-возможно ложные срабатывания ибо у них единица и ноль тоже 500 мкс и 250 мкс
я не слышал ранее о keeloq, у меня единица и ноль это последовательность 0 и 1, а не просто 0 или 1, ложное срабатывание маловероятно, должен совпасть еще сам код, кроме того временные интервалы я могу поменять.
Можно ли уменьшить преамбулу до 3 бит, ухудшиться ли качество приёма?
Ничего не могу сказать на счет 3-х байт, надо экспериментировать, я пробовал 8 бит (1 байт) нормально работало.
Зачетная штучка.Легко повторить. .asm без заморочек.
Прекрасная основа для написания собственного софта.
Я сделал пять пятикомандных трансиверов на этих модулях.
Оказалось очень полезным покрутить сердечник на контуре приемника.
Настроены они плохо.У меня некоторые и на полметра не работали.
После настройки брал по всей квартире. Это метров 15. При 4.5 вольтах питания передатчик-приемник.
Я с таким пока не сталкивался, может это единичный случай и вам достались плохо настроенные модули.
Здравствуйте! Для изменения длины передаваемой преамбулы в программе передачи надо строчку 76
preamb movlw .8
заменить на
preamb movlw .4
а где надо сделать изменения в программе приемника для приема преамбулы длиной 8бит.
Спасибо!
В программе приемника ничего менять не надо, при изменении длины преамбулы в передатчике, в приемнике не ведется прием преамбулы, там сразу идет определение бита.
Здравствуйте.
Подскажите пожалуйста как сделать так, чтобы светодиод в приемнике светился только при нажатии кнопки.
Есть нажатие – горит светодиод, нет нажатия – не горит, а не переключался при каждом нажатии на кнопку.
Спасибо!
Здравствуйте, для этого надо доработать прошивку приемника, я постараюсь в ближайшее время выложить новую версию, с поддержкой обоих вариантов.
Выложил новую версию приемника в конце статьи.
Большое спасибо за новую версию приемника, работающего в двух режимах.
Можно ли коммутировать не GP1, сделать его постоянно замкнутым, а коммутировать непосредственно батарейку, долго ли будет “загружаться” PIC и радиомодуль, чтобы подать в эфир сигнал? Или только последовательно, сначала питание, потом GP1 на землю? Одно-командный пульт мог бы не потреблять энергию в режиме простоя. По идее нужно было бы переделать прошивку.
Можно и так сделать, коммутировать по питанию, прошивку можно и не переделывать, а замкнуть GP1 на общий провод. Вообще для уменьшения потребления вместо обычно стабилизатора напряжения 7805 можно поставить микромощный MCP1702 (на 5В) с собственным током потребления 1 мкА, микроконтроллер в спящем режиме потребляет менее 1 мкА, в итоге потребление составит 1-1,5 мкА.
Я применял такой микромощный стаблизатор в следующих конструкциях: https://radiolaba.ru/microcotrollers/povorotnaya-platforma-s-distantsionnyim-upravleniem.html и https://radiolaba.ru/microcotrollers/termometr-s-besprovodnyim-datchikom.html
Не получается коммутировать подавая питание, при GP1 притянутом на GND.
Приветствую, в комментарии выше я ошибся, прошивку все таки надо переделать, попробуйте вот эту Передатчик включение по питанию
Хорошо, попробуем
Работает! Коммутировать питанием правильно т.к. 99% времени бездействует
Отлично!
В изначальной прошивке микроконтроллер уходил в спящий режим, основное потребление в схеме идет только от стабилизатора напряжения 78L05, собственный ток потребления которого несколько миллиампер, МК в спящем режиме потребляет несколько микроампер.
Наиболее правильное решение это не коммутировать по питанию, а установить микромощный стабилизатор, о чем я писал выше в комментариях
Да, согласен, например НТ серия стабилизаторов “нюхающих” электричество.
Добавьте еще один канал, пожалуйста, памяти в 629/675 пике куча и порты свободные есть. У вас ассемблером все в порядке.
Добрый день, не много не разберусь с кодом передатчика, метка preamb:
1) в описании к коду вы говорите, что передается 0101… , хотя я по коду вижу меандр с периодом 1 мс, да и по графику видно, что он не соответствует ни 0 ни 1;
2) в описании к коду вы говорите, что передается 16 бит, хотя я по коду вижу 8 бит передачи (preamb movlw .8);
Спасибо.
Биты преамбулы и информационные биты по форме не совпадают, преамбула как таковая представляет собой меандр, как вы и заметили, там не обязательно иметь форму сигнала как у информационных битов, а 16 бит это я условно посчитал каждый логический уровень (лог.0 и лог.1).
добрый день, как реализовать на pic16f628a + nrf24l01 передатчик на 6 кнопок и приемник на 6 диодов? в программировании я полный ноль((((((
Здравствуйте, я приемопередатчики nrf24l01 не изучал, так что не могу пока по ним подсказать, если с программированием у вас плохо, то лучше поискать готовые проекты.
на данном мк все проекты без использования кнопок, у меня есть 2 pic и 2 nrf, по сути так же связь что и у вас, только мне нужна передача сигнала с пинов одного мк на теже пины другого
Подскажите пожалуйста как изменять интервал 20мс на выходе 6 в PIC12F675
вот ссылка на код который Вы присылали.
В подпрограмме паузы надо изменить значение числа 26 которое загружается в регистр Sec, числу 1 соответствует пауза 0,765 мс, например для числа 50 пауза составит 50*0,765=38,25 мс.
movlw .26 ;подпрограмма паузы 20мс
movwf Sec
a2 movlw .255
movwf Sec0
a1 decfsz Sec0,F
goto a1
decfsz Sec,F
goto a2
Добрый день! Спасибо за конструкцию и программную реализацию, хорошее решение, не могли бы добавить второй канал, спасибо еще раз!
подскажите пожалуйста ,а где схема приемника на 12f675.
хочу добавить при питании модуля передатчика 12в прием увеличился до 300м,
у передачика и приемника припаяна антенна провод 17см
Прошивка приемника приведена в конце статьи, там в архиве и схема. Что-то с трудом верится в дальность 300 м.
здравствуйте , не буду точно утверждать что это было 300м . проведу испытание опишу условия. если можно вас спросить ,ищу возможность сделать радиоканал с обратной связью,
на pic встречал конструкции на mrf49xa нужно решить такую задачу для включения насоса на участке . повторил несколько устройств на pic , не программист но очень затягивает.
Приветствую, для радиоканала с обратной связью лучше использовать радиомодули HC-12, это получается трансивер, приемник и передатчик в одном модуле, позиционируется как беспроводной удлинитель интерфейса UART, максимальная дальность для них приводится в 1 км, один модуль стоит в среднем 200 руб в Китае. Сам приобрел такие модули уже давненько, но протестировать никак времени не могу найти.
приветствую, подскажите будет работать передатчик при замкнутй кнопке, включать передатчик подачей питания.
Здравствуйте, я сам не проверял такой способ, но думаю что работать будет, если вы хотите таким образом сэкономить заряд батареи, то лучше рекомендую поставить микромощный стабилизатор напряжения MCP1702, собственный ток потребления которого составляет 2 мкА.
хочу дабавить слова благодарности за публикацию подобных устройств, появляется много возможностей автоматизировать ситемы охраны и управления нагрузками.
не могу найти конструкцию с обратной свяью может быть у вас есть что на примете.
Спасибо! В ближайшее время я опубликую статью о радиомодулях HC-12, которые построены на трансивере (приемопередатчике), там будет обратная связь.
Любопытно,но лучше бы NRF24L01 занялись.
Шесть независимых каналов прием/передача да еще 125 каналов по частоте.
Правда частота 2,4Ггц.На все стенки натыкаться будет.
Я как-то хотел изучить радиомодули NRF24L01, но посмотрев документацию, понял что на полное изучение уйдет много времени, очень объемная документация. Да и малый радиус действия модулей убавил интерес к ним, может как нибудь и рассмотрю их…
Оно сначала страшно-потом привыкаешь.
С внешней антенной пишут до 1000 метров.
Вполне…
Александр, вы собирали чего-нибудь на HRF24L01 ? У меня валяются два модуля, хотел управление устройствами на PIC простейшем подключить. Посмотрел проекты людей, такой сложняк, мне просто надо бы несколько каналов туда и обратно управление организовать. не подскажите что-нибудь без дисплеев и проч.
Мучаю сейчас их.Наскоками.Нет времени.Результата нет.
Но осваиваются потихоньку.
Вот хорошо изложено.Но для AtMega8.
Перевожу с Си на ассемблер для PIC.
ссылка
Так отож, найти бы где может на планете кто-нить на Си и для PIC написал код для готового устройства, вот как уважаемый Руслан, автор устройства управления поворотной платформой, несколько каналов использовать. Модули и приемник и передатчик в одном, возможностей куча.
Будем ждать статьи о применении HC-12,
Руслан, приветствую!
Скажите, а на PIC12F675 приемник может работать в двух режимах или нет?
Привет, в приемнике на PIC12F675 заложен только один режим, переключающийся при каждом нажатии кнопки на передатчике.
Добрый день, ищу приемник практически такого-же протокола как у вас только наоборот. Для 1 вкл 550мкс и выкл на 200мкс , а для 0 надо вкл 200мкс и выкл 550мкс. Даже длинна пакета 750 мкс. Пример передаваемого пакета 0101111101010100010101000 . Не могли бы вы подправить прошивку под мои нужды. Приемник должен управлять 1 реле (одна команда вкл, вторая – выкл). В частности тот пакет что написан выше это “включение реле”.
Здравствуйте! А в каком месте программы исходника изменить код, чтобы не мешали друг другу если испольщуется несколько таких устройств.
В программе приемника поменять значение чисел 196 и 46 на любые другие, либо поменять только одно значение:
movlw data1 ;проверка первого и второго байта команды на соответствие
movwf FSR ;с командой, отправленной с передатчика
movf INDF,W
xorlw .196
btfss STATUS,Z
goto opros ;первый байт команды неверный:переход на метку opros
incf FSR,F
movf INDF,W
xorlw .46
btfss STATUS,Z
goto opros ;второй байт команда неверный:переход на метку opros
В программе передатчика также поменять эти числа на другие, соответствующие числам в программе приемника:
nagat call preamb ;вызов подпрограммы передачи преамбулы
movlw .196 ;передача числа 196 на передатчик
call send ;
movlw .46 ;передача числа 46 на передатчик
call send ;
return ;выход из подпрограммы
Благодарю Вас!
Здравствуйте, судя по вашему коду все будет работать только не на этих модулях, так как они инвертируют сигнал
Доброго времени суток , кого-нибудь интересует адаптация данной программы для ATtiny 2313 ?