Как поймать сигнал RF передатчика?
- Войдите на сайт для отправки комментариев
Всем доброго дня!
Контекст такой - есть две Ардуино, которые требуется соединить "в одну сторону" с помощью приемника и передатчика на 433МГц.
Не знаю насколько это принципиально, но использую библиотеки VirtualWire и передаю свою структуру данных длиной 6 байт на скорости 4000 б/с.
Если я в loop() без каких либо перерывов на стороне передатчика отправляю данные, а в loop() на стороне приемника их принимаю (тоже без других подпроцессов) - все хорошо, данные передаются (видимо в какие-то моменты циклы приема передачи совпадают).
Но если я нагружаю приемник и прередатчик какой-то логикой, когда между передачей появляются нерегуляргые задержки, а между сеансами приема - другие нерегулярные задержки, циклы практически не совпадают и пакеты не ловятся. Если хотя бы на одной стороне задержки убрать - ловиться нормально. Значит причина в несинхронности сеансов.
Возможно ли на принимающей стороне повесить сигнал приемника на прерывание (свободный пин с прерыванием есть)? Какую библиотеку для работы с приемником использовать (VirtualWire подойдет)?
без вашего скетча сложно что либо советовать, а в общем случае рекомендуется писать без задержек.
Я пишу без задержек, без delay(), если речь про него.
Вся логика висит на программных таймерах. Любая процедура имеет конечное, но ненулевое время и возврат в loop() происходит спустя некоторое заранее неопределенное время (несколько милисекунд), за это время пакет передачи успевает пройти мимо.
Я выложу конечно код за вычетом бизнес-логики, но чем это поможет? Примеры VirtualWire есть.
Наверно надо было в аппартатную ветку писать с вопросами: Есть ли у RF приемников буфер и какой глубины? Может ли сигнал с RF приемника поднимать прерывание?
KoKaiN . вы видимо что-то курите :) В любой нормальной библиотеке для работы RF433 пин приемника висит на прерывании... например в RFSwitch - и ничего не теряется.
Библиотека VirtualWire не сложная, в принципе переписать ее на прерывания (если их там нет - в чем сомневаюсь) - не должно быть проблемой
Я нюхаю а не курю, это же очевидно...
Код приемника следующий, достаточно простой.
Прием идет нормально, когда прием и передача идут в бесконечных циклах без задержек.
От того что я подключаю приемник к пину с прерыванием само прерывание не появиться. Вызов функции обработки приема внутри цикла, как это описывается в примерах на VW - еще не есть прерывание.
да, глянул библиотеки - в явном виде прерывания там не видно, сл-но все не так просто.
Может кто более опытный подскажет.
Не срастется с VW - буду RFSwitch использовать.
Только мне все равно кажется, что надо обработчик приема вешать на прерывание через attachInterrupt(1, recMyData, CHANGE); ???
А на порту сериала зачем такая маленькая скорость?
Не знаю ))
Можно повысить конечно, но взаимодействие с сериалом идет только при успешном приеме пакета, поэтому я считал что это не критично. Проверю
Не знаю ))
Можно повысить конечно, но взаимодействие с сериалом идет только при успешном приеме пакета, поэтому я считал что это не критично. Проверю
Может и не критично, но в работающих устройствах для этой частоты скорость на порту принята 57600