Радиоуправляемая модель танка

aduardrud
Offline
Зарегистрирован: 08.02.2019

Уважаемые форумчане, затеял приобщение сына к программированию через создание проектов на базе Ардуино. Всякую мелочёвку по книжке для чайников уже попробовали и решили (ну может и я решил), что интереснее будет разбираться в теме через какой нибудь глобальный проект. Ширпотребовскую машинку на 4х колёсах с сонаром и датчиками линии погоняли по квартире. СКУЧНО!))) Решено соорудить танк на радиоуправлении. В итоговом варианте он должен ездить в любых направлениях с изменением скорости, поворачивать башню, поднимать и опускать пушку, стрелять, при переключении в автономный режим самостоятельно двигаться объезжая препятствия, распознавать внесённые в память цели и их уничтожать, естественно передавать на пульт управления видеоизображение. Конечная цель проекта не физический объект а программа управления, в которой ребёнок будет понимать каждую запятую.

На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.

 

kalapanga
Offline
Зарегистрирован: 23.10.2016

Вот передача видео и распознавание образов на ардуино - это пожалуй перебор. А в остальном это развитие, модификация уже имеющейся машинки.

aduardrud
Offline
Зарегистрирован: 08.02.2019

На данный момент отрабатываем движение тележки танка с управлением через блютус. Выкладываю полный скечт. Всё работает, но не могу найти объяснения по работе в нём некоторых функций.

