Робот ездит по линии. Робот, следующий по линии: принципы работы и создание на Arduino

Как создать робота, следующего по линии на Arduino. Какие компоненты нужны для сборки. Как работают датчики линии и ультразвуковой датчик расстояния. Какой алгоритм использовать для движения по линии. Как запрограммировать робота на Arduino.

Содержание

Принцип работы робота, следующего по линии

Робот, следующий по линии — это автономное устройство, способное двигаться вдоль нарисованной на поверхности линии. Основные компоненты такого робота:

  • Платформа с колесами и моторами для движения
  • Датчики линии для определения положения относительно линии
  • Микроконтроллер (например, Arduino) для управления
  • Источник питания (батарея)

Принцип работы заключается в следующем:

  1. Датчики линии непрерывно считывают поверхность под роботом
  2. Микроконтроллер анализирует показания датчиков
  3. На основе показаний корректируется движение моторов
  4. Робот движется, постоянно корректируя свое положение относительно линии

Необходимые компоненты для сборки

Для создания простого робота, следующего по линии на базе Arduino, понадобятся следующие компоненты:


  • Arduino Uno или совместимая плата
  • Шасси с двумя моторами
  • Драйвер двигателей (например, L298N)
  • 3 датчика линии
  • Ультразвуковой дальномер HC-SR04
  • Батарея питания
  • Провода, крепеж

Работа датчиков линии

Датчики линии работают по принципу отражения инфракрасного излучения:

  • Датчик излучает ИК-свет
  • Свет отражается от поверхности
  • Фототранзистор принимает отраженный свет
  • Темная линия поглощает больше света
  • Светлая поверхность отражает больше света

Таким образом, датчик выдает разные аналоговые значения для линии и фона, что позволяет определить положение линии под роботом.

Алгоритм движения по линии

Базовый алгоритм движения робота по линии выглядит следующим образом:

  1. Если центральный датчик на линии, а боковые вне — движение прямо
  2. Если левый датчик на линии — поворот налево
  3. Если правый датчик на линии — поворот направо
  4. Если все датчики вне линии — остановка или возврат на линию

Это позволяет роботу корректировать свое движение, оставаясь на линии. Более сложные алгоритмы могут учитывать историю движения, использовать ПИД-регулятор и т.д.


Программирование робота на Arduino

Основные шаги при программировании робота на Arduino:

  1. Инициализация пинов и переменных
  2. Настройка моторов и датчиков
  3. Основной цикл:
    • Считывание датчиков
    • Анализ показаний
    • Управление моторами

Пример базового кода для движения по линии:

«`cpp #define LEFT_SENSOR A0 #define CENTER_SENSOR A1 #define RIGHT_SENSOR A2 #define LEFT_MOTOR_PIN 5 #define RIGHT_MOTOR_PIN 6 void setup() { pinMode(LEFT_SENSOR, INPUT); pinMode(CENTER_SENSOR, INPUT); pinMode(RIGHT_SENSOR, INPUT); pinMode(LEFT_MOTOR_PIN, OUTPUT); pinMode(RIGHT_MOTOR_PIN, OUTPUT); } void loop() { int leftValue = analogRead(LEFT_SENSOR); int centerValue = analogRead(CENTER_SENSOR); int rightValue = analogRead(RIGHT_SENSOR); if (centerValue < 500 && leftValue > 500 && rightValue > 500) { // Движение прямо analogWrite(LEFT_MOTOR_PIN, 200); analogWrite(RIGHT_MOTOR_PIN, 200); } else if (leftValue < 500) { // Поворот налево analogWrite(LEFT_MOTOR_PIN, 100); analogWrite(RIGHT_MOTOR_PIN, 200); } else if (rightValue < 500) { // Поворот направо analogWrite(LEFT_MOTOR_PIN, 200); analogWrite(RIGHT_MOTOR_PIN, 100); } else { // Остановка analogWrite(LEFT_MOTOR_PIN, 0); analogWrite(RIGHT_MOTOR_PIN, 0); } delay(10); } ```

Этот код считывает показания датчиков и управляет моторами в зависимости от положения линии. Его можно дополнить функциями для более плавного движения и обработки сложных ситуаций.


Оптимизация движения робота

Для улучшения работы робота можно применить следующие методы:

  • Использование ПИД-регулятора для плавного движения
  • Калибровка датчиков перед стартом
  • Динамическое изменение скорости на поворотах
  • Обработка потери линии и возврат на трассу
  • Использование энкодеров для точного контроля скорости

Применение этих техник позволит создать более надежного и эффективного робота, способного двигаться по сложным траекториям.

Добавление ультразвукового датчика

Ультразвуковой датчик HC-SR04 позволяет роботу обнаруживать препятствия на пути. Принцип его работы:

  1. Датчик отправляет ультразвуковой импульс
  2. Импульс отражается от препятствия
  3. Датчик принимает отраженный сигнал
  4. По времени прохождения сигнала вычисляется расстояние

Пример кода для работы с HC-SR04:

«`cpp #define TRIG_PIN 9 #define ECHO_PIN 10 long duration; int distance; void setup() { pinMode(TRIG_PIN, OUTPUT); pinMode(ECHO_PIN, INPUT); Serial.begin(9600); } void loop() { // Очищаем TRIG_PIN digitalWrite(TRIG_PIN, LOW); delayMicroseconds(2); // Устанавливаем TRIG_PIN в HIGH на 10 микросекунд digitalWrite(TRIG_PIN, HIGH); delayMicroseconds(10); digitalWrite(TRIG_PIN, LOW); // Считываем ECHO_PIN, возвращает время прохождения звука в микросекундах duration = pulseIn(ECHO_PIN, HIGH); // Рассчитываем расстояние distance = duration * 0.034 / 2; // Выводим расстояние на серийный порт Serial.print(«Distance: «); Serial.print(distance); Serial.println(» cm»); delay(500); } «`

Этот код можно интегрировать в основную программу робота для обнаружения препятствий и их объезда.


Заключение

Создание робота, следующего по линии, — это увлекательный проект, позволяющий на практике изучить основы робототехники и программирования. Ключевые моменты:

  • Использование датчиков для ориентации в пространстве
  • Применение алгоритмов управления движением
  • Интеграция различных компонентов в единую систему
  • Возможность постепенного усложнения и оптимизации робота

Этот проект служит отличной основой для дальнейшего изучения более сложных тем в робототехнике, таких как машинное зрение, искусственный интеллект и автономная навигация.


Робот, ездящий по линии под управлением Arduino [Амперка / Вики]

В данной статье будет описан процесс создания робота, ездящего по линии. Эта задача является классической, идейно простая, она может решаться много раз, и каждый раз вы будете открывать для себя что-то новое. Решение этой задачи и реализация полученного решения позволяют приобрести необходимые начальные навыки для дальнейшего совершенствования в робототехнике.

Существует множество подходов для решения задачи следования по линии. Выбор одного из них зависит от конкретной конструкции робота, от количества сенсоров, их расположения относительно колёс и друг друга.

В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.

В результате выглядеть он будет так:

Что понадобится

Для нашего примера понадобятся следующие детали:

Вообще говоря, лучше было бы использовать NiMH-аккумуляторы: они лучше отдают ток и значительно дольше держат напряжение, но для целей этого проекта одной батарейки на 9 В вполне хватило.

Собираем робота

Сначала соберём робота, установим всю механику и электронику.

Собираем платформу

Для начала прикрепим колёса к моторам.

Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе. Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат.

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.

Крепим сенсоры

Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.

Крепим Arduino

Arduino закрепим с противоположной стороны двумя винтиками и гайками.

Опять же, можно выбрать и другое место. Например над колёсами, если приподнять Arduino на латунных стойках. Это изменило бы положение центра масс и повлияло бы на эффективность робота в лучшую или худшую сторону.

Крепим Motor Shield и соединительные провода

Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).

В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.

Крепим Troyka Shield

Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Программирование

Теперь напишем программу, которая заставит собранную конструкцию двигаться по нарисованной линии. В проекте мы будем использовать чёрную линию, напечатанную на белых листах бумаги.

Основная идея алгоритма

Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.

На прямой робот должен пропускать трек между сенсоров, то есть оба сенсора должны показывать единички.

При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.

Таким образом получаем простую систему с тремя состояниями:

  • STATE_FORWARD — нужно ехать вперёд

  • STATE_RIGHT — нужно поворачиваться направо

  • STATE_LEFT — нужно поворачиваться налево

На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:

Левый Правый Целевое состояние
0 0 STATE_FORWARD
0 1 STATE_RIGHT
1 0 STATE_LEFT
1 1 STATE_FORWARD

Реализация на Arduino

LineRobot_v1.ino
// Моторы подключаются к клеммам 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            35
 
// Коэффициент, задающий во сколько раз нужно затормозить
// одно из колёс для поворота
#define BRAKE_K          4
 
#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2
 
int state = STATE_FORWARD;
 
void runForward() 
{
    state = STATE_FORWARD;
 
    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);
 
    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerRight() 
{
    state = STATE_RIGHT;
 
    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerLeft() 
{
    state = STATE_LEFT;
 
    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
 
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 == targetState) {
        // мы уже делаём всё что нужно,
        // делаем измерения заново
        return;
    }
 
    switch (targetState) {
        case STATE_FORWARD:
            runForward();
            break;
 
        case STATE_RIGHT:
            steerRight();
            break;
 
        case STATE_LEFT:
            steerLeft();
            break;
    }
 
    // не позволяем сильно вилять на прямой
    delay(50);
}

Проблема инертности и её решение

Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.

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

Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:

stopping_distance_experiment.ino
#define LEFT_SENSOR_PIN   8
#define RIGHT_SENSOR_PIN  9
#define SPEED_LEFT        6
#define SPEED_RIGHT       5 
#define DIR_LEFT          7
#define DIR_RIGHT         4
 
// Для того чтобы убедиться, что именно тормозной путь долог, а не команда остановиться 
// приходит слишком поздно, будем включать светодиод, когда отдаётся команда.
#define LED_PIN           13
 
int currSpeed = 40;
void setup()
{
    for(int i = 4; i <= 7; ++i)
        pinMode(i, OUTPUT);
 
    analogWrite(SPEED_RIGHT, currSpeed);
    digitalWrite(DIR_RIGHT, HIGH);
 
    analogWrite(SPEED_LEFT, currSpeed);
    digitalWrite(DIR_LEFT, HIGH);    
 
    pinMode(LED_PIN, OUTPUT);
}
 
void loop()
{
    if (currSpeed > 120)
        return;
 
    boolean white[] = {
        !digitalRead(LEFT_SENSOR_PIN), 
        !digitalRead(RIGHT_SENSOR_PIN)
    };
 
    if (white[0] && white[1]) {
        // едем пока не упрёмся
        return;
    }
 
    // зажигаем светодиод, останавливаем моторы
    // и наблюдаем
    digitalWrite(LED_PIN, HIGH);
    analogWrite(SPEED_RIGHT, 0);
    analogWrite(SPEED_LEFT, 0);
    delay(5000);
 
    // повторяем эксперимент, увеличивая скорость
    // на 10 пунктов
    currSpeed += 10;
    if (currSpeed > 120)
        return;
 
    digitalWrite(LED_PIN, LOW);
    analogWrite(SPEED_RIGHT, currSpeed);
    analogWrite(SPEED_LEFT, currSpeed);    
}

На той поверхности, на которой проводился эксперимент, были получены следующие результаты:

Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.

Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.

Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:

time_distance_rate.ino
#define SPEED_LEFT      6
#define SPEED_RIGHT     5 
#define DIR_LEFT        7
#define DIR_RIGHT       4
 
