Радиоуправление на Ардуино.

forfrends
Offline
Зарегистрирован: 24.02.2015

Всем добрый день! Решил сделать радиоуправление (для машинки) на Arduino Pro Mini (Mega168). Принцип такой: передатчик (Pro Mini Mega168) передает 1 байт в котором первые 4 бита - напрвление движения и управление поворотами. В подробности не буду вдаваться - прикреплю скетчи передатчика и приемника - там все расписано. Схема управления в машинке простая:

2 аккумулятора 18650 - от них понижалка LM2596 на 5 вольт - все это питает Ардуинку + серву(повороты) + H-мост моторчика. От LM2596 идет еще понижалка 1117 на 3.3 вольта для питания радиомодуля nrf24l01+.

Схема работает отлично без каких-либо проблем. НО! Надо сделать радиоуправляемой другую машинку. И тут пришлось "изголяться". Машинка типа "Баги", внутреннего пространства почти нет, по этому пришлось вместо 2-х аккумуляторов 18650 ставить один аккумулятор cga103450 (плоский и меньше чем 18650) + повышалку MT3608 на 5 вольт для работы схемы. Еще дно изменение: вместо радиомодуля nrf24l01+ поставил китайскую копию SE8R01. Схема (щелкните для увеличения):

Фото схемы внутри машинки (ногами не пинайте, это пока тестовая сборка) :

 

На первом фото виднеется слева повышалка, потом идет серва, ардуина и радиомодуль. На втором фото в отсеке для батареек расположился H-мост и аккумулятор.

Суть проблемы в чем: при включении (если есть связь с передатчиком) ардуина в машинке мигает светодиодом (пин 13) в качестве индикатора что связь с передатчиком (управлением) есть и принимаются данные - это нормальный рабочий режим. При управлении Вправо-Влево управление идет без проблем, сервопривод поворачивает колеса, но если нажать Вперед или Назад то начинается что-то непонятное: ардуина в машинке перестает моргать светодиодом (он гаснет) и секунду-две никак не отвечает на управление, ни на Повороты ни Вперед-Назад. Через секунду - две ардуина развисает. Если при этом ничего на пульте не нажато то машинка может проехать сантиметров 10-15, остановиться, и опять моргать светодиодом и реагировать на повороты. Если же во время "развисания" ардуины передается команда Вперед-Назад то машинка 1 раз дернется и опять зависнет на 1-2 секунды.

Если отключить моторчик от H-моста то подобных зависаний нет, но если вместо моторчика поставить хоть какую-то нагрузку (светодиод) то история опять повторяется. Получается что вся беда в H-мосте (когда к нему хоть что-то подключено). Но почему - не понятно. Платку моста снял с машинки. Платка раньше работала без проблем. В чем может быть причина? Из-за чего такой глюк может быть?

Ссылка на архив со скетчами: http://forex4uplus.ru/SE8R01.rar

Волшебник
Offline
Зарегистрирован: 22.12.2016

Мотор когда стартует, ток жрёт как конь, раз в 5 от номинала, а если с нагрузкой - как в машинке, то вообще труба. Диагноз -питание 5В у вас проседает, ардуино и перезапускается. Вариантов решения несколько

- раздельные повышайки на мотор и на ардуино

- изолировать ардуино по 5В, т.е. поставить диод и электролит потолще, если питание просядет то конденасатор поддержит ардуино на 1-3 секунды.

-повышайку помощнее, и конденсаторы потолще <до> и <после>

forfrends
Offline
Зарегистрирован: 24.02.2015

Попробую разделить питание через диод. Но прикол в том что "зависание" происходит даже если вместо мотора стоит обычный диод, который потребляет всего 15 мА и никакой просадки напряжения не вызывает. Вечером попробую. Может разделение питания на что-то повлияет.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

мотор питается от повышающего преобразователя?

SE8R01 нормально работает? я так и не смог запустить почему то. у меня правда черные

forfrends
Offline
Зарегистрирован: 24.02.2015
В общем... о результатах:
Тест 1: на выходе повышалки поставил конденсатор 3300 мф 10 вольт. С этой точки питаются серва и мотор. Так же подключил диод (1N4007) и на него тоже конденсатор 3300х10. С этой точки питается ардуина и передатчик. Результат: на ардуине и передатчике ток вовсе не просаживается (при выключении машинки светодиод на ардуине горит еще 2-3 секунды). НО зависания и дергания остались.
Тест 2: все питания собрал в кучу и запитал от внешнего БП 5в 2А - Результат тот же: зависания и дергания. Вывод: дело не в повышалке, а в самой схеме, так как питания вполне достаточно.
Тест 3: питание моторчика поставил напрямую от аккумулятора (перед повышалкой). Все остальное запитал от повышалки. Результат: Нет никаких глюков, все работает четко. НО скорость машинки оставляет желать лучшего... Вывод: Питание для моторчика нужно повышать.
 
