2 ардуины с nrf24l01. Прием и передача друг другу значений.
- Войдите на сайт для отправки комментариев
Пт, 18/04/2014 - 01:23
Приветствую! Никак не удается заставить две ардуины с nrf24l01 передавать друг другу значения двух потенциометров. Схемы идентичны, к каждой подключены по 2 потенциометра, и по 2 серво. Каждая ардуина читает значения своих потенциометров и передает их другой, которая получив их, управляет серво. Если делать одну ардуину только на передачу, другую только на прием, все работает. В чем косяк мой? Код ниже (одинаковый для двух ардуин). #include <Wire.h> #include <Servo.h> #include <SPI.h> #include <nRF24L01.h> #include <RF24.h> #include <RF24_config.h> Servo sensA; Servo sensB; int msg1[2]; //2 - колличество переменных для передачи int msg2[2]; //2 - колличество переменных для приема RF24 radio(9,10); //номера каналов приема и передачи const uint64_t pipe = 0xE8E8F0F0E1LL; // адрес канала передачи int sensor1 = A0; //считываем значение напряжения сенсора 1 int sensor2 = A1; //считываем значение напряжения сенсора 2 int sensor1_val=0; //переменная для хранения значения сенсор 1 int sensor2_val=0; //переменная для хранения значения сенсор 2 void setup(void) { radio.begin(); sensA.attach(5); sensB.attach(6); } void loop(void) { //сбор и передача данных с 1 ардуины на 2 sensor1_val = analogRead(sensor1); sensor2_val = analogRead(sensor2); msg1[0] = sensor1_val; //составляем массив данных для отправки msg1[1] = sensor2_val; radio.openWritingPipe(pipe); // Открываем канал передачи radio.write(msg1, sizeof(msg1)); //передаем данные //теперь слушаем, что передает вторая ардуина первой.. radio.openReadingPipe(1,pipe); //открываем один из 6-ти каналов приема radio.startListening(); //начинаем слушать эфир if (radio.available()) { bool done = false; while (!done) { done = radio.read(msg2, sizeof(msg2)); } } int sensA_val = map(msg2[0], 0, 1023, 0, 180); sensA.write(sensA_val); int sensB_val = map(msg2[1], 0, 1023, 0, 180); sensB.write(sensB_val); }
Извиняюсь, текст в код при оформлении записался почему то.
Во первых открытие каналов надо вынести в setup ,а во вторых а где radio.stopListening() ,который переводит радиомодуль на передачу ? Вроде примеров на форуме предостаточно..Есть целая тема ,где множество ответов можно найти.
Форум курю сижу. Просто в голове еще не уложилось все. В частности понятно вроде, а в целом - еще не созрел.
Поправил код по рекомендациям с тем. Однако ничего не изменилось. Ардуины друг друга не видят.
Сдается мне с числом каналов напутал. Или с адресацией. Попробую поковырять код...
На прием и на передачу должны быть разные каналы ,хотя в теории и так может заработать.
У вас не указан канал ,но по умолчанию он всеравно выбран ,и, получается что выбран на обеих одинаково.
Хм. Нашелся такой трабл. В макете у меня две дуины, одна nano, вторая UNO (китайская makerduino UNO). Так вот на нано при работе светодиод L, подключенный к 13 выводу горит вполнакала, ибо нога SCK дергается. А на UNO вообще не горит. Откопал платку мини про, залил скетч, на ней светодиод замигаел.
Хотя когда пробовал однонаправленную связь (nano - передатчик, UNO - приемник) все работало. Похоже в UNO трабл какой то. Пока едут заказанные ардуины, попробую на про мини сгородить и проверить.
MaksMS, спасибо. Не подскажите, какой командой назначаются разные каналы? В 13 строке разве не это делается?
Канал назначается radio.setChannel(25); - это можно увидеть в исходных кодах библиотеки. в 13 строке идет иницилизация модуля используя данные выводы для подключения.
Здесь пример рабочий.
Спасибо, буду ждать ардуины, а пока матчастью займусь. zsm@nxt.ru, в этом примере одностороннее управление одной ардуиной другой. это у меня и так заработало. Я же хочу взаимного управления. Как на видео, только еще прикрутить 2 сервы к ардуине с резисторами а к ардуине с сервами прикрутить резисторы.
Пытался связать две ардуины . Тоже искал примеры . Не нашел . Кое как сваял из всего что нашел на форуме.
Ардуины слушают эфир , и по событию (нажатие кнопки, срабатывание датчика и т.д. ) включ передачу и после опять слушают эфир. Получился говнокод для первой ардуины:
для второй ардуины:
У меня работает. Код не откоментирован ,пробный и , 99 процентов не правильный . Но для мои целей подошел.
Но у тебя другие цели. Тебе нужно передавать данные с аналоговых входов,которые изменяются постоянно..
4ERTIK, спасибо за пример. В примере все понятно, только вот пояснил бы кто, запись выше. Что мы физически делаем этой командой и чем она отличается от 14 строки моего примера, где в массиве только одно значение. Где об этом можно почитать подробней?
адреса каналов приема и передачи, а у тебя указан только канал приема( гуру поправят если я не прав).
Вот переписал код, сделал канал приема и передачи, добавил конфигурационные строки для NRF24. Вроде должно заработать, но вот проверить в ближайшее время не удасться (( жду модули с Китая.
мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?
тут на эту тему написаны килотонны постов..
тоесть установить простой пример в котором две ардуинки шлют пинги друг другу у вас рука не подымается?
чисто с технической точки зрения попробуйте мне обьяснить как ардуина может отправилять сигнал через РФ24 и не принимать его, или наоборот... я видимо туплю страшно и не могу себе представить такой ситуации..
Конечно туплю. Мало времени еще прошло с момента, когда первые 24 пришли из Китая. Не понимаю, как вы можете этого не понимать по моим постам выше.
Может отправлять и не принимать? На уровне моих пока еще скромных познаний, например не управлять по каким либо причинам выводом, переводящим модуль из приема в передачу. Скорей на уровне железа. Но и мегатонны кодов перелопатить новичку и все понять нелегко. Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!
Но процесс идет, я многое уже знаю, например то, что вас то вылечат, а мне с этим жить :) Удачи вам!
Красиво "подъебнул" :)
Вы правы, но.... вы вот призываете других понять причины вашего "туплю...", есть ведь и обратная сторона. Почему так реагируют на "тупление".
Кто вам отвечает на форуме? Люди с 30-летним педагогическим стажем или обыкновенные "практики" (или считающие себя таковыми)? Обычные люди, которых раздражают повторения одного и того же. Да банально - плохое настроение может быть. Вы-то "затупили" один раз, а до вас сколько раз это сделали (по этой же теме)?
Да и банально, "знать" и "уметь учить" - не одно и тоже. Вы когда-нибудь пробовали учить езде на велосипеде или плаванию? То что тебе очевидно и ты даже не задумываешься.... вдруг видишь что челвок делает глупости которые тебе даже не пришли бы в голову ;) Первая естественная реакция (!) "ну что за д%№;%;".
И это все накладывается на то, что большинство отвечающих, даже мысленно, "корону учителя" - себе на голову не одевали. Просто общаются на заданную тему. В этом общении может быть и учебная инфа, и "сброс пара", и откровенный стеб (особенно если есть повод. хотя и не обязателен).
И ничего вы с этим не поделаете. Советы вида "проходите мимо" - дадут противоположный эффект ;) Уже были кто проверял это ;) Вообщем "стиснуть зубы, да терпеть..." (C). Судьба новичков :( Просеиваете "породу" форума, выбираете полезные для себя крупицы.
Кстати, на востоке, учитель часто, в отличае от нашего, вообще ничего не объясняет. Он сам задает вопрос и "нещадно пиздит за неправильный ответ" :) И какой "учебный подход" более правильный - бабка надвое гадала.
Многие начинает с "я новичок", "не пинайте меня", "учитывайте...". Как говорила мой школьный зауч "ваши подробности.." ;) В ответ на ЛЮБЫЕ объяснения "почему не сделал домашнее задание, не сдал куртку в гардероб и т.д. и т.п.". Большинству людей - фиолетово на причины вашего незнания. И я благодарен заучу с тем что она рано заставила меня осознать реальное отношение внешнего мира к индивидууму.
Никто же не обещал что "быть новичком" это психологически комфортно ;) . Ну а тут уже есть два пути. Либо "отказатся" и вернутся в привычную зону комфорта. Работать только с тем что уже умеешь и знаешь. Либо перестать быть новичком :) Стимул есть. Сделать эту область "зоной комфорта".
Только потом опять прийдется искать "как выйти из зоны комфорта". Если застрянешь в ней - деградация.
Вообщем "....оплеухи нужней поцелуев, поцелуям мы знаем цену..." (с) Дольский
leshak. Да у меня вообще никаких претензий. Всегда с благодарностью принимаю помощь и советы от более опытных специалистов. Психологию, настроение, 30 лет, просто фильтрую. Да и не подъебывал никого, просто хотел сказать, что не сижу тупо ответа жду, а ищу, читаю форум, учусь, экспериментирую с ардуинами. В программировании МК я пока новичек, но в том, что стану профессионалом не сомневаюсь. Деваться некуда, да и интересно.
А так, любой Форум интересная штука. Вопросы там задают одни новички, как только ты становишься профессионалом, начинаешь только отвечать.
Поэкспериментировал с кодом, как выяснилось работа RF затыкается сразу как в коде появляются строки выше. Если закомментить, односторонняя передача востанавливается. УНА оказалась рабочей.
Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".
Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?
Тут вы делаете три вещи. Осановку "слушания", передачу, и "старт".
Попробуйте выяснить что же именно мешает. Старт/стоп или "передача. Если write закоментить, а старт/стоп оставить, проблемы остаются?
гыыы, дружище, голова ему мешает и гордость непомерная с ленью попалам.. ему лень прочитать ветку про эти модули потому что она на 60 страниц. но там разобрано все до основания.. ему лень разобратся как работает SPI, и понять одну простую вещь что если модуль работает, то он работает всегда, и возможно просто версия его библиотеки кривая и как то криво обращается к модулю.. выбирай что именно ему мшеает или может все сразу?
Leshak, если закоментить все три строчки, работает в одном направлении. То есть можно управлять той дуиной, в которой закоментены эти строки. Если же раскоментить любую/любые из этих строк, управления нет ни туда ни обратно. Еще заметил что строчки с каналами (код выше) почему то в моем случае должны быть одинаковыми в обеих дуинах. Иначе управления нет. Такой же трабл встречал у кого то в ветке про RF24.
https://github.com/maniacbug/RF24 ,библиотеку отсюда брал.
блин ему гордость не позволяет даже примеры просто попробовать, которые идут с библиотекой.. он сразу свою прогу пихает и удивляется отчего это все так криво...
Это не гордость это детские комплексы :)
Leshak, если закоментить все три строчки, работает в одном направлении.
Вообщем-то я спрашивал что будет если закоментить эту одну строчку. write. Понять что мешает сам факт передачи или остановка/старт прослушки.
Вы же выполнили сразу несколько каких-то изменений. Из чего сделать какой-то вывод одназначный - невозможно.
Если закоментить write, а stop и start не коментить, то:
управления нет ни туда ни обратно.
то есть проблемы остаются
Ладно, думаю эту проблему мне нужно будет решить самому. Спасибо, leshak за помощь. Вам, Puhlyaviy, тоже спасибо.
мне вот интересно.. ну сугубо в иследовательских целях.. вы специально тупите или это врожденое?
В свои 47 могу позволить и тупить . Ну пробовал я разные примеры , боясь спросить здесь на форуме,ничего не получалось . Перечитал от первой до последней страницы тему Nrf24l01 .Заканчивая читать страницу- в голове была еще большая неразбериха. А БУКОВ там на много страниц . С NRF24 я разобрался как-то.... Да , может быть и тупо разобрался. Плеш или Флеш в голове уже не тот...Но понял я одно ...Помочь реально пытаются на этом форуме реально таким тупым как я такие как maksim , leshak и другие. А товарищ Puhlyaviy только остроту своего молодого языка показывает.Или уровень его подготовки не позволяет ему, кроме сарказма и подколов , ничего другого. Лично я на форуме не видел ни одного поста от Puhlyaviy с практической помощью...Может ошибаюсь..Но в подколах он первый... Герой .Ребята , может хорош подкалывать и колоть ?Ну не все здесь програмисты с высшим . Форум для всех.А для юмористов можно завести отдельный раздел.
Все заработало, когда добавил задержку после startListening в void loop. Так же причиной нестабильной работы был выбранный 10 канал, после изменения его на 100 проблемы сбоев исчезли (смотрите сканером наличие помех в канале). Еще у меня были перепутаны CSN и SCK в одном из модулей.
Еще у меня были перепутаны CSN и SCK в одном из модулей.
гыыыыы. где то я такое уже видел.. доктор, не подскажете?
пока доктор на мальдивах, я тоже расскажу, как меня китайцы подкололи. На приобретенном в DX шилде для Mega2560 на всех 72 площадках надписи +5 и GND были перепутаны местами (распаяно как "-+S", а написано как "+-S". Если учесть, что это был мой первый опыт работы с Arduino, подстава была жесткой :)
Почему с добавленой задержкой работает, а без нее нет? С delay вроде контроллер занят и не может (может ошибаюсь) выполнять других действий типа сохранений передачи и тп переменной?
Наверное потому, что после получения команды startListening сам модуль NRF чем-то занят (инициализация радиотракта, подстройка частоты приема/передачи, выбор свободноего канала и др.) И если сразу же отправить ему другие команды, то он их тупо проигнорирует, потому как буфер команд - это удел более дорогих модулей.
Здравствуйте. Нуждаюсь в помощи - не могу решить. Имею скеч на управление кнопками светодиодов. В оригинале в скече светодиоды горят до следующего нажатия на кнопку- Как исправить что бы светодиоды при нажатие светил всего 1 секунду и тухли.
Это оригинал. от - http://mybotic.com.my/webshaper/store/viewProd.asp?pkProductItem=414
Большое спасибо за терпение. Надеюсь на вашу помощь.
Где Вы головы. Нужна помощь.Выслушаю все. Помогите соедить в 1 -но целое две рабочие половинки. Ну не силен, не могу и что теперь.
приемник
Помогите соеденить две половинки в одно целое
Может это поможет
Читайте тему по модулю. Приемопередача организуется другим способом
Да - если сидеть в другом кабинете и с планшетом в руках - то такая помощь меня бы устроила.
Конкретный вопрос о конкретной помощи. И… да не сижу я там.
Помогите в чем косяк
Вы пишете - ошибка в строке 064. Но по этой строке прослеживаются и другие ошибки, сделанные ранее.
В 064 написано digitalRead(BUTTON1), а в строке 009 вы объявляли
int
pinBUTTON1=A0,
Далее, если А0 используете как цифровой пин, то он должен быть объявлен для ардуино УНО как 14, т.е. если номера цифровых пинов идут с 0 по 13, то А0=14, А1=15 и т.д.
Далее, лучше было не использовать для объявления номеров пинов кнопок и диодов тип int, а объявить их через define, у вас и так код большой получается.
Большое спасибо ,
В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".
=
Спасибо - прислушался к вашим словам. Написал отдельно c millis , проверил. Все работает – теперь буду переносить на NFR24L01+. И спасибо за терпение к таким как Я.
В #34 вы писали, что скеч рабочий. Вы его работу проверяли? Если он рабочий, то вы сами сможете его подправить, чтобы светодиод гас через определенное время. Сначала напишите кусок кода на управление светодиодом без delay, проверите его работу и потом подправите ''рабочий код".
Рабочий вариант включил в NRF24l01+ но вылезают такие ошибки - в чем косяк?
Строка 104 лишняя. Кол-во открывающих скобок должно быть равно кол-ву закрывающих.
Ещё строка 128, вроде, тоже не в кассу. Дальше лень искать :)
Честно говоря –эти скобы и не влияют здесь, но ошибки такие как - в чем косяк? я на пути к победе ПОМОГИТЕ.
141
//**************************************************
142
// Function: init_io();// Функция: init_io ();
143
// Description:// Описание:
144
// flash led one time,chip enable(ready to TX or RX Mode),// Светодиодной вспышкой один раз, чип позволит (готовый TX RX или режим),
145
// Spi disable,Spi clock line init high// Спи отключить, SPI часы линии инициализировать высокой
146
//**************************************************
147
void
init_io(
void
)
//недействительными init_io (недействительными)
148
{
149
150
SPI_PORT&=~CE;
// Чип позволит
151
SPI_PORT|=CSN;
// Спи отключить
152
SPI_PORT&=~SCK_pin;
// Спи часы линии инициализировать высокой
153
}
154
155
/**************************************************
156
* Function: SPI_RW();
//Функция: SPI_RW ();
157
*
158
* Description:
// Описание:
159
* Writes one unsigned
char
to nRF24L01, and
return
the unsigned
char
read
160
* from nRF24L01 during write, according to SPI protocol
161
Пишет один неподписанный символ для NRF24L01, и вернуть неподписанные символ читать
162
* От NRF24L01 во пишут, в соответствии с протоколом SPI
163
**************************************************/
164
unsigned
char
SPI_RW(unsigned
char
Byte)
//подписанные символ SPI_RW (неподписанные символ байт)
165
{
166
unsigned
char
i;
//неподписанные символ я;
167
for
(i=0;i<8;i++)
// выход 8-бит
168
{
169
if
(Byte&0x80)
//если (байт & 0x80)
170
{
171
SPI_PORT |=MOSI_pin;
// Выход "неподписанные символ ', MSB для MOSI_pin
172
}
173
else
//другой
174
{
175
SPI_PORT &=~MOSI_pin;
176
}
177
SPI_PORT|=SCK_pin;
// Установить SCK_pin высокий ..
178
Byte <<= 1;
// Сдвиг следующий бит в MSB ..
179
if
(SPI_IN & MISO_pin)
//если (SPI_IN & MISO_pin)
180
{
181
Byte |= 1;
// Захватить текущее MISO_pin немного
182
}
183
SPI_PORT&=~SCK_pin;
// ..то Установить SCK_pin низкий снова
184
}
185
return
(Byte);
// Возврат прочитать неподписанные символ
186
}
187
/**************************************************/
188
189
/**************************************************
190
* Function: SPI_RW_Reg(); // Функция: SPI_RW_Reg ();
191
*
192
* Description:// Описание:
193
* Writes value 'value' to register 'reg'// Записывает значение '' значение для регистрации '' рег
194
/**************************************************/
195
unsigned
char
SPI_RW_Reg(unsigned
char
reg, unsigned
char
value)
//неподписанные символ SPI_RW_Reg (неподписанные символ рег, символьное значение без знака)
196
{
197
unsigned
char
status;
// неподписанных статус символ;
198
199
SPI_PORT&=~CSN;
// ДНС низкий, инициализировать сделка SPI
200
status = SPI_RW(reg);
// Выбрать регистр
201
SPI_RW(value);
// ..и Значение записи к нему ..
202
SPI_PORT|=CSN;
// ДНС высокой снова
203
204
return
(status);
// Вернуть NRF24L01 статус неподписанные символ
205
}
206
/**************************************************/
207
208
/**************************************************
209
* Function: SPI_Read();//Функция: SPI_Read_Buf ();
210
*
211
* Description://Описание:
212
* Read one unsigned char from nRF24L01 register, 'reg'Читайте одну неподписанные символ из регистра NRF24L01, "рег"
213
/**************************************************/
214
unsigned
char
SPI_Read(unsigned
char
reg)
//неподписанные символ SPI_Read (неподписанные символ рег)
215
{
216
unsigned
char
reg_val;
// неподписанные символ reg_val;
217
218
SPI_PORT&=~CSN;
// ДНС низкий, инициализировать SPI связь ...
219
SPI_RW(reg);
// Выбор зарегистрируйтесь, чтобы читать из ..
220
reg_val = SPI_RW(0);
// ..то Прочитать значение регистра
221
SPI_PORT|=CSN;
// ДНС высокий, прекратить общение SPI
222
223
return
(reg_val);
// Возвращаемое значение регистра
224
}
225
/**************************************************/
226
227
/**************************************************
228
* Function: SPI_Read_Buf();//Функция: SPI_Write_Buf ();
229
*
230
* Description://Описание:
231
* Reads 'unsigned chars' #of unsigned chars from register 'reg' //Читает неподписанные символы 'неподписанных симв' #of из 'рег' регистра
232
* Typically used to read RX payload, Rx/Tx address//Обычно используется для чтения RX полезной нагрузки, прием / передача адрес
233
/**************************************************/
234
unsigned
char
SPI_Read_Buf(unsigned
char
reg, unsigned
char
*pBuf, unsigned
char
bytes)
//неподписанные символ SPI_Read_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)
235
{
236
unsigned
char
status,i;
//неподписанных статус символ, я;
237
238
SPI_PORT&=~CSN;
// Установить ДНС низкий, инициализации SPI tranaction
239
status = SPI_RW(reg);
// Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ
240
241
for
(i=0;i<bytes;i++)
//для (я = 0; я <байт; я ++)
242
{
243
pBuf[i] = SPI_RW(0);
// // Выполнить SPI_RW читать неподписанные символ из NRF24L01
244
}
245
246
SPI_PORT|=CSN;
// Установить ДНС высокой снова
247
248
return
(status);
// Вернуть NRF24L01 статус неподписанные символ
249
}
250
/**************************************************/
251
252
/**************************************************
253
* Function: SPI_Write_Buf();//Функция: SPI_Write_Buf ();
254
*
255
* Description://Описание:
256
* Writes contents of buffer '*pBuf' to nRF24L01//Записывает содержимое буфера '*', чтобы pBuf NRF24L01
257
* Typically used to write TX payload, Rx/Tx address//Обычно используется, чтобы написать полезную нагрузку TX, Rx / Tx адрес
258
/**************************************************/
259
unsigned
char
SPI_Write_Buf(unsigned
char
reg, unsigned
char
*pBuf, unsigned
char
bytes)
//неподписанные символ SPI_Write_Buf (неподписанные символ рег, неподписанные символ * pBuf, неподписанные символ байт)
260
{
261
unsigned
char
status,i;
//неподписанных статус символ, я;
262
263
SPI_PORT&=~CSN;
// Установить ДНС низкий, инициализации SPI tranaction
264
status = SPI_RW(reg);
// Выберите зарегистрируйтесь, чтобы написать и прочитать статус неподписанные символ
265
for
(i=0;i<bytes; i++)
// затем написать все неподписанные символ в буфере (* pBuf)
266
{
267
SPI_RW(*pBuf++);
268
}
269
SPI_PORT|=CSN;
// Установить ДНС высокой снова
270
return
(status);
// Вернуть NRF24L01 статус неподписанные символ
271
}
272
/**************************************************/
273
274
/**************************************************
275
* Function: Initialize TX & RX mode;//Функция: Инициализировать режим TX & RX;
276
*
277
* Description://Описание:
278
* This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к
279
* TX mode, set TX address, set RX address for auto.ack,//Режим Техас, установить TX-адрес, установите адрес RX для auto.ack,
280
* fill TX payload, select RF channel, datarate & TX pwr.//Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR.
281
* PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX.//PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX.
282
*
283
* ToDo: One high pulse(>10us) on CE will now send this//ToDo: Один высокий пульс (> 10us) на CE теперь отправить это
284
**************************************************/
285
void
initialize_R_T(
void
)
//недействительными initialize_R_T (недействительными)
286
{
287
SPI_PORT&=~CE;
288
289
SPI_Write_Buf(WRITE_REG + TX_ADDR, TX_ADDRESS, TX_ADR_WIDTH);
// Записывает TX_Address в NRF24L01
290
SPI_Write_Buf(WRITE_REG + RX_ADDR_P0, TX_ADDRESS, TX_ADR_WIDTH);
// RX_Addr0 же, как TX_Adr для Auto.Ack
291
292
SPI_RW_Reg(WRITE_REG + EN_AA, 0x01);
// Включить Auto.Ack: Pipe0
293
SPI_RW_Reg(WRITE_REG + EN_RXADDR, 0x01);
// Включить Pipe0
294
295
SPI_RW_Reg(WRITE_REG + RF_CH, 50);
// Выбор радиочастотного канала 50
296
SPI_RW_Reg(WRITE_REG + RF_SETUP, 0x26);
// TX_PWR: 0 дБм, DataRate: 250 Мбит, МШУ: HCURR
297
298
SPI_PORT|=CE;
299
}
300
/**************************************************
301
* Function: TX_Mode(); //Функция: TX_Mode ();
302
*
303
* Description: //Описание:
304
* This function initializes one nRF24L01 device to //Эта функция инициализирует один NRF24L01 устройство к
305
* TX mode, set TX address, set RX address for auto.ack, //Режим Техас, установить TX-адрес, установите адрес RX для auto.ack,
306
* fill TX payload, select RF channel, datarate & TX pwr. //Заполнить TX полезной нагрузки, выберите радиочастотный канал, DataRate & TX PWR.
307
* PWR_UP is set, CRC(2 unsigned chars) is enabled, & PRIM:TX. //PWR_UP установлен, КПР (2 неподписанные символов) включена, и ПРИМ: TX.
308
*
309
* ToDo: One high pulse(>10us) on CE will now send this //ToDo: Один высокий пульс (> 10us) на CE теперь отправить это
310
* packet and expext an acknowledgment from the RX device. //Пакет и expext подтверждение от устройства RX.
311
**************************************************/
312
void
TX_Mode(
void
)
//недействительными TX_Mode (недействительными)
313
{
314
SPI_PORT&=~CE;
315
316
SPI_RW_Reg(WRITE_REG + SETUP_RETR, 0x1f);
// 500us + 86us, 10 Retrans ...
317
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0e);
// Установить PWR_UP немного, включите CRC (2 неподписанные знаков) и Прим: TX. MAX_RT & TX_DS включен ..
318
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
319
320
SPI_PORT|=CE;
321
}
322
323
/**************************************************
324
* Function: RX_Mode();//Функция: RX_Mode ();
325
*
326
* Description://Описание:
327
* This function initializes one nRF24L01 device to//Эта функция инициализирует один NRF24L01 устройство к
328
* RX Mode, set RX address, writes RX payload width,//RX Режим установите RX адрес, пишет ширину RX полезной нагрузки,
329
* select RF channel, datarate & LNA HCURR.//Выберите радиочастотный канал, DataRate & МШУ HCURR.
330
* After init, CE is toggled high, which means that//После инициализации, CE переключается высокой, что означает, что
331
* this device is now ready to receive a datapacket.//Это устройство готово для приема datapacket.
332
/**************************************************/
333
void
RX_Mode(
void
)
//недействительными RX_Mode (недействительными)
334
{
335
SPI_PORT&=~CE;
336
337
SPI_RW_Reg(WRITE_REG + RX_PW_P0, TX_PLOAD_WIDTH);
// Выбор же RX ширину полезной нагрузки как TX шириной Payload
338
SPI_RW_Reg(WRITE_REG + CONFIG, 0x0f);
//Установить PWR_UP немного, включите CRC (2 неподписанные символов) & Прим: RX. Включен RX_DR ..
339
340
SPI_PORT|=CE;
// Установить CE контактный высокой для того, чтобы устройство RX
341
}
342
343
//RF transmit data function// Функция передачи данных РФ
344
void
RF_SendData(
char
*TXdata)
345
{
346
TX_Mode();
// Включить режим Tx // activate Tx mode
347
348
for
(
short
i=0; i<23;i++)
// для (короткий я = 0; я <23; я ++)
349
{
350
tx_buf[i] = (unsigned
char
)*(TXdata+i);
// Сохранить данные в массив // store the data to an array
351
}
352
353
unsigned
char
status = SPI_Read(STATUS);
// Читаем значение регистра статуса в // read register STATUS's value
354
355
if
(status&TX_DS)
// если данные готовы получить (TX_DS) прервать // if receive data ready (TX_DS) interrupt
356
{
357
SPI_RW_Reg(FLUSH_TX,0);
358
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
// Запись в TX_FIFO playload
359
}
360
if
(status&MAX_RT)
// если принимать данные готовые (MAX_RT) прервать это повтора чем SETUP_RETR
361
{
362
SPI_RW_Reg(FLUSH_TX,0);
363
SPI_Write_Buf(WR_TX_PLOAD,tx_buf,TX_PLOAD_WIDTH);
// Отключение режима Standy
364
}
365
SPI_RW_Reg(WRITE_REG+STATUS,status);
// Ясно RX_DR или TX_DS или MAX_RT флаг прерывания
366
delay(50);
367
RX_Mode();
368
}
369
370
//RF receive data function// РФ получить функцию передачи данных
371
void
RF_ReceiveData(unsigned
char
*RXdata)
// недействительными RF_ReceiveData (неподписанные символ * RXdata)
372
{
373
RX_Mode();
// Включить режим RX
374
unsigned
char
status = SPI_Read(STATUS);
// Читаем значение регистра статуса в
375
if
(status&RX_DR)
// если данные готовы получить (TX_DS) прервать
376
{
377
SPI_Read_Buf(RD_RX_PLOAD, rx_buf, TX_PLOAD_WIDTH);
// Прочитать playload в rx_buf
378
SPI_RW_Reg(FLUSH_RX,0);
// Ясно RX_FIFO
379
380
*RXdata = rx_buf[0];
// передать полученные данные в RXdata
381
Serial
.println(rx_buf[0]);
382
}
383
SPI_RW_Reg(WRITE_REG+STATUS,status);
// Ясно RX_DR или TX_DS или MAX_RT флаг прерывания
384
delay(50);
385
TX_Mode();
386
}
в строке 112 скобка открывается, а закрывающей нигде далее нету.