void go(int speed, bool reverseLeft, bool reverseRight, int duration)
{
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); 
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); 
    delay(duration); 
}
 
void setup() 
{
    for(int i = 4; i <= 7; ++i)
        pinMode(i, OUTPUT);
} 
 
void loop() 
{ 
    // Задержка 5 секунд после включения питания 
    delay(5000); 
 
    for (int i = 200; i <= 1000; i += 100) {
        // Несколько сотен мс вперёд 
        go(50, false, false, 200);
        go(0, false, false, 0);
 
        // Задержка 5 секунд
        delay(5000); 
    }
 
    // Остановка до ресета или выключения питания 
    go(0, false, false, 0);
 
    // Приехали
    while (true)
        ; 
}

На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

Полученные две зависимости были линейно аппроксимированы, затем была выведена формула зависимости времени, которое надо двигаться назад, от скорости перед остановкой.

Обратим внимание на то, что у вас значения могут оказаться другими: из-за особенностей сборки либо из-за поверхности, поэтому в общем случае лучше провести все измерения самостоятельно.

Адаптивное поведение

Перед финальным экспериментом произведём ещё несколько поправок.

Во-первых, нам необязательно давать команду ехать назад перед каждым поворотом, как мы помним, на маленькой скорости робот прекрасно справляется и без этого. К тому же лучше ему двигаться не прямо назад, а немного поворачивая, всё-таки робот находится перед поворотом.

Во-вторых, нам стоит различать состояния робота: когда он движется по прямой, и ничто ему не мешает ускоряться; и когда робот входит в поворот. В первом случае действительно будем увеличивать скорость робота для более динамичного прохождения трека, во втором случае будем сбрасывать скорость до значения, достаточного для успешного прохождения поворота, и будем держать эту скорость ещё какое-то время.

В итоге наш код будет выглядит следующим образом:

Robot_v02.ino
// Моторы подключаются к клеммам 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;
    }
 
}

Результат

Что дальше?

Представленный алгоритм оставляет множество возможностей для улучшения и оптимизации. Скорость поворота можно так же менять адаптивно. Можно добавить контроль заноса. Можно поиграть с расположением сенсоров и центром масс. В конце концов можно получить непобедимого на треке робота.

Нет ничего лучше, чем обставить оппонента на секунду-другую.

Урок 33. Обучаем Arduino робота ездить по линии

Введение:

В этом уроке мы создадим машинку, которая будет ездить по траектории нарисованной линии, а также останавливаться при обнаружении препятствий.

При создании любого робота, его нужно оснастить датчиками (показания которых будет считывать робот), управляющими модулями (для вывода результатов работы робота), и скетчем (по алгоритму которого должен работать робот). В нашем случае, мы оснастим машинку, тремя аналоговыми датчиками линий и одним ультразвуковым датчиком расстояния, а в роли управляющих модулей выступят два закрепленных к каркасе моторчика, с колёсами на валах.

Видео:

Нам понадобится:

Для реализации проекта нам необходимо установить библиотеку:

  • iarduino_HC_SR04_int для работы с ультразвуковыми датчиками расстояния по внешним прерываниям.

О том как устанавливать библиотеки, Вы можете ознакомиться на странице Wiki — Установка библиотек в Arduino IDE.

Схема подключения:

Моторчики подключаются к клеммам M1 (левый мотор) и M2 (правый мотор) расположенным на Motor Sield. Аналоговые датчики линии подключаются к любым аналоговым входам Arduino Uno, в нашем примере используются входы A5 (для правого датчика), A4 (для центрального датчика) и A3 (для левого датчика). Вывод TRIG ультразвукового датчика расстояния подключается к любому выводу Arduino Uno, в нашем случае вывод D2. Вывод ECHO, при использовании библиотеки iarduino_HC_SR04_int, может подключаться только к тем выводам Arduino Uno, которые используют внешние прерывания, в нашем случае это вывод D3. Все датчики запитаны от напряжения 5 В. Напряжение питания на Arduino Unoподаётся через Motor Shield (клеммник Vin), для чего нужно установить перемычку, рядом с клеммником, в позицию «Общ. Пит.». Входы Motor Shield h2 (направление 1 мотора), E1 (ШИМ 1 мотора), E2 (ШИМ 2 мотора), h3 (направление 2 мотора), по умолчанию, подключены к выводам D7, D6, D5 и D4 соответственно, но их можно поменять, сняв перемычку и соединив вывод Motor Shield с нужным выводом Arduino Uno.

Алгоритм работы:

  • Если центральный датчик находится на линии, а боковые вне линии, то машинка едет прямо.
  • Если левый датчик находится на линии, а правый вне линии, то машинка поворачивает налево (независимо от показаний центрального датчика)
  • Если правый датчик находится на линии, а левый вне линии, то машинка поворачивает направо (независимо от показаний центрального датчика)
  • Если правый и левый датчики находятся на линии (вне зависимости от показаний центрального датчика), то такое состояние является неопределённым, машинка продолжает предыдущее движение (прямо или с поворотом) в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится.
  • Если все три датчика находятся вне линии, то такое состояние является неопределённым (потеря линии). Если этому состоянию предшествовал поворот, то машинка продолжит поворот в течении 2 секунд (можно менять в скетче). Если в течении этого времени состояние не изменится, то она остановится. Если этому состоянию не предшествовал поворот (машинка ехала прямо и линия оборвалась), то машинка сразу остановится.
  • Если перед машинкой появилось препятствие, на расстоянии менее 10 см (можно менять в скетче), то машинка остановится и продолжит движение, как только препятствие исчезнет.

