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; }
} |
|
Всего комментариев: 0 | |