Радиоуправляемая модель танка
- Войдите на сайт для отправки комментариев
Уважаемые форумчане, затеял приобщение сына к программированию через создание проектов на базе Ардуино. Всякую мелочёвку по книжке для чайников уже попробовали и решили (ну может и я решил), что интереснее будет разбираться в теме через какой нибудь глобальный проект. Ширпотребовскую машинку на 4х колёсах с сонаром и датчиками линии погоняли по квартире. СКУЧНО!))) Решено соорудить танк на радиоуправлении. В итоговом варианте он должен ездить в любых направлениях с изменением скорости, поворачивать башню, поднимать и опускать пушку, стрелять, при переключении в автономный режим самостоятельно двигаться объезжая препятствия, распознавать внесённые в память цели и их уничтожать, естественно передавать на пульт управления видеоизображение. Конечная цель проекта не физический объект а программа управления, в которой ребёнок будет понимать каждую запятую.
На форум пришёл так как периодически нужна помощь специалистов в разборе непонятных мне моментов в скетчах, по которым сам не смог найти информацию.
Вот передача видео и распознавание образов на ардуино - это пожалуй перебор. А в остальном это развитие, модификация уже имеющейся машинки.
На данный момент отрабатываем движение тележки танка с управлением через блютус. Выкладываю полный скечт. Всё работает, но не могу найти объяснения по работе в нём некоторых функций.
001
//Управляем роботом с помощью BLUETOOTH.
002
//В качестве управляющего устройства используем ANDROID устройство с программой Bluetooth RC Controller.
003
004
#include <SoftwareSerial.h> // Подключаем библиотеку для работы с Serial через дискретные порты
005
006
// *********************** Установка выводов моторов ************************
007
008
int
MotorLeftSpeed = 9;
// Левый (А) мотор СКОРОСТЬ — ENA
009
int
MotorLeftForward = 6;
// Левый (А) мотор ВПЕРЕД — IN1
010
int
MotorLeftBack = 7;
// Левый (А) мотор НАЗАД — IN2
011
int
MotorRightForward = 4;
// Правый (В) мотор ВПЕРЕД — IN3
012
int
MotorRightBack = 5;
// Правый (В) мотор НАЗАД — IN4
013
int
MotorRightSpeed = 3;
// Правый (В) мотор СКОРОСТЬ — ENB
014
015
// ********************** Для управления по блютуз ****************************
016
017
// Соединяем BT module TX на пин 10
018
// Соединяем BT module RX на пин 11
019
// Соединяем BT Vcc to 5V, GND to GND
020
SoftwareSerial BT(10, 11);
//Создаём "виртуальный" serial port/UART
021
022
char
btCommand =
'S'
;
// Задаем переменную btCommand (BLUETOOTHкоманда) — по умолчанию "S" — СТОП
023
024
// ********************************** SETUP ***********************************
025
026
void
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
044
void
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
}
054
void
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
}
063
void
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
}
072
void
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
}
082
void
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
}
092
void
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
}
100
void
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
113
void
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
}
?
Может кто нибудь объяснить для чего сдесь эта переменная (int a), и зачем в функции delay эта переменная умножается на 50.
Как это работает и для чего?
01
// ****************** Задаем основные направления движения ******************
02
03
void
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
}
В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.
01
void
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
}
Почему перебор? Если есть модули для Ардуино способные распознавать форму и цвет предметов, а передача видео сейчас вообще как за хлебом сходить.
В данном модуле скетча понятно как всё работает кроме троечки в скобках (3) у направлений движения.
01
void
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
}
очень справочно ответ можно найти вот тут и в строках после 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
// ****************** Задаем основные направления движения ******************
043
044
void
forward (
int
a)
// ВПЕРЕД
045
{
Видим, что для функции forward нужна входная величина в виде переменной "а".
Далее в коде эта переменная и создаёт задержку
052
delay (a * 50);
Дальше объяснять, или всё же серое вещество начало свои магические телодвижения???
Как может функция задержки быть задающей для поворота?
Учите основы, потом будете людей в заблуждение вводить.
Это ко мне вопрос? Так если подумать, то элементарно.
Для идеи таких масштабов, какой масштаб танка?
Передача видео, обьезд препятствий - требуют крепления датчиков и камер.
Что-то тема заглохла