Скорость движения задаётся в константе valSpeed, от 1 до 255. Крутизна поворотов задаётся в константе valTurning, от 1 до 255. Время продолжения движения, при неопределённом состоянии, задаётся в константе tmrDelay, в микросекундах. Направление движения моторов указывается логическими значениями элементов массива arrRoute (0 элемент — правый мотор, 1 элемент — левый

Ozobot — миниатюрный программируемый робот для игр и обучения, который ходит по нарисованным линиям

Возможно, нас действительно легко впечатлить, но робот Ozobot нам понравился. Описать его одной какой-то емкой фразой вряд ли получится, потому что уж довольно многое он умеет. Тем не менее, продается это как интерактивная обучающая игрушка.

Если коротко: то это мини-бот, оснащенный фотосенсорами, которые позволяют ему следовать по нарисованным линиям, запоминать и выполнять разные алгоритмы и действия. Он всегда как бы разный, потому что его действия зависят от того, кто им управляет.

Подробнее же — внутри. Извините, в этот раз много Gif-ок.

Основное «вау» на старте промо разработчики Ozobot пытались вызвать тем, что робот Ozobot Bit следует по нарисованным линиям.

Полагалось, что дети смогут управлять игрушкой, разрабатывая отдельные сценарии и интегрируя его в свои привычные игры. Такой способ коммуникации с игрушкой действительно популярен.

Дети могут не просто наблюдать, как робот ходит по заданной траектории, но придумывать различные «цветовые команды», устраивать соревнования роботов, заставлять выполнять мини-ботов разнообразные забавные зигзаги и развороты.

Учитывая, возможности кастомизации, в целом, этот сценарий кажется и теперь наиболее вероятным. Однако игра рано или поздно может утомить, и поэтому второе назначение робота — обучение, пусть и достаточно простое, программированию.

Как все это работает: работа с маркерами

Первым делом мы поговорим о младшей версии игрушки — Ozobot Bit.

Комплект поставки включает в себя непосредственно гаджет, два «колпачка», кабель зарядки, руководство пользователя, набор для кастомизации (наклейки: глаза, усы и т. п.), маркеры, наклейки с командами и листы с заданиями.

Листы с заданиями — это, по сути, площадка для «походов» вашего Ozobot, точнее вариант для ленивых: для тех, кто не хочет рисовать самостоятельно. Начиная с простого, тут можно просто посмотреть некоторые базовые возможности и порепетировать.

Заодно показано, как надо рисовать, а как не надо: например, весьма и весьма полезно сразу усвоить, что по тонким линиям Ozobot ходит либо неохотно, либо неверно, либо не ходит совсем.

Также в комплекте обучающие материалы с подсказками, правда, все, в том числе и сопутствующий софт, и расходники, и инструкция — на английском языке.

Такие места, где есть пробелы предлагается для тренировки самостоятельно заполнить наклейками с цветовыми командами, а заодно позапоминать, что умеет робот для дальнейшего творческого использования. Также команды приведены в инструкции.

Прежде, чем начать работу, Ozobot требует калибровки: для этого его необходимо поместить на прилагаемый лист в центр черного круга. Также необходимо удерживать пару секунд единственную кнопку до мерцания светлого диода. В случае успеха Ozobot съедет с места и в финале «подмигнет» зеленым.

А дальше — рисуем линии. Робот может ходить и под прямым углом:

И по изогнутой траектории:

Выполнять различные «цветовые команды».

Стоит сказать, что в маркере никакой магии нет: использовать можно и любой другой, не из комплекта. Вот, к пример, «проход по линии», нарисованной другим маркером.

У детей младшего возраста это — наиболее востребованный сценарий использования робота, который вызывает неподдельные позитивные эмоции.

Ozobot Bit — работа с приложением

Робот может работать в паре с фирменными приложениями для IOS и Android. Приложение состоит из нескольких разделов, один из которых позволит сохранить чистые листы в доме: он для рисования.

В зависимости от размера устройства можно придумывать различные маршруты для робота, рисуя пальцем на дисплее.

Также приложение включает несколько игр «на удачу».

Здесь роботом управлять нельзя — он все делает сам. В начале игры его нужно будет поставить на стартовую позицию и наблюдать, к какому игроку он отправится.

Схем несколько. Одна из самых простых представляет собой т-образную развилку.

Наиболее любопытной кажется логическая игра, в процессе которое нужно проложить путь для Ozobot от старта к финишу, используя предлагаемые шаг за шагом элементы.

Также для Ozobot есть нефирменное приложение, где собраны схемы для «прогулок» по дисплею.

Ozobot Bit — работа с ПК

Образовательная часть робота, которая призвана привлечь внимание детей к программированию, перенесена на сайт Ozoblockly. И, надо отметить, это достаточно увлекательный и интерактивный процесс от создания до «выгрузки» схемы на робота.

Сайт представляет собой панель для создания кода, которая имеет несколько уровней сложности от 1 до 5. Например, на 1 шаге все достаточно просто с точки зрения создания алгоритма: движения обозначены линиями, и это будет понятно ребенку.

Далее движения и действия обозначются более сложными способами:

К каждому пункту в разделе помощь дано пояснение, как и зачем его использовать, однако, как уже упоминалось, пока все это на английском языке.

Несложную программу в первом разделе ребенок может создать и самостоятельно. Особенно, вероятно, ему понравится процесс «синхронизации». Для того, чтобы робот воспроизвел заданный алгоритм, необходимо передать данные. Это делается так:

  • Удержать пару секунд кнопку до мигания светлого сигнала
  • Приложить Ozobot к специальному месту на мониторе
  • Дождаться зеленого сигнала

Это — процесс калибровки. Далее необходимо:
  • Один раз нажать на кнопку включения
  • Нажать Load Bit
  • Робот должен в процессе передачи данных мигать зеленым. Если цвет индикатора будет красным, то операцию нужно повторить.

Окно загрузки активируется нажатием в левом нижнем углу на меню Flashing:

Чтобы активировать загруженный режим, необходимо дважды быстро нажать на кнопку включения. Запускать Ozobot можно на любой поверхности.

В итоге вы получаете довольно многофункциональную гик-игрушку и гаджет, управляемую и настраиваемую, которая призвана и развлекать, и обучать одновременно, пусть и опять же в игровой форме! Выглядит Ozobot Bit тоже привлекательно, можно даже сказать «увлекательно».

Сверху, если его не «наряжать» он прозрачный, так что видно плату с элементами. В комплекте же есть две силиконовых «курточки»:

Сам по себе робот очень маленький, чуть-чуть больше пятирублевой монеты:

Снизу располагаются датчики, которые и отвечают за распознавание цветов в Ozobot, перемещается робот на колесиках.

Заряжается робот через MicroUSB кабель, разъем для которого расположен с тыльной стороны:

Сбоку — кнопка включения, выключения, управления роботом.

Кроме специальных чехлов, в комплекте доступны и другие средства индивидуализации робота: наклейки и вставки.

Bit vs Evo

Озоботов — два. Вторая модель считается более продвинутой и интерактивной. Во-первых, потому что тут есть возможность синхронизации по Bluetooth.

Модель Ozobot Evo работает с отдельным приложением, где доступны несколько разделов. Часть из них дублирует уже известные возможности, в частности, сюда перенесен сервис Ozoblokly. Часть из них — уникальная для возможностей модели Evo. К таким можно отнести первый раздел — Drive.

Во-первых, тут, в отличие от Bit, доступны виртуальные инструменты кастомизации. Также Ozobot Evo умеет издавать звуки — их также можно отправить на устройство с этой панели. И, наконец, тут доступно управление роботом по Bluetooth.

Иными словами, для этой игрушки не принципиально наличие алгоритма или линий: модель Evo может управляться ребенком непосредственно со смартфона. Однако, кажется, это не так интересно.

В качестве промежуточного итога для модели Evo:

  • + Звук
  • + Bluetooth
  • + Управление со смартфона
  • + Кастомизация из приложения

В остальном оба робота достаточно похожи и по форме, и по возможностям. Скажем, все, что умеет модель Bit, умеет и Evo: та же работа с ПК, только для разработки программ и синхронизации сверху, слева, необходимо выбрать нужную модель.

И те же возможности в плане прохода по нарисованным линиям. Тем не менее, и отличия найдутся: модель Evo чуть больше.

А вот комплект чуть беднее.

Здесь также есть маркеры, один чехол для робота, кабель для зарядки и сумочка для хранения, а вот уже прочих расходных материалов тут нет.

Единственное, что тут приложено дополнительно — настольная игра.

В остальном роботы довольно похожи: внешне — это прозрачный купол, внутри которого видны схемки и датчики, что должно пробудить интерес к необычной гик-игрушке.

Сбоку единственная кнопка управления.

С тыльной стороны — разъем для MicroUSB.

На самом деле, как показалось при использовании, младшая модель, Bit, для детей представляет не меньший интерес, нежели продвинутая, потому что управлять роботом, подрисовывая ему линии гораздо забавнее, чем управлять роботом по Bluetooth вручную.

Робот, ездящий по линии [Амперка / Вики]

В данной статье будет описан процесс создания робота, ездящего по линии. Эта задача является классической, идейно простая, она может решаться много раз, и каждый раз вы будете открывать для себя что-то новое. Решение этой этой задачи и реализация полученного решения позволяют приобрести необходимые начальные навыки для дальнейшего совершенствования в робототехнике.

Существует множество подходов для решения задачи следования по линии. Выбор одного из них зависит от конкретной конструкции робота, от количества сенсоров, их расположения относительно колёс и друг друга.

В нашем примере будет собран робот на лёгкой платформе с двумя колёсами и двумя датчиками линии, расположенными на днище робота перед колёсами.

В результате выглядеть он будет так:

Что понадобится

Для нашего примера понадобятся следующие детали:

Вообще говоря, лучше было бы использовать NiMH-аккумуляторы: они лучше отдают ток и значительно дольше держат напряжение, но для целей этого проекта одной батарейки на 9 В вполне хватило.

Собираем робота

Сначала соберём робота, установим всю механику и электронику.

Собираем платформу

Для начала прикрепим колёса к мотрорам.

Затем с помощью пластиковых П-образных креплений прикручиваем моторчики к платформе. Обратите внимание на взаимное расположение крепления и моторчики: в креплении есть небольшие углубления, так что если всё соединить правильно, то моторчики будут крепко держаться и никуда не выскочат.

Теперь крепим балансировочный шар.

Отлично! Платформа собрана. Если вам кажется, что колёсам отведено слишком мало места и они трутся о платформу, то скорее всего вам нужно посильнее надавить на колёса, чтобы они плотнее сели на вал мотора.

Крепим сенсоры

Закрепим их, как показано на фото:

Можно было бы выбрать и другое место. Это могло бы сделать контроль проще или сложнее, а самого робота более или менее эффективным. Оптимальное расположение — вопрос серии экспериментов. Для этого проекта просто был выбран такой способ крепления.

Крепим Arduino

Arduino закрепим с противоположной стороны двумя винтиками и гайками.

Опять же, можно выбрать и другое место. Например над колёсами, если приподнять Arduino на латунных стойках. Это изменило бы положение центра масс и повлияло бы на эффективность робота в лучшую или худшую сторону.

Крепим Motor Shield и соединительные провода

Установим Motor Shield на Arduino и подсоединим соединительные провода. Обратите внимание, чтобы соотвествовать программному коду из примера ниже, моторчики соединены с Motor Shield так: правый — к клеммам M1 с прямой полярностью (плюс к плюсу), а левый — к M2 с обратной (плюс к минусу).

В этом проекте, для экономии времени концы соединительных проводов просто скручены с контактами моторов. При работе «начисто» стоит жёстко припаять провода к моторам.

Крепим Troyka Shield

Присоединяем сверху Troyka Shield и подключаем датчики к 8 и 9 цифровым контактам. В итоге получаем следующую конструкцию:

Программирование

Теперь напишем программу, которая заставит собранную конструкцию двигаться по нарисованной линии. В проекте мы будем использовать чёрную линию, напечатанную на белых листах бумаги.

Основная идея алгоритма

Пусть у нас усть белое поле, и на нём чёрным нарисован трек для нашего робота. Используемые датчики линии выдают логический ноль, когда «видят» чёрное и единицу, когда «видят» белое.

На прямой робот должен пропускать трек между сенсоров, то есть оба сенсора должны показывать единички.

При повороте траектории направо, правый сенсор наезжает на трек и начинает показывать логический ноль. При повороте налево, ноль показывает левый сенсор.

Таким образом получаем простую систему с тремя состояниями:

  • STATE_FORWARD — нужно ехать вперёд

  • STATE_RIGHT — нужно поворачиваться направо

  • STATE_LEFT — нужно поворачиваться налево

На вход системы поступает информация с сенсоров. Получаем следующую логику переходов:

Левый Правый Целевое состояние
0 0 STATE_FORWARD
0 1 STATE_RIGHT
1 0 STATE_LEFT
1 1 STATE_FORWARD

Реализация на Arduino

LineRobot_v1.ino
// Моторы подключаются к клеммам 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            35
 
// Коэффициент, задающий во сколько раз нужно затормозить
// одно из колёс для поворота
#define BRAKE_K          4
 
#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2
 
int state = STATE_FORWARD;
 
void runForward() 
{
    state = STATE_FORWARD;
 
    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);
 
    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerRight() 
{
    state = STATE_RIGHT;
 
    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerLeft() 
{
    state = STATE_LEFT;
 
    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
 
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 == targetState) {
        // мы уже делаём всё что нужно,
        // делаем измерения заново
        return;
    }
 
    switch (targetState) {
        case STATE_FORWARD:
            runForward();
            break;
 
        case STATE_RIGHT:
            steerRight();
            break;
 
        case STATE_LEFT:
            steerLeft();
            break;
    }
 
    // не позволяем сильно вилять на прямой
    delay(50);
}

Проблема инертности и её решение

Однако если выставить скорость моторов побольше, мы столкнёмся со следующей проблемой: наш робот будет вылетать с трека, не успевая отреагировать на поворот. Это связано с тем, что наши моторчики не умеют тормозить мгновенно.

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

Эксперимент проведём для разных скоростей. Код программы для эксперимента таков:

stopping_distance_experiment.ino
#define LEFT_SENSOR_PIN   8
#define RIGHT_SENSOR_PIN  9
#define SPEED_LEFT        6
#define SPEED_RIGHT       5 
#define DIR_LEFT          7
#define DIR_RIGHT         4
 
// Для того чтобы убедиться, что именно тормозной путь долог, а не команда остановиться 
// приходит слишком поздно, будем включать светодиод, когда отдаётся команда.
#define LED_PIN           13
 
int currSpeed = 40;
void setup()
{
    for(int i = 4; i <= 7; ++i)
        pinMode(i, OUTPUT);
 
    analogWrite(SPEED_RIGHT, currSpeed);
    digitalWrite(DIR_RIGHT, HIGH);
 
    analogWrite(SPEED_LEFT, currSpeed);
    digitalWrite(DIR_LEFT, HIGH);    
 
    pinMode(LED_PIN, OUTPUT);
}
 
void loop()
{
    if (currSpeed > 120)
        return;
 
    boolean white[] = {
        !digitalRead(LEFT_SENSOR_PIN), 
        !digitalRead(RIGHT_SENSOR_PIN)
    };
 
    if (white[0] && white[1]) {
        // едем пока не упрёмся
        return;
    }
 
    // зажигаем светодиод, останавливаем моторы
    // и наблюдаем
    digitalWrite(LED_PIN, HIGH);
    analogWrite(SPEED_RIGHT, 0);
    analogWrite(SPEED_LEFT, 0);
    delay(5000);
 
    // повторяем эксперимент, увеличивая скорость
    // на 10 пунктов
    currSpeed += 10;
    if (currSpeed > 120)
        return;
 
    digitalWrite(LED_PIN, LOW);
    analogWrite(SPEED_RIGHT, currSpeed);
    analogWrite(SPEED_LEFT, currSpeed);    
}

На той поверхности, на которой проводился эксперимент, были получены следующие результаты:

Таким образом, начиная с некоторого момента у нашего робота нет никакой возможности успеть среагировать и остаться на треке.

Что можно сделать?! После того, как сенсоры улавливают поворот, можно остановиться и вернуться назад на некоторое расстояние, зависящее от скорости перед остановкой. Однако мы можем отдать команду роботу ехать с какой-то скоростью, но не можем приказать ему проехать какое-то расстояние.

Для того, чтобы понять зависимость расстояния при заднем ходе от времени, был проведён ещё один замер:

time_distance_rate.ino
#define SPEED_LEFT      6
#define SPEED_RIGHT     5 
#define DIR_LEFT        7
#define DIR_RIGHT       4
 
void go(int speed, bool reverseLeft, bool reverseRight, int duration)
{
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); 
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); 
    delay(duration); 
}
 
void setup() 
{
    for(int i = 4; i <= 7; ++i)
        pinMode(i, OUTPUT);
} 
 
void loop() 
{ 
    // Задержка 5 секунд после включения питания 
    delay(5000); 
 
    for (int i = 200; i <= 1000; i += 100) {
        // Несколько сотен мс вперёд 
        go(50, false, false, 200);
        go(0, false, false, 0);
 
        // Задержка 5 секунд
        delay(5000); 
    }
 
    // Остановка до ресета или выключения питания 
    go(0, false, false, 0);
 
    // Приехали
    while (true)
        ; 
}

На скорости 50, например, робот проделывал путь, зависящий от времени следующим образом:

Полученные две зависимости были линейно аппроксимированы, затем была выведена формула зависимости времени, которое надо двигаться назад, от скорости перед остановкой.