Н-мост я не переделывал так как: 1) выдран со старой р/у машинки где раньше нормально работал. 2) он уже был у меня в работе на другой машинке (проблем не было). 3) он соответствует схеме из 1-го поста, а схема взята здесь: http://www.radiokot.ru/forum/viewtopic.php?f=22&t=26398 
 
Управление что я делаю сейчас отличается от тех что были раньше только радиомодулем (SE8R01 вместо nrf24l01+) и повышающим преобразователем вместо понижающего. Тесты показали что дело не в преобразователе. Похоже что проблема с SE8R01... скорее всего она как-то ловит наводки по питанию. Ставить отдельную повышалку для мотора... не рентабельно и.. НЕ СПОРТИВНО! :))
 
Можно ли как-то развязать питание? То есть от повышалки запитать все устройства, но "развязать" мотор и все остальное? Попробовал моторчик подключить через диод, но он работал как-то вяло а проблемы с зависаниями и дерганиями остались. Как правильно развязывать питание?
 
По SE8R01: у нее есть свои "особенности" подключенияя, и она не работает с библиотеками от nrf24l01+. Как я их подключал и библиотека к ним: http://forum.amperka.ru/threads/nrf24l01-%D0%BF%D0%BE%D0%B1%D0%B5%D0%B6%D0%B4%D0%B0%D0%B5%D0%BC-%D0%BC%D0%BE%D0%B4%D1%83%D0%BB%D1%8C.3205/page-60#post-95110
forfrends
Offline
Зарегистрирован: 24.02.2015

Попробовал соединить все устройства и запитать от одного хорошего источника - сбоев небыло вообще. Значит вся беда в повышалке - она не справляется с нагрузкой. Заменить ее нечем :( В общем, решений проблемы несколько:

1) поставить отдельную повышалку для мотора (мне этот вариант не подходти)

2) сделать развязку по питанию для мотора и електроники. Мне этот вариант подходит более всего, но Как ее сделать? Пробовал питать ардуину через L-C фильтр, но толку почти нет.

3) заменить/переделать повышалку, так как она не справляется с такими нагрузками... Опять же: как повысить ПКД повышалки?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

или так

forfrends
Offline
Зарегистрирован: 24.02.2015

Тоже неплохой вариант. К сожалению 2 батареи мне просто некуда вставить, а про диод паралельно матору я забыл!!! Попробую, может будет какой-то эффект!

forfrends
Offline
Зарегистрирован: 24.02.2015

В общем... после 1000 и 1 теста... выявил причину проблем - аккумулятор.

Если вместо cga103450 поставить банку 18650 - все "глюки" исчезают. Почему система не дружит с cga103450 - не понятно. Даже если полностью зарядить результат тот же. В то же время если поставить 18650 (даже если она на половину разряжена) то проблем не возникает. От cga103450 при попытке езды вперед-назад (включение мотора) ардуина перезагружается. Если использовать 18650 то ардуина не сбрасывается. Тестировал cga103450 - подключал мотор напрямую - батарея нормально может отдавать 1.5 Ампера...

В общем я в ступоре. Почему это происходит - не понятно. Никто не знает что это за "прикол" такой, и можно его победить?

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

Посмотрите осциллографом питание в момент включения мотора.

forfrends
Offline
Зарегистрирован: 24.02.2015

Увы, осциллографа нет. Только тестер.

Почесал я репу, плюнул, и решил разобрать один аккумулятор. Вот что было внутри:

 

Что это? Контроллер (защита)? Предохранитель? Эта штука все и портила, не спасали никакие диоды - конденсаторы - LC-фильтры. Подключил аккумулятор напрямую, и все заработало как часы! А столько вечеров потратил что бы найти проблему!

Волшебник
Offline
Зарегистрирован: 22.12.2016

А огнетушитель дома есть? Тогда выкидывай защиту.

ardo
Offline
Зарегистрирован: 23.11.2016

Можно попробовать отделить ардуину от Н моста оптронами, нужно проверить какой ток в портах ардуины на Н мост в момент исполнения команд.

md750
Offline
Зарегистрирован: 30.03.2017

forfrends пишет:

Что это? Контроллер (защита)? Предохранитель? Эта штука все и портила, не спасали никакие диоды - конденсаторы - LC-фильтры. Подключил аккумулятор напрямую, и все заработало как часы! А столько вечеров потратил что бы найти проблему!

Это защита. Выкинуть ее, вместо нее купить защиту расчитанную на бОльшие токи. Ардуиной контролировать ее питание и при падении меньше 2.8 отрубать выключать моторы. Либо использовать модуль на tp4056 у которого есть выход на нагрузку. 

mag155
Offline
Зарегистрирован: 21.12.2017

Всем привет вопрос по радиоуправлению.

 

Начал писать скетч и все работает на релле . Но вот хочу управлять шимом по радиоканалу монитор порта показывает изменения значения при повороте потенциометра и  analogWrite(3,val); работает . Но вот ка это все передать в радиоканал а потом еще и принять ??? Опыта совсем мало поэтому не судите строго.

mag155
Offline
Зарегистрирован: 21.12.2017
#define potent_pin 3 
#include <SoftwareSerial.h>
SoftwareSerial radio(6, 7); // RX, TX

int val;               

void setup() {
  Serial.begin(9600);
  radio.begin(9600);
}

void loop() {
  val = analogRead(potent_pin);     
  val = map(val, 0, 1200, 0, 250);  
  val = constrain(val, 0, 250);    
        
  analogWrite(3,val);
radio.print(val);
 Serial.println(val);
}

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

радиомодули аналоговые?

Гриша
Offline
Зарегистрирован: 27.04.2014

jeka_tm пишет:

радиомодули аналоговые?

полезнее будет спросить полное описание, и если есть, ссылку... ИМХО

mag155
Offline
Зарегистрирован: 21.12.2017

Модули HC 12 . Работают так . получил 1 передал 1.

mag155
Offline
Зарегистрирован: 21.12.2017
jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

 а в чем тогда проблема))) радиомодуль все за тебя делает.  просто отправляй и принимай

Гриша
Offline
Зарегистрирован: 27.04.2014

mag155 пишет:

Модули HC 12 . Работают так . получил 1 передал 1.

в скетче из поста 15 прокоментируйте каждую строку т.е. что за что отвечает и что делает. Особенно строку 18.

jeka_tm пишет:

 а в чем тогда проблема))) радиомодуль все за тебя делает.  просто отправляй и принимай

так mag155 вообще не понимает, что делать - учится... 

mag155
Offline
Зарегистрирован: 21.12.2017
#define potent_pin 3  
#include <SoftwareSerial.h>
SoftwareSerial radio(6, 7); // RX, TX

int val;               // переменная для хранения значения с потенциометра

void setup() {
  Serial.begin(9600);
  radio.begin(9600);
}

void loop() {
  val = analogRead(potent_pin);     // запомнить показания с потенциометра
  val = map(val, 0, 1200, 0, 250);   // перевести в диапазон 0.. 10
  val = constrain(val, 0, 250);      // ограничить диапазон 0.. 10
        // вывести в порт
  analogWrite(3,val);
radio.print(val);
 Serial.println(val);
}

 

mag155
Offline
Зарегистрирован: 21.12.2017

Я действителтно только учусь . 18 строке выводим  згначение val  в радиоканал (если я конечно не заблуждаюсь) но приемник принимает только от 1 до 10 . А не от 1 до 255 вчем проблема не пойму? 

mag155
Offline
Зарегистрирован: 21.12.2017
#include <SoftwareSerial.h>
SoftwareSerial radio(6, 7); // RX, TX
void setup() {
Serial.begin(9600); 
radio.begin(9600);
pinMode(3, OUTPUT);
}
void loop(){
  char val = radio.read();
 analogWrite(3,val);
}

 

mag155
Offline
Зарегистрирован: 21.12.2017

Это приемник и он совсем кривой. Не судите уж студента . 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

https://www.youtube.com/watch?v=Z6Z9y6v6vsc

ну вот тебе тогда видео от ребенка)

mag155
Offline
Зарегистрирован: 21.12.2017

Как кнопку подключить мне понятно . Не понятно как шимом управлять?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

так отправляй свой шим и принимай его. смысл одинаковый. как раз в 8 бит умещается

if(radio.available()) {

   analogWrite(3, radio.read());

}

 