001//Управляем роботом с помощью BLUETOOTH.
002//В качестве управляющего устройства используем ANDROID устройство с программой Bluetooth RC Controller.
003 
004#include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты
005 
006// *********************** Установка выводов моторов ************************
007 
008int MotorLeftSpeed = 9; // Левый (А) мотор СКОРОСТЬ — ENA
009int MotorLeftForward = 6; // Левый (А) мотор ВПЕРЕД — IN1
010int MotorLeftBack = 7; // Левый (А) мотор НАЗАД — IN2
011int MotorRightForward = 4; // Правый (В) мотор ВПЕРЕД — IN3
012int MotorRightBack = 5; // Правый (В) мотор НАЗАД — IN4
013int MotorRightSpeed = 3; // Правый (В) мотор СКОРОСТЬ — ENB
014 
015// ********************** Для управления по блютуз ****************************
016 
017// Соединяем BT module TX на пин 10
018// Соединяем BT module RX на пин 11
019// Соединяем BT Vcc to 5V, GND to GND
020SoftwareSerial BT(10, 11); //Создаём "виртуальный" serial port/UART
021 
022char btCommand = 'S'; // Задаем переменную btCommand (BLUETOOTHкоманда) — по умолчанию "S" — СТОП
023 
024// ********************************** SETUP ***********************************
025 
026void setup ()
027{
028  BT.begin(9600); // Устанавливаем скорость передачи данных по Bluetooth
029 
030  BT.println("Hello from Tank"); // Посылаем тестовое сообщение на блютус устройство
031 
032  //****************** Настраиваем параметры выводов ARDUINO ******************
033 
034  pinMode (MotorLeftForward, OUTPUT);
035  pinMode (MotorLeftBack, OUTPUT);
036  pinMode (MotorLeftSpeed, OUTPUT);
037 
038  pinMode (MotorRightForward, OUTPUT);
039  pinMode (MotorRightBack, OUTPUT);
040  pinMode (MotorRightSpeed, OUTPUT);
041}
042// ****************** Задаем основные направления движения ******************
043 
044void forward (int a) // ВПЕРЕД
045{
046  digitalWrite (MotorRightBack, LOW);
047  digitalWrite (MotorRightForward, HIGH);
048  analogWrite (MotorRightSpeed, 255);
049  digitalWrite (MotorLeftBack, LOW);
050  digitalWrite (MotorLeftForward, HIGH);
051  analogWrite (MotorLeftSpeed, 225);
052  delay (a * 50);
053}
054void right (int b) // ПОВОРОТ ВПРАВО (одна гусеница)
055{
056  digitalWrite (MotorLeftBack, LOW);
057  digitalWrite (MotorLeftForward, HIGH);
058  analogWrite (MotorLeftSpeed, 200);
059  digitalWrite (MotorRightBack, LOW);
060  digitalWrite (MotorRightForward, LOW);
061  delay (b * 50);
062}
063void left (int c) // ПОВОРОТ ВЛЕВО (одна гусеница)
064{
065  digitalWrite (MotorRightBack, LOW);
066  digitalWrite (MotorRightForward, HIGH);
067  analogWrite (MotorRightSpeed, 200);
068  digitalWrite (MotorLeftBack, LOW);
069  digitalWrite (MotorLeftForward, LOW);
070  delay (c * 50);
071}
072void turnR (int d) // РАЗВОРОТ ВПРАВО (две гусеницы)
073{
074  digitalWrite (MotorRightBack, HIGH);
075  digitalWrite (MotorRightForward, LOW);
076  analogWrite (MotorRightSpeed, 200);
077  digitalWrite (MotorLeftBack, LOW);
078  digitalWrite (MotorLeftForward, HIGH);
079  analogWrite (MotorLeftSpeed, 200);
080  delay (d * 50);
081}
082void turnL (int e) // РАЗВОРОТ ВЛЕВО (две гусеницы)
083{
084  digitalWrite (MotorRightBack, LOW);
085  digitalWrite (MotorRightForward, HIGH);
086  analogWrite (MotorRightSpeed, 200);
087  digitalWrite (MotorLeftBack, HIGH);
088  digitalWrite (MotorLeftForward, LOW);
089  analogWrite (MotorLeftSpeed, 200);
090  delay (e * 50);
091}
092void stopp (int f) // СТОП
093{
094  digitalWrite (MotorRightBack, LOW);
095  digitalWrite (MotorRightForward, LOW);
096  digitalWrite (MotorLeftBack, LOW);
097  digitalWrite (MotorLeftForward, LOW);
098  delay (f * 50);
099}
100void back (int g) // НАЗАД
101{
102  digitalWrite (MotorRightBack, HIGH);
103  digitalWrite (MotorRightForward, LOW);
104  analogWrite (MotorRightSpeed, 255);
105  digitalWrite (MotorLeftBack, HIGH);
106  digitalWrite (MotorLeftForward, LOW);
107  analogWrite (MotorLeftSpeed, 225);
108  delay (g * 50);
109}
110 
111// ********************* Управление по БЛЮТУЗ ****************************
112 
113void loop()
114{
115 
116  if (BT.available() > 0)// В случае если в виртуальном "Серийном порту" есть информация
117  {
118    btCommand = BT.read(); // Считываем инвормацию с "Серийного порта"
119    BT.println(btCommand); // Печатаем инвормацию полученную с "Серийного порта" — необходио в слуае отладки программы
120    switch (btCommand)  // Отрабатывем в соотвествии с поступившей командой
121    {
122      case 'F':
123        forward (3); // едем ВПЕРЕД
124        break;
125      case 'B':
126        back (3); // едем НАЗАД
127        break;
128      case 'R':
129        right (3); // поворачиваем ВПРАВО
130        break;
131      case 'L':
132        left (3); // поворачиваем ВЛЕВО
133        break;
134      case 'G':
135        turnL (3); // разворот ВЛЕВО
136        break;
137      case 'I':
138        turnR (3); // разворот ВПРАВО
139        break;
140      case 'S':
141        stopp (3); // СТОП!
142        break;
143    }
144  }
145}

 

aduardrud
Offline
Зарегистрирован: 08.02.2019

?

aduardrud
Offline
Зарегистрирован: 08.02.2019

Может кто нибудь объяснить для чего сдесь эта переменная (int a), и зачем в функции delay эта переменная умножается на 50.

Как это работает и для чего? 

 

01// ****************** Задаем основные направления движения ******************
02 
03void forward (int a) // ВПЕРЕД
04{
05  digitalWrite (MotorRightBack, LOW);
06  digitalWrite (MotorRightForward, HIGH);
07  analogWrite (MotorRightSpeed, 255);
08  digitalWrite (MotorLeftBack, LOW);
09  digitalWrite (MotorLeftForward, HIGH);
10  analogWrite (MotorLeftSpeed, 225);
11  delay (a * 50);
12}

 

aduardrud
Offline
Зарегистрирован: 08.02.2019

В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.

01void loop()
02{
03 
04  if (BT.available() > 0)// В случае если в виртуальном "Серийном порту" есть информация
05  {
06    btCommand = BT.read(); // Считываем инвормацию с "Серийного порта"
07    BT.println(btCommand); // Печатаем инвормацию полученную с "Серийного порта" — необходио в слуае отладки программы
08    switch (btCommand)  // Отрабатывем в соотвествии с поступившей командой
09    {
10      case 'F':
11        forward (3); // едем ВПЕРЕД
12        break;
13      case 'B':
14        back (3); // едем НАЗАД
15        break;
16      case 'R':
17        right (3); // поворачиваем ВПРАВО
18        break;
19      case 'L':
20        left (3); // поворачиваем ВЛЕВО
21        break;
22      case 'G':
23        turnL (3); // разворот ВЛЕВО
24        break;
25      case 'I':
26        turnR (3); // разворот ВПРАВО
27        break;
28      case 'S':
29        stopp (3); // СТОП!
30        break;
31    }
32  }
33}

 

aduardrud
Offline
Зарегистрирован: 08.02.2019

Почему перебор? Если есть модули для Ардуино способные распознавать форму и цвет предметов, а передача видео сейчас вообще как за хлебом сходить.

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

aduardrud пишет:

В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.

 

очень справочно ответ можно найти вот тут и в строках после 042 пост2 ... и начинайте писать свои скетчи - быстрее поймете. И ищите уроки, в инете их много, начните с простых.  

и не ждите ответов - ответ можите получить только на конкретный вопрос, типа этого... и не валите вопросы в кучу пока не разбиретесь с предыдущим. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

aduardrud пишет:
затеял приобщение сына к программированию через создание проектов на базе Ардуино. 

На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.

Ну да. Осталось только Вас приобщить к основам программирования и постепенно давать методику как писать программы , а не "письма на деревню дедушке".

aduardrud
Offline
Зарегистрирован: 08.02.2019

qwone пишет:

aduardrud пишет:
затеял приобщение сына к программированию через создание проектов на базе Ардуино. 

На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.

Ну да. Осталось только Вас приобщить к основам программирования и постепенно давать методику как писать программы , а не "письма на деревню дедушке".

А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?

sadman41
Offline
Зарегистрирован: 19.10.2016

aduardrud пишет:

А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?

Да.

aduardrud
Offline
Зарегистрирован: 08.02.2019

sadman41 пишет:

aduardrud пишет:

А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?

Да.

Спасибо честный ответ! Надеюсь знающие и отзывчивые люди сюда тоже иногда заглядывают!

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

aduardrud пишет:

А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?

тут помогают и направляют, но учителей тут нет. ОСНОВНАЯ претензия - вы пришли с чужим кодом, где взяли, там и ищите помощи.

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

почитайте этот топик, поймете о чем речь... пытались научить... сложно это...

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

aduardrud пишет:
Ширпотребовскую машинку на 4х колёсах с сонаром и датчиками линии погоняли по квартире. СКУЧНО!)))
Вот почему народ не питается перешить плюшевого мишку в слоника или в зайчика. Ведь швейных машинок полно, иголок ниток ножниц в магазинах как грязи. И ведь не скучное это занятие. 
  А теперь по существу писать надо программу так что бы в ней можно что-то менять и модернизировать. А скетч написан так, что или пользуйтесь что есть или пишите новый заново под новые задачи. По факту бестолковый скетч. А учиться толковые скетчи Вы не желаете.

aduardrud
Offline
Зарегистрирован: 08.02.2019

Гриша пишет:

aduardrud пишет:

А по существу заданных вопросов, ответить гордость не позволяет, или компетенций не хватает?

тут помогают и направляют, но учителей тут нет. ОСНОВНАЯ претензия - вы пришли с чужим кодом, где взяли, там и ищите помощи.

Этот код я скомпановал сам из разных проектов, частично написал сам, и настроил под своё железо. И оно работает. Код отвечающий за управление движением с какого то англоязычного сайта. Это наиболее интересный код. В книжках и рунете какие-то корявые и громоздкие варианты. Поэтому хочу понять принцип работы именно этого кода.

aduardrud
Offline
Зарегистрирован: 08.02.2019

qwone пишет:

aduardrud пишет:
Ширпотребовскую машинку на 4х колёсах с сонаром и датчиками линии погоняли по квартире. СКУЧНО!)))
Вот почему народ не питается перешить плюшевого мишку в слоника или в зайчика. Ведь швейных машинок полно, иголок ниток ножниц в магазинах как грязи. И ведь не скучное это занятие. 
  А теперь по существу писать надо программу так что бы в ней можно что-то менять и модернизировать. А скетч написан так, что или пользуйтесь что есть или пишите новый заново под новые задачи. По факту бестолковый скетч. А учиться толковые скетчи Вы не желаете.

А приведите пример бестолковости. И как бы Вы написли толково. Только с аргументами.

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

Сравните  и 

Первый громоздкий, а второй то что надо. И никаких сложностей.

leks
Offline
Зарегистрирован: 22.10.2017

https://www.drive2.ru/b/2867939/

Вот тут ваши кампановки уже стащили. 

qwone
qwone аватар
Offline
Зарегистрирован: 03.07.2016

И да я Вам не смогу помочь. У меня горомоздкие вещи на ваш взгляд выйдут.

ПС:от сюда #39  и дальше

MYFRIEND
MYFRIEND аватар
Offline
Зарегистрирован: 31.01.2017

aduardrud пишет:

В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.

обычно если хочу узнать ставлю в скобках вместо троечки другую цифру, скомпилируйте и увидите, там шаг какой то скорее всего. А если не увидите разницы, то например если код новый для вас, и разницы в нем нет, его можно выкинуть. Здесь похоже троечка нужна, нужна скорее всего для какого то шага. Лучше скомпилировать с другой цифрой. Насчёт 

a*50 delay - автору захотелось нагородить огород, напишите просто delay (50), возможно автор кода думал о другом когда писал код, или среда ардуино вынудила его нагородить огород сказав что не откомпилирует без огорода. Обычно в ардуино такие объяснения неизвестному коду. Я бы объяснил это так. delay убрал бы a, он явно попал из другого кода возможно. Например могло быть ещё и a которое меняется. Но в коде осталось только delay, а а лишний возможно. Компилируйте и убирайте а пробуйте, если разницы нет что с ним что без него, выбрасывайте код будет меньше и быстрее.

PRC
Offline
Зарегистрирован: 03.02.2019

Мне думается)), что изначально delay(a*50) делался для задания поворотов на определенный угол. Где "а" и есть этот самый угол. А ТС уже в лоб напихал его и куда надо и не надо.

ВН
Offline
Зарегистрирован: 25.02.2016

aduardrud, все ваши вопросы на одну тему - функция.

найдите, что это за зверь и с чем его едят .... 

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

ВН пишет:

aduardrud, все ваши вопросы на одну тему - функция.

найдите, что это за зверь и с чем его едят .... 

в посте 7 этого топика уже написано... немного 

ВН
Offline
Зарегистрирован: 25.02.2016

да, там все что нужно есть +1

aduardrud
Offline
Зарегистрирован: 08.02.2019

qwone пишет:

И да я Вам не смогу помочь. У меня горомоздкие вещи на ваш взгляд выйдут.

ПС:от сюда #39  и дальше

Спасибо! Изучу, протестирую на своей тележке и отпишусь.

neformalishe
Offline
Зарегистрирован: 13.02.2019

Как может функция задержки быть задающей для поворота?

Учите основы, потом будете людей в заблуждение вводить.

Эта переменная задаёт задержку, а умножая её на 50 могу предположить что это задержки в половину 10-й части секунды, умноженые на эту переменную.

neformalishe
Offline
Зарегистрирован: 13.02.2019

По поводу 3-й ки...

Смотрим в код, а именно сюда

042 // ****************** Задаем основные направления движения ******************
043  
044 void forward (int a) // ВПЕРЕД
045

{

Видим, что для функции forward нужна входная величина в виде переменной "а".

Далее в коде эта переменная и создаёт задержку

052  delay (a * 50);

Дальше объяснять, или всё же серое вещество начало свои магические телодвижения???

PRC
Offline
Зарегистрирован: 03.02.2019

neformalishe пишет:

Как может функция задержки быть задающей для поворота?

Учите основы, потом будете людей в заблуждение вводить.

Это ко мне вопрос? Так если подумать, то элементарно.

Ljuist
Offline
Зарегистрирован: 05.06.2018

Для идеи таких масштабов, какой масштаб танка? 

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

ua6em
ua6em аватар
Offline
Зарегистрирован: 17.08.2016

Что-то тема заглохла