Robots #9 Энкодеры

Чудесные энкодеры робота Zumo 32U4

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

В помощь приходят энкодеры – это датчики угла поворота, позволяющие получить значение поворота колёс робота и его направление.
Встроенные энкодеры робота позволяют решить такие задачи:
• Перемещение робота на определённое расстояние;
• Поворот на заданный угол относительно текущего направления;
• Движение с заданной скоростью, её поддержание;
• Измерение расстояний;
• Так, как каждое колесо робота оснащено отдельным энкодером, можно запрограммировать робота на сохранение заданного направления движения (компенсация разницы в скоростях вращения).


Программирование энкодеров

Используемые объекты:
Zumo32U4Encoders encoders;

Используемые методы:
encoders.getCountsLeft(); // получить значение энкодера с левого колеса
encoders.getCountsRight(); // получить значение энкодера с правого колеса

Пример программы с датчиками

/* После включения робот ждёт 2 секунды и начинает движение вперёд со скоростью 150.
 * Как только он сделает один полный оборот колеса, он остановится и зажжёт жёлтый светодиод
 * Один полный оборот колеса для нашего робота (50:1) примерно равен 620 с показаний энкодера
*/

#include <Wire.h>
#include <Zumo32U4.h>

// Объявляем экземпляр encoders класса Zumo32U4Encoders
Zumo32U4Encoders encoders;

// Также нам нужны объекты экранчика и моторов
Zumo32U4LCD lcd;
Zumo32U4Motors motors;

// Объявляем глобальные переменные для хранения данных с левого и правого энкодера
int16_t countsLeft;
int16_t countsRight;

void setup()
{

  // Гасим жёлтую лампочку
  ledYellow(0);
  // Ждём 2 сек
  delay(2000);
  // Запускаем оба мотора со скоростью 150
  motors.setSpeeds(150 ,150 );
}

void loop()
{

  // Используем прерывания с помощью millis() – каждые 100 мс будем получать данные с        энкодеров
  static uint8_t lastDisplayTime;

  if ((uint8_t)(millis() - lastDisplayTime) >= 100)
    {
    lastDisplayTime = millis();

    // получить данные с левого энкодера и записать в переменную countsLeft
    countsLeft = encoders.getCountsLeft();
    // получить данные с правого энкодера и записать в переменную countsRight
    countsRight = encoders.getCountsRight();

    // Вывести эти данные на экранчик
    lcd.clear();
    lcd.print(countsLeft);
    lcd.gotoXY(0, 1);
    lcd.print(countsRight);
  }

  // Проверка: если (данныеСЛевогоЭнкодера > 620 И данныеСПравогоЭнкодера > 620)
  if(countsLeft>620&&countsRight>620) {
    ledYellow(1);
    motors.setSpeeds(0,0);
  }

}

Задачи

Задача 1. Робот едет вперёд со скоростью 150. После того, как его левый И правый энкодер передадут сигнал 1000, он зажигает жёлтую лампочку. После 2000 – зелёную. После 3000 – красную. После 4000 – робот останавливается.
Задача 2. Робот ждёт нажатия кнопки А, после этого ждёт 1 секунду. Далее он едет со скоростью 100. Когда он сделает 10 полных оборотов колес (это, кстати, примерно 125 см), он начинает двигаться реверсом со скоростью 300 те же 10 полных оборотов колёс. После этого он останавливается и ждёт 3 сек. Потом снова едет вперёд со скоростью 100 и так далее.

Следующие задачи с энкодером будут описаны в следующей карточке #10. До встречи! =)

Комментарии