Обратим внимание на то, что у вас значения могут оказаться другими: из-за особенностей сборки либо из-за поверхности, поэтому в общем случае лучше провести все измерения самостоятельно.

Адаптивное поведение

Перед финальным экспериментом произведём ещё несколько поправок.

Во-первых, нам необязательно давать команду ехать назад перед каждым поворотом, как мы помним, на маленькой скорости робот прекрасно справляется и без этого. К тому же лучше ему двигаться не прямо назад, а немного поворачивая, всё-таки робот находится перед поворотом.

Во-вторых, нам стоит различать состояния робота: когда он движется по прямой, и ничто ему не мешает ускоряться; и когда робот входит в поворот. В первом случае действительно будем увеличивать скорость робота для более динамичного прохождения трека, во втором случае будем сбрасывать скорость до значения, достаточного для успешного прохождения поворота, и будем держать эту скорость ещё какое-то время.

В итоге наш код будет выглядит следующим образом:

Robot_v02.ino
// Моторы подключаются к клеммам 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;
    }
 
}

Результат

Видео

Что дальше?

Представленный алгоритм оставляет множество возможностей для улучшения и оптимизации. Скорость поворота можно так же менять адаптивно. Можно добавить контроль заноса. Можно поиграть с расположением сенсоров и центром масс. В конце концов можно получить непобедимого на треке робота.

Нет ничего лучше, чем обставить оппонента на секунду-другую.

робот, который ходит по линиям / Дроны, квадрокоптеры, моделизм / iXBT Live

Ozobot — миниатюрный робот, который, впрочем, умеет многое. Основной «хайп» вокруг него возник из-за способа управления роботом: ребенок просто рисует линии в разных направлениях, а робот ходит по ним. 

И, тем не менее, все не так просто и однобоко. Я коротко расскажу о нем. 

Робот Ozobot представлен в двух версиях: Bit и Evo. 

Вторая версия (Evо) — более продвинутая с точки зрения исполнения (здесь есть звуковое сопровождение) и возможностей управления (здесь есть Bluetooth, так что можно «рулить» роботом с помощью смартфона). 

Однако функция управления со смартфона применительно к данному гаджету совсем неинтересна: основная фишка Ozobot’ов как раз в том, что они умеют ходить по линиям маркера. 

Мы поговорим о младшей модели — Ozobot Bit. Это компактный, можно даже сказать, миниатюрный бот, размер которого чуть больше пятака: 

Снизу — располагаются как раз фотосенсоры, которые отвечают за распознавание цветов и линий, по которым передвигается робот. Делает он это с помощью колесиков. 

Здесь же, сбоку можно увидеть единственную кнопку управления, которая включает и выключает Bit, а также вводит его путем удержания в режим калибровки. 

Робот выполнен из прозрачного пластика, что должно, вероятно, заинтересовать ребенка: платки и диоды превращают в воображении модели Ozobot в миниатюрных инопланетян! 

С тыльной стороны Ozobot разъем для зарядки. 

На самом деле Ozobot можно «нарядить». В комплекте к роботу Bit идет целый набор для кастомизации: кроме двух силиконовых чехлов. 

Тут довольно много инструментов из картона и наклеек: шляпы, уши, глаза и так далее, и тому подобное.

Это и забавно, и полезно. Например, в роликах на Youtube Ozobot представлен как инструмент для совместной игры, и если роботов на игровой площадке много, то не потерять свой — единственный шанс только принарядив устройство.

Комплектация Ozobot Bit достаточно богатая: это многочисленные обучающие материалы, логические и творческие задания, наклейки с цветовыми кодами, маркеры. Все это можно использовать и для тренировки, и для игры с Ozobot. 

Фишка с маркерами

Робот должен ходить по линиям, и их можно рисовать любым цветом — задача Ozobot различать эти цвета и менять сигнал диода в зависимости от того, по линии какого цвета он в данный момент движется. 

Линии необходимо рисовать по определенному примеру, впрочем, вся эта информация любезно приложена в комплекте с роботом. Второе назначение маркеров — создание цветовых кодов для робота. Ozobot запрограммирован на определенные действия: повороты, зигзаги и т. п., и, чтобы их вызвать, необходимо дать ему сигнал. 

Подобные наклейки уже приложены к сопроводительным материалам Ozobot Bit, чтобы их можно было потренироваться использовать на распечатанных листах с заданиями: 

А вот уже для более сложных индивидуальных сценариев — как раз понадобятся маркеры. Причем, не обязательно комплектные — тут хитрости никакой. У детей появляется отличная возможность создавать всегда разные индивидуальные сценарии игры. 

Причем управлять роботом и менять правила можно прямо по ходу! 

ПК и приложения

Отсутствие Bluetooth не означает отсутствие возможности работать с мобильными устройствами: в приложении ребенка ждет площадка для рисования. 

Несколько игр на удачу. По сюжету каждой из них Bit устанавливается на поле и по клику на старт должен рандомно выбрать, к кому из игроков он отправится. 

Игра-дискотека и игра на логику. По сюжету последней Bit нужно вывести из лабиринта подставляя ему квадратики с линиями поворотов. 

Ценность представляет и специальный сайт для программирования — «Озоблокли». Здесь для робота предстоит создавать алгоритмы, которые он затем будет выполнять.

Работа состоит из нескольких этапов: во-первых, необходимо создать алгоритм. Для этого для начала надо выбрать слева сверху нужного робота: 

Далее предстоит создать и сгруппировать команды для Bit. Всего есть пять уровней от простого к сложному, на каждом из которых движения для робота можно задавать по-разному. 

Для каждого пункта, задачи, действия можно открыть подсказки справа. 

После того, как все будет запрограммировано, задачу необходимо передать на Bit. Это также происходит довольно любопытным способом. 

Для начала робот необходимо вызвать меню «Flashing» и откалибровать Bit: 

  • Зажать и удерживать кнопку до светового сигнала
  • Поднести к специальному полю на экране
  • Дождаться зеленого сигнала о том, что калибровка закончена

После этого робот нужно будет еще раз включить, разово нажав на кнопку, и уже затем нажать «Load Bit», не снимая робот с дисплея. Если процесс проходит корректно, робот будет мигать зеленым. При красном сигнале на Bit, придется все переделать. 

Чтобы робот воспроизвел загруженные действия, необходимо будет дважды быстро нажать на кнопку включения. 

Ozobot Bit — что в итоге? 

И мне, и детям робот Ozobot Bit показался забавным, а впечатления от теста остались положительными. Положа руку на сердце, сказать, что сложные задачи с ним, типа программирования, кодирования мы выполняли неохотно и постольку, поскольку. Работа с приложением в логической его части вполне оправдана. 

Но по-настоящему детские эмоции пробуждает хаотичный процесс рисования и наблюдения за тем, как робот следует по предначертанному пути с постоянной сменой задач и установкой новых требований. Листов было изведено, мягко говоря, изрядно. Прелесть игрушки еще и в том, что она как бы всегда разная, всегда уникальная и непредсказуемая. 

Робот на RaspberryPi, Arduino и RaspiCam + OpenCV. Часть 1 Обзорная / Хабр

Очень часто на хабре появляются статьи о том как использовать Raspberry Pi как медиацентр, передвижную видеокамеру, удаленную web камеру и… собственно все. Очень странно, что в такой большой IT тусовке — довольно мало информации о том — как его программировать и использовать одноплатный компьютер там, где он действительно довольно полезен — во всяких встраиваемых системах, где есть ограничения по размеру и стоимости, но также есть потребность в производительности. В нескольких статьях постараюсь описать на примере создания мобильного колесного робота с компьютерным зрением — как можно использовать малинку для создания роботов(штук с интеллектом на борту, а не управляемых с андроида машинок с веб камерой).



Всегда было интересно программировать что то механическое — ощущаешь себя Богом(как и большинство программистов) — вдыхаешь в кучу деталей душу. Наверное все помнят ту детскую радость от первого мигания светодиодом, шевелящегося сервопривода и т.д. — когда сделал что то, что можно потрогать, что живет, двигается, а не сайтик на php.
Во многих своих творениях, а тем более роботах — человек всегда старается повторить самого себя, или часть своих функций. 80% информации об окружающем мире мы получаем через зрение — так что компьютерное зрение, на мой взгляд, одна из основополагающих областей знания в робототехнике.

Изучение ее я начинал с чтения академических трудов по алгоритмам параллельно с освоением библиотеки компьютерного зрения OpenCV на C++(в случае с Raspberry — Python)- знание принципов работы алгоритмов поможет Вам оценить сложность и выполнимость задачи, еще до начала ее выполнения, а также оптимизировать алгоритмы в критичных местах. Даже если Вы будете пользоваться в основном библиотечными функциями — они хорошо оптимизированы, и вряд ли вы с нуля напишете лучше — Вы сможете оптимизировать какие то параметры, которые незначительно влияют в конкретном случае на решение вашей задачи, но значительно влияют на скорость ее решения — в общем возвращаясь к холивару — «нужна ли программисту математика» — В данном случае нужна, так что советую напрячь немного извилины и разбираться хотя бы поверхностно в работе алгоритмов.

Также нелишне будет хотя бы поверхностно изучить Теорию Автоматического Управления — вместо расписывания ее возможностей — предлагаю просто посмотреть следующее видео (BTW — половина его команды — русские)

Составные части робота



Вряд ли у Вас под рукой окажутся 1 в 1 те же самые детали, что и у меня, если захотите повторить — поэтому буду описывать общую концепцию, а вы уж смотрите сами.

Механика


Механическая основа робота — двухколесная с дифференциальным приводом — классическая, в общем то, для первых робототехнических экспериментов — у нее 2 независимых колеса и ее движение контролируется исключительно скоростями и направлением их вращения (подобно винтам квадрокоптера). Кроме собственно колес имеется шаровая/колесная опора, в продвинутых системах — энкодеры для обратной связи и контроля текущей скорости двигателей, что позволяет более эффективно управлять двигателями.

Контроллер двигателей


В качестве контроллера двигателей можно использовать любой микроконтроллер, у меня используется Arduino nano — потому что просто попалось под руку.
Возможно возникнет вопрос — почему бы не управлять напрямую с Raspberry? Дело в том, что у оперционной системы квант времени гораздо больше, чем у микроконтроллера, кроме того нет аппаратных ШИМов, плюс, если мы захотим улучшить управление двигателями при помощи обратной связи и Теории Управления — это потребует вычислительных затрат и более быстрой реакции — поэтому управляющая двигателями часть и мозг робота разделены — arduino просто получает по UART команду — с какими скоростями и направлениями мозг бы хотел, чтобы крутились двигатели — как это будет достигаться — просто включением ШИМа с нужной скважностью или хитрым управлением, когда вначале мы подаем напряжение больше уставки, раскручивая двигатель, а потом выравниваем — таким образом ускоряя раскрутку двигателя до нужной скорости — все это уже заботы контроллера двигателей, а не Raspberry — поскольку это вообще говоря задача гораздо более жесткого времени — на порядок — два меньшего, чем позволяет Raspberry, да и вообще подобные системы.

Драйвер двигателей


Одной лишь ардуинки недостаточно, чтобы двигатели закрутились — ток, отдаваемый ножкой слишком мал — если мы на маленький выходной транзистор ножки контроллера посадим обмотку двигателя, требующего ток порядка ампер — то просто устроим КЗ — замкнем ключ сам на себя и он скорей всего просто выйдет из строя — поэтому нужен более мощный ключ, позволяющий пропускать через себя большой ток — если нам требуется крутить двигатель в одном направлении — в общем то нам достаточно одного транзистора, но если мы хотим крутить в разных — нам их уже потребуется 4 — такая схема называется H — мост — замыкая диагональные ключи при закрытых других диагональных — мы можем менять направление тока в двигателе.
И такая схема необходима для каждого колеса. К счастью в наше время нет нужды ее собирать — она реализована в виде интегральных микросхем, коих великое множество — так что, подойдет любая, способная управлять током, нужным вашему двигателю. У меня используется вот такой двухканальный от pololu:

Также имеется великое множество всевозможных шилдов для ардуин — при помощи гугла вы их легко найдете по запросу «arduino motor driver». Схему подключения также обычно предоставляет производитель или пользователи всевозможных форумов — ищущий да обрящет. У микросхем 2 питания — одно — которое подается на двигатели от мощного источника тока — например Li-Pol батарейки 7.2В, другое — питание входного каскада логики — ардуиновские 5В, также имеется входы, контролирующие направление вращения каждого канала и вход Enable — подавая на который ШИМ сигнал мы можем регулировать скорость вращения двигателя. Могут быть различные конфигурации в зависимости от шилда, но основные выводы — такие.

В общем то соединив таким образом Arduino, драйвер двигателей, двигатели и батарейку(или просто какой нибудь источник тока на длинном проводе) можете уже начинать играться с управлением моторами. Для получения команд от Raspberry потребуется реализовать прием строчки по UART и ее парсинг — протокол можете тут придумать какой вашей душе угодно. вышеперечисленное — основные части практически любого колесного робота — далее уже начинаются варианты — можете вообще забить на компьютерное зрение и сделать робота чисто на Arduino, который, например, ездит по линии, объезжает препятствия при помощи датчиков расстояния и т.п.

Главный контроллер



Моя же задача — сделать несколько более интеллектуальную платформу для ислледования компьютерного зрения и теории управления — так что следующим элементом системы будет являться одноплатный компьютер Raspberry Pi B+ в виду его невысокой цены, распространенности и доступности информации. В сборку Raspbian включен Python интерпретатор — так что писал программу для робота я на нем

Камера



В качестве камеры можно в общем то использовать любую вебку(что я первое время и делал) — у меня используется Raspicam — она небольшая, легкая, есть отдельный порт для ее подключения, широкий угол обзора хороший драйвер и 90 фпс в VGA разрешении.

Средство отладки



Для отладки я использую USB Wifi свисток, подключаясь к Raspberry через удаленный рабочий стол по SSH. Тоже в общем то можно использовать любой, для первоначальной настройки вообще можно использовать Ethernet кабель и SSH

Система питания


Аккумулятор — литий полимерный от 2Ач на 7.2В номинального напряжения + зарядка.

Понижающий DC-DC преобразователь — батарея наша выдает от 8.4 до 6В — это напряжение мы можем напрямую подавать на двигатели через микросхему драйвера, но для питания Raspberry и Arduino требуется 5В источник питания — по документации Raspberry Pi требуется источник 5В, способный отдавать не менее 800мА — можно конечно понизить напряжение с батарейного до 5В при помощи линейного стабилизатора, но при таких токах он будет греться и неэффективно использовать заряд батареи, так что я рекомендую использовать импульсный понижающий DC-DC преобразователь — от него у меня питается и Raspberry и Arduino

Собственно фото моего нанотехнологичного робота и пара видео его езды по различным соревновательным трекам в качестве демонстрации:

Линия профи(прерывистая)

Тонкая линия с резкими поворотами(Евро)

В общем обзорная статья закончена — рассказал об основных используемых инструментах, далее уже будет более конкретно, а именно:
1.Введение
2.Первоначальная настройка Raspberry Pi + отладка по Wifi
3.Начало работы с OpenCV, Raspicam на Python
4.Управление роботом, ПИД регулятор, примеры
Вопросы, замечания, дополнения и пожелания по следующим статьям оставляйте в комментариях, очепятки и прочее — в личку

Движение по черной линии Ev3

На данном уроке мы разберем движение робота Ev3   вдоль  черной линии.

Напишем программу для движения робота по черной линии для Lego Ev3. Познакомимся с логическими операциями Ev3.

Для того, чтобы робот Ev3 двигался постоянно вдоль черной линии  в программе используется бесконечный цикл в нем происходит считывание  данных с датчиков  цвета, освещенности, анализ данных датчиков и соответсвующие маневры робота. В нашем роботе левый датчик цвета подключен к порту 3, правый датчик подсоединен к порту 1. Левый мотор подключен к порту В, правый мотор к порту А.

На рисунке показан блок считывания данных с датчика освещенности.

Если значение меньше 5  (знак сравнения 4) , то значит датчиком мы заехали на черную линию.

Если значение больше 5 (знак сравнения 2), то заехали на белое поле

Алгоритм движения по черной линии для робота с двумя датчиками следующий.

Если робот  заехал левым датчиком на черную линию, то  робот сворачивает (съезжает с линии) налево. Если робот заехал правым датчиком на черную  линию, то поворачивает направо. Если обоими датчиками видит белое поле, то робот едет вперёд. Если обоими датчиками он видит чёрную линию, то это перекрёсток, он едет вперёд и съезжает с перекрестка.

Чтобы обрабатывать одновременно данные с нескольких датчиков, необходимо использовать логические операции. Для того чтобы выполнялись  оба условия,  используется  логическая операция И.

 

 

Напишем программу для движения вдоль черной линии для робота Ev3.

У нашего робота левый датчик освещенности подключен к порту 3, правый датчик освещенности подключен к порту 1.

1 действие. Считываем данные с датчиков освещенности заходим в яркость, отраженного света Записываем их в логический блок И ( Красный блок)

2 действие. Соединяем логический блок с переключателем, который выставлен в логическое значение.

3 действие. В условие ставим поворот налево. Смотри урок 1 Повороты Ev3

4 Действие. Повторяем считывание датчиков освещенности и логический блок

Значение датчика освещенности  1 становится меньше 5, а датчика с портом 3 больше 5.  В этом случае чёрную линию видит правый датчик. Поворот делается направо, поэтому правый  мотор (порт А) вращается назад , мощность со знаком минус, а левый мотор (порт B)  вращается вперед. Осуществляется поворот направо. В цикле движения выставите  не очень большое время  порядка 0,1 секунды, чтобы робот реагировал быстрее на изменение траектории. 

 

5 действие. Если оба датчика освещенности фиксируют белое поле, то робот движется вперед. Опять считываем данные с обоих датчиков. Ставим в считывании датчиков знак больше, мощность обоих моторов положительная.

6 действие. . Если оба датчика освещенности фиксируют  чёрную линию, то движемся вперёд. Считывание датчиков, для обоих датчиков ставим меньше 5, для обоих моторов выставляем движение вперед

Для изменения скорости движения по черной линии необходимо поменять мощность моторов при движении вперед. Если траектория будет слишком крута и робот будет слетать с черной линии, необходимо уменьшить мощность при движении вперед и увеличить мощность при поворотах. 

 Вернуться к содержанию  Перейти к уроку Движение по линии до перекрестка

Полезно почитать по теме движение по черной линии lego робота
Движение робота по черной линии до перекрестка
Пропорциональный регулятор  с двумя датчиками
Инструкция для сборки робота ev3 для движения по черной линии

Поделиться:

 

 

 

micro: руководство по эксперименту с набором ботов — learn.sparkfun.com

Добавлено в избранное Любимый 4

Эксперимент 3: Следование по линии

Введение

Хорошо, ваш робот находится внутри коробки, нарисованной на полу, но это все равно кажется немного странным и случайным. Вы хотите, чтобы ваш робот куда-то пошел, сделал что-то и продолжал идти! В этом эксперименте вы уточните, что вы узнали из эксперимента 2, чтобы заставить своего робота следовать по линии.

Необходимые детали

Вам понадобятся следующие детали:

  • 1x micro: битовая плата (не входит в комплект)
  • 1x USB-кабель Micro-B (не входит в комплект)
  • 1x мото: бит несущая плата
  • 2x Колеса
  • 1x Собранное шасси Shadow
  • 2x мотор-редукторы Hobby
  • 1x Держатель батареи 4xAA
  • 4 батарейки AA (не входят в комплект)
  • 3x Датчики слежения за аналоговой линией
  • 3x 3-контактные перемычки

Не получили комплект? Не бойся! Вот детали, которые вам понадобятся для завершения этого эксперимента.Возможно, вам не понадобится все, в зависимости от того, что у вас есть. Добавьте его в корзину, прочтите руководство и при необходимости отрегулируйте корзину.

Кабель USB micro-B — 6 футов

В наличии CAB-10215

USB 2.0 типа A на 5-контактный микро-USB. Это новый разъем меньшего размера для USB-устройств. Разъемы Micro USB примерно вдвое дешевле…

13

микро: битовая плата

В наличии DEV-14208

BBC micro: bit — это карманный компьютер, который позволяет творчески работать с цифровыми технологиями.Каждый заказ содержит только…

9

Шасси Shadow

В наличии ROB-13301

Shadow Chassis — это удивительно прочная модульная роботизированная платформа от RobotZone. Пластины шасси и крепления вырезаны…

7
Рекомендуемая литература

Начало работы с micro: bit

BBC micro: bit — это компактный, мощный инструмент программирования, не требующий установки программного обеспечения.Читайте дальше, чтобы узнать, как использовать ПО ВАШЕМУ!

Введение в использование нескольких датчиков линии

В предыдущем эксперименте вы использовали однолинейный датчик (средний датчик) для обнаружения линии на полу. Это отлично подходит для того, чтобы оставаться внутри линии, но теперь вам нужно следовать линии. Вот тут и пригодятся два других линейных датчика.

По сути, вы хотите, чтобы центральный датчик обнаруживал линию, но не два других, а это означает, что робот находится по центру линии.Если один из боковых датчиков обнаруживает линию, это означает, что вы отклоняетесь в ту или иную сторону и ваш робот должен исправиться. Мы будем использовать информацию от нескольких датчиков в сочетании с блоком операторов if / else , чтобы построить дерево решений, которому будет следовать ваш робот. Для простоты мы начнем с использования всего двух линейных датчиков (левого и правого), чтобы следовать за темной черной линией. По мере того как вы добавляете к роботу дополнительные датчики отслеживания линии, код может усложняться. Однако робот сможет лучше следовать за линией.

P0 и P2 чтение черной линии

Подключение оборудования

Примечание: Если вы уже подключили свои датчики в эксперименте 2, пропустите этот раздел.

Как и моторы, вы уже должны были подключить линейные датчики во время сборки данного руководства. Вы можете перейти туда сейчас для получения полной инструкции по сборке. Дважды проверьте правильность подключения проводов к линейным датчикам!

Линейные датчики подключаются к moto: bit через перемычки типа мама / мама, которые проходят через шасси вашего робота до moto: bit.Датчики подключаются к мото: бит в следующем порядке:

  • СЛЕВА => PO
  • ЦЕНТР => P1
  • СПРАВА => P2

Дважды проверьте, правильно ли они подсоединены и в правильной ориентации


Эксперимент 3a — Показание простого ИК-датчика

Разобьем этот эксперимент на две части. Во-первых, у нас будет микро: бот будет следовать прямой темной черной линии.Затем у нас будет немного более сложный путь, чтобы попытаться заставить микробота объехать путь с зигзагообразным узором.

Запуск сценария

Не забудьте добавить пакет moto: bit, как описано в разделе «Установка пакета moto: bit в MakeCode» данного руководства.

Теперь вы можете либо загрузить приведенный ниже пример сценария и перетащить его на свой micro: bit, либо использовать его в качестве примера и создать его с нуля в MakeCode.

Калибровка очень важна для точной работы линейных датчиков.Ваша среда сильно повлияет на аналоговые показания P0 и P2 и пороговые значения для значений поверхности, поэтому вам, возможно, придется настроить эти числа в соответствии с вашим приложением.

Код примечания

Давайте посмотрим на код и чего ожидать.

Нажмите на изображение для более детального просмотра

черный_Line_L и черный_Line_R

Как и в предыдущем эксперименте, вам необходимо установить базовое значение для поверхности, по которой движется ваш робот.Фактически это называется калибровочным значением. Теперь нам нужно сделать это для двух датчиков; Лево и право. Мы проделываем ту же процедуру, что и раньше для одного датчика, но для левого и правого датчиков.

Разделитель запятой

Для отладки снова выставляем серийник. Однако мы будем использовать блок join с разделителем-запятой. Это полезно для построения графиков показаний более чем одного датчика.

Нажатие кнопки включения

Как и в первом эксперименте, мы используем блок On Button Press для запуска программы.Поскольку мы снова используем кнопку A для повторной калибровки датчиков, следующих за линией, когда нам это необходимо, мы будем использовать кнопку B для запуска программы. Это сделано для того, чтобы вы могли получить хорошее базовое показание для калибровки датчиков, не пытаясь бороться с роботом, который пытается передвигаться. Чтобы напомнить нам, что нужно нажать кнопку B, блок on start отображает короткую анимацию один раз, указывая на кнопку B. Если переключатель двигателя повернут в сторону RUN MOTORS, нажатие кнопки B заставит micro: bot начать выполнение линия.

Хотя

Блок Пока — это логический блок, который похож на блок цикла , но немного умнее. Блок While принимает оператор TRUE / FALSE, если этот оператор истинен, блок зациклит любой код, помещенный внутри него. Если это значение ложно, блок While просто пропускается. Мы жестко кодируем значение true в блоке While , чтобы он постоянно зацикливался при нажатии кнопки B.Таким образом, мы получаем преимущества как блока событий, так и блока цикла без необходимости сложного программирования.

Если условия условия

Мы снова воспользуемся операторами if / else , чтобы проверить показания датчика и переместить micro: bot:

  • Случай 1 :
    • Если оба читают одно и то же, двигаться вперед .
  • Случай 2 :
    • Если левый датчик видит темную черную линию, а другой - нет, перемещается вперед и немного влево к темно-черной линии ближе к левой стороне micro: bot .
  • Случай 3 :
    • Если правый датчик видит темную черную линию, а другой - нет, перемещается вперед и немного вправо к темно-черной линии ближе к правой стороне micro: bot . Есть небольшие различия в моторах и колесах, поэтому мы немного подправляем левый мотор, чтобы micro: bot фактически поворачивался вправо ( 50 + 5 ).
  • Кейс 4 :
    • Если мы не видим темно-черную линию, остановитесь .

Что вы должны увидеть

Последовательный выход

Мы снова воспользуемся консолью MakeCode для вывода последовательного вывода. Если вы подключили micro: bit к своему компьютеру и использовали функцию загрузки одним щелчком для MakeCode, в MakeCode должна появиться кнопка « Показать консольное устройство ». Нажмите кнопку, чтобы просмотреть последовательный вывод.

Вы заметите, что данные начнут прыгать, когда линия, следующая за датчиками на P0 и P2, будет считывать поверхность.Ниже приведен снимок линии, следующей за датчиками на светлой поверхности. Обратите внимание, что выходной сигнал обоих датчиков не был одинаковым. Это связано с небольшими различиями в датчиках следования за линией. Вы можете увидеть другой результат со своими датчиками.

Перемещая micro: bot по куску коричневого картона и черной изоленты, вы заметите, что показания датчика меняются одновременно с уменьшением масштаба графика.

Белый стол под P0 и P2 Коричневый Картон под P0 и P2 Черная изолента под P0 и P2

Для этого чтения мы переместили micro: bot глубже в картон так, чтобы расстояние между датчиками линии следования и картонной коробкой было одинаковым.

Давайте посмотрим на тот же график, но выделенный для разных поверхностей. В целом результат аналогичен тому, что мы видели в эксперименте 2, когда двигатели выключены.

На изображении ниже выделена область, где он находится выше black_line_L - 100 и black_line_R - 100 . Обратите внимание, что нам нужно сделать это для левого и правого датчика следования по линии из-за небольших различий. В результате все, что выше ~ 875 для левой линии, следующей за датчиком (как показано красной линией), вероятно, является темной поверхностью.Кроме того, все, что выше ~ 892 для датчика, следующего за правой линией (как показано черной линией), вероятно, является темной поверхностью.

Когда мы включаем двигатели для micro: bot и просматриваем данные, выход будет зашумленным, а не постоянным. Вы также увидите, что выходной сигнал становится немного больше, когда моторы включаются, когда он пытается следовать за темной черной линией. На изображении ниже выделена область, когда оба датчика видят темно-черную линию. Когда это произойдет, micro: bot двинется вперед.

На изображении ниже показано, когда левая линия, следующая за датчиком (когда она выше black_line_L - 100 ), видит темную черную линию. Моторы включаются и пытаются двигаться к линии слева. Обратите внимание, что правая линия, следующая за датчиком, остается около того же значения, но становится шумной.

На изображении ниже показано, когда правая линия, следующая за датчиком (когда она выше black_line_R - 100 ), видит темную черную линию. Моторы включаются и пытаются двигаться к линии справа.Обратите внимание, что левая линия, следующая за датчиком, остается около того же значения, но становится шумной.

Прямая линия После микро: бот

После загрузки скрипта поместите своего робота на темно-черную линию на светлом / белом фоне. Убедитесь, что он выровнен по центру линии под датчиком центральной линии. Убедитесь, что переключатель двигателя переключен с «ОСТАНОВИТЬ ДВИГАТЕЛИ» на «РАБОТАЮЩИЕ ДВИГАТЕЛИ», и нажмите кнопку B для запуска.

Остановка двигателей Ходовые двигатели

Ваш робот должен двигаться вперед, пока один из датчиков боковой линии не обнаружит темно-черную линию, а затем он повернет в этом направлении, чтобы исправить себя.В зависимости от формы и толщины вашей линии ваш робот может больше или меньше «ковылять». Если у вас мотор работает слишком быстро, он будет продолжать движение, пока не увидит светлую поверхность. Убедитесь, что робот медленно движется вперед, иначе он может упасть за край стола!


Эксперимент 3b - Следование по курсу зигзагами

Теперь, когда micro: bot может следовать по прямой линии, давайте попробуем заставить micro: bot следовать по простому многоугольнику зигзагами.

Запуск сценария

Не забудьте добавить пакет moto: bit, как описано в разделе «Установка пакета moto: bit в MakeCode» данного руководства.

Теперь вы можете либо загрузить приведенный ниже пример сценария и перетащить его на свой micro: bit, либо использовать его в качестве примера и создать его с нуля в MakeCode.

Калибровка очень важна для точной работы линейных датчиков. Ваша среда сильно повлияет на аналоговые показания P0 и P2 и пороговые значения для значений поверхности, поэтому вам, возможно, придется настроить эти числа в соответствии с вашим приложением.

Код примечания

Давайте посмотрим на код и чего ожидать.

Нажмите на изображение для более детального просмотра

Заявление об изменении условия if

Большая часть кода, используемого для эксперимента 3B, почти такая же, если следовать черной линии. Вы должны увидеть те же операторы условий для случаев с 1 по 3 при использовании P0 и P2, когда micro: bot пытается следовать за темной черной линией.

Случай 1 - движение вперед Случай 2 - движение вперед и влево Случай 3 - движение вперед и вправо

Однако случай 4 будет настроен для продолжения поиска пути.Если мы не видим темную черную линию, мы сделаем шаг назад и трижды поищем влево. Переменная move_left будет отслеживать, сколько раз мы смотрели налево. Каждый раз, когда мы ищем налево, мы увеличиваем мощность двигателя, чтобы мы не застряли в одном месте. После третьего раза мы попробуем посмотреть вправо, прежде чем начинать все сначала.

Нам нужно использовать переменную move_left только в случае 4. Мы будем сбрасывать переменную всякий раз, когда перейдем к другим случаям.

Что вы должны увидеть

Последовательный вывод будет таким же, если вы откроете консоль MakeCode. Если вам нужно, вы можете открыть его, чтобы просмотреть результат. Если вы еще этого не сделали, сделайте дорожку на плоской поверхности с разными краями. Убедитесь, что рядом с дорожкой достаточно материала. Если колеса или зубчатый ролик сойдут с гусеницы, у него могут возникнуть проблемы при попытке вернуться на поверхность. Для этого эксперимента мы использовали картонную поверхность с черной изолентой. Дополнительный картон был прикреплен, чтобы предотвратить застревание micro: bot.

Этот пример хорошо подходит для отслеживания небольших изменений линии при поворотах, но также позволяет корректировать резкие повороты. Вы выполните те же действия, чтобы робот начал следовать по линии. Единственное отличие состоит в том, что в этом примере робот будет следовать зигзагообразным курсом. По умолчанию, micro: bot пытается исправить себя, чтобы в конечном итоге следовать по треку против часовой стрелки. Имейте в виду, что существуют ограничения на отслеживание темной черной линии при использовании только двух датчиков отслеживания линии.Кроме того, поверхность не была полностью плоской. Как видно из гифки ниже, пол раскачивался, когда micro: bot следовал за линией. Добавление дополнительных датчиков следования за линией может помочь микроботу лучше следовать за линией и удерживать его от съезда с трассы.


Дальше: Ваш робот может пойти туда, куда вы ему скажете, проследив линию. Мы только поцарапали поверхность для проблем с отслеживанием линии. Вот еще несколько задач, которые стоит изучить и поэкспериментировать:
  • Попробуйте добавить больше кода для использования датчика слежения за центральной линией.
  • Вместо того, чтобы заставить робота двигаться против часовой стрелки, попробуйте заставить робота двигаться по часовой стрелке.
  • Отрегулируйте код, чтобы он соответствовал темной черной линии для сложного лабиринта
  • Отрегулируйте скорость двигателя и снимите матрицу светодиодов, чтобы увидеть, насколько быстро ваш робот, следующий за линией, может двигаться вдоль линии, не отклоняясь от курса.
  • Используйте встроенный акселерометр для увеличения скорости мотора, когда micro: bot находится на наклонной поверхности, чтобы робот мог перемещаться по пересеченной местности.
  • Добавьте дополнительный режим, чтобы инвертировать условия, чтобы они следовали светлой белой линии на темной поверхности вместо темной черной линии на светлой поверхности.
  • Попробуйте отрегулировать ширину вашей колеи, чтобы увидеть, может ли робот следовать по более узкой линии.

Поиск и устранение неисправностей

  • Робот движется по кругу - Дважды проверьте свою проводку и свой код, ваш робот не видит линии. Кроме того, дважды убедитесь, что датчик не блокирует пыль.

  • Робот не двигается - Досадный выключатель мотора! Убедитесь, что он установлен в положение «работа» и у вас есть свежие батареи.

  • Робот не едет вперед - Если ваши двигатели подключены правильно и мы инвертировали оба двигателя в коде, попробуйте нажать кнопку сброса на micro: bit. Это может произойти после загрузки при первоначальном включении micro: bit.

  • Движение задним ходом ?! - Есть два варианта, если вы заметили, что микробот движется в неправильном направлении.Как объяснялось выше, вы можете перевернуть проводку двигателей или использовать набор & lowbar; & lowbar; & lowbar; & lowbar; инвертировать двигатель в & lowbar; & lowbar; & lowbar; & lowbar; Блок в вашем при запуске Блок , чтобы изменить прямое и обратное.

  • Робот много вертится! - Измените ширину вашей линии.

  • Робот не обнаруживает линию - Если изменение ширины линии не помогает, помните, что настройки калибровки датчика линии могут быть очень чувствительны в зависимости от вашей среды.Также код калибруется при запуске micro: bot. Убедитесь, что датчики расположены над черной линией.


← Предыдущая страница
Эксперимент 2: Пребывание в коробке .

Jet, робот для быстрого следования за линией

Jet, робот, который следует за линиями со скоростью более 1 метра в секунду

Мотивация

Я давно восхищаюсь роботами Стива Хассенплуга, следящими за линией, за их изящные движения.

Первый раз я увидел одного из его роботов на конкурсе ChiBots Spring 2002. Я заканчивал достаточно быстрый пробный заезд, когда Стив (которого я раньше не встречал) спросил, может ли он попробовать пару тренировочных кругов.Я улыбнулся про себя, когда увидел, что это «просто робот LEGO».

Но через несколько секунд после взлета LEGO Lightning Стива мое отношение изменилось, и небольшая толпа собралась, чтобы полюбоваться его скоростью. Посмотрев пару кругов (что не заняло много времени), мой робот и я тихо попятились.

В тот день скорость LEGO Lightning Стива составила 73,8 см / с. Его робот был более чем в два раза быстрее следующего самого быстрого конкурента (у меня 34 см / с).

В конкурсе ChiBots Fall 2004 Стив превзошел самого себя. Трасса состояла из 10 прямых плиток (линия длиной 12 дюймов) и 12 поворотных плиток (линия длиной 9,4245 дюйма), всего 233,1 дюйма или 592,07 сантиметра. Роботу Стива Бен Гура потребовалось всего 21,48 секунды, чтобы пройти три круга, что соответствует линейной скорости:

(592,07 см * 3 круга) / 21,48 секунды = 82,7 см / с.

Важной особенностью конструкции Стива является его рулевой механизм.Некоторые люди ошибочно полагают, что это рулевое управление Акермана, но на самом деле это дифференциальное рулевое управление, при котором большая часть массы (мозг, батареи) перевозится, как тележка.

Реакция происходит быстро, поскольку рулевое управление состоит только из компактной группы двигателей и датчиков - небольшая масса, низкий крутящий момент. Это эффективное автоматическое сглаживание, так как робот не борется с изменением направления большей части массы, перемещая датчики вперед и назад, пытаясь отцентрировать линию.

Предшественники

Не люблю соревнования на скорость. Единичный метод подсчета очков слишком удушает. Эти типы конкурсов, как правило, поощряют узкий диапазон дизайнов вместо разнообразных и креативных роботов с различными стратегиями подсчета очков.

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

  • Моя вторая попытка, Конденсированный суп, была намного легче (360 граммов).Но двигатели Condensed Soup находились слишком далеко от датчиков (17 см), в результате чего миниатюрным двигателям требовался слишком большой крутящий момент, чтобы они могли быстро менять направление. Конденсированный суп показал результат 51,78 см / с на конкурсе в апреле 2003 года. Хотя мой робот был быстрее своих предшественников, он не мог приблизиться к скорости Бен Гура.

Как вы понимаете, мне было бы недостаточно создать робота, который был бы быстрее, чем у Стива.Робот должен быть другим (не имитацией его конструкции) и преодолевать барьер 100 см / с. И, конечно же, это должно быть сделано на стандартной трассе соревнований, а не на чем-то, рассчитанном на скорость (например, овал с длинными прямыми участками или поверхность с высоким сцеплением).

Курс

Курс следования по линии ChiBots состоит из белой линии 3/4 дюйма на темной плитке. Есть прямые плитки, поворотные плитки и пустые плитки (для заполнения центров и краев).

Плитка по линии 592 см в соответствии с раскладкой ChiBots Fall 2004

Раскладка тайлов «Осень 2004» включает прямые участки разного размера (1, 2, 3 и 4 плитки в длину). Он включает одинарные, двойные и тройные повороты, а также S-образную кривую. Как побежал, он предпочитает правые повороты 8: 4. Однако правила позволяют бежать в любом направлении. Я считаю, что макет осени 2004 года - отличное место для полноценной тренировки базового робота, следующего по линии.

Скорость реактивного двигателя

Я рад сообщить, что 23 декабря 2004 года мой новый робот, Джет, успешно завершил схему трассы схемы падения ChiBots на скорости 104 см / с. Приглашаю вас скачать небольшое (800 КБ), плохо освещенное видео.

ЖК-дисплей с таймером следования по линии, показывающий разделение круга, круг и общее время

(592,07 см * 3 круга) / 17,05 секунды = 104,18 см / с или чуть более 1 м / с.

Я разработал Jet другим курсом.Затем я несколько раз запускал Jet на макете ChiBots, оптимизируя настройки скорости между запусками. Это то же самое, что и на практике. Jet не запоминает курс, и никакое программирование не использует преимущества схемы курса, радиуса поворота плиток или чего-либо подобного.

Плитки - это точно такие же плитки из вспененного ПВХ, которые использовались для осеннего конкурса. Нет поверхности подготовка была произведена, за исключением легкого протирания полотенцем перед началом тренировочные круги.(Так же, как Эдди Райт или Майк Дэйви поступили до осени конкурс.)

Низкопрофильные пары отражателей инфракрасный излучатель-детектор для поверхностного монтажа для датчиков слежения за линией. Белые непрозрачные направляющие блокируют рассеянный свет и обеспечивают оптимальное минимальное расстояние до пола.

Были и добродушные претензии к условиям освещения в день конкурса. Однако я не считаю, что условия освещения актуальны для Jet, так как датчики, которые я использую, находятся менее чем в 1 мм от пола и затенены медной заземляющей пластиной.(Эдди Райт порекомендовал мне низкопрофильные инфракрасные датчики вместо моих обычных светодиодов видимого света высотой 8,5 мм.)

С учетом всего вышесказанного я понимаю, что легко говорить чушь о том, насколько хорошо ваш робот работает дома. Я старался воспроизвести конкурсный курс как можно лучше, но настоящее доказательство должно было появиться на открытом конкурсе.

Взлет

День гонки. 15 мая 2005 г. Публичная библиотека Шаумбург.

Трасса для конкурса ChiBots Spring 2005 соответствовала планировке Fall 2004. Хотя в будущих конкурсах может использоваться другой формат, это сделано для прямого сравнения с результатами Fall.

Jet больше не имеет параметров, которые нужно настраивать или настраивать. Потребовался один тренировочный круг, чтобы убедиться, что он работает. Затем он терпеливо ждал в коробке.

При первом официальном запуске Jet работал с более легким аккумулятором на 8.4 В. Я хотел использовать более тяжелый аккумулятор, но при транспортировке оборвался провод. Из-за небольшого изменения алгоритма (обмен скорости на согласованность), Jet удалось немного медленнее, чем на практике дома. Тем не менее ...

17,71 секунды -> 100 см / с !!!

ChiBots допускает до трех попыток. Пока другие участники соревновались, я добавил дополнительную батарею и регулятор напряжения, чтобы довести напряжение до 9.6 В.

15,38 секунды -> 115 см / с !!!

Простым поворотом потенциометра я мог бы довести напряжение до 12 В для третьего прогона. Однако я решил, что лучше не испытывать судьбу на 6-вольтовых моторах Jet.

Успех! Миссия выполнена.

О компании Jet

Масса: 196 г (с аккумулятором 340 мАч) или 212 г (с аккумулятором 880 мАч) Чем меньше масса, тем меньше энергии требуется для изменения направления.

Размеры: 13,3 см в ширину x 10,8 см в длину x около 5 см в высоту Широкий с низким центром тяжести для лучшего прохождения поворотов.

Вид сверху на Джет, следующего за линией робота, демонстрирующий различные электронные устройства

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

Примечание. Плоскость заземления существует по оптическим причинам, хотя она также может обеспечить незначительное снижение электрических шумов датчика. Меня немного беспокоят быстро движущиеся пластины по статически заряженному ПВХ. Я добавил стабилитрон на 5,6 В на каждую плату на случай перенапряжения.

Процессор: 68HC908GP32 @ 7,3728 МГц (делится до хорошей скорости передачи данных для беспроводной отладки)

Микроконтроллер может принимать около 7000 полных решений о следовании линии в секунду, что составляет почти 7 решений на миллиметр, когда робот движется на полной скорости.Увеличив часы, развернув циклы и удалив мою беспроводную отладку и посторонний код, я мог увеличить количество решений в секунду. Теоретический верхний предел около 14000 основан на количестве преобразований, возможных в секунду с помощью встроенного аналого-цифрового преобразователя микроконтроллера для одного полного сканирования датчика. (Да, Эдди, я использую аналоговые, а не цифровые значения с датчиков.)

Драйвер двигателя: Два полных H-моста из дискретных n-канальных / p-канальных мощных МОП-транзисторов IRF7307 (50 мОм / 90 мОм) с дискретными диодами Шоттки 1N5817 и драйверами 4427A.

Расположение H-образного моста очень похоже на схему, представленную на рис. 10-15 на стр. 188 документа Intermediate Robot Building. Чтобы сэкономить место, я выбрал силовые MOSFET для поверхностного монтажа. Чтобы избежать нагрева от обратного тока, я решил добавить дополнительные диоды Шоттки.

Каждый двигатель может потреблять до 1,7 А, поэтому было важно использовать силовые транзисторы, чтобы обеспечить максимально возможную производительность двигателя. Даже в самые тяжелые моменты двигатели по-прежнему получают более 97% электроэнергии от Н-моста.

Поскольку на эти двигатели поступают частые импульсы, драйвер силового полевого МОП-транзистора (в данном случае 4427A) имел решающее значение. Я бы использовал чипы IXDN404SI, но в то время у меня их не было под рукой.

Нагрев полевого МОП-транзистора не является проблемой. Чипы даже не кажутся теплыми после длительного использования. Это связано с мощным драйвером MOSFET (быстрое насыщение), диодами Шоттки и завышением сопротивления MOSFET по сравнению с максимальной потребляемой мощностью двигателя.Другими словами, чипы остаются холодными, поэтому сопротивление остается низким, поэтому двигатели работают хорошо (повторите).

Пуск и настройки: Panasonic PNA4602M Инфракрасный декодер 38 кГц для запуска / остановки / скорости и энергонезависимая последовательная память Ramtron 25640 для настроек. (PNA4602M больше не доступен. См. Vishay TSOP4038.)

У Jet есть инфракрасный пульт дистанционного управления запуском и остановкой, на случай, если вам интересно, как я это сделал для видео.Чтобы сделать этого робота немного более сложным, я удалил DIP-переключатели и кнопки с платы. Я настраиваю робота с помощью дистанционного управления, беспроводного последовательного порта или проводного последовательного интерфейса. Настройки хранятся в энергонезависимой памяти, что также достаточно быстро для регистрации данных.

Вид спереди Jet, следующего за линией робота, с батареей и двигателями

Обратите внимание на то, как сенсорная плата прилегает к полу.Нейлоновые прокладки были тщательно отфрезерованы, чтобы их положение было точным. Нет зазора для проникновения света и нет необходимости в перегородке (кроме самой скользящей подушки).

Материал корпуса: В основном печатная плата. Есть нейлоновые прокладки, стальные винты, алюминиевые винты и алюминиевые угловые крепления двигателя. Неизвестный материал (вероятно, Гаролит) для батарейного отсека / элемента жесткости конструкции. АБС-пластик скользит.

