Дискретное радиоуправление на NRF24l01+

Мои поделки
Ответить
TechMike
Site Admin
Сообщения: 210
Зарегистрирован: Вт окт 06, 2009 3:37 pm
Контактная информация:

Дискретное радиоуправление на NRF24l01+

Сообщение TechMike »

В давние стародавние времени, 13 лет назад, была куплена радиоуправляемая машинка для себя любимого. В нее успели наиграться сыновья, а машинка была еще жива, но родной NiMH аккумулятор не выдержал пытки и почил с миром. Попытка его живить ни к ему не привела, осталось в нём емкости от 420ма/ч где-то 50-70ма/ч. Была предпринята попытка заменить его на Li-ion от ноутбуков, но электроника отказывалась нормально работать от 3,7в и глючила страшно. Попытка поставить DC-DC up до 5в. привела к судорожному дерганью ходового мотора, а напихать большой дроссель и конденсаторы по выходу DC-DC не было физически места.
И было принято решительное решение, выкинуть всю электронику в машинке и пульте и заменить своим. Пульт оказался полностью дискретным в части управления, мозгом там была PT8A977BP вот с такой схемой включения:
Image
Мозгом машинки (приемника) был собрат по несчастью PT8A978BP со схемой включения:
Image
Покопавшись в загашниках, было решено использовать в качестве мозга mega8L, для радиочасти NRF24L01+ которых было множество в наличии для использования в умном доме. В пульте (передатчике) оставлялись к использованию кнопки (ползунки) которые управляют направлением движения машинки и траекторией.
Сервомашинки в приемнике было собраны по неведомой конструкции и представляли собой по сути редуктор с DC-мотором. Характеристики, которые удалось с них снять:
Максимальный ток сервы на поворотные колеса 0.27А при 3.5в. Сопротивление сервы 17 Ом в неподвижном среднем положении, от 1ком до 150ом при выкрученных в сторону колесах.
Ток ведущих колес на холостых оборотах 0.43А при 3.5в, под нагрузкой до 2.3А и потом защита у акб срабатывает. Сопротивление на проводах ведущих колес 1.3 Ома, если их не трогать.
По размерам посадочного места в машинке (приемнике) не густо, максимальная высота платы с деталями 16мм, но не по всей площади платы, т.к. есть дырки под крепление и ограничители по краям.
Что должно быть по функционалу:
1. движение вперед и назад с регулировкой скорости (ШИМ) или на первое время просто вкл/выкл.
2. поворот в лево и вправо.
3. вкл/выкл фары спереди и габариты сзади
4. вкл/выкл проблесковых маячков из двух светодиодов на крыше машины (полицейская мигалка).
5. вкл/выкл гудка (пищалки) со звуком клаксона автомобиля.

Начнем с передатчика, т.к. с ним получилось проще всего, кроме не поместившейся в корпус платы.
Схема принципиальная:
Image
Кнопки подключены по такой схеме только ради экономии места и возможности выхода mega8 из powerdown при нажатии на любую кнопку. Совершенно не рекомендую такое решение если питания не батарейное или есть управление силовой нагрузкой, т.к. МК может ловить помехи от наводок по портам кнопок и их нужно будет шунтировать резисторами и стабилитронами. По питанию в результате была оставлена батарейка типа «Крона» и поставлен LDO AMS1117-3.3, поставлен выключатель.
Алгоритм работы передатчика:
1. Инициализировали перефирию.
2. Если нажата или отпущена одна из кнопок, то выходим из сна и отправляем в NRF состояние порта кнопок.
3. Если в течении 5 секунд кнопки не нажимают или отпускают, то уходим в Powerdown.
4. Раз в 5 секунд проверяем напряжение питания МК, если оно ниже 2.5в, то двукратно пищим.
5. Ждем нажатия или отпусканию любой из кнопок и идем в пункт 2.
В результате пультик выглядит в разобранном виде так:
Image
Image
Слева плата управления, в центре старая плата, которую выпаивать не стал, ибо не мешала.
В будущем есть планы вырезать Крону и поставить 18650, но лень.
В целом с пультом проблем было очень мало, главный косяк, что плата получилась чуть толще, чем могла поместиться в пульт, хотя все размеры снимал по несколько раз. В результате в собранном виде у пульта есть слева щель и через нее видно плату и индикацию светодиодов на ней:
Image
Кнопки на пульте имеют следующее назначение:
Image
Остальные органы управления (вперед/назад, влево/вправо) остались без изменений.

Приемник.
Схема принципиальная:
Image
Красным выделены элементы, которые пришлось добавлять уже после изготовления печатной платы на этапе монтажа.
Т.к. ходовой двигатель потреблял ток до 5А легко, то от этого МК становилось плохо, и он перезагружался, это исключается элементами: VD1, L2, C10, L3, C9. Перечисленные элементы установлены навесным монтажом.
VD2, V3, R21, R22 реализуют ШИМ-управление ходовым двигателем. Т.к. если этого не сделать, то машина превращается в адский скоростной болид, соответственно редуктор или корпус машины просто развалится после столкновения с препятствиями или от времени. Без ШИМ реализован Турбо режим, если одновременно нажать Фара+Мигалка+Гудок, таким же нажатием он и отключается.

