КОРЗИНА
магазина
8 (499) 500-14-56 | ПН. - ПТ. 12:00-18:00
ЛЕСНОРЯДСКИЙ ПЕРЕУЛОК, 18С2, БЦ "ДМ-ПРЕСС"

Бампер с 7 датчиками линий, i2c - flash

Общие сведения:

Модуль - Бампер с 7 датчиками линий, I2C-flash - предназначен для установки на подвижные механизмы (машины, тракторы, танки, роботы) для их движения по линии без участия оператора. Модуль снабжен световой индикацией наличия линии, фарами и поворотниками.

Управление модулем осуществляется по шине I2C. Модуль относится к серии «Flash», а значит к одной шине I2C можно подключить более 100 модулей, так как их адрес на шине I2C (по умолчанию 0x09), хранящийся в энергонезависимой памяти, можно менять программно.

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

Видео:

Редактируется ...

Спецификация:

  • Напряжение питания: 3,3 В или 5 В (постоянного тока).
  • Потребляемый ток: до 20 мА (все светодиоды включены).
  • Расстояние до датчиков: от 2 до 50 мм.
  • Максимальная скорость движения бампера (м/с): ширина линии (мм) / 3.
  • Интерфейс: I2C.
  • Скорость шины I2C: 100 кбит/с.
  • Адрес на шине I2C: устанавливается программно (по умолчанию 0x09).
  • Уровень логической 1 на линиях шины I2C: 3,3 В (толерантны к 5 В).
  • Рабочая температура: от -20 до +70 °С.
  • Габариты: 105 x 25 мм (без креплений), 105 x 35 мм (с креплениями).
  • Вес: 10 г.

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

Подключение:

Модуль подключается по шине I2C, все выводы которой (GND, Vcc, SDA, SCL) размещены на двух одинаковых колодках.

  • SCL - вход/выход линии тактирования шины I2C.
  • SDA - вход/выход линии данных шины I2C.
  • Vcc - вход питания 3,3 или 5 В.
  • GND - общий вывод питания.

Для подключения модуля можно использовать любую из двух колодок (верхнюю или нижнюю), а оставшуюся колодку можно применить для подключения второго бампера или иного модуля к шине I2C.

Питание:

Входное напряжение питания модуля 3,3В или 5В постоянного тока (поддерживаются оба напряжения питания), подаётся на выводы Vcc и GND.

Подробнее о модуле:

Модуль построен на базе микроконтроллера STM32F030F4, снабжен собственным стабилизатором напряжения, имеет на борту 7 датчиков отражения (линий) и кнопку калибровки. Светодиодная индикация модуля позволяет определять наличие линий под датчиками - светодиод расположенный перед датчиком светится если под датчиком есть линия. Так же на модуле установлены светодиоды фар и сигналов поворота.

Модуль позволяет:

      • Изменить свой адрес на шине I2C, временно (пока есть питание) или постоянно.
      • Получать аналоговые значения (АЦП) с датчиков линий.
      • Получать цифровые значения с датчиков линий (есть линия под датчиком или нет).
      • Выполнить калибровку для цветов линий и фона используемых на трассе.
      • Узнать тип трассы для которой откалиброван модуль (трасса со светлой или тёмной линией).
      • Изменить тип трассы (считать фон как линию, а линию как фон).
      • Управлять фарами и задать скорость мигания поворотников.
      • Управлять поворотниками самостоятельно, или указать им работать в автоматическом режиме.

      Специально для работы с модулем - Бампер с 7 датчиками линий, I2C-flash, нами разработана библиотека iarduino_I2C_Bumper которая позволяет реализовать все функции модуля.

      Подробнее про установку библиотеки читайте в нашей инструкции.

      Калибровка:

      Калибровка модуля может быть запущена методами библиотеки iarduino_I2C_Bumper, или нажатием на кнопку «калибровка».

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

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

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

      Успех калибровки определяется модулем по контрасту между фоном и линией, при малой контрастности калибровка будет считаться неудачной, а её результаты не сохранятся в памяти модуля. Если калибровка закончилась провалом, то все светодиоды расположенные перед датчиками линий мигнут два раза. Если калибровка закончилась успехом, то все светодиоды расположенные перед датчиками линий мигнут один раз. Так же о результате калибровки можно судить по флагам возвращаемым методами setCalibrationRun() и setCalibrationEnd(), или по значению статуса калибровки, возвращаемому методом getCalibrationStage().

      В результате калибровки модуль не только сможет отличать линии от фона, но и определит тип трассы (трасса с тёмной линией на светлом фоне, или со светлой линией на тёмном фоне). Тип линии трассы можно узнать методом getLineType(). Если на трассе есть участки, где цвет линии меняется с цветом фона, то достаточно сменить тип линии трассы методом setLineType().

      Примеры:

      В данном разделе раскрыты примеры работы модуля по шине I2C с использованием библиотеки iarduino_I2C_Bumper. Сама библиотека содержит больше примеров, доступных из меню Arduino IDE: Файл / Примеры / iarduino I2C Bumper (бампер).

      Смена адреса модуля на шине I2C:

      uint8_t newAddress = 0x09;                                 //   Назначаемый модулю адрес (0x07 < адрес < 0x7F).
                                                                 //
      #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
      #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
      iarduino_I2C_Bumper bum;                                   //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper.
                                                                 //   Если при объявлении объекта указать адрес, например, bum(0xBB), то пример будет работать с тем модулем, адрес которого был указан.
      void setup(){                                              //
          Serial.begin(9600);                                    //
          if( bum.begin() ){                                     //   Инициируем работу с энкодером.
              Serial.print("Найден бампер с адресом 0x");        //
              Serial.println( bum.getAddress(), HEX );           //   Выводим текущий адрес модуля.
              if( bum.changeAddress(newAddress) ){               //   Меняем адрес модуля на newAddress.
                  Serial.print("Адрес изменён на 0x");           //
                  Serial.println(bum.getAddress(),HEX );         //   Выводим текущий адрес модуля.
              }else{                                             //
                  Serial.println("Адрес не изменён!");           //
              }                                                  //
          }else{                                                 //
              Serial.println("Бампер не найден!");               //
          }                                                      //
      }                                                          //
                                                                 //
      void loop(){}                                              //
      

      Для работы данного примера, на шине I2C должен быть только один бампер I2C-flash.

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

      Чтение линий под датчиками модуля:

      #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
      #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
      iarduino_I2C_Bumper bum(0x09);                             //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper, указывая адрес модуля на шине I2C.
                                                                 //   Если объявить объект без указания адреса (iarduino_I2C_Bumper bum;), то адрес будет найден автоматически.
      void setup(){                                              //
          Serial.begin(9600);                                    //   Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек.
          bum.begin();                                           //   Инициируем работу с бампером.
      }                                                          //
                                                                 //
      void loop(){                                               //
          Serial.print( "Линия находится под датчиком:" );       //   Выводим текст.
          if( bum.getLineDigital(1) ){ Serial.print(" 1"); }     //   Выводим номер 1 датчика, если под ним находится линия.
          if( bum.getLineDigital(2) ){ Serial.print(" 2"); }     //   Выводим номер 2 датчика, если под ним находится линия.
          if( bum.getLineDigital(3) ){ Serial.print(" 3"); }     //   Выводим номер 3 датчика, если под ним находится линия.
          if( bum.getLineDigital(4) ){ Serial.print(" 4"); }     //   Выводим номер 4 датчика, если под ним находится линия.
          if( bum.getLineDigital(5) ){ Serial.print(" 5"); }     //   Выводим номер 5 датчика, если под ним находится линия.
          if( bum.getLineDigital(6) ){ Serial.print(" 6"); }     //   Выводим номер 6 датчика, если под ним находится линия.
          if( bum.getLineDigital(7) ){ Serial.print(" 7"); }     //   Выводим номер 7 датчика, если под ним находится линия.
          Serial.println(".");                                   //   Завершаем строку.
          delay(200);                                            //   Задержка позволяет медленнее заполнять монитор последовательного порта.
      }                                                          //
      

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

      В примере Arduino IDE: Файл / Примеры / iarduino I2C Bumper (бампер) / getLineDigitalFast показано как считать состояние всех датчиков одним запросом к модулю, что резко увеличивает скорость работы с ним.

      Чтение аналоговых значений с датчиков модуля:

      #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
      #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
      iarduino_I2C_Bumper bum(0x09);                             //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper, указывая адрес модуля на шине I2C.
                                                                 //   Если объявить объект без указания адреса (iarduino_I2C_Bumper bum;), то адрес будет найден автоматически.
      void setup(){                                              //
          Serial.begin(9600);                                    //   Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек.
          bum.begin();                                           //   Инициируем работу с бампером.
      }                                                          //
                                                                 //
      void loop(){                                               //
          Serial.print( "Аналоговые значения датчиков 1-7: " );  //   Выводим текст.
          Serial.print( (String) bum.getLineAnalog(1) + ", " );  //   Выводим значение АЦП снятое с 1 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(2) + ", " );  //   Выводим значение АЦП снятое с 2 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(3) + ", " );  //   Выводим значение АЦП снятое с 3 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(4) + ", " );  //   Выводим значение АЦП снятое с 4 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(5) + ", " );  //   Выводим значение АЦП снятое с 5 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(6) + ", " );  //   Выводим значение АЦП снятое с 6 датчика линии и текст ", ".
          Serial.print( (String) bum.getLineAnalog(7) + ".\n");  //   Выводим значение АЦП снятое с 7 датчика линии и текст ".\n".
          delay(200);                                            //   Задержка позволяет медленнее заполнять монитор последовательного порта.
      }                                                          //
      

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

      Аналоговыми значениями датчиков линий являются показания АЦП (аналого-цифрового преобразователя). Чем светлее объект находящийся под датчиком линий, тем выше показания АЦП. Оперируя аналоговыми значениями бампера, можно использовать трассы с разметками разных цветов.

      Управление фарами и поворотниками:

      #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
      #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
      iarduino_I2C_Bumper bum(0x09);                             //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper, указывая адрес модуля на шине I2C.
                                                                 //   Если объявить объект без указания адреса (iarduino_I2C_Bumper bum;), то адрес будет найден автоматически.
      void setup(){                                              //
          bum.begin();                                           //   Инициируем работу с бампером.
          bum.setTurnPeriod(BUM_TURN_200);                       //   Задаём скорость мигания поворотников в 200мс. Возможные значения: BUM_TURN_100, BUM_TURN_200, BUM_TURN_400 и BUM_TURN_800.
      }                                                          //
                                                                 //
      void loop(){                                               //
          bum.setTurnSignal(BUM_TURN_LEFT);      delay(5000);    //   Включаем левый поворотник и ждём 5 секунд.
          bum.setTurnSignal(BUM_TURN_RIGHT);     delay(5000);    //   Включаем правый поворотник и ждём 5 секунд.
          bum.setTurnSignal(BUM_TURN_OFF);                       //   Отключаем поворотник.
          bum.setLamp      (true);               delay(5000);    //   Включаем фары и ждём 5 секунд.
          bum.setLamp      (false);                              //   Отключаем фары.
          bum.setTurnSignal(BUM_TURN_EMERGENCY); delay(5000);    //   Включаем поворотниками аварийный сигнал и ждём 5 секунд.
          bum.setTurnSignal(BUM_TURN_POLICE);                    //   Включаем поворотники в полицейский режим.
          bum.setLamp      (true );              delay(1000);    //   Включаем  фары и ждём 1 секунду.
          bum.setLamp      (false);              delay(1000);    //   Отключаем фары и ждём 1 секунду.
          bum.setLamp      (true );              delay(1000);    //   Включаем  фары и ждём 1 секунду.
          bum.setLamp      (false);              delay(1000);    //   Отключаем фары и ждём 1 секунду.
          bum.setLamp      (true );              delay(1000);    //   Включаем  фары и ждём 1 секунду.
          bum.setLamp      (false);                              //   Отключаем фары.
          bum.setTurnSignal(BUM_TURN_OFF);       delay(5000);    //   Отключаем поворотники и ждём 5 секунд.
      }                                                          //
      

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

      • 5 секунд мигает левый поворотник;
      • 5 секунд мигает правый поворотник;
      • 5 секунд горят фары;
      • 5 секунд мигают оба поворотника - аварийный сигнал;
      • 5 секунд мигают фары, а поворотники работают в режиме полицейской машины.;
      • 5 секунд не светятся ни фары, ни поворотники.

      В примере Arduino IDE: Файл / Примеры / iarduino I2C Bumper (бампер) / setTurnSignalAuto показано как заставить поворотники включаться и отключаться в автоматическом режиме (по положению линии под датчиками).

      Калибровка модуля:

      #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
      #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
      iarduino_I2C_Bumper bum(0x09);                             //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper, указывая адрес модуля на шине I2C.
                                                                 //   Если объявить объект без указания адреса (iarduino_I2C_Bumper bum;), то адрес будет найден автоматически.
      void setup(){                                              //
          Serial.begin(9600);                                    //   Инициируем передачу данных в монитор последовательного порта на скорости 9600 бит/сек.
          bool f;                                                //   Объявляем флаг для отслеживания результатов калибровки.
          bum.begin();                                           //   Инициируем работу с бампером.
          Serial.println("Установите бампер над линией трассы"); //   Выводим текст.
          Serial.println("У Вас есть 5 секунд...\r\n");          //   Выводим текст.
          delay(5000);                                           //   Ждём 5 секунд.
          Serial.println("Запускаем калибровку.\r\nЖдите.\r\n"); //
          f = bum.setCalibrationRun();                           //   Запускаем калибровку.
          Serial.println( f? "Линия считана!":"Ошибка!.");       //   Выводим текст зависящий от флага f.
          Serial.println("\r\nУстановите бампер над фоном");     //   Выводим текст.
          Serial.println("У Вас есть 5 секунд...\r\n");          //   Выводим текст.
          delay(5000);                                           //   Ждём 5 секунд.
          Serial.println("Завершаем калибровку.\r\nЖдите.\r\n"); //   Выводим текст.
          f = bum.setCalibrationEnd();                           //   Завершаем калибровку.
          Serial.println( f? "Фон считан!":"Ошибка!.");          //   Выводим текст зависящий от флага f.
      }                                                          //
                                                                 //
      void loop(){}                                              //
      

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

      Через 5 секунд произойдёт обращение к функции setCalibrationRun() которая запустит калибровку и модуль считает данные с датчиков. Функция может выполняться до 5 секунд, после чего в мониторе появится результат чтения линий.

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

      Через 5 секунд произойдёт обращение к функции setCalibrationEnd() которая инициирует завершение калибровки и модуль считает данные с датчиков. Функция может выполняться до 5 секунд, после чего в мониторе появится результат чтения фона.

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

      Вместо обращения к функциям setCalibrationRun() и setCalibrationEnd(), на любом этапе калибровки, можно просто нажать на кнопку «калибровка».

        В примере Arduino IDE: Файл / Примеры / iarduino I2C Bumper (бампер) / setCalibrationManual показано как выполнить калибровку в ручном режиме. Такая калибровка выполняется за 100 мс, при этом датчики модуля могут быть даже вне трассы.

        Автоматическая смена типа линии на трассе:

        #include <Wire.h>                                          //   Подключаем библиотеку для работы с аппаратной шиной I2C.
        #include <iarduino_I2C_Bumper.h>                           //   Подключаем библиотеку для работы с бампером I2C-flash.
        iarduino_I2C_Bumper bum;                                   //   Объявляем объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper.
                                                                   //   Если при объявлении объекта указать адрес, например, bum(0xBB), то пример будет работать с тем модулем, адрес которого был указан.
        void setup(){                                              //
            bum.begin();                                           //   Инициируем работу с бампером.
        }                                                          //
                                                                   //
        void loop(){                                               //
            if( bum.getLineSum() > 3 ){                            //   Если больше 3 датчиков бампера фиксируют линию, то ...
                bum.setLineType(BUM_LINE_CHANGE);                  //   Меняем тип линии трассы.
            }                                                      //
        }                                                          //
        

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

        Описание функций библиотеки:

        В данном разделе описаны функции библиотеки iarduino_I2C_Bumper для работы с модулем - Бампер с 7 датчиками линий, I2C-flash.

        Данная библиотека может использовать как аппаратную, так и программную реализацию шины I2C. О том как выбрать тип шины I2C рассказано в статье Wiki - расширенные возможности библиотек iarduino для шины I2C.

        Подключение библиотеки:

        • Если адрес модуля известен (в примере используется адрес 0x09):
        #include <iarduino_I2C_Bumper.h>    // Подключаем библиотеку для работы с модулем.
        iarduino_I2C_Bumper bum(0x09);      // Создаём объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper, указывая адрес модуля на шине I2C.
        
        • Если адрес модуля неизвестен (адрес будет найден автоматически):
        #include <iarduino_I2C_Bumper.h>    // Подключаем библиотеку для работы с модулем.
        iarduino_I2C_Bumper bum;            // Создаём объект bum для работы с функциями и методами библиотеки iarduino_I2C_Bumper.

        При создании объекта без указания адреса, на шине должен находиться только один модуль.

        Функция begin();

        • Назначение: Инициализация работы с модулем.
        • Синтаксис: begin();
        • Параметры: Нет.
        • Возвращаемое значение: bool - результат инициализации (true или false).
        • Примечание: По результату инициализации можно определить наличие модуля на шине.
        • Пример:
        if( bum.begin() ){ Serial.print( "Модуль найден и инициирован!" ); }
        else             { Serial.print( "Модуль не найден на шине I2C" ); }

        Функция reset();

        • Назначение: Перезагрузка модуля.
        • Синтаксис: reset();
        • Параметры: Нет.
        • Возвращаемое значение: bool - результат перезагрузки (true или false).
        • Пример:
        if( bum.reset() ){ Serial.print( "Модуль    перезагружен" ); }
        else             { Serial.print( "Модуль не перезагружен" ); }

        Функция changeAddress();

        • Назначение: Смена адреса модуля на шине I2C.
        • Синтаксис: changeAddress( АДРЕС );
        • Параметр: uint8_t АДРЕС - новый адрес модуля на шине I2C (целое число от 0x08 до 0x7E)
        • Возвращаемое значение: bool - результат смены адреса (true или false).
        • Примечание: Текущий адрес модуля можно узнать функцией getAddress().
        • Пример:
        if( bum.changeAddress(0x12) ){ Serial.print( "Адрес модуля изменён на 0x12" ); }
        else                         { Serial.print( "Не удалось изменить адрес"    ); }

        Функция getAddress();

        • Назначение: Запрос текущего адреса модуля на шине I2C.
        • Синтаксис: getAddress();
        • Параметры: Нет.
        • Возвращаемое значение: uint8_t АДРЕС - текущий адрес модуля на шине I2C (от 0x08 до 0x7E)
        • Примечание: Функция может понадобиться если адрес модуля не указан при создании объекта, а обнаружен библиотекой.
        • Пример:
        Serial.print( "Адрес модуля на шине I2C = 0x" );
        Serial.println( bum.getAddress(), HEX );

        Функция getVersion();

        • Назначение: Запрос версии прошивки модуля.
        • Синтаксис: getVersion();
        • Параметры: Нет
        • Возвращаемое значение: uint8_t ВЕРСИЯ - номер версии прошивки от 0 до 255.
        • Пример:
        Serial.print( "Версия прошивки модуля " );
        Serial.println( bum.getVersion() );

        Функция setLamp();

        • Назначение: Управление фарами.
        • Синтаксис: setLamp( ФЛАГ );
        • Параметр: bool ФЛАГ - требуемое состояние фар (true - включены или false - отключены).
        • Возвращаемое значение: bool - результат применения указанного состояния (true или false).
        • Пример:
        bum.setLamp(true ); // Включить  фары.
        bum.setLamp(false); // Отключить фары.
        

        Функция setTurnSignal();

        • Назначение: Указание режима работы поворотников.
        • Синтаксис: setTurnSignal( РЕЖИМ );
        • Параметр: uint8_t РЕЖИМ работы поворотников, может принимать следующие значения:
          • BUM_TURN_OFF - поворотники отключены.
          • BUM_TURN_LEFT - включён (мигает) левый поворотник.
          • BUM_TURN_RIGHT - включён (мигает) правый поворотник.
          • BUM_TURN_EMERGENCY - поворотники работают в режиме аварийного сигнала.
          • BUM_TURN_POLICE - поворотники работают в режиме полицейской машины.
          • BUM_TURN_AUTO - поворотники работают в автоматическом режиме.
        • Возвращаемое значение: bool - результат применения нового режима (true или false).
        • Примечание: Параметры автоматического режима задаются функцией settingsTurnAuto().
        • Пример:
        bum.setTurnSignal(BUM_TURN_LEFT ); // Включить только левый  поворотник.
        bum.setTurnSignal(BUM_TURN_RIGHT); // Включить только правый поворотник.
        

        Функция setTurnPeriod();

        • Назначение: Указание периода мигания поворотников.
        • Синтаксис: setTurnPeriod( ПЕРИОД );
        • Параметр: uint8_t ПЕРИОД мигания поворотников, может принимать следующие значения:
          • BUM_TURN_100 - период мигания равен 100мс (10Гц) 50мс вкл / 50мс выкл.
          • BUM_TURN_200 - период мигания равен 200мс (5Гц) 100мс вкл / 100мс выкл.
          • BUM_TURN_400 - период мигания равен 400мс (2,5Гц) 200мс вкл / 200мс выкл.
          • BUM_TURN_800 - период мигания равен 800мс (1,25Гц) 400мс вкл / 400мс выкл.
        • Возвращаемое значение: bool - результат применения нового периода (true или false).
        • Примечание: Функцию можно вызывать как до включения поворотников, так и во время их работы.
        • Пример:
        bum.setTurnPeriod(BUM_TURN_800); // Задать период мигания поворотников в 800 мс.
        

        Функция settingsTurnAuto();

        • Назначение: Указание условий работы поворотников в автоматическом режиме.
        • Синтаксис: settingsTurnAuto( ВКЛ , ВЫКЛ [, ФЛАГ] );
        • Параметры:
          • uint8_t ВКЛ - условие включения поворотников, может принимать следующие значения:
            • BUM_AUTO_ON_1 - Линия под одним, самым крайним, датчиком со стороны поворотника.
            • BUM_AUTO_ON_2 - Линия под первым и/или вторым крайним датчиком со стороны поворотника.
            • BUM_AUTO_ON_3 - Линия под 1, 2, или 3, крайним датчиком со стороны поворотника.
          • uint8_t ВЫКЛ - условие отключения поворотников, может принимать следующие значения:
            • BUM_AUTO_OFF_CEN - Под центральным датчиком есть линия.
            • BUM_AUTO_OFF_ANY - Линия есть под любым датчиком кроме указанных в условии включения.
          • bool ФЛАГ - значение true или false указывающее добавить 2 мигания перед отключением. Данный параметр является необязательным, если он не указан, значит ФЛАГ = false.
        • Возвращаемое значение: bool - результат применения новых настроек (true или false).
        • Примечание: Функцию можно вызывать как до включения поворотников, так и во время их работы в автоматическом режиме.
        • Пример:
        bum.settingsTurnAuto(BUM_AUTO_ON_2, BUM_AUTO_OFF_ANY, true); // Условие работы поворотников в автоматическом режиме.
        
        • Разбор примера:
          • В условии включения указан параметр BUM_AUTO_ON_2, значит поворотник будет включаться когда линия находится под первым и/или вторым крайним датчиком со стороны поворотника.
            • Для левого поворотника это датчики № 1 и 2.
            • Для правого поворотника это датчики № 7 и 6.
          • В условии отключения указан параметр BUM_AUTO_OFF_ANY, значит поворотник будет отключаться если линия находится под любым датчиком (или датчиками) бампера и не соблюдается условие для включения этого поворотника.
          • В качестве третьего (необязательного) параметра указано значение true, значит при наступлении условия отключения поворотника он выключится не сразу, а спустя 2 мигания.

        Функция setCalibrationRun();

        • Назначение: Запуск автоматической калибровки модуля.
        • Синтаксис: setCalibrationRun();
        • Параметры: Нет.
        • Возвращаемое значение: bool - результат запуска калибровки (true или false).
        • Примечание:
          • Обращение к данной функции равносильно первому нажатию на кнопку «калибровка».
          • Во время выполнения функции все датчики должны находиться над линией трассы.
          • Запуск автоматической калибровки приводит к началу чтения показаний АЦП со всех датчиков линий, этот процесс занимает до 5 секунд.
          • По завершению чтения показаний датчиков, модуль перейдёт в стадию ожидания завершения калибровки. Инициировать завершение калибровки можно нажатием на кнопку «калибровка» или обращением к функции setCalibrationEnd().
        • Пример:
        bum.setCalibrationRun(); // Начать калибровку.
        

        Функция setCalibrationEnd();

        • Назначение: Завершение автоматической калибровки модуля.
        • Синтаксис: setCalibrationEnd( [ ФЛАГ ] );
        • Параметр: bool ФЛАГ - значение true указывает на то что датчики требуется откалибровать не по отдельности, а определить одно общее значение для всех датчиков.
        • Возвращаемое значение: bool - результат инициализации завершения калибровки (true или false).
        • Примечание:
          • Обращение к данной функции равносильно второму нажатию на кнопку «калибровка».
          • Во время выполнения функции все датчики должны находиться над фоном трассы.
          • Инициализация завершения автоматической калибровки приводит к началу чтения показаний АЦП со всех датчиков линий, этот процесс занимает до 5 секунд.
          • По завершению чтения показаний датчиков, модуль рассчитает граничные значения АЦП датчиков между фоном и линией трассы, определит тип линии трассы и сохранит результаты в энергонезависимую память.
          • Если функция вызвана без параметра (или с параметром false), то модуль рассчитает граничные значения АЦП для каждого датчика в отдельности (как при нажатии на кнопку «калибровка»).
          • Если функция вызвана с параметром true, то модуль рассчитает общее граничное значение АЦП, одинаковое для всех датчиков (может помочь при сильной боковой засветке трассы).
          • По сохранённым граничным значениям АЦП (между линией и фоном) модуль будет определять наличие линии под датчиками.
          • Более подробно про граничные значения АЦП рассказано в пояснении к ручной калибровке.
        • Пример:
        bum.setCalibrationEnd(); // Завершить калибровку.
        

        Функция setCalibrationManual();

        • Назначение: Выполнение ручной калибровки модуля.
        • Синтаксис: setCalibrationManual( АЦП [, АЦП, АЦП, АЦП, АЦП, АЦП, АЦП ] );
        • Параметры:
          • uint16_t АЦП - число (0...4095) соответствующее граничному значению АЦП датчика.
        • Возвращаемое значение: bool - результат записи калибровочных значений (true или false).
        • Примечание:
          • Функция принимает 7 граничных значений АЦП для каждого датчика модуля, или одно граничное значение АЦП для всех датчиков модуля.
          • Граничное значение АЦП является средним значением между АЦП датчика для линии и АЦП датчика для фона.
          • АЦП любого датчика, для линии и фона, можно получить функцией getLineAnalog().
          • Указанные значения сохраняются в энергонезависимую память модуля и используются им в последствии для определения наличия линий под датчиками.
          • При ручной калибровке, помимо указания значений АЦП, может понадобится указание типа используемой линии при помощи функции setLineType().
        • Пример:
        bum.setCalibrationManual( 700 );                               // Применить граничное значение 700 для всех датчиков модуля.
        bum.setCalibrationManual( 710, 770, 750, 899, 900, 700, 800 ); // Применить граничное значение 710 для 1 датчика, 770 для второго и т.д.
        • Пояснение ручной калибровки:
          • Предположим что нами используется трасса с тёмной линией на светлом фоне, это можно указать модулю обратившись к функции setLineType( BUM_LINE_BLACK );
          • Предположим что при помощи функции getLineAnalog( 1 ); мы выяснили, что АЦП первого датчика для линии равно 500, а для фона 2500. Значит граничное значение АЦП для первого датчика равно 1500 (среднее значение). Аналогичным образом рассчитываются граничные значения АЦП для остальных датчиков.
          • После выполнения ручной калибровки, модуль будет знать что граничное значение АЦП первого датчика равно 1500. Так как мы указали модулю, что линия трассы темнее её фона, то все значения датчика ниже граничного модуль будет воспринимать как линия, а выше граничного - как фон. Чем светлее поверхность под датчиком, тем выше значение АЦП.
          • Стоит учесть что зона в ±50 значений АЦП возле границы является гистерезисом.

        Функция getCalibrationStage();

        • Назначение: Получение текущего статуса автоматической калибровки.
        • Синтаксис: getCalibrationStage();
        • Параметры: Нет.
        • Возвращаемое значение: uint8_t СТАТУС - одно из возможных значений:
          • BUM_STAGE_READ_LN - выполняется чтение АЦП с датчиков над линией трассы.
          • BUM_STAGE_WAITING - модуль ожидает поступления команды на чтение фона.
          • BUM_STAGE_READ_BG - выполняется чтение АЦП с датчиков над фоном трассы.
          • BUM_STAGE_OFF_ERR - калибровка завершена провалом.
          • BUM_STAGE_OFF_OK - калибровка завершена успехом.
        • Примечание:
          • Функцию можно использовать для контроля выполнения и результата автоматической калибровки, запускаемой как функциями, так и нажатием кнопки «калибровка».
          • В примере Arduino IDE: Файл / Примеры / iarduino I2C Bumper (бампер) / controlCalibrationButton показан пример контроля за ходом выполнения калибровки с кнопки.
        • Пример:
        if(bum.getCalibrationStage()==BUM_STAGE_OFF_OK){Serial.println("Калибровка выполнена успешно");}
        

        Функция getLineDigital();

        • Назначение: Чтение линий под датчиками модуля.
        • Синтаксис: getLineDigital( НОМЕР );
        • Параметр: uint8_t НОМЕР датчика, может принимать значение от 1 до 7.
        • Возвращаемое значение: uint8_t - флаг наличия линии под датчиком (true или false).
        • Примечание:
          • Если в качестве параметра НОМЕР указать не число, а значение BUM_LINE_ALL, то функция вернёт не флаг, а число состоящее из 8 бит, где каждый бит (кроме нулевого) является флагом наличия линии под датчиком, номер которого совпадает с номером бита.
        • Пример:
        bool i = bum.getLineDigital( 5 );                     // Если под 5 датчиком есть линия, то i = true.
        bool i = bum.getLineDigital( BUM_LINE_ALL ) & bit(5); // Если под 5 датчиком есть линия, то i = true.
        

        Функция getLineAnalog();

        • Назначение: Чтение значений АЦП снятых с датчиков модуля.
        • Синтаксис: getLineAnalog( НОМЕР );
        • Параметр: uint8_t НОМЕР датчика, может принимать значение от 1 до 7.
        • Возвращаемое значение: uint16_t - число от 0 до 4096 соответствующее значению АЦП датчика.
        • Примечание:
          • Обращение к функции позволяет получить значение АЦП того датчика номер которого был указан в качестве параметра.
          • Чем светлее поверхность под датчиком, тем выше значение АЦП.
        • Пример:
        uint16_t i = bum.getLineAnalog( 5 ); // Получить значение АЦП с 5 датчика в переменную i.
        

        Функция getLineSum();

        • Назначение: Запрос количества датчиков находящихся над линией.
        • Синтаксис: getLineSum( [ПЕРЕМЕННАЯ] );
        • Параметр: uint8_t ПЕРЕМЕННАЯ для получения байта флагов наличия линий.
        • Возвращаемое значение: uint8_t - число от 0 до 7 соответствующее количеству датчиков находящихся над линией.
        • Примечание:
          • Данная функция позволяет получить не только количество датчиков находящихся над линией (в качестве возвращаемого значения), но и байт флагов наличия линий (если в качестве необязательного параметра указана переменная для получения этого байта).
          • Байт флагов наличия линий соответствует байту возвращаемому функцией getLineDigital().
        • Пример:
        uint8_t i = bum.getLineSum(); // Получить количество датчиков которые находятся над линией.
        

        Функция getLineType();

        • Назначение: Запрос типа линии трассы для которой откалиброван модуль.
        • Синтаксис: getLineType();
        • Параметры: Нет.
        • Возвращаемое значение: uint8_t - ТИП лини, может принимать следующие значения:
          • BUM_LINE_BLACK - модуль откалиброван для трассы с тёмной линией на светлом фоне.
          • BUM_LINE_WHITE - модуль откалиброван для трассы со светлой линией на тёмном фоне.
        • Пример:
        if( bum.getLineType() == BUM_LINE_BLACK ){ Serial.println("Трасса с  тёмной  линией"); }
        else                                     { Serial.println("Трасса со светлой линией"); }
        

        Функция setLineType();

        • Назначение: Установка типа линии трассы.
        • Синтаксис: setLineType( ТИП );
        • Параметры: uint8_t ТИП лини, может принимать следующие значения:
          • BUM_LINE_BLACK - указать модулю что трасса использует тёмную линию.
          • BUM_LINE_WHITE - указать модулю что трасса использует светлую линию.
          • BUM_LINE_CHANGE - изменить тип линии трассы на противоположный.
        • Возвращаемое значение: bool - результат записи нового типа линии в модуль (true или false).
        • Примечание:
          • Тип используемой линии сохраняется в энергонезависимую память модуля, а значит модуль будет работать с данным типом трассы и после отключения питания.
          • Функцию удобно использовать с параметром BUM_LINE_CHANGE, если на трассе есть участки, где цвет линии и фона резко меняют друг с друга.
        • Пример:
        bum.setLineType(BUM_LINE_BLACK); // Указываем модулю что на трассе используется тёмная линия на светлом фоне.

          Ссылки:




          Обсуждение

          Гарантии и возврат Используя сайт Вы соглашаетесь с условями