mag155
Offline
Зарегистрирован: 21.12.2017
void loop() {
  buttonState = digitalRead(buttonPin); 
   buttonState1 = digitalRead(buttonPin1); 
    buttonState2 = digitalRead(buttonPin2);  
 
    
   

   if (buttonState == 1) {
    radio.print("3");
    
         }

Так работает кнопка. Подкоректируйте под шим ?

mag155
Offline
Зарегистрирован: 21.12.2017
radio.print(val);

Не получается считать val приемником ???

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не понял

mag155
Offline
Зарегистрирован: 21.12.2017

Передаю 

radio.print(val);

Передатчик значение val передатчика через ком порт видно что нормально работает.

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну и хорошо. я давал кусок для приемника

 

mag155
Offline
Зарегистрирован: 21.12.2017

Ловлю приемником 

if (radio.available()>0 ) { 
   char val = radio.read();
 val = constrain(val, 0, 250); 

analogWrite(5, val);
 Serial.println(val);

и значение val показывает на от 0 до 255 а просто скачут цыфры от 0 до 10 . 

mag155
Offline
Зарегистрирован: 21.12.2017

3 строка по  ходу не нужна

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

там еще преобразовывать же надо

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
if (radio.available() > 0 ) {
  char val = radio.read();
  int value = atoi(val);
  analogWrite(5, value);
  Serial.println(value);
}
так вроде
mag155
Offline
Зарегистрирован: 21.12.2017

Не работает в ком порту ноли и изридка пробегают цыфры.

mag155
Offline
Зарегистрирован: 21.12.2017

????

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

в примере нет radio.available(). Может там это не предусмотрено, врядли конечно. Попробуй удалить. А вообще гугли общение ардуин по uart

mag155
Offline
Зарегистрирован: 21.12.2017

Я так понимаю нужно преобразовть значение и вывести в  analogWrite?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

для начала в терминал шли, но вообще да

Гриша
Offline
Зарегистрирован: 27.04.2014

jeka_tm, в посте 19 ссылка, там пример TX and RX , у ТС осложнение - у него еще есть кнопки... это означает, что  ему нужно  разбить char, и первые 2 бита (или больше) использовать для маски (2 кнопки + ШИМ). и вообще поменять char на byte...

Сейчас ТС даже посылками обменяться не может.

Я бы и рад помочь, но тут проще самому код написать, чем объяснить.

mag155,  вы можете забыть про кнопки и написать код для ШИМ который будет работать, и вылажить его в эту тему (оба скетча)? 

mag155
Offline
Зарегистрирован: 21.12.2017

Сейчас пытаюсь

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

Кнопки я видно пропустил. Тогда целую строку надо отправлять. А ведь даже двоичное число нужно нужно собирать из цифр, плюс всякие разделители использовать наверно если еще и кнопки. Хотя наверно безразмерный массив, парсим, для кнопок забиты конкретные символы, и по ним можно ориентироваться, без разделителей, например NP15 будет соответствовать нажаты обе кнопки  и шим 15. 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

заполняем массив. проверяем состав, определяем буквы, буквы в кнопки, после них остальное собираем в число

Гриша
Offline
Зарегистрирован: 27.04.2014

jeka_tm пишет:

Кнопки я видно пропустил. Тогда целую строку надо отправлять. А ведь даже двоичное число нужно нужно собирать из цифр, плюс всякие разделители использовать наверно если еще и кнопки. Хотя наверно безразмерный массив, парсим, для кнопок забиты конкретные символы, и по ним можно ориентироваться, без разделителей, например NP15 будет соответствовать нажаты обе кнопки  и шим 15. 

 о том и речь, есть вариант побайтно отправлять. Если первые 2 бита 01 - кн1, 10 - кн2, 11 - шим. и 6 бит данных - кнопкам много, а ШИМу может нехватить.

mag155
Offline
Зарегистрирован: 21.12.2017
 val = analogRead(potent_pin);     // запомнить показания с потенциометра
  val = map(val, 0, 1200, 0, 250);   // перевести в диапазон 0.. 10
  val = constrain(val, 0, 250);      // ограничить диапазон 0.. 10
        // вывести в порт
  analogWrite(3,val);
radio.print(val);
 Serial.println(val);
}

передатчик с приемником проблема ?

b707
Offline
Зарегистрирован: 26.05.2017

mag155 - вы передатчиком отправляете значение функцией print. Отправляется, например, строка "144". А потом в приемнике читаете функцией read() только первый символ - то есть "1". Отправляйте не строки, а байты - функцией write(). читайте не символы - а тоже байты!

Это как минимум четвертая или пятая ветка, где вы спрашиваете об одном и том же. Ровно точно так же вы тупили по теме отправки данных по Сериал. Сколько можно-то? Вы студент? В каком вузе держат таких тупиц? На платном отделении, что ль, за папины денежки?

mag155
Offline
Зарегистрирован: 21.12.2017

Значение с val почему то не считывается в приемнике ???