DRON v.1
- Войдите на сайт для отправки комментариев
Чт, 31/07/2014 - 11:12
Видео работы http://www.ex.ua/158011847237
Цель.
Отработка навыка построения управления электрооборудованием автомобиля :)
План по развитию.
Добавить радиопередатчик NRF24, сделать пульт управления, запрограммировать и отладить логику.
Комплектация.
Автомобиль без Р/У.
Контроллер - Arduino Nano.
Питание - 2 АКБ (сумарно 12 В).
Два драйвера L293DNE (один управляет двумя двигателями, другой - сервой).
Питание микроконтроллера от стабилизатора на 5 В.
Код управления.
int dronmode = 0; int lPin = 3; int rPin = 10; int fPin = 6; int bPin = 5; byte FBPowerMax = 50; byte FBPowerMin = 10; byte FBPowerRateStep = 10; byte FBPowerRate = 40; byte randomFBPowerRate; byte LRPowerMax = 150; byte LRPowerMin = 50; byte LRPowerRate = 100; boolean demoMode; long timer; typedef struct dron_data_struct { byte left; byte right; byte forward; byte backward; }; dron_data_struct dronstate; int movementmode = 1; int switchtimermodeTime = 5000; int currenttime = 0; void setup() { TCCR1B = TCCR1B & 0b11111000 | 0x01; TCCR2B = TCCR2B & 0b11111000 | 0x01; Serial.begin(9600); delay(5000); demoMode = true; timer = millis()+2000; } void loop() { if (Serial.available()){ String ttydata = Serial.readString(); int switchcase = 1000; if (ttydata == "s") switchcase = 0; if (ttydata == "f") switchcase = 1; if (ttydata == "b") switchcase = 2; if (ttydata == "l") switchcase = 3; if (ttydata == "r") switchcase = 4; if (ttydata == "m") switchcase = 5; if (ttydata == "pu") switchcase = 6; if (ttydata == "pd") switchcase = 7; if (ttydata == "demo") switchcase = 8;//demo switch (switchcase) { case 0: dronmode = 0; break; case 1: dronmode = 1; break; case 2: dronmode = 2; break; case 3: dronmode = 3; break; case 4: dronmode = 4; break; case 5: dronmode = 5; break; case 6: dronmode = 6; break; case 7: dronmode = 7; break; case 8: demoMode = true; timer = millis()+2000; break; } } switch (dronmode) { case 0://DRON STOP dronstate.backward = 0; dronstate.forward = 0; break; case 1: //FORWARD dronstate.backward = 0; dronstate.forward = 1; break; case 2://BACKWARD dronstate.backward = 1; dronstate.forward = 0; break; case 3: dronstate.right = 0; dronstate.left = 1; break; case 4: dronstate.right = 1; dronstate.left = 0; break; case 5: dronstate.right = 0; dronstate.left = 0; break; case 6: //speed up if ( (FBPowerRate + FBPowerRateStep) < FBPowerMax) { FBPowerRate = FBPowerRate + FBPowerRateStep; } else { FBPowerRate = FBPowerMax; } dronmode = 10001; break; case 7: //speed dw if ((FBPowerRate-FBPowerRateStep) > FBPowerMin ) { FBPowerRate = FBPowerRate - FBPowerRateStep; } else { FBPowerRate = FBPowerMin; } dronmode = 10001; break; } byte lpinpwm = dronstate.left * LRPowerRate; byte rpinpwm = dronstate.right * LRPowerRate; byte fpinpwm = dronstate.forward * (FBPowerRate + randomFBPowerRate); byte bpinpwm = dronstate.backward * (FBPowerRate + randomFBPowerRate); analogWrite(lPin, lpinpwm); analogWrite(rPin, rpinpwm); analogWrite(fPin, fpinpwm); analogWrite(bPin, bpinpwm); if (demoMode){ if (timer < millis()) { timer = millis() + 500; dronmode = random(6); randomFBPowerRate = random(10, 30); } } }
А что происходит, если НЕ
Serial
.available()
в строке 051 ?Через каждые 500 мс дрон случайно куда-нибудь движется, если включен DemoMode?
ссылка не открывается
Сериал использую для отладки, а так да - каждые 500 мс дрон демонстрирует свои возможности для детей и кота. Мощность движков зажата ШИМ-мом, иначе разобьется, не дождавшись апгрейда. Ссылку проверил, работает.
Роскомнадзор внес украинский файлообмениик Ex.ua в реестр страниц, содержащих запрещенную к распространению на местности России информацию.
Нужно отметить, что и до решения русского ведомства Ex.ua был недоступен на местности России и иных государств(не считая Украины)без применения прокси либо Tor.
интересно конечно посмотреть на это "случайное" поведение, может опубликуете видео на какойнибудь доступный ресурс?
человек выложил на украинском ресурсе и думает из россии к нему есть доступ
или это специально? для всех кроме россии. неужели и сюда добралась политика
есть же youtube для видео
Злого умысла не было, ранее пользовался ех и ни у кого проблем не было с доступом, разобрался с ютубом, сорри за сложности, попробуйте
http://youtu.be/2w_rBUMYzuQ
да, хороший эксперимент получился со случайным движением
может я не понял. а где случайное движение?
Автомобиль дополнился радиомодулем NRF24 и получил обновленную программу без "демо" режима. Пульт управления - Комп->Arduino Nano -> NRF24. Теперь через постоянные интервалы милливремени пульт выдает команды автомобилю, которые можно забивать в сериале. На пульте пока сделал одну лишь кнопку "хальт". Планы - дополнить его индикаторами заряда АКБ автомобиля, парой тумблеров (вперед/стоп/назад, налево/выровнять/вправо), и парой потенциометров для управления скоростью и усилием на руле.
Если кому интересно - код:
На 12 В резво гоняет!
не нашел вашего шасси в интернете. могли бы привести ссылочку?
Видео работы
https://www.youtube.com/watch?v=NKV39eTrwMo&feature=youtu.be
http://rozetka.com.ua/maisto_81156_green/p308224/
спасибо. можете приложить фото двигателя который у вас стоит?
и еще. не боитесь что щетки сгорят от 12В? машинка вроде на 6В. я фото изза этого и спросил, чтобы понять какие там щетки стоят
Сорри, но "ходовую" не разбирал. Что там за моторы - можно только догадываться, скорее всего самое бюджетное. Оригинальное питание 6 В было, а то, что щетки могут сгореть - это их (щеток) проблемы. Скорей бы сгорели, хороший повод посмотреть, как там все устроено, и будет потребность улучшить дрона :).
ага. кажись они и есть самые дешевые
только у меня от 7,5-8,4В сгорели через какое то время. но купить такой двигатель не проблема
я вообще, так как срочно нужно было, из куска жести сделал самодельные. и ничего работают
В процессе отработки схемы радиоуправления столкнулся с проблемой - МК (Nano) пульта управления гарантированно зависал с таким куском кода:
if (tikmill < millis()){
radio.stopListening();
radio.write( &NRF_Send, sizeof(NRF_Send) );
radio.startListening();
tikmill = millis() + tikmilldelta;
digitalWrite(led, LOW);
}
Методом перебора проблему удалось обойти отказом от использования IF ! Теперь, в алгоритме изменение - МК постоянно в loop-e шлет дрону команды, а не через определенный интервал.
В качестве эксперимента брал "чистый" МК без всяких внешних устройств, прогружал в него скетч - он так же зависал в течение минуты работы.
В итоге код до безобразия упростил, and it works, but I don't know how.
возник вопрос. открываете 2 канала на прием и передачу. все нормально работает?
Я правильно понял, в коде дрона нужно изменить каналы передачи/приема?
ПУЛЬТ
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
ДРОН
radio.openWritingPipe(pipes[1]);
radio.openReadingPipe(1,pipes[0]);
Спасибо за подсказку, попробую.
вроде как да. а то получается странно. и шлют оба в одном, а принимают оба в другом. как при этом у вас связь работает не пойму
вот и хотел узнать как у вас все работает и все ли хорошо
..Мдаа. А ведь такой ошибочный код все еще работает на другом моем проекте (летательный аппарат), на котором я долго возился в обеспечении устойчивости связи. Столько было танцев с бубнами - кондеры на питание, стабилизаторы питания, компоновка, код.. Если б оно вообще тогда не заработало - был бы стимул разобраться с примерами из RF24 внимательнее ;-)
так там и так работает? интересно почему
Да, работает и так. Чудеса да и только, я ранее описывал тот проект http://arduino.ru/forum/programmirovanie/nrf24l01?page=10#comment-64263
Тогда проблему с неустойчивой связью свалил на плохое питание :), и решил лишь за счет стабилизации питания. Но в дроне номер с использованием одних и тех же каналов не прошел, либо наконец-то проявил себя.
все равно странно. менять пробовали как в 18 посте?
рукой трогать чтобы работало. да. странно
Попробую, понаблюдаю и отпишусь на днях.
Указание каналов не помогает, добавление указанного условия в код приводит к зависанию МК. Т.е. проблема была не в каналах.
Спишу это обстоятельство на особенность использования МК с радиомодулем.
сделайте простую программу чтобы друг другу слали и одновременно считывали данные и смотрите их в терминале например
начните с односторонней связи
слать например числа из цикла чтобы отследить изменения
С этим проблем нет - с передачей и приемом.
Но есть два вопроса:
1. почему связь между модулями есть в случае, когда неверно указываются одни и те же каналы в МК-х. Зачем каналы специально обрабатывать, если оно и так работает :?)
radio.openWritingPipe(pipes[0]);
radio.openReadingPipe(1,pipes[1]);
2. почему зависает МК при выполнении кода (и не важно, есть NRF24, нет его)
if (tik < millis()){ radio.stopListening();
radio.write( &NRF_Send, sizeof(NRF_Send) );
radio.startListening();
digitalWrite(led, LOW);
tik = millis() + tikD;
}
и все работает стабильно при коде без IF
radio.write( &NRF_Send, sizeof(NRF_Send) );
radio.startListening();
digitalWrite(led, LOW);
Мистика.
Сделал пульт (Nano + nRF24 + два тумблера (вперед-стоять-назад, влево-ровно-вправо) + два потенциометра (скорость, угол поворота передних колес)). Оптимизировал для него код:
Ранее задокументированные упражнения с дроном позволили таки наладить управление им, но аппарат при движении дергался, а через небольшое время работы управление переставало работать вообще. Допил программного обеспечения пульта
и дрона
позволил добиться стабильной работы лишь в случае, когда пульт питается от USB-порта компа. Попытки запитать МК от различных блоков питания ничем хорошим не заканчились, проблему с питанием таким образом удалось локализовать. Рабочим оказался следующий вариант - с АКБ 5В питание подается на +5В МК.
Видео работы.
http://youtu.be/YhaRagsUNgk
Сейчас один драйвер L293D управляет двумя моторами (полный привод).
Так вот, при его нагреве мощность падает (на видео есть моменты, когда дрон либо не может забраться на препятствие, либо его запросто перелетает).
Для устранения этой неприятности поставлю по отдельному драйверу на каждый мотор и попробую приладить к ним радиаторы.
До отдельного драйвера руки не дошли, но из микросхем L293D сделал бутерброд, упаковал в итоге все в корпус, чтобы все было "как было", и в таком состоянии машина отгоняла полчаса по пересеченной местности.
Прикольно было наблюдать со стороны за тем, как дроном управлял ребенок 4,5 лет, и за машиной бегали дети поменьше толпой , как цыплята. Отсутствие простейшей системы охлаждения на драйверах закончилось живописным дымом. Теперь думаю, как бы наладить охлаждение.
на модули NRF24 по питанию нужно прямо на плате припоять конденсаторы.