Тема. Реализация различных видов движения на языке C++
Цель: реализовать движение мобильной платформы во всех возможных направлениях. Для каждого направления написать отдельную функцию.
План:
1. Переменные
2. Функции
Теоретическая часть
1. Переменные
Как и в Skretch, переменные в С++ представляют собой некоторые области памяти, которые имеют имя и могут принимать различные значения. В Skretch все переменные создаются одинаково, не учитывая какие данные будут храниться в этой переменной: целое значение, дробное значение, true false, текст. В С++ при создании переменной так же указывается и тип данных, которые будут храниться в этой переменной. В общем виде объявление переменной выглядит следующим образом:
тип_данных имя_переменной;
Основные типы данных перечислены ниже:
int — целые значения
bool — false/true
double — вещественные числа(с добной частью после запятой, например 3.14)
char — символьный тип.
Таким образом объявление (создание) целочисленной переменной с именем a будет выглядеть так: int a;
Задать (присвоить) значение можно при объявлении: int a=10;
Или в любом месте программы после объявления: а=10;
2 Функции
Функция — это именованная последовательность операций, которая находится вне других функций и может быть использована в любой другой функции. Функции позволяют разделить программу на несколько маленьких подпрограмм, которые в совокупности выполняют поставленную задачу. Также функции можно многократно использовать, что значительно сокращает размер кода программы.
Определение функции:
тип_возвращаемого_значения имя_функции (тип имя_переменной1, тип имя_переменной2)
{тело функции;}
Сама функция может принимать значение определенного типа. Этот тип указывается перед именем функции. Значение, которая принимает функция пишется после слова return и называется возвращаемым значением. Если функция не имеет возвращаемого значения, а просто выполняет какую-либо последовательность операций, то перед именем функции указывается слово void.
Функция может иметь параметры. Это те значение, которые в ходе своего выполнения может использовать функция, и которые передаются в нее из главной функции ( в нашем случае функции loop()). Параметры функции указываются в круглых скобках после имени функции. При определении функции параметры указываются с их типами. При вызове функции параметры могут указываться в явно в виде значений или как переменные ( без указания типа переменной), при чем имена переменных при определении и вызове функции могут не совпадать.
Например: Есть два светодиода, которые подключены к 10 и 11 пинам. С использованием функции нужно поочередно зажигать светодиоды с интервалом 1000 миллисекунд.
void ledOn(int n) // создание функции с параметром n (номер светодиода)
{
if (n==1)
{
digitalWrite(10, HIGH);
digitalWrite(11,LOW);
}
else
if (n==2)
{
digitalWrite(11, HIGH);
digitalWrite(10,LOW);
}
}
void setup()
{
pinMode(10,OUTPUT);
pinMode(11,OUTPUT);
}
void loop()
{
ledOn(1); //вызов функции с параметром 1 (зажгется первый светодиод)
delay(1000);
ledOn(2); //вызов функции с параметром 2 (зажгется второй светодиод)
delay(1000);
}
Практическая часть
В среде IDE Arduino написать программу, которая позволяет мобильной платформе передвигаться во всех направлениях: вперед, назад, влево, вправо и останавливаться. Для реализации каждого вида движения необходимо написать отдельную функцию.
Последовательность работы:
1. Двигатель, который отвечает за движение платформы вперед — назад подключен к пинам 8 и 9. В программе в соотвествие им заданы переменные fb1 и fb2, которые хранят эти значения. Двигатель, с помощью которого происходит поворот влево — вправо подключен к пинам leng=10 и reng=11.
int fb1=8;
int fb2=9;
int leng=10;
int reng=11;
В таблице ниже показано какие сигналы нужно послать для движения обильной платформы в каждом направлении.
Направление движения
fb1
fb2
leng
reng
Вперед
0
1
0
0
Назад
1
0
0
0
Вперед-влево
0
1
1
0
Назад-влево
1
0
1
0
Вперед-вправо
0
1
0
1
Назад-вправо
1
0
0
1
Стоп
0
0
0
0
2. Создадим функции для движения мобильной платформы вперед и назад. Управление скоростью можно реализовать с использованием ШИМа.
int fb1=8;
int fb2=9;
int leng=10;
int reng=11;
int pwm=100;
void forward()
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void backward()
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void setup()
{
pinMode(fb1,OUTPUT);
pinMode(fb2,OUTPUT);
pinMode(leng,OUTPUT);
pinMode(reng,OUTPUT);
}
void loop()
{ }
3. Функции, реализующие движение влево — вправо, создаем с параметром. Если функии передается параметр 1, то она едет вперед и влево/вправо, если 2, то назад и влево/вправо.
int fb1=8;
int fb2=9;
int leng=10;
int reng=11;
int pwm=100;
void forward()
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void backward()
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void left(int direction1)
{
if (direction1==1)
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
analogWrite(leng,rotatePWM);
digitalWrite(reng,LOW);
}
else if(direction1==2)
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
analogWrite(leng,rotatePWM);
digitalWrite(reng,LOW);
}
}
void right(int direction1)
{
if(direction1==1)
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
digitalWrite(leng,LOW);
analogWrite(reng,rotatePWM);
}
else if(direction1==2)
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
analogWrite(reng,rotatePWM);
}
}
void setup()
{
pinMode(fb1,OUTPUT);
pinMode(fb2,OUTPUT);
pinMode(leng,OUTPUT);
pinMode(reng,OUTPUT);
}
void loop()
{ }
4. Функция spopp() должна останавливать машинку и выравнивать поворотный двигатель. В функции loop() можно написать ту последовательность движений, которую Вы хотите, чтобы выполняла мобильная платформа.
int fb1=8;
int fb2=9;
int leng=10;
int reng=11;
int pwm=100;
void forward()
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void backward()
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void left(int direction1)
{
if (direction1==1)
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
analogWrite(leng,rotatePWM);
digitalWrite(reng,LOW);
}
else if(direction1==2)
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
analogWrite(leng,rotatePWM);
digitalWrite(reng,LOW);
}
}
void right(int direction1)
{
if(direction1==1)
{
digitalWrite(fb1,LOW);
analogWrite(fb2,pwm);
digitalWrite(leng,LOW);
analogWrite(reng,rotatePWM);
}
else if(direction1==2)
{
analogWrite(fb1,pwm);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
analogWrite(reng,rotatePWM);
}
}
void stopp()
{
digitalWrite(fb1,LOW);
digitalWrite(fb2,LOW);
digitalWrite(leng,LOW);
digitalWrite(reng,LOW);
}
void setup()
{
pinMode(fb1,OUTPUT);
pinMode(fb2,OUTPUT);
pinMode(leng,OUTPUT);
pinMode(reng,OUTPUT);
}
void loop()
{
forward();
delay(1000);
right(1);
delay(1000);
}