Набор "Малыш": описание возможных проблем и способы их решения.

В данной статье мы рассмотрим возможные сложности при работе с обучающим набором "Малыш".

Робот не едет по линии

Если Вы столкнулись с проблемой нежелания робота ездить по линии, то возможным решением может стать один из следующих пунктов:

  • Попробуйте повторно откалибровать датчики и внести точные значения в скетч езды робота по линии;
  • Попробуйте изменить расстояние между датчиками, для чего разместите их ближе друг к другу;
  • Добавьте в скетч №12, используемый для калибровки датчиков, считывание значений по трём датчикам вместо двух и вычислите среднее арифметическое для нижнего значения (датчики вне чёрной полосы) и для верхнего значения (датчики над чёрной полосой). Для этого загрузите следующий скетч:
uint8_t  pinSensorL   = A3;                                             // Вывод датчика, находящегося слева
uint8_t  pinSensorC   = A4;                                             // Вывод датчика, находящегося по центру
uint8_t  pinSensorR   = A5;                                             // Вывод датчика, находящегося по центру
void setup() {                                                          // Выводим показания датчиков линии
  Serial.begin(9600);
  pinMode(A3, INPUT);
  pinMode(A4, INPUT);
  pinMode(A5, INPUT);
}
void loop() {
    Serial.print("Left = ");   Serial.println(analogRead(pinSensorL));  // Значение левого датчика (valSensor0)
    Serial.print("Center = "); Serial.println(analogRead(pinSensorC));  // Значение центрального датчика (valSensor1)
    Serial.print("Right = ");  Serial.println(analogRead(pinSensorR));  // Значение левого датчика (valSensor0)
    Serial.println("=====================");                            // Значение левого датчика (valSensor0)
    delay(1000);                                                        // Задержка 1сек
}

После этого, для расчёта среднего арифметического по трём датчикам, расположите сначала все три датчика на линии и запишите результат, затем расположите датчики вне линии и снова запишите результат.

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

uint16_t  whiteL   = 35;                                              // Значение левого датчика вне линии
uint16_t  whiteC   = 40;                                              // Значение центрального датчика вне линии
uint16_t  whiteR   = 37;                                              // Значение правого датчика вне линии
uint16_t  blackL   = 830;                                             // Значение левого датчика на линии
uint16_t  blackC   = 700;                                             // Значение центрального датчика на линии
uint16_t  blackR   = 905;                                             // Значение правого датчика на линии
uint16_t  whiteMiddle;                                                // Среднее арифметическое для значений вне линии
uint16_t  blackMiddle;                                                // Среднее арифметическое для значений на линии

void setup() {
  Serial.begin(9600);                                                 // Инициируем работу монитора последовательного порта на скорости 9600бод
  whiteMiddle = ( whiteL + whiteC + whiteR ) / 3;                     // Вычисляем среднее арифметическое по трём значениям для датчиков вне линии
  blackMiddle = ( blackL + blackC + blackR ) / 3;                     // Вычисляем среднее арифметическое по трём значениям для датчиков на линии
  Serial.print("Srednee vne linii = "); Serial.println(whiteMiddle);  // Выводи в монитор последовательного порта текст и значение среднего арифметического вне линии
  Serial.print("Srednee na linii = ");  Serial.println(blackMiddle);  // Выводи в монитор последовательного порта текст и значение среднего арифметического на линии
}

void loop() {}

Полученные значения Вам необходимо будет указать в значении переменных valSensor1 (значение датчиков на линии )и valSensor0 (значение датчиков вне линии) в скетче №13/14

  • Если все вышеуказанные способы не помогли, тогда сделайте следующее:
    • Отключите датчики линии, которые установлены на колёсах, от MotorShield (выводы A0 и A1);
    • Отключите датчики линии, которые установлены на бампере, от MotorShield (выводы A3, A4, A5);
    • Подключите датчики линии, которые установлены на бампере, в следующие выводы: левый  датчик к выводу A0, центральный датчик к выводу A1, правый датчик к выводу A2. Измените значения выводов в скетче 13-14, перед запуском не забыв откалибровать датчики, установленные в новые выводы.

Машинка не реагирует на пульт

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

  • Проверьте, что батарейка в пульте рабочая. при необходимости замените её новой;
  • Обязательно перед тем, как Вы загрузите скетч №16, проверьте полученные коды всех кнопок с теми значениями, которые указаны в скетче. Для этого загрузите скетч № 15, откройте монитор порта и, нажимая на кнопки пульта, сравните полученные значения с теми, что указаны в книге и в скетче №16. Скетч №15:
#include <iarduino_IR_RX.h>       // Подключаем библиотеку для работы с ИК-приёмником
iarduino_IR_RX IR(10);            // Объявляем объект IR и указываем вывод, к которому подключён ИК-приёмник
void setup() {
  Serial.begin(9600);             // Инициируем передачу данных в монитор порта  на скорости 9600 бит/сек
  IR.begin();                     // Инициируем работу с ИК-приёмником
}
void loop() {
  // Если в буфере имеются данные, принятые с пульта (удерживается кнопка), то выводим код нажатой кнопки
  if (IR.check(true)) Serial.println(IR.data, HEX);
}
  • Если все вышеперечисленные способы не помогли, то Вам необходимо заменить пульт.