Официальный сайт компании Arduino по адресу arduino.cc
nrf24l01 radio.available() всегда true
- Войдите или зарегистрируйтесь, чтобы получить возможность отправлять комментарии
Пнд, 15/09/2014 - 00:06
Не могу понять что не так.
Arduino mini pro. Модуль nrf24l01. Код самый простой:
#include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> #include <printf.h> // Your chosen radio CE,CS pins RF24 radio(7,8); uint64_t addresses[] = {0xABABABABABLL, 0xC3C3C3C3C3LL}; /****** Configure this for sender or receiver *****/ int send_role = 1; int receive_role = 0; boolean sender = receive_role; // Change this from 0 to 1 to switch between sending or receiving sketch void setup() { Serial.begin(57600); radio.begin(); if(sender == 0){ radio.openWritingPipe(addresses[1]); radio.openReadingPipe(1,addresses[0]); radio.startListening(); }else{ radio.openWritingPipe(addresses[0]); //*Edit to correct address assignments radio.openReadingPipe(1,addresses[1]); radio.stopListening(); } Serial.println("Setup complete"); } char myArray[] = "This is not a test"; void loop() { if(sender == 0){ if(radio.available()){ char tmpArray[19]; // This generally should be the same size as the sending array radio.read(&tmpArray,sizeof(tmpArray)); // Reading 19 bytes of payload (18 characters + NULL character) Serial.println("data"); // Prints only the received characters because the array is NULL terminated } }else{ Serial.println("Sender loop start"); bool ok = radio.write(&myArray,sizeof(myArray)); if(ok){ Serial.println("Transfer OK"); }else { Serial.println("Transfer Fail"); } delay(1000); Serial.println("Send loop"); } }
Режим отправки вроде бы корректно отправляет ("Ок" и "Фейлед" если отключить получателя).
Но в логе получателя одни "data". Не могу понять почему radio.available всегда true :(
Подключение модуля согласно картинке
Библиотека ипользуется форк nrf24 maniacbug'а https://github.com/tmrh20/RF24
Библиотека ипользуется форк nrf24 maniacbug'а https://github.com/tmrh20/RF24
Он ее сто лет не обновляет. Нужно новые версии брать у других.
А Ардуина у Вас какая, 3,3V или 5V?
В общем логично, у вас в скетче отслеживается только факт приема сообщения, сами принятые данные вы не выводите.
При каждом удачном принятие сообщения, в сериал порт приемника печатается "data".
Если передатчик отключите, у вас "data" писаться не будет...
И еще. У вас myArray - 18 байт, а tmpArray - 19 байт. Несостыковочка.
:) Используется форк. Не оригинальная либа. Гляньте ссылочку.
В общем логично, у вас в скетче отслеживается только факт приема сообщения, сами принятые данные вы не выводите.
При каждом удачном принятие сообщения, в сериал порт приемника печатается "data".
Если передатчик отключите, у вас "data" писаться не будет...
И еще. У вас myArray - 18 байт, а tmpArray - 19 байт. Несостыковочка.
Этот код был приведен в качестве простейшего пример. Что касается 19 символа, то в комментариях кода указано, что 19-й символ NULL
radio.read(&tmpArray,
sizeof
(tmpArray));
// Reading 19 bytes of payload (18 characters + NULL character)
Проблема в том, что отсылка сигнала происходит раз в секунду, а radio.available() всегда true. То есть по теории (если я правильно понимаю логику) data должен выкидываться тоже раз в секунду (не чаще во всяком случае). А он выкидывает лог при каждой итерации loop. При этом выкидывает пустой (так как инициализированный массив пустой изначально). Может данные он и получает, но засечь это в сериал аутпуте не получилось (т.к. забивается пустотой).
А Ардуина у Вас какая, 3,3V или 5V?
Arduino mini pro 3.3 mega328. Питание раздается правильно от отдельного 3.3в блока.
Логику правильно понимаете
Что вы имеете ввиду, когда говорите "При этом выкидывает пустой". В вашем скетче, когда выбрана роль приемника, он либо должен писать "data", либо вообще ничего не писать. От инициализации "массива" это не зависит.
Если код не полный, весь код приведите...
Логику правильно понимаете
Что вы имеете ввиду, когда говорите "При этом выкидывает пустой". В вашем скетче, когда выбрана роль приемника, он либо должен писать "data", либо вообще ничего не писать. От инициализации "массива" это не зависит.
Если код не полный, весь код приведите...
Сожалею, что ввел в заблуждение. Изначально был вывод массива в сериал. Я заменил его выводом "data" когда понял, что забивающийся пустотой сериал не то что я ждал и хотел понять что там вообще происходит.
Тогда вопрос в силе. Куда смотреть? Код вроде простой, отправка работает (вроде), кривое подключение? Вечером попробую наверное инициализировать массив изначально и после read смотреть есть или нет изменения, но это только укажет на то есть ли получение вообще, на проблему с available == true оно не укажет.
Эксперименты результата не принесли.
Выдает:
"aaaaaaaaaaaaaaaaaa
Принятие есть просто у мини в память не лезет. Сделайте пересылку int и все будет работать.
Сделал пересылку трех интов, но это ничего не изменил. Сендер - отправляет раз в секунду, получатель - получает постоянно. Сендер отправляет "10,10,10", массив получатель всегда ноль.
Я популярно обьясняю для невежд.
Пошлите просто int. Не масив, не пачку и не полный совок блох. А один, отдельный int.
на самом деле код верный... проверте подключение... или модуль... может сам модуль сума так сходит...
пример pingpair.pde из библиотеки rf24 у вас работает ?
Кондёры на пины питания НРФ напаяли?
http://i61.tinypic.com/2rc75zn.jpg
http://forum.arduino.cc/index.php?PHPSESSID=i94m7u66j8vcri8m1t9ej77bl5&t...
Да не в кондерах дело. А в памяти и разрядности. Кривости некоторых вариантов библиотек. Мы когда мини и это радио использовали, тоже такое имели, но было лень разбирается и тупо переделали все посылки через int.
С кондёров надо начинать.
Это закон: купил НРФ- запаяй кондёр!
Просто когда библиотеки выпрямятся и разряды правильно встанут в память будут глюки с уймой потраченного времени и сил.
Извиняюсь за задержку с ответом. Проблема решена.
Большое спасибо trembo за напоминание о питании. nrfl питалась от vcc mini pro, коий при подключении к программатору выдавал 5в, вместо положенных 3.3. Проверил тестером. :( Вторая нрфл корректно питалась от 3.3 источника и поэтому была активной.
Второе спасибо уходит roman2712@ma который напомнил мне про тестовую программу в библиотеке. Собственно именно после того, как эта тестовая программа выдала нули по адресам нрфл, я и понял, что нрфл не видится и косяки в подключении.
Почетное третье спасибо Puhlyaviy за участие :)
P.S. Интересно, что рабочая (автономно питающаяся нрфл) все таки выдавала "ОК" на отправку, что наталкивало на мысли, что проблема в коде. Так как при отключении второй нрфл от сети отправка начинала давать "Fail". А radio.available() == true вызывало мысли о багах где-то в другом месте.
P.P.S. Пошел распаковывать bluetoth HC-05 :)
выручил GettingStarted из библиотеки (форк nrf24). Код приводить не буду. Вот линк https://github.com/stanleyseow/RF24/blob/master/examples/GettingStarted/GettingStarted.ino
Пчему же при отключенном передатчике available приемника тараторит true? Почему возятся с этим аурдино? Кругом глюки