Радиоуправляемая модель танка
- Войдите на сайт для отправки комментариев
Уважаемые форумчане, затеял приобщение сына к программированию через создание проектов на базе Ардуино. Всякую мелочёвку по книжке для чайников уже попробовали и решили (ну может и я решил), что интереснее будет разбираться в теме через какой нибудь глобальный проект. Ширпотребовскую машинку на 4х колёсах с сонаром и датчиками линии погоняли по квартире. СКУЧНО!))) Решено соорудить танк на радиоуправлении. В итоговом варианте он должен ездить в любых направлениях с изменением скорости, поворачивать башню, поднимать и опускать пушку, стрелять, при переключении в автономный режим самостоятельно двигаться объезжая препятствия, распознавать внесённые в память цели и их уничтожать, естественно передавать на пульт управления видеоизображение. Конечная цель проекта не физический объект а программа управления, в которой ребёнок будет понимать каждую запятую.
На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.
Вот передача видео и распознавание образов на ардуино - это пожалуй перебор. А в остальном это развитие, модификация уже имеющейся машинки.
На данный момент отрабатываем движение тележки танка с управлением через блютус. Выкладываю полный скечт. Всё работает, но не могу найти объяснения по работе в нём некоторых функций.
//Управляем роботом с помощью BLUETOOTH. //В качестве управляющего устройства используем ANDROID устройство с программой Bluetooth RC Controller. #include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты // *********************** Установка выводов моторов ************************ int MotorLeftSpeed = 9; // Левый (А) мотор СКОРОСТЬ — ENA int MotorLeftForward = 6; // Левый (А) мотор ВПЕРЕД — IN1 int MotorLeftBack = 7; // Левый (А) мотор НАЗАД — IN2 int MotorRightForward = 4; // Правый (В) мотор ВПЕРЕД — IN3 int MotorRightBack = 5; // Правый (В) мотор НАЗАД — IN4 int MotorRightSpeed = 3; // Правый (В) мотор СКОРОСТЬ — ENB // ********************** Для управления по блютуз **************************** // Соединяем BT module TX на пин 10 // Соединяем BT module RX на пин 11 // Соединяем BT Vcc to 5V, GND to GND SoftwareSerial BT(10, 11); //Создаём "виртуальный" serial port/UART char btCommand = 'S'; // Задаем переменную btCommand (BLUETOOTHкоманда) — по умолчанию "S" — СТОП // ********************************** SETUP *********************************** void setup () { BT.begin(9600); // Устанавливаем скорость передачи данных по Bluetooth BT.println("Hello from Tank"); // Посылаем тестовое сообщение на блютус устройство //****************** Настраиваем параметры выводов ARDUINO ****************** pinMode (MotorLeftForward, OUTPUT); pinMode (MotorLeftBack, OUTPUT); pinMode (MotorLeftSpeed, OUTPUT); pinMode (MotorRightForward, OUTPUT); pinMode (MotorRightBack, OUTPUT); pinMode (MotorRightSpeed, OUTPUT); } // ****************** Задаем основные направления движения ****************** void forward (int a) // ВПЕРЕД { digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, HIGH); analogWrite (MotorRightSpeed, 255); digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, HIGH); analogWrite (MotorLeftSpeed, 225); delay (a * 50); } void right (int b) // ПОВОРОТ ВПРАВО (одна гусеница) { digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, HIGH); analogWrite (MotorLeftSpeed, 200); digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, LOW); delay (b * 50); } void left (int c) // ПОВОРОТ ВЛЕВО (одна гусеница) { digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, HIGH); analogWrite (MotorRightSpeed, 200); digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, LOW); delay (c * 50); } void turnR (int d) // РАЗВОРОТ ВПРАВО (две гусеницы) { digitalWrite (MotorRightBack, HIGH); digitalWrite (MotorRightForward, LOW); analogWrite (MotorRightSpeed, 200); digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, HIGH); analogWrite (MotorLeftSpeed, 200); delay (d * 50); } void turnL (int e) // РАЗВОРОТ ВЛЕВО (две гусеницы) { digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, HIGH); analogWrite (MotorRightSpeed, 200); digitalWrite (MotorLeftBack, HIGH); digitalWrite (MotorLeftForward, LOW); analogWrite (MotorLeftSpeed, 200); delay (e * 50); } void stopp (int f) // СТОП { digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, LOW); digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, LOW); delay (f * 50); } void back (int g) // НАЗАД { digitalWrite (MotorRightBack, HIGH); digitalWrite (MotorRightForward, LOW); analogWrite (MotorRightSpeed, 255); digitalWrite (MotorLeftBack, HIGH); digitalWrite (MotorLeftForward, LOW); analogWrite (MotorLeftSpeed, 225); delay (g * 50); } // ********************* Управление по БЛЮТУЗ **************************** void loop() { if (BT.available() > 0)// В случае если в виртуальном "Серийном порту" есть информация { btCommand = BT.read(); // Считываем инвормацию с "Серийного порта" BT.println(btCommand); // Печатаем инвормацию полученную с "Серийного порта" — необходио в слуае отладки программы switch (btCommand) // Отрабатывем в соотвествии с поступившей командой { case 'F': forward (3); // едем ВПЕРЕД break; case 'B': back (3); // едем НАЗАД break; case 'R': right (3); // поворачиваем ВПРАВО break; case 'L': left (3); // поворачиваем ВЛЕВО break; case 'G': turnL (3); // разворот ВЛЕВО break; case 'I': turnR (3); // разворот ВПРАВО break; case 'S': stopp (3); // СТОП! break; } } }?
Может кто нибудь объяснить для чего сдесь эта переменная (int a), и зачем в функции delay эта переменная умножается на 50.
Как это работает и для чего?
// ****************** Задаем основные направления движения ****************** void forward (int a) // ВПЕРЕД { digitalWrite (MotorRightBack, LOW); digitalWrite (MotorRightForward, HIGH); analogWrite (MotorRightSpeed, 255); digitalWrite (MotorLeftBack, LOW); digitalWrite (MotorLeftForward, HIGH); analogWrite (MotorLeftSpeed, 225); delay (a * 50); }В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.
void loop() { if (BT.available() > 0)// В случае если в виртуальном "Серийном порту" есть информация { btCommand = BT.read(); // Считываем инвормацию с "Серийного порта" BT.println(btCommand); // Печатаем инвормацию полученную с "Серийного порта" — необходио в слуае отладки программы switch (btCommand) // Отрабатывем в соотвествии с поступившей командой { case 'F': forward (3); // едем ВПЕРЕД break; case 'B': back (3); // едем НАЗАД break; case 'R': right (3); // поворачиваем ВПРАВО break; case 'L': left (3); // поворачиваем ВЛЕВО break; case 'G': turnL (3); // разворот ВЛЕВО break; case 'I': turnR (3); // разворот ВПРАВО break; case 'S': stopp (3); // СТОП! break; } } }Почему перебор? Если есть модули для Ардуино способные распознавать форму и цвет предметов, а передача видео сейчас вообще как за хлебом сходить.
В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.
void loop() { if (BT.available() > 0)// В случае если в виртуальном "Серийном порту" есть информация { btCommand = BT.read(); // Считываем инвормацию с "Серийного порта" BT.println(btCommand); // Печатаем инвормацию полученную с "Серийного порта" — необходио в слуае отладки программы switch (btCommand) // Отрабатывем в соотвествии с поступившей командой { case 'F': forward (3); // едем ВПЕРЕД break; case 'B': back (3); // едем НАЗАД break; case 'R': right (3); // поворачиваем ВПРАВО break; case 'L': left (3); // поворачиваем ВЛЕВО break; case 'G': turnL (3); // разворот ВЛЕВО break; case 'I': turnR (3); // разворот ВПРАВО break; case 'S': stopp (3); // СТОП! break; } } }очень справочно ответ можно найти вот тут и в строках после 042 пост2 ... и начинайте писать свои скетчи - быстрее поймете. И ищите уроки, в инете их много, начните с простых.
и не ждите ответов - ответ можите получить только на конкретный вопрос, типа этого... и не валите вопросы в кучу пока не разбиретесь с предыдущим.
На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.
На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.
А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?
А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?
Да.
А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?
Да.
Спасибо честный ответ! Надеюсь знающие и отзывчивые люди сюда тоже иногда заглядывают!
А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?
тут помогают и направляют, но учителей тут нет. ОСНОВНАЯ претензия - вы пришли с чужим кодом, где взяли, там и ищите помощи.
почитайте этот топик, поймете о чем речь... пытались научить... сложно это...
А теперь по существу писать надо программу так что бы в ней можно что-то менять и модернизировать. А скетч написан так, что или пользуйтесь что есть или пишите новый заново под новые задачи. По факту бестолковый скетч. А учиться толковые скетчи Вы не желаете.
А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?
тут помогают и направляют, но учителей тут нет. ОСНОВНАЯ претензия - вы пришли с чужим кодом, где взяли, там и ищите помощи.
Этот код я скомпановал сам из разных проектов, частично написал сам, и настроил под своё железо. И оно работает. Код отвечающий за управление движением с какого то англоязычного сайта. Это наиболее интересный код. В книжках и рунете какие-то корявые и громоздкие варианты. Поэтому хочу понять принцип работы именно этого кода.
А теперь по существу писать надо программу так что бы в ней можно что-то менять и модернизировать. А скетч написан так, что или пользуйтесь что есть или пишите новый заново под новые задачи. По факту бестолковый скетч. А учиться толковые скетчи Вы не желаете.
А приведите пример бестолковости. И как бы Вы написли толково. Только с аргументами.
Сравните
и 
Первый громоздкий, а второй то что надо. И никаких сложностей.
https://www.drive2.ru/b/2867939/
Вот тут ваши кампановки уже стащили.
И да я Вам не смогу помочь. У меня горомоздкие вещи на ваш взгляд выйдут.
ПС:от сюда #39 и дальше
В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.
обычно если хочу узнать ставлю в скобках вместо троечки другую цифру, скомпилируйте и увидите, там шаг какой то скорее всего. А если не увидите разницы, то например если код новый для вас, и разницы в нем нет, его можно выкинуть. Здесь похоже троечка нужна, нужна скорее всего для какого то шага. Лучше скомпилировать с другой цифрой. Насчёт
a*50 delay - автору захотелось нагородить огород, напишите просто delay (50), возможно автор кода думал о другом когда писал код, или среда ардуино вынудила его нагородить огород сказав что не откомпилирует без огорода. Обычно в ардуино такие объяснения неизвестному коду. Я бы объяснил это так. delay убрал бы a, он явно попал из другого кода возможно. Например могло быть ещё и a которое меняется. Но в коде осталось только delay, а а лишний возможно. Компилируйте и убирайте а пробуйте, если разницы нет что с ним что без него, выбрасывайте код будет меньше и быстрее.
Мне думается)), что изначально delay(a*50) делался для задания поворотов на определенный угол. Где "а" и есть этот самый угол. А ТС уже в лоб напихал его и куда надо и не надо.
aduardrud, все ваши вопросы на одну тему - функция.
найдите, что это за зверь и с чем его едят ....
aduardrud, все ваши вопросы на одну тему - функция.
найдите, что это за зверь и с чем его едят ....
в посте 7 этого топика уже написано... немного
да, там все что нужно есть +1
И да я Вам не смогу помочь. У меня горомоздкие вещи на ваш взгляд выйдут.
ПС:от сюда #39 и дальше
Спасибо! Изучу, протестирую на своей тележке и отпишусь.
Как может функция задержки быть задающей для поворота?
Учите основы, потом будете людей в заблуждение вводить.
Эта переменная задаёт задержку, а умножая её на 50 могу предположить что это задержки в половину 10-й части секунды, умноженые на эту переменную.
По поводу 3-й ки...
Смотрим в код, а именно сюда
042// ****************** Задаем основные направления движения ******************043044voidforward (inta)// ВПЕРЕД045{Видим, что для функции forward нужна входная величина в виде переменной "а".
Далее в коде эта переменная и создаёт задержку
052delay (a * 50);Дальше объяснять, или всё же серое вещество начало свои магические телодвижения???
Как может функция задержки быть задающей для поворота?
Учите основы, потом будете людей в заблуждение вводить.
Это ко мне вопрос? Так если подумать, то элементарно.
Для идеи таких масштабов, какой масштаб танка?
Передача видео, обьезд препятствий - требуют крепления датчиков и камер.
Что-то тема заглохла