Детектор скорости движущегося автомобиля на Ардуино

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

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

Детектор скорости движущегося автомобиля на Ардуино

Когда мы только подали питание на робота предполагается что угол его поворота равен 0°. Если вращается левое колесо угол инкрементируется в отрицательную сторону, а если вращается правое колесо угол инкрементируется в положительную сторону. Для упрощения понимания рассмотрим диапазон углов от -90 до +90 как показано на выше приведенном рисунке. Поскольку оба колеса одинакового диаметра, то если одно колесо сделает один полный оборот, то робот повернется на угол 90°.

К примеру, если левое колесо сделает полный оборот (80 прерываний), то робот повернется на 90° влево. Аналогично, если правое колесо сделает полный оборот (80 прерываний), то робот повернется на -90° вправо. То есть если плата Arduino обнаружит 80 прерываний от одного колеса, то мы можем считать что робот повернулся на 90° в соответствующую сторону, поэтому для расчета углов поворота мы можем использовать формулу:

Arduino

int angle_left = (left_intr % 360) * (90/80);
int angle_right = (right_intr % 360) * (90/80);

1
2

intangle_left=(left_intr%360)*(9080);

intangle_right=(right_intr%360)*(9080);

90 в этой формуле обозначает угол, покрываемый за 80 прерываний. Мы также используем модуль по основанию 360 чтобы результирующее значение никогда не превышало 36. Когда мы рассчитаем по приведенной формуле углы поворота вправо и влево, то результирующий угол поворота мы можем найти с помощью разницы между этими углами:

Arduino

angle = angle_right — angle_left;

1 angle=angle_right-angle_left;

Работа схемы

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

Детектор скорости движущегося автомобиля на АрдуиноСхема содержит плату Arduino Pro Mini, модуль инфракрасного датчика и ЖК дисплей. Плата Arduino управляет всем процессом функционирования устройства: считывание импульса с выхода модуля инфракрасного датчика, вычисление частоты вращения (в оборотах в минуту) и передача значения этой частоты на ЖК дисплей. Инфракрасный датчик используется для обнаружения объекта. Мы можем регулировать чувствительность данного датчика с помощью встроенного в него потенциометра. Модуль инфракрасного датчика состоит из инфракрасного передатчика и фотодиода, который обнаруживает инфракрасные лучи. Инфракрасный передатчик излучает инфракрасные лучи, когда эти лучи падают на поверхность, они отражаются от нее и улавливаются фотодиодом (более подробно об этих процессах можно прочитать в статье про робота, движущегося вдоль линии). Выход фотодиода подключен к компаратору, который сравнивает значение с выхода фотодиода с опорным напряжением и результат сравнения выдает на плату Arduino.

Детектор скорости движущегося автомобиля на Ардуино

Выход модуля инфракрасного датчика напрямую подключен ко контакту 18 (A4) Arduino. Vcc и GND подсоединены к контактам Vcc и GND arduino. ЖК дсиплей подключен к плате Arduino в 4-битном режиме. Его управляющие контакты RS, RW и En напрямую подсоединены к контактам 2, GND и 3 Arduino. Контакты данных D4-D7 подключены к контактам 4, 5, 6 и 7 Arduino. В схеме также присутствует кнопка, которую необходимо нажать для подсчета числа оборотов. Наш тахометр на основе платы Arduino подсчитывает число оборотов в течение 5 секунд а потом по вышеприведенной формуле осуществляет пересчет этого значения в число оборотов в минуту. Кнопка подключена к контакту 10 Arduino.

Шаг 4: Дополнительные примеры

Еще один вариант реализации этого устройства продемонстрировали коллеги из компании ForceTronics. Они сделали видео о том как происходил процесс создания анемометра:

Скетч для микроконтроллера от этой компании ниже:

//*****************Arduino anemometer sketch******************************
const byte interruptPin = 3; //anemomter input to digital pin
volatile unsigned long sTime = 0; //stores start time for wind speed calculation
unsigned long dataTimer = 0; //used to track how often to communicate data
volatile float pulseTime = 0; //stores time between one anemomter relay closing and the next
volatile float culPulseTime = 0; //stores cumulative pulsetimes for averaging
volatile bool start = true; //tracks when a new anemometer measurement starts
volatile unsigned int avgWindCount = 0; //stores anemometer relay counts for doing average wind speed
float aSetting = 60.0; //wind speed setting to signal alarm

void setup() {
  pinMode(13, OUTPUT); //setup LED pin to signal high wind alarm condition
  pinMode(interruptPin, INPUT_PULLUP); //set interrupt pin to input pullup
  attachInterrupt(interruptPin, anemometerISR, RISING); //setup interrupt on anemometer input pin, interrupt will occur whenever falling edge is detected
  dataTimer = millis(); //reset loop timer
}

void loop() {
 
  unsigned long rTime = millis();
  if((rTime - sTime) > 2500) pulseTime = 0; //if the wind speed has dropped below 1MPH than set it to zero
     
  if((rTime - dataTimer) > 1800){ //See if it is time to transmit
   
    detachInterrupt(interruptPin); //shut off wind speed measurement interrupt until done communication
    float aWSpeed = getAvgWindSpeed(culPulseTime,avgWindCount); //calculate average wind speed
    if(aWSpeed >= aSetting) digitalWrite(13, HIGH);   // high speed wind detected so turn the LED on
    else digitalWrite(13, LOW);   //no alarm so ensure LED is off
    culPulseTime = 0; //reset cumulative pulse counter
    avgWindCount = 0; //reset average wind count

    float aFreq = 0; //set to zero initially
    if(pulseTime > 0.0) aFreq = getAnemometerFreq(pulseTime); //calculate frequency in Hz of anemometer, only if pulsetime is non-zero
    float wSpeedMPH = getWindMPH(aFreq); //calculate wind speed in MPH, note that the 2.5 comes from anemometer data sheet
   
    Serial.begin(57600); //start serial monitor to communicate wind data
    Serial.println();
    Serial.println("...................................");
    Serial.print("Anemometer speed in Hz ");
    Serial.println(aFreq);
    Serial.print("Current wind speed is ");
    Serial.println(wSpeedMPH);
    Serial.print("Current average wind speed is ");
    Serial.println(aWSpeed);
    Serial.end(); //serial uses interrupts so we want to turn it off before we turn the wind measurement interrupts back on
   
    start = true; //reset start variable in case we missed wind data while communicating current data out
    attachInterrupt(digitalPinToInterrupt(interruptPin), anemometerISR, RISING); //turn interrupt back on
    dataTimer = millis(); //reset loop timer
  }
}

//using time between anemometer pulses calculate frequency of anemometer
float getAnemometerFreq(float pTime) { return (1/pTime); }
//Use anemometer frequency to calculate wind speed in MPH, note 2.5 comes from anemometer data sheet
float getWindMPH(float freq) { return (freq*2.5); }
//uses wind MPH value to calculate KPH
float getWindKPH(float wMPH) { return (wMPH*1.61); }
//Calculates average wind speed over given time period
float getAvgWindSpeed(float cPulse,int per) {
  if(per) return getWindMPH(getAnemometerFreq((float)(cPulse/per)));
  else return 0; //average wind speed is zero and we can't divide by zero
  }

//This is the interrupt service routine (ISR) for the anemometer input pin
//it is called whenever a falling edge is detected
void anemometerISR() {
  unsigned long cTime = millis(); //get current time
  if(!start) { //This is not the first pulse and we are not at 0 MPH so calculate time between pulses
   // test = cTime - sTime;
    pulseTime = (float)(cTime - sTime)/1000;
    culPulseTime += pulseTime; //add up pulse time measurements for averaging
    avgWindCount++; //anemomter went around so record for calculating average wind speed
  }
  sTime = cTime; //store current time for next pulse time calculation
  start = false; //we have our starting point for a wind speed measurement
}

На этом пока всё. Желаем вам хороших проектов! Любые пожелания и комментарии вы можете оставить в нашей группе ВКонтакте.

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

Прототип на базе микросхемы MC33035

Параллельно с разработкой контроллера на Ардуино я рассматривал альтернативные варианты логической части контроллера. И это привело меня к микросхеме MC33035. Это старая разработка от Motorola, сейчас её выпускает ON Semiconductor. Создана специально для мощных трёхфазных двигателей.

Данная микросхема:

  • Отвечает за всю логическую часть контроллера
  • Считывает показания с датчиков Холла
  • Определяет положения вала
  • Выдаёт сигналы для затворов Н-моста на их драйверы
  • Имеет возможность подключения индикатора ошибок, перегрева
  • Обрабатывает и передает ШИМ-сигнал (PWM)
  • Осуществляет реверс (обратный ход колеса)

Одним словом, микросхема содержит всё необходимое для управления электродвигателем. Её стоимость очень низкая: на Алиэкспрессе — около 50 рублей. Для сборки полноценного контроллера на её основе потребуется микросхема MC33035, полумостовые драйверы и Н-мост из полевых транзисторов. Я также собрал контроллер на этой микросхеме. Работает отлично, стабильно, колесо крутится как надо на различных оборотах. Но функционал микросхемы ограничен, если необходимо наворотить различные функции, вывод на дисплей скорости, одометр, расход батареи, то опять же возникает необходимость дополнительно подключить Ардуино или что-то аналогичное.

Схема с MC33035

Печатная плата

Готовый вариант

Принцип работы

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

ИК-датчик включает в себя ИК-светодиод (передатчик) и фототранзистор (приемник). Когда объект проходит между датчиками, свет отражается от объекта и падает на фототранзистор. Используется операционный усилитель IC (LM393), к которому подключен фототранзистор. Когда объект оказывается перед датчиком, он посылает логический сигнал HIGH в Arduino.

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

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

Используемая формула: Speed = distance / Time, где

  • Speed — скорость,
  • distance — расстояние между датчиками,
  • Time — время измеренное модулем ардуино.

Все расчеты и сбор данных выполняются Arduino, а окончательный результат отображается на ЖК-модуле 16X2.

Предисловие

Так получилось, что в университете я изучаю C/C++. Для души пробую делать небольшие проекты на Python. Я много слышал про платформу Arduino, смотрел видео на YouTube, частенько посещал Arduino Project Hub и вот мне стало интересно самому поэкспериментировать, углубясь в разработку под микроконтроллеры. Купив стартовый набор с самой платой и горстью электронных компонентов и попробовав собрать проекты из обучающей брошюры, понял, что надо двигаться дальше. Продумав саму идею следующей самоделки, отправился на просторы Google и обнаружил, что не могу найти всего, что мне нужно на одном ресурсе. Безусловно, мне несложно было посетить несколько сайтитов и блогов с информацией, но я бы сильно сэкономил время, если бы нашел все в одном месте. Так и появилась эта статья-туториал.

Необходимые компоненты

Драйвер мотора L293D

Детектор скорости движущегося автомобиля на Ардуино

L293D представляет собой микросхему драйвера мотора (motor driver), имеющую в своем составе 2 канала для управления двумя двигателями. Микросхема L293D имеет две транзисторные пары Дарлингтона для усиления и раздельного управления мощностью двигателей, подключаемых к ее выходам.

Инфракрасный модуль

Детектор скорости движущегося автомобиля на Ардуино

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

Также в схему добавлен регулятор напряжения на 5 В, а питание устройства осуществляется от батарейки 9 В.

Датчик расстояния в проектах 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, то мы приравниваем число оборотов колеса в минуту и скорость робота нулю.

Популярные статьи  Металлоискатель Терминатор 3

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();

}

Структура слова

Основное, на что нужно обратить внимание при проектировании систем распознавания звука – сама фонетика языка. В русском, есть гласные и согласные буквы

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

Детектор скорости движущегося автомобиля на Ардуино

Еще одно ограничение, накладываемое платам KY-037 и KY-038 – падение уровня улавливаемого сигнала в зависимости от расстояния до его источника. То есть, нужно предусмотреть сравнение именно разниц поступающих пиков, а не конкретных значений.

Характеристики

Характеристики у обоих устройств KY-037 и KY-038 достаточно скромные, и отличающихся, как было сказано ранее, между собой только размером микрофона.

Детектор скорости движущегося автомобиля на Ардуино

  • питание — 3,5–5В;
  • цифровой выход — есть, однобитный, работающий в режиме индикации наличия звука или тишины;
  • аналоговый — присутствует, с градацией получаемого сигнала в 1024 уровня;
  • вес — в среднем 12..13 грамм;
  • предел чувствительности — до 5 метров;

Принципиальная схема и выводы устройства:

Детектор скорости движущегося автомобиля на Ардуино

Сразу хочется заметить, что названые детекторы, регистрируют только достаточно громкие звуки и не очень чувствительны к их переходным состояниям, к примеру, используемым в словах или фразах. То есть, сделать выключатель или активатор реагирующий на хлопок и свист гораздо проще, чем запрограммировать систему распознавания голосовых команд с применением KY-037 или KY-038. Некоторые идеи по осуществлению требуемой функциональности будут представлены далее.

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

Исходный код программы (скетча)

Arduino

/* Obstacle Avoiding Robot Using Ultrasonic Sensor and Arduino NANO
* Circuit Digest(www.circuitdigest.com)
*/
int trigPin = 9; // trig pin датчика HC-SR04
int echoPin = 10; // Echo pin датчика HC-SR04
int revleft4 = 4; //REVerse motion (движение назад) для левого двигателя
int fwdleft5 = 5; //ForWarD motion (движение вперед) для левого двигателя
int revright6 = 6; //REVerse motion (движение назад) для правого двигателя
int fwdright7 = 7; //ForWarD motion движение вперед) для правого двигателя
long duration, distance;
void setup() {

delay(random(500,2000)); // задержка на случайное время
Serial.begin(9600); //для целей отладки, потом можно закомментировать
pinMode(revleft4, OUTPUT); // set Motor pins as output
pinMode(fwdleft5, OUTPUT);
pinMode(revright6, OUTPUT);
pinMode(fwdright7, OUTPUT);

pinMode(trigPin, OUTPUT); // set trig pin as output
pinMode(echoPin, INPUT); //echo pin в режим ввода данных
}
void loop() {
digitalWrite(trigPin, LOW);
delayMicroseconds(2);
digitalWrite(trigPin, HIGH); // передаем серию импульсов длительностью 10 мкс
delayMicroseconds(10);
duration = pulseIn(echoPin, HIGH); // принимаем отраженные импульсы
distance = duration / 58.2; // рассчитываем расстояние в см
delay(10);
// If you dont get proper movements of your robot then alter the pin numbers (если что то работает не так, попробуйте сменить используемые контакты)
if (distance > 19)
{
digitalWrite(fwdright7, HIGH); // движение вперед
digitalWrite(revright6, LOW);
digitalWrite(fwdleft5, HIGH);
digitalWrite(revleft4, LOW);
}
if (distance < 18)
{
digitalWrite(fwdright7, LOW); //Stop (остановка)
digitalWrite(revright6, LOW);
digitalWrite(fwdleft5, LOW);
digitalWrite(revleft4, LOW);
delay(500);
digitalWrite(fwdright7, LOW); //движение назад
digitalWrite(revright6, HIGH);
digitalWrite(fwdleft5, LOW);
digitalWrite(revleft4, HIGH);
delay(500);
digitalWrite(fwdright7, LOW); //Stop (остановка)
digitalWrite(revright6, LOW);
digitalWrite(fwdleft5, LOW);
digitalWrite(revleft4, LOW);
delay(100);
digitalWrite(fwdright7, HIGH);
digitalWrite(revright6, LOW);
digitalWrite(revleft4, LOW);
digitalWrite(fwdleft5, LOW);
delay(500);
}
}

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62

/* Obstacle Avoiding Robot Using Ultrasonic Sensor and Arduino NANO
*  Circuit Digest(www.circuitdigest.com)
*/

inttrigPin=9;// trig pin датчика HC-SR04

intechoPin=10;// Echo pin датчика HC-SR04

intrevleft4=4;//REVerse motion (движение назад) для левого двигателя

intfwdleft5=5;//ForWarD motion (движение вперед) для левого двигателя

intrevright6=6;//REVerse motion (движение назад) для правого двигателя

intfwdright7=7;//ForWarD motion движение вперед) для правого двигателя

longduration,distance;

voidsetup(){

delay(random(500,2000));// задержка на случайное время

Serial.begin(9600);//для целей отладки, потом можно закомментировать

pinMode(revleft4,OUTPUT);// set Motor pins as output

pinMode(fwdleft5,OUTPUT);

pinMode(revright6,OUTPUT);

pinMode(fwdright7,OUTPUT);

pinMode(trigPin,OUTPUT);// set trig pin as output

pinMode(echoPin,INPUT);//echo pin в режим ввода данных

}

voidloop(){

digitalWrite(trigPin,LOW);

delayMicroseconds(2);

digitalWrite(trigPin,HIGH);// передаем серию импульсов длительностью 10 мкс

delayMicroseconds(10);

duration=pulseIn(echoPin,HIGH);// принимаем отраженные импульсы

distance=duration58.2;// рассчитываем расстояние в см

delay(10);

// If you dont get proper movements of your robot then alter the pin numbers (если что то работает не так, попробуйте сменить используемые контакты)

if(distance>19)

{

digitalWrite(fwdright7,HIGH);// движение вперед

digitalWrite(revright6,LOW);

digitalWrite(fwdleft5,HIGH);

digitalWrite(revleft4,LOW);

}

if(distance<18)

{

digitalWrite(fwdright7,LOW);//Stop (остановка)                

digitalWrite(revright6,LOW);

digitalWrite(fwdleft5,LOW);

digitalWrite(revleft4,LOW);

delay(500);

digitalWrite(fwdright7,LOW);//движение назад        

digitalWrite(revright6,HIGH);

digitalWrite(fwdleft5,LOW);

digitalWrite(revleft4,HIGH);

delay(500);

digitalWrite(fwdright7,LOW);//Stop (остановка)              

digitalWrite(revright6,LOW);

digitalWrite(fwdleft5,LOW);

digitalWrite(revleft4,LOW);

delay(100);

digitalWrite(fwdright7,HIGH);

digitalWrite(revright6,LOW);

digitalWrite(revleft4,LOW);

digitalWrite(fwdleft5,LOW);

delay(500);

}

}

Итог

Главное преимущество контроллера на базе MC33035 — это простота в использовании. Просто покупаете микросхему, собираете Н-мост, спаиваете всё на плату с небольшой обвязкой — и контроллер готов. Если нужно просто запустить двигатель с ШИМ-сигналом и управлять им — оптимальный вариант.

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

Оцените статью