Печать корпуса и сборка

Возьмите скользящие контакты и поместите его в верхнюю часть корпуса. Убедитесь, что вращающаяся часть кольца находится на верхней стороне корпуса, чтобы она вращалась одновременно с диском. Теперь установите шаговый мотор, который фиксируется к корпусу двумя 3M винтами и гайкам. Крышка готова:

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

Теперь пропускаем провода от скользящих контактов через отверстие вращающегося диска:

После чего берём датчик и припаиваем к нему 4 провода (+5V, GND, SCL и SDA) от скользящих контактов:

С помощью двух болтов М3 закрепляем модуль дальномера на корпусе вращающегося диска:

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

Когда датчик будет закреплён, вращающийся диск надевается на подшипник:

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

Магнит служит для того, чтобы на него на него срабатывал датчик Холла и в этот момент в коде происходит установка переменной «угол» в некоторое значение. Если магнит по размерам позволяет наклеить его по центру под датчиком, это будет самый лучший вариант, т.к. при срабатывании переменной «угол» нужно будет присвоить значение 0. Если нет, магнит можно наклеить возле датчика. Тогда переменной «угол» нужно будет присвоить не 0, а соответствующее значение (на какой угол относительно магнита повёрнут датчик). Если магнит находится с противоположной стороны, нужно присвоить 180. Если угол составляет 20 градусам (на фото выше угол немного больше):

Тогда переменной «угол» нужно присвоить 20 и т.д.

На макетную плату по схеме, приведенной ранее, запаиваем конденсатор, драйвер мотора, 10K резистор, датчик Холла, провода от Arduino и стабилизатора питания:

Всё припаяно, теперь закрепляем (двусторонней липкой лентой, клеем, термоклеем и т.д.) Arduino Nano внутри корпуса и наш лидар почти готов:

Осталось вплавить в нижнюю крышку корпуса три вставные гайки, затем прикрутить крышку корпуса, надеть на шкив пасик и можно переходить к программированию и экспериментам.

Шаг 2. Схема подключения акселерометра к микроконтроллеру Arduino

Порядок и схема подключения довольно просты:

GY-521 (MPU-6050) Arduino Uno
VCC 3.3 V
GND GND
SCL A5
SDA A4
  1. Присоединяем модуль датчика к микроконтроллеру.
  2. На МК Ардуино загружаем проработанный код, представленный в разделе ниже.
  3. Открываем среду разработки Arduino IDE и мониторим последовательный порт.
  4. Сверяем выводимые данные акселерометра и гироскопа.
  5. Во время поворота датчика сведения не производят изменений.

Гироскоп – инструмент, который позволяет измерить реакцию тела на перемещение углов и вообще ориентации. Акселерометр же служит измерителем проекции ускорения, которое только кажется.

Как подключить датчик MQ2 к Ардуино

Для этого занятия нам потребуется:

  • плата Arduino Uno / Arduino Nano / Arduino Mega;
  • датчик газа MQ2;
  • макетная плата;
  • светодиод;
  • резистор 220 Ом;
  • провода «папа-папа», «папа-мама».

Схема подключения датчика MQ2 к Ардуино Уно

Рассмотрим несколько вариантов кода для сенсора. Первый вариант — без библиотеки и еще два примера с библиотеками MQ2.h и TroykaMQ.h от Амперки. Обе библиотеки можно скачать на нашем сайте здесь

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

Скетч. Применяем датчик MQ2 без библиотеки

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода

int value;

void setup() {
  Serial.begin(9600);
  pinMode(LED, OUTPUT);
  pinMode(PIN_MQ2, INPUT);
}

