Реализация различных видов движения мобильной платформы на языке С++

Реализация различных видов движения мобильной платформы на языке С++

Тема. Реализация различных видов движения на языке 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);
}

 

 

 

Учебная программа курса RoboKid

Центр робототехники "BOTEON".
Добавить комментарий

;-) :| :x :twisted: :smile: :shock: :sad: :roll: :razz: :oops: :o :mrgreen: :lol: :idea: :grin: :evil: :cry: :cool: :arrow: :???: :?: :!: