Standalone-ардуино (atmega328p) и nRF24L01+
- Войдите на сайт для отправки комментариев
Доброго времени суток, подскажите пожалуйста, будет ли работать данный модуль на "минимальной сборке" ардуины, где есть тупо микроконтроллер (atmega328 с прошитым загрузчиком Uno), резонатор, два конденсатора, регулятор напряжения 5в->3.3в (для питания непосредственно nRF24L01) и, в общем-то, все? Фоточку приложил на всякий случай.
Проблема в том, что.. после трех дней попыток связать Arduino Uno и "кустарную ее версию" с помощью этих модулей не увенчались успехом. Пробовал все делать с помощью библиотеки RF24, перепробовал кучу кода, примеры библиотеки ни один не сработал. Уже не знаю в чем может быть проблема и подумал, что, может быть, просто такая "минимальная" сборка не будет работать, вот и все..
Спалить модуль не мог, подключал к 3.3в. Подключения перепроверял раз 20, питание и работу мини-версии проверял простым миганием светоида в цикле отправки сообщения.
Запускал (на нормальной Уне, с доступом к консоли на компьютере) скетч со сканером каналов - он сканит все 127 каналов (где большинство ничем не заняты - 0), а значит модуль работает - верно? (если отключить питание модуля, то информация приходит совсем другая, а radio.printDetails() выводит почти везде одни нули).
Вот такой вывод идет с printDetails() для обоих модулей
STATUS = 0x0e RX_DR=0 TX_DS=0 MAX_RT=0 RX_P_NO=7 TX_FULL=0
RX_ADDR_P0-1 = 0xe8e8f0f0e1 0xc2c2c2c2c2
RX_ADDR_P2-5 = 0xc3 0xc4 0xc5 0xc6
TX_ADDR = 0xe8e8f0f0e1
RX_PW_P0-6 = 0x20 0x00 0x00 0x00 0x00 0x00
EN_AA = 0x3f
EN_RXADDR = 0x03
RF_CH = 0x4c
RF_SETUP = 0x07
CONFIG = 0x0c
DYNPD/FEATURE = 0x03 0x06
Data Rate = 1MBPS
Model = nRF24L01+
CRC Length = 16 bits
PA Power = PA_HIGH
Прощупывал контакты на модуле - на некоторых раз в секунду-две скачет напряжение от 0 до 5, видимо идут какие-то сигналы, т.е. вроде бы "работает".
Проблема в том, что вся эта инфа выводится в консоль. А вот в standalone-версии с "голым" микроконроллером у меня, конечно же, нет консоли. Я попытался придумать как можно проверить статус "вслепую". Заранее прошу прощения за полный ноль в языке программирования, мне знакомы Perl, PHP и Javascript, а с C** я никогда не сталкивался.
Покопавшись в библиотеке нашел методы get_status() и print_status(), которыми можно воспользоваться таким образом:
printf("Status: %lu", radio.print_status(radio.get_status()));
Я слегка "кастрировал" этот метод и сделал чтобы он выводил только 0x0e, однако есть проблема: выводится это все все равно в консоль, а присвоить это значение переменной не выходит. Мысль была в том, чтобы проверять в цикле программы что-то вроде if (status == '0x0e') { digitalWrite(pinLED, HIGH); } - тупо включить светодиод если статус тот, что нужен.
Выглядит внутри так:
void RF24::print_status(uint8_t status)
{
printf_P(PSTR("0x%02x"), status);
}
Я пытался возвращать вот так, но выводилась сама переменная status, а не ее "преобразованная" версия (понятно почему - потому что неправильно):
char RF24::print_status(uint8_t status)
{
return PSTR("0x%02x"), status;
}
Не могу сообразить, как конвертировать этот uint8_t в удобоваримый вид, как это делает printf_P(PSTR("0x%02x"), status)...
Вроде:
char code = uint8TOchar(status)
Подскажите, что делать..
Из всего прочитанного так и не ясно запустились ли у вас модули на дуинах и получилось ли передать данные с одной дуины на другую?
можно uno подключить по serial к standalone и проверить что там происходит
Из всего прочитанного так и не ясно запустились ли у вас модули на дуинах и получилось ли передать данные с одной дуины на другую?
Получилось очень сумбурно, согласен. Проблема в том, что мне не удалось провести сеанс приема-передачи ни разу. Использовал примеры, использовал чужой код, упрощенный до невозможности. Модули вроде запускаются, статус 0x0e - вроде значит "все ок", но мне не проверить статус на standalone-ардуине, т.к. там нет ничего, кроме резонатора и конденсаторов.. Я бы с радостью взял еще одну ардуину - но у меня ее нет, подключить их обе к компу не могу, т.к. у standalone-версии нет никаких интерфейсов к компу. Вот и думаю, как проверить, работает ли все правильно там или нет.. с помощью светодиодов и каких-то условий-проверок.
можно uno подключить по serial к standalone и проверить что там происходит
Хм, вариант, спасибо! Не подскажите, где почитать про это? Правильно ли я понимаю, что нужно использовать пины TX и RX? Т.е. я беру standalone, подключаее ее TX к RX (Uno), и RX к TX соответственно, верно?
Насколько я вижу по фото - питание nrf24 сделано просто от линейного стабилизатора. Так работать не будет, поставьте прямо на ноги питания nrf24 конденсатор на 100 мкф, а хорошо бы еще и на вход стабилизатора - как написано у него в датащите.
Когда я портировал библиотеку RF24 на ARM, у меня были моменты, когда я получал 0x0e код на все переданные данные. Насколько помню, это было тогда, когда некорректно формировались сигналы CE, CSN. Т.е. модуль NRF24 отвечал, но на запросы получить от него информацию (передача с мастера кода 0xFF) он не отвечал, точнее всегда отвечал 0x0e. Если бы у Вас был логический анализатор (ЛА), думаю всё было бы на порядок проще. Именно ЛА мне и помог раскопать проблему.
У меня провода достаточно короткие (~5 см), кондер по питанию на NRF я не ставил, пока что работает без него и не глючит, но лучше поставить, чтобы исключить эту проблему.
Хм, вариант, спасибо! Не подскажите, где почитать про это? Правильно ли я понимаю, что нужно использовать пины TX и RX? Т.е. я беру standalone, подключаее ее TX к RX (Uno), и RX к TX соответственно, верно?
сам если честно не пробовал, но не вижу причин чтобы не заработало:
1. если МК в DIP корпусе - его вынимаем из UNO либо вещаем RESET на GND чтобы МК находился в ресете, а всего выводы в Z состоянии
2. цепляем пин отвечающий за RX к RX пину UNO, TX к TX
3. подключаем UNO к компу и как обычно настраиваем монитор
таким образом в мониторе мы должны видеть standalone
Насколько я вижу по фото - питание nrf24 сделано просто от линейного стабилизатора. Так работать не будет, поставьте прямо на ноги питания nrf24 конденсатор на 100 мкф, а хорошо бы еще и на вход стабилизатора - как написано у него в датащите.
Да, вы правы, напрямую идет от стабилизатора (если быть точным, вот такой: http://www.chipdip.ru/product/lp2950acz-3.3-nopb/, у него выходной ток 0.1 ампер, но этого же достаточно для модуля nRF, ведь так?). Исправлю этот момент как доберусь до дома, спасибо.
axill
Класс! Обязательно попробую, благо МК в DIP корпусе. Выходит, что сигналы будут проходить мимо "пустой колодки" и уходить прямо на другой МК.
kisoft
Спасибо, пойду курить про ЛА
Класс! Обязательно попробую, благо МК в DIP корпусе. Выходит, что сигналы будут проходить мимо "пустой колодки" и уходить прямо на другой МК.
по идее зануление ресета должно не хуже работать, вам быстро надоесть DIP вытаскивать)
Согласен, надо себя приучить)
1. если МК в DIP корпусе - его вынимаем из UNO либо вещаем RESET на GND чтобы МК находился в ресете, а всего выводы в Z состоянии
2. цепляем пин отвечающий за RX к RX пину UNO, TX к TX
3. подключаем UNO к компу и как обычно настраиваем монитор
таким образом в мониторе мы должны видеть standalone
Попробовал вчера - не вышло.
Standalone МК работает 100% - у меня там в цикле спецом мигает светодиод, как раз для проверки, плюс, если вставить этот МК на плату Arduino Uno, то через консоль видно, как идет отсылка через nRF, т.е. код работает 100%.
Первым способом попробовал вынуть МК из Uno и включить его пустым. На плате Uno загорелся светодиод, который показывает, что питание есть, плюс светодиод который горит обычно, когда подаешь сигнал на pin13. Затем я подключил RX и TX обоих МК. Сбросил обоим питание, запустил консоль.. и тишина. На плате светодиоды RX и TX не горели. Но я так понимаю, что они гореть и не должны были?
Вторым способом я вернул обратно МК на место в Uno, но при его включении тупо защал пальцем кнопку Reset и держал ее все время. Сценарий тот же получился. Те же огоньки горели, та же тишина.
Пытался менять местами RX-RX и TX-TX на RX-TX и TX-RX - разницы ноль.
Я подумал, что может быть надо standalone как-то настроить, чтобы он передавал по serial инфу на Uno (, а та в свою очередь всю поступающую инфу выводила в консоль.. Но разве нет способа попроще?
Насколько я вижу по фото - питание nrf24 сделано просто от линейного стабилизатора. Так работать не будет, поставьте прямо на ноги питания nrf24 конденсатор на 100 мкф, а хорошо бы еще и на вход стабилизатора - как написано у него в датащите.
Не нашел вчера у себя нужного конденсатора.. Но пока копался, возник (глупый, наверное) вопрос: почему с платой Arduino Uno все работает, где так же я беру питание от 3.3в и не ставлю никаких конденсаторов на ногу питания nRF, а на standalone версии, где питание так же беру от 3.3в - работать не будет? Т.е... в чем разница?
почему с платой Arduino Uno все работает, где так же я беру питание от 3.3в и не ставлю никаких конденсаторов на ногу питания nRF, а на standalone версии, где питание так же беру от 3.3в - работать не будет?
Понял, прошу прощения за свое невежество )
Standalone МК работает 100% - у меня там в цикле спецом мигает светодиод, как раз для проверки, плюс, если вставить этот МК на плату Arduino Uno, то через консоль видно, как идет отсылка через nRF, т.е. код работает 100%.
Извиняюсь конечно, мигает светодиод не delay()'ем случайно? Просто тогда весь ваш рабочий код спит =)
Standalone МК работает 100% - у меня там в цикле спецом мигает светодиод, как раз для проверки, плюс, если вставить этот МК на плату Arduino Uno, то через консоль видно, как идет отсылка через nRF, т.е. код работает 100%.
Извиняюсь конечно, мигает светодиод не delay()'ем случайно? Просто тогда весь ваш рабочий код спит =)
Нет-нет, что вы :) Там есть строчка в примере, идущим с библиотекой, там есть delay(2000), вот оно:
Почитайте Вставка программного кода в тему/комментарий.
Исправил.
Подскажите, могу ли я пока запитать мой второй модуль nRF не от стабилизатор 3.3в, а от выхода 3.3в Uno? Он выдержит 2 модуля? Конденсаторы на 100мкф не найти просто пока что)
Да любой конденсатор подойдет от 20 до 500 мкф. Можно даже несколько по 10.
Вот по нагрузочной способности выхода - не помню. Посмотри датащит.
Я подключил вчера конденсатор 220 мкф, так у меня напряжение стало 2.5в вместо 3.3в.. Я в электрике профан, подумал, что это конденсатор сожрал часть, будто резистор. Решил, что если будет на 100 мкф, то потери будут меньше.. А вот вы пишите, что от 20 до 500 мкф.. значит кушать напряжение они не должны?
П.С. Даташит посмотреть чей? Модуля?
Я подключил вчера конденсатор 220 мкф, так у меня напряжение стало 2.5в вместо 3.3в.. Я в электрике профан, подумал, что это конденсатор сожрал часть, будто резистор. Решил, что если будет на 100 мкф, то потери будут меньше.. А вот вы пишите, что от 20 до 500 мкф.. значит кушать напряжение они не должны?
а, если поменять полярность конденсатора, то какое напряжение?
*чтозанах - явэлектрикепрофан? это значит - я не учился в школе, у меня образование как у пуштунского козопаса.
Господа, до сих пор ковыряюсь с проблемой. :(
Собрал Стенд, с блекдже.. конденсаторами и синей изолентой) Слабонервным лучше не смотреть, заранее прошу прощения за этот ахтунг, но ничего лучше придумать не удалось. Некоторые проводники на макетной плате используются для фиксирования элементов.
На фото:
1) Это, собственно, Uno и подключенный к ней nRF24L01+ модуль.
2) Чтобы быть приближенным к боевым условиям, питание для модуля взял через регулятор напряжения 3.3в
3) По совету ales2k перед тем как запитать модуль поставил параллельно конденсаторы (там стоит 330 мкф и 0.1 мкф)
4) Это, собственно, Standalone версия и соединенный с ней модулья nRF. Она запитана от 5в Uno.
5) Те же самые регулятор напряжения 3.3в и конденсаторы (тут 220 мкф и 0.1 мкф), что и в пп. 2 и 3, питание модуля идет через все это.
Удалось подключить RX и TX к плате и вывести на экран инфу со Standalone версии. (Как написал выше axill - все правильно, последовательность моих действий просто была не та, надо было после всех манипуляций сбросить питание standalone и консоль ожила).
Эта инфа сообщала, что с модулем nRF все в порядке и он работает. radio.printDetails() сообщала статус 0x0e как и положено.
Но связи между двумя модулями (соответственно включенных в разные режими путем заземления pin 7 как это и указано в скетче-примере к библиотеке) установить так и не удалось. Менял адреса каналов (пару разных попробовал), тоже ничего.
Обратил внимание, что цикл на standalone длится дольше в сравнении с нормальной Uno, как будто частота другая: медленнее ползли строчки, когда я тупо в цикле писал что-то в консоль)
Еще возник вопрос, если запустить скетч pingpair, то там у трансивера при отсылке всегда будет
если выключен приемник? Я так и не понял..
Другой код, который был до невозможности прост (передатчик):
И приемник:
Так же не заставил приемник подать признаки жизни...
Пробовал менять модули (ставить другой) - результата так же ноль.
Менял местами CE и CSN - в результате начало идти что-то (именно что-то, т.к. передачик был обесточен) на прием, однако radio.printDetails() в таком случае не определял модуль, и я решил, что модуль стал сходить с ума из-за смены пинов.
Уважаемые форумчане... помогите советом.. куда копать?
Конденсатор на сам модуль припаяйте.
http://arduino.ru/forum/programmirovanie/nrf24l01?page=8#comment-40787
Помоему вы не все библиотеки подключили
у меня так.
Помоему вы не все библиотеки подключили
у меня так.
nRF24L01.h включен внутри RF24, так что его добавление суорее всего ни на что не влияет
Весь код передатчика. Сейчас на нем работает 5 датчиков
UPD2 Проблему решил, почему-то в примере из библиотеки была закомментирована одна строчка, из-за которой были все проблемы...
Друзья, хелп! Связь наладил, но через одно место.. происходит какой-то полтергейст.
Во-первых, сеанс связи стал возможен только благодаря еще одной плате Arduino Uno. Во время испытаний тестового скетча GettingStarted из библиотеки была обнаружена проблема почему нифига не работало. Кстати, конденсатор помог при питании через стабилизатор (если питаться от 3.3в Uno - все прекрасно и так работает) - только если его (конденсатор) непостредственно к питанию модуля припаять! Спасибо!
Проблема заключается в странном поведении модулей. Когда все запускается и оба модуля находятся в режиме Receiver по умолчанию, при попытке впервые передать сообщения (т.е. перейти в режим Transmitter вводом в консоль буквы "T") любым (не важно каким!) из модулей происходит как обычно ошибка Now sending [число]...failed. Failed, response timed out. Но! После этого, если перевести этот модуль обратно в режим Receiver, а второй, другой модуль, наоборот в режим Transmitter - то замечательным образом все начинает работать. После чего переключение Transmitter<->Receiver работает без запинки, все шлется и принимается обоими модулями. Т.е. по какой-то причине, модули после запуска не видят друг друга, и начинают общаться только после того, как один из модулей побудет трансмиттером и неудачно будет слать сообщения...
Иными словами, модули начинают работать вместе только после того как один из них "потыкает" другого, а затем они поменяются ролями. Если сбросить питание у одного из МК - связь налаживать опять надо. Не могу понять, это особенность модулей такая?
UPD Есть подозрения, что изначально, после запуска, модули по какой-то причине "не активированы", и переход Receiver-Transmitter-Receiver запускает прослушивание эфира. Буду копать код скетча...
Паузы уберите в скетчах ,хотя бы на сервере , и вообще пора переходить на NRF24LE1 со встроенным процом :)
Даже не слышал о таком звере. Погуглил, штука интересная, но цена существенно отличается от простого L01.. почти в 10 раз, видимо за счет встренного МК. Но, я так понимаю, данный модуль полезен лишь для определенных целей, да и программить его уже не так просто, как ардуину :) Спасибо за инфу!
LO1 стоит 1 доллар ,а LE1 - около 6-7. Разница почти сравнима с ценой ардуины.А тут получаем минимальный размер 1/2 спичечного коробка,низкое потребление.
Сейчас разобрался с ними и уже написал основные функции для работы как у библиотеки nrf24.Пишется прошивка на Си ,не сложнее ардуины,имеется свой SDK ,где имеется куча готовых функций для работы со всем,например за 5 минут написал код для чтения DHT используя готовые функции для работы с PIO.