В разобранном виде машинка выглядит так:
Image
Места у неё в нутре совсем не много:
Image
Плата управления двух этажная (из двух плат), на второй реализован H-мост по управлению ходовым двигателем:
Image
Image
Image
Следует отдельно описать работы с NRF, т.к. было много времени потрачено на превращении готовой библиотеки найденой интернетах, в рабочий вариант.
Главное проблемой были дубликаты получаемых комманд, вино тому была неправильная обработка принятой команды на приемнике, не правильно было так:
1. Ждем от NRF поднятия флага RX_DR, входим в обработчик приема;
2. Выгребаем из буфера приема команду, отправляем ее на обработку;
3. Сбрасываем флаг RX_DR.
Это в корне не верно, т.к. флаг RX_DR говорит только о факте принятия команды буфере, но команд может прийти несколько (всего буфер NRF рассчитан на 3 команды).
Правильный алгоритм такой:
1. Ждем от NRF поднятия флага RX_DR, входим в обработчик приема;
2. Выгребаем из буфера приема команду, отправляем ее на обработку;
3. Проверяем есть ли еще принятые команды по флагу RX_P_NO, если есть, то переходим к п2;
4. Сбрасываем флаг RX_DR.
Инициализация NRF используется следующая (от NRF нужна дальность но не скорость):
#define SETUP_AW_5BYTES_ADDRESS (3 << AW)
#define SETUP_RETR_DELAY_1500MKS (5 << ARD)
#define SETUP_RETR_UP_TO_5_RETRANSMIT (5 << ARC)
#define RF_SETUP_250KBPS (1 << RF_DR_LOW)
#define RF_SETUP_0DBM (3 << RF_PWR)
#define mirf_CH 10 //transmission channel
#define mirf_PAYLOAD 0 //payload lenght

mirf_write_register(EN_AA,(1<<ENAA_P0)); // включение автоподтверждения только по каналу 0
mirf_write_register(EN_RXADDR, (1 << ERX_P0) | (1 << ERX_P1)); // включение каналов 0 и 1
mirf_write_register(SETUP_AW, SETUP_AW_5BYTES_ADDRESS); // выбор длины адреса 5 байт
mirf_write_register(SETUP_RETR, SETUP_RETR_DELAY_1500MKS | SETUP_RETR_UP_TO_5_RETRANSMIT); // задаем ждать подтверждение от принимающего 1,500мс и пять попыткот нас до него достучаться
mirf_write_register(RF_SETUP, RF_SETUP_250KBPS | RF_SETUP_0DBM); // выбор скорости 250 кбит/с и мощности 0dBm
mirf_write_register(RF_CH, mirf_CH); // задаем канал преима/передачи
if (mirf_PAYLOAD!=0){
// настраиваем отправку данных фиксированной длинны
mirf_write_register(RX_PW_P0, mirf_PAYLOAD); //length of incoming payload
mirf_write_register(FEATURE,(0 << EN_DPL) | (1<<EN_ACK_PAY) | (1<<EN_DYN_ACK)); // запрещаем произвольную длинну пакета и включаем возможность отправки с подтверждение и без
}else{
// настраиваем отправку данных произвольной длинны с автоподтверждением
mirf_write_register(FEATURE,(1 << EN_DPL) | (1<<EN_ACK_PAY) | (1<<EN_DYN_ACK)); // разрешаем произвольную длинну пакета и включаем возможность отправки с подтверждение и без
mirf_write_register(DYNPD, (1 << DPL_P0)); // включение произвольной длины для канала 0
}
mirf_write_register(CONFIG, (1 << EN_CRC) | (1 << CRCO) | (1 << PWR_UP) | (1 << PRIM_RX)); // Включение CRC, питания и переход на прием

mirf_setRX; // rx mode
_delay_ms(20);
mirf_CE_hi;

Машинка в сборе выглядит так:
Image
Image
Image

Немного видео показывающее функции получившегося девайса:
https://youtu.be/g7QZsjG5lCY

Что можно еще улучшить:
1. Поставить в разрых питания H-моста полевик, чтобы снизить потребление приемника. Сейчас во схе вся схема потребяется 13ма, все это жрет именно H-мост для ходового двигателя.
2. Переделать плату в пульте (передатчик), чтобы он закрывался плотно.
3. Сделать задние стоп-сигналы, запаралелить их с фарами.

Использовались следующие ссылки по теме:
http://aterlux.ru/index.php?page=articl ... p#COMMANDS
https://openservo.org/Schematic2?action ... ematic.pdf
http://kazus.ru/forums/showthread.php?p ... ost1093653

Исходники+плата:
files/radio_auto_receiver_12022017.rar
files/radio_auto_sender_12022017.rar
Ответить