Обычно вы выбираете как можно более гладкий материал для скольжения (тефлон или UHMW).Однако я хотел, чтобы робот немного схватился, а не скользил по всей трассе. В свою очередь, это означает, что двигатели должны работать немного тяжелее, чтобы преодолеть трение.

Аккумулятор: Литий-полимерный (LiPoly) номинальное напряжение 7,4 В / перезаряжаемые аккумуляторы макс. Либо 340 мАч, либо 880 мАч.

Дон Керсте порекомендовал мне LiPoly батареи, и с тех пор я не оглядывался назад. Мои никель-металлгидридные батареи просто лежат на полке, и они будут потрачены впустую.Литий-полимерный обладает рядом существенных преимуществ:

  1. Он легкий.
  2. Тонкая плоская форма.
  3. Естественно высокое напряжение (номинальное 3,7 В) на элемент.
  4. Хорошая разрядная способность (до 6 ° C) легко обеспечивает пиковый потребляемый ток в несколько ампер. (Также помогает обильное использование керамических, танталовых и электролитических конденсаторов.)

Двигатели: Два редкоземельных магнита диаметром 13 мм 1.Двигатели Maxon мощностью 2 Вт 6 В с металлическими редукторами 17: 1 и щетками из драгоценных металлов

Да, Джон Орландо, конечно, я использовал моторы Maxon.

Скорость двигателя без нагрузки составляет 16500 об / мин при 6 В
Что составляет 8,4 В / 6 В * 16500 об / мин = 23100 об / мин при 8,4 В
С передачей выход без нагрузки составляет 23100 об / мин / 17 передаточное число = 1358,82 об / мин
Окружность колеса pi * 30,4 мм = 95,5 мм = 9,55 см
Максимальная линейная скорость без нагрузки - 9.55 см * 1358,82 об / мин = 12977 см / мин
Что составляет 12977 см / мин / 60 секунд в минуту = 216 см / с

Струя движется чуть меньше половины (104 см / с) максимальной скорости холостого хода (216 см / с), поскольку скорость двигателя снижается по мере того, как он несет нагрузку. Кроме того, робот не приводит двигатель в движение на 100% скорости, так как он меняет скорость для поворота. Кроме того, робот не точно соответствует длине трека; Есть некоторая недостаточная поворачиваемость, некоторая избыточная поворачиваемость и некоторое покачивание.

Я вычислил фактическую линейную скорость vs.скорость двигателя без нагрузки Sandwich, LEGO Lightning и Ben Hur. Их соотношение чуть больше половины. Но в любом случае помните об этом соотношении 50%, когда выбираете двигатели для своего быстрого робота.

На Jet нет кодировщиков. Мне бы понравились некоторые, но у меня не было двигателей такого размера, с такой передачей, с энкодерами. (При необходимости можно добавить домашние кодировщики).

Колеса: LEGO 30.Шины VR 4 мм высотой x 14 мм шириной с резьбовыми ступицами (без муфты)

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

Джет, вид сбоку, демонстрирующий алюминиевое крепление двигателя и ступицу LEGO с установочным винтом

Втулки имеют резьбу для установочного винта, этому трюку я научился у Пола Юрчака. После затяжки ступицы на валу двигателя просто накройте резиновой шиной.

Я особенно горжусь алюминиевыми креплениями двигателя. Я сделал их из алюминиевого уголка (см. Страницы 403-406 в Промежуточном роботостроении). Чтобы уменьшить вес, я вырезал изогнутую нижнюю половину с помощью ротационного инструмента Dremel и отрезного диска. Затем я зашлифовал края.

Underneath Jet, робот, следующий за линией, с 4 передними и 4 задними датчиками

Хотя Jet включает в себя 8 датчиков, в итоге использовались только четыре передних датчика.Задняя сенсорная плата остается нетронутой для баланса и сцепления.

Как сделать робота быстрого следования за линией

1. Перед бегом ползайте и ходите.

Попробуйте сначала приготовить сэндвич. Его легко собрать, он относительно недорог и содержит хорошо документированные инструкции.

Возможно, вам кажется, что этот совет слишком отеческий? Учтите, что в среднем только половина роботов, участвующих в соревнованиях ChiBots, может даже пройти курс, независимо от скорости.И подумайте обо всех людях, которые вообще не могли заставить робота войти.

Поверьте, построить робота, следующего за линией, непросто. Будьте добры к себе, начав преуспевать с достижимой цели. В качестве следующих советов я предполагаю, что вы уже выполнили этот шаг.

2. Мистера Физика не обманешь.

Держите робота как можно более компактным, легким и низко к земле.Есть веская причина, по которой автомобили Формулы 1 и Indy не похожи на броневики или внедорожники. Ладно, есть и другие веские причины, помимо аэродинамического сопротивления.

Если вы обнаружите, что ваш робот немного тяжелый, используйте трюк Стива с тележкой: Установите поворотный шарнир отдельно от основного корпуса.

3. Все дело в алгоритме, детка.

То, что вы читали на этой странице, позволило увеличить скорость струи до 68 см / с. Следующее повышение на 50% было связано с программным обеспечением.Мне пришлось придумать способ уменьшить колебания и уменьшить выброс кривой после долгой прямой езды.

Робот Эдди Райта обладает таким хорошим подавлением колебаний, что вы можете ударить его по заднице, и он сам выпрямится. Когда робот пролетает за угол, он не только знает, в какую сторону вернуться, чтобы вернуться к линии, но и предвидит, что линия приближается, и выпрямляется, чтобы соответствовать углу. В какой-то момент Эдди написал отличную статью о следующей строке на сайте www.wrighthobbies.net/guides/linefollower.htm.

4. Будьте изобретательны.

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

Возможны простые оптимизации или серьезные изменения дизайна, которые приведут к следующему скачку в скорости. Я подозреваю, что потребуется что-то вроде робота Джона Орландо с камерой или робота, который запоминает курс, чтобы робот мог сбрасывать скорость и предвидеть повороты.Конечно, акселерометры или энкодеры предоставят роботу более точное ощущение движения. Вероятно, придется изменить набор правил, чтобы определить, насколько робот может срезать угол.

5. Удачи!

Помните, что хобби должно приносить удовольствие. Мой «новый мировой рекорд» недолго продержится. И, насколько мне известно, никто не планирует присылать мне крупный чек за это достижение. (Хотя я получил хороший подарочный сертификат от Solutions Cubed за победу в конкурсе ChiBots Spring 2005.)

Итак, мой лучший совет - создать робота, который вам понравится и достигнет цели, которая важна для вас. Следование линии не совсем решит проблему голода в мире или принесет мир человечеству. Тем не менее, я определенно ценю дух товарищества, который это мероприятие принесло мне и моим друзьям в ChiBots.


.

Почему мой робот не едет прямо? - LEGO Engineering

Кажется разумным ожидать, что когда вы программируете робота, чтобы он двигался прямо, он должен работать просто . И, конечно же, для этого предназначен блок управления движением в программном обеспечении EV3.

Подробнее Блок рулевого управления

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

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

Блок Move Steering определенно упрощает начинающим программирование, чем если бы им приходилось использовать отдельные блоки для каждого двигателя. Однако недостатком этой простоты является то, что детали того, как работает блок, скрыты от пользователя. В частности, процессы пропорциональной обратной связи, участвующие в движении двухколесного робота вперед.

Настоящие роботы не едут прямо

Десять лет назад Фред Мартин, профессор компьютерных наук Массачусетского университета в Лоуэлле, написал на эту тему содержательную статью под провокационным названием Настоящие роботы не едут прямо .

Статья

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

В своей статье Мартин утверждает, что обратная связь является центральным процессом не только в нашей жизни, но и в инженерных системах. Обратная связь широко распространена, но зачастую незаметна.

«Вегетативные процессы в организме, такие как регулирование температуры и дыхание, происходят без нашего сознательного внимания, а усвоенные действия, такие как балансирование и ходьба, выполняются без особого внимания».

«Со временем наша способность разрабатывать системы обратной связи также неуклонно улучшалась до такой степени, что транспортные средства и процессы, которые обычно были бы крайне нестабильными (например.например, реактивный истребитель) можно заставить «лететь прямо».

Мартин заключает, что «как биологические, так и инженерные системы действительно вносят коррекции в контакт, пусть они минимальны на грани восприятия. Как преподаватели, мы должны знакомить учащихся с этим центральным принципом, а не скрывать его от них. Настоящие роботы не едут прямо ".

Некоторые из причин, по которым роботы не едут прямо

Вот некоторые из причин, по которым типичный робот EV3 может не двигаться прямо, и некоторые предложения.

  • Колебания трения или других внутренних факторов, влияющих на работу двигателей. Попробуйте поменять двигатели местами или заменить их, если у вас есть запасной
  • .
  • Направление ворса ковра. Попробуйте запустить робота в обратном направлении или под прямым углом
  • Центр баланса / симметрии. Проверьте симметрию с точки зрения конструкции, веса, материала, колес, оси вращения и баланса. Есть ли большее трение с одной стороны и, возможно, проскальзывание с другой?
  • Робот-конструктор.Убедитесь, что колеса хорошо соединены с осью и рамой, а балки и другие блоки надежно соединены друг с другом.
  • Колесо ролика не выровнено, заедает. Если сзади есть свободные колеса, перед запуском робота убедитесь, что оба они расположены в равных направлениях.
  • При запуске робота старайтесь равномерно нажимать на кнопку пуска, иначе робот может не стартовать прямо. Попробуйте установить небольшое время ожидания после нажатия кнопки, чтобы давление пальца не создавало проблем.
  • Двигатели имеют небольшой внутренний зазор между энкодерами и приводным валом, который может повлиять на начальную траекторию.
  • Колеса или шестерни заедают или трутся с одной стороны больше, чем с другой.
  • Различные колеса могут иметь немного разную окружность.
  • Пыль / грязь, вызывающая потерю сцепления. Очистите шины и, возможно, подместите пол.
  • Попытайтесь использовать тормоз, а не инерцию, чтобы завершить движение.

  • Попробуйте уменьшить мощность двигателя - e.грамм. Двигатели NXT, настроенные на 70%, работают стабильнее, чем 100%. См. Также анализ внутреннего устройства двигателя NXT, сделанный Филиппом «Фило» Хурбейном (внешняя ссылка).
  • Увеличьте мощность, чтобы избежать скачка при более высокой мощности.
  • Используются ли какие-либо фрикционные штифты (черный, черный) для шестерен, в которых должны использоваться бесфрикционные (желто-коричневый, серый) или оси? См. Также этот пост Яна Чоу-Миллера.
  • Различные шины могут обеспечивать разное сцепление с дорогой.
  • Проверьте, нет ли погнутых осей и незакрепленных шин.

Лучше подход?

Простой последователь линии EV3

Если мы согласимся с тем, что настоящие роботы не едут по прямой, то, возможно, лучший подход - не ставить перед учащимися задачи, основанные на точном расчете. Вместо этого мы должны предоставить возможности использовать физические ограничения и / или информацию датчиков для локализации и обновления движения их роботов.

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

  • проехать по колее
  • использовать ультразвуковой датчик для отслеживания стены
  • используйте датчик освещенности, чтобы следовать линии
  • используйте компас и / или датчик GPS для отслеживания пеленга
  • использовать ИК-маяк для определения направления и определения расстояния

(Последнее обновление 16.11.17)

Следующие две вкладки изменяют содержимое ниже.

Я преподаю в Тасмании, Австралия, и использую LEGO MINDSTORMS со своими учениками с 2001 года.Я главный редактор LEGO Engineering (этот сайт), а также редактор контента LEGO Education Australia (LEGOeducation.com.au).

.

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *