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

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

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

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

 

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

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

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

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

//Управляем роботом с помощью 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;
    }
  }
}

 

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

?

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

Может кто нибудь объяснить для чего сдесь эта переменная (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);
}

 

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

В данном модуле скетча понятно как всё работает кроме троечки в скобках (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;
    }
  }
}

 

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

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

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

aduardrud пишет:

В данном модуле скетча понятно как всё работает кроме троечки в скобках (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 ... и начинайте писать свои скетчи - быстрее поймете. И ищите уроки, в инете их много, начните с простых.  

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

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

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