Главная » 2016 » Июнь » 5 » Робот ездящий вдоль линии
16:48
Робот ездящий вдоль линии

Введение

В этой статье я хотел бы рассказать про простого робота построенного с помощью набора от amperka. Мы построим робота, который будет ездить вдоль нарисованной линии.

Детали 

1) Детали самой платформы: двигатели, колеса, диск

2) Arduino

3) Два датчика линии

4) Мезонинная плата для подключения сенсоров

5) Мезонинная плата для подключения двигателей

6) Разъем для батарейки 

7) Батарейка

Сборка 

1) Соедините двигатель и колесо.

2) Присоедините 2 двигателя к диску с помощью специального крепления.

3) Соберите 3 колесо-балансер и прикрепите его к диску-шасси.

4) Прикрепите Arduino к платформе, используя болты, гайки и специальные расширители.

5) Присоедините к платформе датчики линии так чтобы они находились почти вплотную к полу при нормальном положении робота, но не цеплялись за него (так как их диапазон всего пару миллиметров) .

6)  Вставьте в Arduino мезонинную плату для двигателей и закрепите в ее клемниках провода двигателей. чтобы провода одного двигателя оставались в соседних клемниках  и соблюдая полярность.

7) Вставьте в плату для двигателей мезонинную плату для тройных разъемов и соедините посредством нее датчики линии с 10-м и 11-м пинами Arduino. Обратите внимание на обозначения VCC, GND и D рядом со штырьками на  плате: разъем датчика нужно повернуть так, чтобы назначения проводов совпадали: красный-питание(VCC), черный-земля(GND), зеленый-цифровой сигнал(D).

Вот и все наша платформа готов. Осталось загрузить только программу.

Программа

// Моторы подключаются к клеммам M1+,M1-,M2+,M2- 

// Motor shield использует четыре контакта 6,5,7,4 для управления моторами

#define SPEED_LEFT       6

#define SPEED_RIGHT      5

#define DIR_LEFT         7

#define DIR_RIGHT        4

#define LEFT_SENSOR_PIN  8

#define RIGHT_SENSOR_PIN 9

 

// Скорость, с которой мы движемся вперёд (0-255)

#define SPEED            100

 

// Скорость прохождения сложных участков

#define SLOW_SPEED       35

 

#define BACK_SLOW_SPEED  30

#define BACK_FAST_SPEED  50

 

// Коэффициент, задающий во сколько раз нужно затормозить

// одно из колёс для поворота

#define BRAKE_K          4

 

#define STATE_FORWARD    0

#define STATE_RIGHT      1

#define STATE_LEFT       2

 

#define SPEED_STEP       2

 

#define FAST_TIME_THRESHOLD     500

 

int state = STATE_FORWARD;

int currentSpeed = SPEED;

int fastTime = 0;

 

void runForward()

{

    state = STATE_FORWARD;

 

    fastTime += 1;

    if (fastTime < FAST_TIME_THRESHOLD) {

        currentSpeed = SLOW_SPEED;

    } else {

        currentSpeed = min(currentSpeed + SPEED_STEP, SPEED);

    }

 

    analogWrite(SPEED_LEFT, currentSpeed);

    analogWrite(SPEED_RIGHT, currentSpeed);

 

    digitalWrite(DIR_LEFT, HIGH);

    digitalWrite(DIR_RIGHT, HIGH);

}

 

void steerRight()

{

    state = STATE_RIGHT;

    fastTime = 0;

 

    // Замедляем правое колесо относительно левого,

    // чтобы начать поворот

    analogWrite(SPEED_RIGHT, 0);

    analogWrite(SPEED_LEFT, SPEED);

 

    digitalWrite(DIR_LEFT, HIGH);

    digitalWrite(DIR_RIGHT, HIGH);

}

 

void steerLeft()

{

    state = STATE_LEFT;

    fastTime = 0;

 

    analogWrite(SPEED_LEFT, 0);

    analogWrite(SPEED_RIGHT, SPEED);

 

    digitalWrite(DIR_LEFT, HIGH);

    digitalWrite(DIR_RIGHT, HIGH);

}

 

 

void stepBack(int duration, int state) {

    if (!duration)

        return;

 

    // В зависимости от направления поворота при движении назад будем

    // делать небольшой разворот

    int leftSpeed = (state == STATE_RIGHT) ? BACK_SLOW_SPEED : BACK_FAST_SPEED;

    int rightSpeed = (state == STATE_LEFT) ? BACK_SLOW_SPEED : BACK_FAST_SPEED;

 

    analogWrite(SPEED_LEFT, leftSpeed);

    analogWrite(SPEED_RIGHT, rightSpeed);

 

    // реверс колёс

    digitalWrite(DIR_RIGHT, LOW);

    digitalWrite(DIR_LEFT, LOW);

 

    delay(duration);

}

 

 

void setup()

{

    // Настраивает выводы платы 4,5,6,7 на вывод сигналов

    for(int i = 4; i <= 7; i++)

        pinMode(i, OUTPUT);

 

    // Сразу едем вперёд

    runForward();

}

 

void loop()

{

    // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно

    // инвертировать значения с датчиков

    boolean left = !digitalRead(LEFT_SENSOR_PIN);

    boolean right = !digitalRead(RIGHT_SENSOR_PIN);

 

    // В какое состояние нужно перейти?

    int targetState;

 

    if (left == right) {

        // под сенсорами всё белое или всё чёрное

        // едем вперёд

        targetState = STATE_FORWARD;

    } else if (left) {

        // левый сенсор упёрся в трек

        // поворачиваем налево

        targetState = STATE_LEFT;

    } else {

        targetState = STATE_RIGHT;

    }

 

    if (state == STATE_FORWARD && targetState != STATE_FORWARD) {

        int brakeTime = (currentSpeed > SLOW_SPEED) ?

            currentSpeed : 0;

        stepBack(brakeTime, targetState);

    }

 

    switch (targetState) {

        case STATE_FORWARD:

            runForward();

            break;

 

        case STATE_RIGHT:

            steerRight();

            break;

 

        case STATE_LEFT:

            steerLeft();

            break;

    }

 

}

Просмотров: 2979 | Добавил: mikrobord | Рейтинг: 0.0/0
Всего комментариев: 0
avatar