Официальный сайт компании Arduino по адресу arduino.cc
Помогите с обратной связью NRF24L01
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Втр, 27/03/2018 - 15:40
Подскажите товарищи:
Есть один передатчик и 2 приемника, которые должны кидать в обратную связь по одной переменной
Делается это вот такой командой radio.writeAckPayload(pipeNo,&gotByte, sizeof(gotByte));
А вот как ее считать передатчиком я не понимаю. Если использовать radio.isAckPayloadAvailable(), то он не может разобрать с какого примника пришла переменная.
Как быть? Может у кого примеры есть?
А что каждый приёмник не может слать ещё и свой ID?
Наверное может, а как?
Ну, как Вы шлёте любую информацию, так и эту шлите.
Не совсем понятно
Если брать фрагментом кода, то организовано так.
Приемник. Сначала принимает, потом шлет обратную переменную
Передатчик. Цикл приема обратной связи.
Собственно при работе пульта с одним приемником все работает, а второй приемник шлет на эту же трубу, хотя указана другая. Начинается конфликт.
В инете я не смог найти решение обратной связи для двух приемников
Ну, Вы шлите кроме этой переменной ещё и номер приёмника. Объедините их в один пакет и шлите. Тогда передатчик будет знать кто ему это присал
В качестве обратной связи можно послать только переменную, а не массив.
Есть ли фрагмент кода?
Можно и массив, но в данном случае, КМК, будет удобнее использовать структуру, состоящую из идентификатора и данных.
Для ленивых. А уж если в яндексе загуглить...
Я все это понимаю. Речь идет именно о двух приемниках, которые конфлитуют друг с другом даже на разных "трубах"
Кидать пакеты друг другу я умею :)
Кидать пакеты друг другу я умею :)
и что еще нужно? Абстрагируйтесь от понятия "обратная связь " и вместо ответа в обратку тоже "кидайте пакеты" - точно так же, как вы это делаете в прямом направлении.
В чем вообще проблема - не ясно.
Проблема в том, что есть функция передачи пакета по "трубе", но нет функции ее приема. Как принять сигнал с двух передатчиков одновременно?
Как принять сигнал с двух передатчиков одновременно?
Очевидно, что "одновременно" один приемник может принять только один сигнал. Поэтому принимайте последовательно.
А зачем одновременно-то?
Можно:
1. Мастер - в режиме приёма. При получении пакета (структуры) смотрим идентификатор (кто прислал) и используем данные.
2. Мастер поочерёдно опрашивает слэйвов и получает данные, зная от кого они пришли.
В этом и вся проблема. Как заставить его узнавать кто прислал?
В этом и вся проблема. Как заставить его узнавать кто прислал?
послушайте, сколько можно тупить! Вам уже раз шесть сказали, как это делается. Максимальный размер данных NRF24 - 32 байта. Отведите 1-2 байта из них под ID передатчика - и передавайте вместе с данными. ВСЕ.
Прежде чем задавать следующий одинаковый вопрос - попытайтесь вникнуть в уже полученные ответы.
Я бы лучше попытался вникнуть в какой либо пример, но не могу найти примеров именно с дуплексным режимом
Напрягите мозг и соберите пример сами. Вот у вас есть код сообщении #4. "Вперед" вы отправляете массив из трех элементов, а обратно - переменную ask2. Что мешает сделать ask2 массивом, где, к примеру - первый элемент будет номером передатчика, а второй - собственно данными?
Если и после этого обьяснения на пальцах ничего не поймете - я уже и не знаю. Видимо, это не всем дано.
Блин. Я все это понимаю, но
Если оба передатчика передают массив
array[2], то первый передатчик передает в переменной [1] свой идентификатор, а второй передатчик в этой же переменной передает [0]
Блин. Я все это понимаю, но
Если оба передатчика передают массив
array[2], то первый передатчик передает в переменной [1] свой идентификатор, а второй передатчик в этой же переменной передает 0
array[2], то первый передатчик передает в переменной [1] свой идентификатор, а второй передатчик в этой же переменной передает [0]
У вас данные с каждого передатчика нормально передаются? - так что мешает так же ID передавать? Вы длину данных на размер ID увеличили, я надеюсь?
приведите код, как вы отправляете массив.
Фрагмент кода я уже привел. Сам код достаточно длинный, так как есть дисплей и текст к нему.
Если он интересен, то могу скинуть позже, как доберусь до рабочего компа.
Если он интересен, то могу скинуть позже, как доберусь до рабочего компа.
ну мне-то это не нужно - это ж у вас ID при передаче теряется, не у меня.
Блин. Я все это понимаю, но
Если оба передатчика передают массив
array[2], то первый передатчик передает в переменной [1] свой идентификатор, а второй передатчик в этой же переменной передает 0
вот центральный
вот ведомые
А почему автоответ выключен?
он мне не нужен, только эфир засоряет
Megawollt - посмотрел еще раз ваш код из сообшения #4. Что-то вы странно с массивом работаете. Вы не забыли, что в массиве из трех элементов их индексы будут 0, 1 и 2, а не 1,2,3 ?
Может у вас именно поэтому с передачей проблемы. что вы индексы массивов путаете?
Не забыли. Индексы не путаем. Массив обозначен как четырехэлементный. :Р
Я не настолько туп, как вы думете, да и проблем с передачей массива нет. Оба приемника работают и массивы свои получают.
Приемники кидают обратно переменную float, напряжение на аккумуляторах. Так вот доходит только одна
Вот код. Передатчик
Приемник
Коды передатчика и приемника не перепутали? Почему в передатчике две приемных трубы, а в приемнике одна? Разве примник не должне принимать данные от двух передатчиков?
И еще - я так и не увидел, где же вы передаете уникальный ID приемников/передатчиков вместе с данными.
И поясните еще раз на примере кода. что за проблема у вас.
А код - он, конечно, кривоватый. Миллисом вы категорически неправильно пользуетесь. Ну и функцией map() тоже не всегда.
В передатчике 2 применых трубы, так как он принимает обратную связь с двух приемников.
Уникального ID нет, так как разные трубы. ID вряд ли сможет тут чем нибудь помочь.
Проблема в том, что с одного приемника приходит обратная связь, а с другого нет и я понимаю, что ошибка где то в реализации труб или команд
Трубы у приемников естественно разные.
И миллис и мап работают. По другому я не умею. Если поясните, буду признателен
Уникального ID нет, так как разные трубы. ID вряд ли сможет тут чем нибудь помочь.
ID от труб никак не зависит, поэтому шанс, что это поможет - весьма велик. А вот разные трубы, уже очевидно- не работают. Поэтому тут два пути - либо неизвестно сколько искать ошибки в использовании вашего метода, либо просто пойти другим путем и использовать разные ID для разных источников. Но дело ваше...
Я вообще замечаю, что вы не очень-то склонны слушать советы. Непонятно, зачем вы тогда их просите.
И миллис и мап работают. По другому я не умею. Если поясните, буду признателен
Про миллис писано сотни страниц. Если вкратце - если вы складываете время и интервал, то при переполнении миллис это давет ошибку. Если вычитаете интервалы - то все считается правильно даже при переполнении:
currentmillis > previous_millis + interval // НЕВЕРНО
currentmillis - prev_millis > interval // Верно
Я люблю слушать советы, если они подкреплены фрагментами кода и ясны для меня.
Вот про миллис очень доходчиво, спасибо.
То есть, если задавать идентификатор, то от идеи с автоответом нужно отказаться вовсе и использовать start и stoplistening?
Я люблю слушать советы, если они подкреплены фрагментами кода и ясны для меня.
То есть, если задавать идентификатор, то от идеи с автоответом нужно отказаться вовсе и использовать start и stoplistening?
Я пока не знаю, как совместить автответ и идентификаторы. Большинство решений приходит тогда, когда что-то делаешь. Поэтому я бы просто попробовал написать код с идентификаторами - и посмотрел, решит ли это проблему.
Примеры кода вам давал Валера в сообщении #22
Вот я третий день сижу пробую, поэтому и спросил, может уже кто делал подобное. Даже видео осипова смотрел, но он до автоответов не добирался, а если не использовать автоответы, то индикация статуса соединения не будет стабильна
если не использовать автоответы, то индикация статуса соединения не будет стабильна
Честно говоря, с практической точки зрения не вижу никакой разницы между "автответом" и ответом "вручную". Общеизвестно, что функция Авто-Аск у НРФ-ок глючная и поэтому большинство ее отключает. Но дело ваше.
Вот я третий день сижу пробую, поэтому и спросил, может уже кто делал подобное. Даже видео осипова смотрел, но он до автоответов не добирался, а если не использовать автоответы, то индикация статуса соединения не будет стабильна
уже два с лишним года работает у меня этот код, ни разу зависаний не было, там даже три попытки приема данных, вдруг образуется временное препятствие, и видно что датчик умер
Спасибо, понял вас. А можно прямо посреди кода включать старт и стоп прослушивания? Не будет ли оно мешать самому передатчику?
А можно прямо посреди кода включать старт и стоп прослушивания?
не просто можно, а многие руковдства прямо рекомендуют после каждого сенанса связи и в приемнике и в передатчике делать стоп-старт, иначе в приемных и передающих буферах зависает всякий мусор.
Там есть некий буфер памяти? Иначе же прием/передача не будут включаться синхронно
Valera19701 в вашем коде приемники ничего не шлют в обратку, а у меня проблема именно в этом
Valera19701 в вашем коде приемники ничего не шлют в обратку, а у меня проблема именно в этом
а что делают строки с 36 по 46 ?
del
Извините, проглядел. Как команда avaliable различает с какой трубы пришли данные?
У меня сейчас вот так
первой трубой прекрасно работает, а вторую не видит....Почему так может быть?
Как команда avaliable различает с какой трубы пришли данные?
опять трубы...
Вы все-таки не въезжаете в базовый принцип. При использовании ID нет необходимости "различать трубы". Да их и не нужно много - откройте одну трубу для всех данных.. Понимаете, при использовании номеров датчиков информация, откуда пришли данные - содержится в самих данных. Вот, посмотрите внимательнее код Валеры - он принимает данные с передатчиков в строках 53-62. Принимается 16 байт, где первый (нулевой) - это номер датчика, а остальные байты - данные.
Что тут непонятного, что мы уже десятки сообщений мусолим?
А зачем тогда нужны трубы? Если передатчик 1 шлет по номеру [0] единицу, то другой то шлет ноль в эту же ячейку
А зачем тогда нужны трубы? Если передатчик 1 шлет по номеру [0] единицу, то другой то шлет ноль в эту же ячейку
вы, блин, пробовали?!!! - сколько можно писать хрень, а? попробуйте сначала
Не умеете сами - скопируйте код Валеры. У него все работает.
Пробовали.
Код передатчика(Приемная часть)
Код приемника(Передающая)
ack[0] это идентификатор. Что не так?
в первом коде, если номер передатчика ==1 , вы читаете ответ из ack[1], а если передатчик ==2 - то из ack[2]. хотя в коде приемника отправляете ответ только в ack[1].
Это только по этим огрызкам. Приведите полный код этого примера - уверен, найдутся и еще ошибки
кстати, в вашем коде с трубами (сообщение №41) - похоже, такая же ошибка. Вы в первом передатчике читаете ответ из ack[1] и ack[2]. а во втором - из ack[3] и ack[4].
Это неправильно, нужно в обоих передатчиках читать данные из одни и тех же ячеек, иначе разные трубы просто не имеют смысла.
Вот оно как. Я рассчитывал, что элемент массива 0 это идентификатор, 1 это напряжение на первом приемнике, 2- напряжение на втором. Так нельзя? Надо слать в одну ячейку и по одной трубе, а разным будет только идентификатор 0?
Вот оно как. Я рассчитывал, что элемент массива 0 это идентификатор, 1 это напряжение на первом приемнике, 2- напряжение на втором. Так нельзя? Надо слать в одну ячейку и по одной трубе, а разным будет только идентификатор 0?
можно, только у вас все в кучу. В том, что вы описали выше - ажно три разных варианта:
1 если элемент массива 0 это идентификатор, то не нужно распихивать данные по разным ячейкам и не нужны разные трубы
2 если трубы разные - то не нужны идентификаторы и не нужно распихивать данные по разным ячейкам
3 если данные от разных приемников в разных ячейках - нет нужды в трубах и идентификаторах
Вы же пытаетесь одновременно применить ВСЕ ТРИ подхода. В принуипе, при грамотном программировании - можно и все три. Только. будем честны - где "грамотное программирование" и где вы...
Вот оно как. Я рассчитывал, что элемент массива 0 это идентификатор, 1 это напряжение на первом приемнике, 2- напряжение на втором. Так нельзя? Надо слать в одну ячейку и по одной трубе, а разным будет только идентификатор 0?
Вам уже 100 раз обьяснили:
Первый байт - " я чайник",
Второй байт - " я на кухне",
Третий байт - " я кипюююююю".
..... и так далее до бесконечности ( вернее до 32 байт)