void loop() {
   // записываем полученные данные с датчика
   value = analogRead(PIN_MQ2);

   // выводим информацию на монитор порта
   Serial.println("VALUE - " + String(value));
   Serial.println(" ");

   // включаем светодиод при превышении определенного значения
   if (value > 200) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

Пояснения к коду:

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

Датчик широкого спектра газов MQ-2 и Ардуино

Для следующего примера следует переключить пин A1 на логический порт сенсора газа (цифровой сигнал). Если вы используете датчик широкого спектра газов MQ-2 от компании Амперка, то подключите его к микроконтроллеру, согласно схеме. При этом у сенсора должен быть включен нагрев (замкнута перемычка на плате датчика). После подключения датчика к Arduino, загрузите следующую программу в плату.

Скетч. Подключение датчика с библиотекой MQ2.h

#include <MQ2.h>  // библиотека для датчика

#define PIN_MQ2  A1    // имя пина для подключения MQ2
#define LED       13   // имя пина для подключения светодиода
MQ2 mq2(PIN_MQ2);   // создаём объект для работы с датчиком

int lpg, co, smoke;

void setup() {
  Serial.begin(9600);
  mq2.begin();
  pinMode(LED, OUTPUT);
}

void loop() {
   float* values = mq2.read(true);

   // получаем информацию с датчика
   // выводим данные на монитор порта
   lpg = mq2.readLPG();
   co = mq2.readCO();
   smoke = mq2.readSmoke();
  
   // включаем светодиод при превышении концентрации CO
   if (co > 1000) { digitalWrite(LED, HIGH); }
   else { digitalWrite(LED, LOW); }

   delay(200);
}

Пояснения к коду:

  1. информация с датчика выводится на монитор порта Arduino IDE;
  2. порог включения светодиода можно изменить в операторе if и настроить программу на определение концентрации другого газа (в примере указан CO).

Скетч. MQ2 от Амперки с библиотекой TroykaMQ.h

#include <TroykaMQ.h>  // библиотека для датчика

#define PIN_MQ2  A1     // имя пина для подключения датчика
MQ2 mq2(PIN_MQ2);    // создаём объект для работы с датчиком

void setup() {
   Serial.begin(9600);
   // выполняем калибровку датчика
   mq2.calibrate();
   // выводим сопротивление датчика в чистом воздухе (Ro)
   Serial.println("Ro = " + String(mq2.getRo()));
}

void loop() {
   // выводим значения газов в ppm
   Serial.println("LPG: " + String(mq2.readLPG()) + " ppm");
   Serial.println("Methane: " + String(mq2.readMethane()) + " ppm");
   Serial.println("Smoke: " + String(mq2.readSmoke()) + " ppm");
   Serial.println("Hydrogen: " + String(mq2.readHydrogen()) + " ppm");

   Serial.println(" ");
   delay(200);
}

Пояснения к коду:

  1. в представленном примере информация по концентрации газов выводится в последовательный порт, без включения светодиода;
  2. сенсор должен находится в режиме постоянного нагрева (перемычка замкнута).

Подключение датчика HC SR04

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

У самого сенсора SR04 следующие характеристики от которых вам стоит отталкиваться:

  1. Напряжение для питания – 5В.
  2. Работает в цепях с силой тока 15 мА.
  3. Если датчик не используется, то для поддержания его в пассивном состоянии всё ещё требуется до 2 мА.
  4. Угол обзора у модуля небольшой, всего 15 градусов.
  5. Разрешение сенсора – 3 десятых см.
  6. А вот угол для измерений составляет уже приятные 30 градусов.

Также на датчике имеются четыре вывода по стандарту 2.54 мм. В них входит контакт для питания с положительным напряжением +5В, пины для ввода и вывода сигнала и заземление.

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

3Получение дистанции до объекта с датчика HC-SR04

Теперь напишем скетч, определяющий расстояние до препятствия и выводящий его в последовательный порт. Сначала задаём номера выводов TRIG и ECHO – это 12 и 11 пины. Затем объявляем триггер как выход, а эхо – как вход. Инициализируем последовательный порт на скорости 9600 бод. В каждом повторении цикла loop() считываем дистанцию и выводим в порт.

const int trigPin = 12;
const int echoPin = 11;

void setup()  {
  pinMode(trigPin, OUTPUT); // триггер - выходной пин
  pinMode(echoPin, INPUT); // эхо - входной
  digitalWrite(trigPin, LOW);
  Serial.begin(9600); // инициализация послед. порта
}

void loop()  { 
  long distance = getDistance(); // получаем дистанцию с датчика
  Serial.println(distance); // выводим в последовательный порт
  delay(100);
} 

// Определение дистанции до объекта в см
long getDistance() {
  long distacne_cm = getEchoTiming() * 1.7 * 0.01;
  return distacne_cm;
}

// Определение времени задержки
long getEchoTiming() {
  digitalWrite(trigPin, HIGH); // генерируем 10 мкс импульс запуска
  delayMicroseconds(10);  
  digitalWrite(trigPin, LOW);
  // определение на пине echoPin длительности уровня HIGH, мкс:
  long duration = pulseIn(echoPin, HIGH); 
  return duration;
}

Функция getEchoTiming() генерирует импульс запуска. Она как раз создаёт тот 10-микросекундный импульс, который является триггером для начала излучения дальномером звукового пакета в пространство. Далее она запоминает время от начала передачи звуковой волны до прихода эха.

Функция getDistance() рассчитывает дистанцию до объекта. Из школьного курса физики мы помним, что расстояние равно скорость умножить на время: S = V×t Скорость звука в воздухе 340 м/сек, время в микросекундах мы знаем (переменная duration). Чтобы получить время duration в секундах, нужно разделить его на 1 000 000. Так как звук проходит двойное расстояние – до объекта и обратно – нужно ещё разделить результат пополам. Вот и получается, что расстояние до объекта S = 34000 см/сек × duration / 1 000 000 сек / 2 = 1,7 см/сек / 100, что мы и написали в скетче.

Операцию умножения микроконтроллер выполняет быстрее, чем операцию деления, поэтому :100 я заменил на эквивалентное ×0,01.

Шаг 3: теория

Рисунок 6 – Область обнаружения объектаРисунок 7 – Формулы

Диаграммы направленности лучей

На левом рисунке 6 выше показаны наложенные диаграммы направленности для преобразователя A и преобразователя B.

Датчик A получит эхо от любого объекта в «красной зоне».

Датчик B будет получать эхо, только если объект находится в «лиловой зоне». Вне этой зоны определить координаты объекта невозможно (целевая зона может быть полностью «освещена» звуком, если расположить датчики ниже базовой линии).

Большие «лиловые» зоны обнаружения возможны, если датчики расставлены широко.

Расчеты

Что касается правого рисунка 7 выше.

Площадь любого треугольника может быть вычислена по формуле:

\[площадь = основание \cdot высота/2 \qquad (1)\]

Преобразование уравнения (1) дает нам высоту (координату Y):

\[высота = площадь \cdot 2 / основание \qquad (2)\]

Пока всё хорошо… Но как мы вычислим площадь?

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

На рисунке 7 показано, как это сделать.

Преобразователь A посылает импульс, который отражается от объекта во всех направлениях. Этот импульс слышат оба преобразователя, и A, и B. Преобразователь B не передает импульсов, он только слушает.

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

\[d1 _{(см)} = время_{(микросекунды)}/59 \qquad (3)\]

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

  • Скорость звука составляет примерно 340 м/с, что составляет 0,034 см/мкс (сантиметр/микросекунда).
  • Обратное значение 0,034 см/мкс составляет 29,412 мкс/см, которое при умножении на 2 (чтобы получить длину обратного пути) дает в результате 58,824 или 59 при округлении.
  • Это значение можно подстроить вверх/вниз, чтобы учесть температуру, влажность и давление воздуха.

Путь к преобразователю B показан синим цветом. Если из этого пути вычесть расстояние d1, мы получим расстояние d2. Формула для d2 будет следующей:

\[d2 _{(см)} = время_{(микросекунды)}/29,5 — d1 \qquad (4)\]

Величина 29,5 для константы получается следующим образом:

Тут нет обратного пути, поэтому мы используем 29,5, что является половиной значения, используемого в формуле (3) выше.

Теперь у нас есть длины всех сторон треугольника ABC… погуглите «Герон».

Формула Герона

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

\[s = (a + b + c)/2 \qquad (5)\]

Теперь полощадь может быть рассчитана по следующей формуле:

\

Как только мы узнаем эту площадь, мы сможем вычислить высоту (координату Y) из формулы (2) выше.

Теорема Пифагора

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

\

3Скетч Arduino для ультразвукового дальномера

Напишем скетч для нашего дальномера:

const int trigPin = 6; // вывод триггера датчика HC-SR04
const int echoPin = 5; // вывод приёмника датчика HC-SR04

#include <LiquidCrystal.h> // подключаем стандартную библиотеку
LiquidCrystal lcd(12, 11, 10, 9, 8, 7); //инициализация ЖКИ 

void setup() {
  pinMode(trigPin, OUTPUT); // триггер - выходной пин
  pinMode(echoPin, INPUT); // эхо - входной
  digitalWrite(trigPin, LOW); 
  lcd.begin(16, 2); //задаём кол-во строк и символов в строке
  lcd.setCursor(10, 0); // выравниваем надпись по правому краю
  lcd.print("Dist:");
  lcd.setCursor(14, 1); 
  lcd.print("cm");
}

void loop() {
  long distance = getDistance(); // получаем дистанцию с датчика   
  lcd.setCursor(10, 1);
  lcd.print("    "); // очищаем ЖКИ от предыдущего значения
  lcd.setCursor(10, 1);
  lcd.print((String)distance); // выводим новую дистанцию
  delay(100);
}

// Определение дистанции до объекта в см
long getDistance() {
  long distacne_cm = getEchoTiming() * 1.7 * 0.01;
  return distacne_cm;
}

// Определение времени задержки
long getEchoTiming() {
  digitalWrite(trigPin, HIGH); // генерируем импульс запуска
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  // определение на пине echoPin длительности уровня HIGH, мкс:
  long duration = pulseIn(echoPin, HIGH);
  return duration;
}

Тут всё просто. Сначала инициализируем ЖКИ на выводах 12, 11, 10, 9, 8 и 7 с помощью библиотеки LiquidCrystal из состава Arduino IDE. Далее привяжем выводы «триггер» и «эхо» дальномера к выводам 6 и 5 платы Arduino. Каждые 100 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.

У меня на LCD дисплее имеется дефект, и его левая половина почти не работает. Поэтому я вывожу надписи выровненными по правому краю.

После того как записали скетч в память Arduino, можем собирать прибор. Предлагаемая мной компоновка внутренностей показана на рисунке. Дисплей и датчик я закрепил с помощью термоклея. Он держит достаточно прочно, но при этом даёт возможность снять соединённые детали, если понадобится. Желательно всё разместить так, чтобы можно было подключиться к USB порту Arduino и поправить «прошивку» при необходимости. Например, изменить выводимый текст или поправить коэффициенты для расчёта дистанции. Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.

Вариант готового прибора показан на фотографии. Он достаточно компактен и удобен в использовании.

Вариант компоновки ультразвукового дальномера Внешний вид готового ультразвукового дальномера

Но следует иметь в виду несколько важных замечаний при его использовании:

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

Запуск и настройка

При первом запуске устройства происходит следующее:

  1. Подается импульс на вход Trig.
  2. В самом датчике сигнал преобразуется в 8 импульсов, у которых частота достигает 40 кГц, их он, соответственно, и посылает вперёд.
  3. Доходя до препятствия, импульсы отражаются и возвращаются на приемник, происходят моментальные расчеты в МК, и вся информация подаётся на устройство вывода. В нашем случае – это консоль ПК, но в будущем мы сделаем урок, где данные будут выводиться на LED-экранчик.

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

Датчик пользуется большой популярностью и всё больше людей пишут свои решения для работы с ним.

Датчик расстояния в проектах Arduino

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

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

Описание датчика HC SR04

Ультразвуковой дальномер HC SR04 имеет такие технические параметры:

  • Питающее напряжение 5В;
  • Рабочий параметр силы т ока – 15 мА;
  • Сила тока в пассивном состоянии < 2 мА;
  • Обзорный угол – 15°;
  • Сенсорное разрешение – 0,3 см;
  • Измерительный угол – 30°;
  • Ширина импульса – 10-6 с.

Датчик оснащен четырьмя выводами (стандарт 2, 54 мм):

  • Контакт питания положительного типа – +5В;
  • Trig (Т) – выход сигнала входа;
  • Echo (R) – вывод сигнала выхода;
  • GND – вывод «Земля».

Схема взаимодействия с Arduino

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

  • Подать на выход Trig импульс длительностью 10 микросек;
  • В ультразвуковом дальномере hc sr04 подключенном к arduino произойдет преобразование сигнала в 8 импульсов с частотой 40 кГц, которые через излучатель будут посланы вперед;
  • Когда импульсы дойдут до препятствия, они отразятся от него и будут приняты приемником R, что обеспечит наличие входного сигнала на выходе Echo;
  • На стороне контроллера полученный сигнал при помощи формул следует перевести в расстояние.

При делении ширины импульса на 58.2, получим данные в сантиметрах, при делении на 148 – в дюймах.

Подключение HC SR04 к Arduino

Выполнить подключение ультразвукового датчика расстояния к плате Arduino достаточно просто. Схема подключения показана на рисунке.

Контакт земли подключаем к выводу GND на плате Arduino, выход питания соединяем с 5V. Выходы Trig и Echo подсоединяем к arduino на цифровые пины. Вариант подключения с помощью макетной платы:

Библиотека для работы с HC SR04

Для облегчения работы с датчиком расстояния HC SR04 на arduino можно использовать библиотеку NewPing. Она не имеет проблем с пинговыми доступами и добавляет некоторые новые функции.

К особенностям библиотеки можно отнести:

  • Возможность работы с различными ультразвуковыми датчиками;
  • Может работать с датчиком расстояния всего через один пин;
  • Отсутствие отставания на 1 секунду при отсутствии пинга эха;
  • Для простой коррекции ошибок есть встроенный цифровой фильтр;
  • Максимально точный расчет расстояния.

Скачать бибилотеку NewPing можно здесь

Точность измерения расстояния датчиком HC SR04

Точность датчика зависит от нескольких факторов:

  • температуры и влажности воздуха;
  • расстояния до объекта;
  • расположения относительно датчика (согласно диаграммы излучения);
  • качества исполнения элементов модуля датчика.

В основу принципа действия любого ультразвукового датчика заложено явление отражения акустических волн, распространяющихся в воздухе. Но как известно из курса физики, скорость распространения звука в воздухе зависит от свойств этого самого воздуха (в первую очередь от температуры). Датчик же, испуская волны и замеряя время до их возврата, не догадывается, в какой именно среде они будут распространяться и берет для расчетов некоторую среднюю величину. В реальных условиях из-за фактора температуры воздуха HC-SR04 может ошибаться от 1 до 3-5 см.

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

Также для повышения точности надо правильно направить датчик: сделать так, чтобы предмет был в рамках конуса диаграммы направленности. Проще говоря,  “глазки” HC-SR04 должны смотреть прямо на предмет.

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

  • усредняются значения (несколько раз замеряем, убираем всплески, потом находим среднее);
  • с помощью датчиков (например, DHT11 или DHT22) определяется температура и вносятся поправочные коэффициенты;
  • датчик устанавливается на серводвигатель, с помощью которого мы “поворачиваем голову”, перемещая диаграмму направленности влево или вправо.

Принципы измерения скорости с помощью датчика H206

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

В нашем проекте для измерения угла поворота робота мы смонтировали датчики скорости на обоих колесах, но если вы хотите измерять только скорость, то в этом случае можно использовать только один датчик. Выход датчика подсоединен ко входу внешнего прерывания платы Arduino. Каждый раз при обнаружении отверстия (пропуска) в пластине будет формироваться прерывание и вызываться процедура обработки прерывания (ISR — Interrupt service Routine). Если вы сможете измерять время между двумя такими прерываниями, то вы сможете рассчитать и скорость вращения колеса.

В плате Arduino мы можем достаточно просто определять это время при помощи функции millis(). Значение этой функции инкрементируется (увеличивается) на 1 каждую миллисекунду начиная со времени подачи питания на плату Arduino. То есть когда мы будем вызывать эту функцию на первое возникшее прерывание мы можем сохранить значение функции millis() в переменной (pevtime в нашей программе), а при втором возникшем прерывании мы можем рассчитать время при помощи вычитания значения переменной pevtime из текущего значения функции millis().

Time taken = current time – previous timetimetaken = millis()-pevtime; //timetaken in millisec

А когда мы определим время между двумя прерываниями мы можем рассчитать и число оборотов колеса в минуту (rpm) по следующей приведенной формуле. В представленной формуле (1000/timetaken) позволяет рассчитать число оборотов колеса в секунду (RPS — Revolutions per second) и в дальнейшем оно умножается на 60 чтобы преобразовать RPS в RPM (Revolutions per minute – число оборотов в минуту).

rpm=(1000/timetaken)*60;

После расчета числа оборотов колеса в минуту (rpm) мы можем рассчитать скорость робота зная радиус его колеса по следующей формуле:

Velocity = 2π × RPS × radius of wheel.v = radius_of_wheel * rpm * 0.104

Представленная формула рассчитывает скорость в м/с, если вы хотите рассчитывать ее в км/ч, то в этом случае замените в представленной формуле 0.104 на 0.376. Число 0.104 в нашей формуле получилось после упрощения выражения V = 2π × RPS × radius of wheel.

Аналогичные расчеты на нашем сайте мы уже рассматривали в проектах аналогового спидометра на основе платы Arduino и спидометра для велосипеда на основе приложения на Android. Но пластина датчика H206 имеем 20 слотов (отверстий) и если мы будем измерять время между каждой парой отверстий, то это будет слишком перегружать микроконтроллер. Поскольку на каждое отверстие в пластине будет генерироваться два прерывания (одно в начале и одно в конце отверстия), то за время одного полного оборота колеса мы получим 40 прерываний. Поэтому в коде программы мы будем ожидать появления этих 40 прерываний прежде чем рассчитать скорость вращения колеса.

Arduino

if(rotation>=40)
{
timetaken = millis()-pevtime; //timetaken in millisec
rpm=(1000/timetaken)*60; //formulae to calculate rpm
pevtime = millis();
rotation=0;
}

1
2
3
4
5
6
7

if(rotation>=40)

{

timetaken=millis()-pevtime;//timetaken in millisec

rpm=(1000timetaken)*60;//formulae to calculate rpm

pevtime=millis();

rotation=;

}

Другой недостаток этого метода заключается в том, что скорость в нем не будет опускаться до нуля поскольку для расчета скорости с помощью прерываний мы всегда будем ждать завершения полного оборота колеса. Но этот недостаток можно достаточно просто устранить добавлением кода, который будет проверять время между двумя прерываниями и если оно будет больше определенного значения, то мы будем считать что скорость равна нулю. В следующем фрагменте кода для измерения времени между двумя прерываниями мы используем переменную dtime. Если разница между текущим значением функции millis() и значением этой переменной превышает 500, то мы приравниваем число оборотов колеса в минуту и скорость робота нулю.

Arduino

/*To drop to zero if vehicle stopped*/
if(millis()-dtime>500) //ни одного прерывания не найдено на интервале 500ms
{
rpm= v = 0; // устанавливаем rpm и скорость в 0
dtime=millis();
}

1
2
3
4
5
6

/*To drop to zero if vehicle stopped*/

if(millis()-dtime>500)//ни одного прерывания не найдено на интервале 500ms

{

rpm=v=;// устанавливаем rpm и скорость в 0

dtime=millis();

}

Работа схемы

Схема робота на основе Arduino и датчика скорости LM393 представлена на следующем рисунке.

Вычислительные и управляющие задачи в схеме возложены на плату of Arduino Nano. Колеса робота приводятся в движение двумя электродвигателями постоянного тока при помощи драйвера двигателя на основе H-моста L298N. Джойстик используется для управления скоростью и направлением движения робота, а два датчика скорости H206 используются для измерения скорости, пройденной дистанции и угла поворота робота. Измеренные значения этих параметров отображаются на экране ЖК дисплея 16×2. Потенциометр, подключенный к ЖК дисплею, можно использовать для управления его контрастностью, а резистор служит для ограничения тока для управления яркостью подсветки дисплея.

Схема запитывается от литиевого элемента на 7.4V. Эти 7.4V подаются на контакт 12V драйвера двигателя, а регулятор напряжения драйвера двигателя преобразует их в стабилизированное напряжение +5V, которое используется для питания платы Arduino, ЖК дисплея, датчиков и джойстика.

Двигатели управляются с помощью цифровых контактов 8, 9, 10 и 11 платы Arduino. Поскольку нам необходимо управлять еще и скоростью вращения двигателей мы используем сигналы ШИМ (широтно-импульсной модуляции), подаваемые на положительные контакты двигателей. Для этой цели мы используем контакты 9 и 10 платы Arduino, на которых возможно использование ШИМ сигналов. Значения положения осей X и Y джойстика подаются на аналоговые контакты A2 и A3 соответственно.

Поскольку, как мы уже знаем, датчик H206 формирует управляющее воздействие (триггер) каждый раз когда обнаруживается отверстие в пластине с делениями. Для повышения точности определения скорости мы эти управляющие воздействия будем подавать на входы внешних прерываний на контактах 2 и 3 платы Arduino. После сборки робота у нас получилась конструкция показанная на следующем рисунке. Более подробно вы ее можете рассмотреть на видео, приведенном в конце статьи.