Arduino hc hc sr04 или собираем простой дальномер на его основе

Дальномер с помощью датчика HC SR04 и Arduino

3 апреля в 13:33

Ардуино – уникальная система, представляющая собой пластилин в руках инженера, из которого он может слепить, что пожелает. Возможно это благодаря большому разнообразию датчиков и модулей разных направленностей. От простых чипов, измеряющих силу тока, до вещей вроде Arduino hc hc sr04.

Это специальный датчик, позволяющий, при помощи ультразвуковых волн, измерить расстояние до объекта, на который его направили. Несложно догадаться, что проще всего его применить для создания простого дальномера. Рассмотрим Arduino hc sr04 и какие нюансы в работе с ним стоит учитывать, прежде чем начать собирать проект.

1. Основы сборки  дальномера на Ардуино с помощью датчика HC SR04

Если вы собираетесь собрать дальномер на Ардуино, то без HC SR04 просто не обойтись. Ведь именно этот модуль чаще всего применяют в подобных системах из-за его высокой востребованности, по причине простоты работы, доступности и низкой стоимости.

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

Однако сегодня мы рассмотрим именно вариант с дальномером на Аrduino, так как он идеально подойдёт для новичков в сфере, которые ещё не слишком хорошо разбираются в основах.

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

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

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

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

Почему усреднённое?

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

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

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

Соответственно, лучше всего применять прибор к гладким и плоским поверхностям, которые не будут нарушать движения УВ, что также ограничивает его функционал. Но благодаря низкому ценнику и удобству работы датчик всё ещё остается достаточно популярным.

2. Что будет в уроке?

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

Достаточно простой пример, в котором мы проверим точность измерения расстояния дальномером hc-sr04. Основа проверки точности станет простая линейка

Источник: https://ArduinoPlus.ru/arduino-hc-sr04-dalnomer/

Как сделать ультразвуковой дальномер на HC-SR04 и Arduino

Вам понадобится

  • — Arduino Nano;
  • — ультразвуковой дальномер HC-SR04;
  • — ЖК-дисплей;
  • — корпус;
  • — батарея «Крона»;
  • — потенциометр на 10 кОм;
  • — макетная плата;
  • — соединительные провода.

Инструкция

Для начала, необходимо подобрать подходящего размера корпус. Размер зависит от того, какую плату Arduino вы собираетесь использовать (UNO, Mini, Nano, или другую), а также от того, какого размера у вас ЖК-дисплей.

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

используемый ультразвуковой датчик имеет диапазон измерений от 3 до 400 см.

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

Теперь рассмотрим схему нашего прибора. Питание — от батареи «Крона» 9 В. Тумблер S1 — для включения и выключения прибора. Жидкокристаллический индикатор (ЖКИ) подключается по стандартной схеме с потенциометром на 10 кОм для регулировки контрастности. ЖКИ и ультразвуковой датчик питаются от 5 В.

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

Каждые 50 мс будем запрашивать с детектора расстояние с помощью функции getDistance() и выводить на ЖК-дисплей.

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

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

Может понадобиться менять контрастность ЖК дисплея, так что также желательно иметь в доступности регулятор потенциометра.

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

Полезный совет

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

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

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

Источник: https://www.kakprosto.ru/kak-951790-kak-sdelat-ultrazvukovoy-dalnomer-na-hc-sr04-i-arduino

Курс Arduino — Дальномеры

Дальномеры

В этом уроке мы поподробнее познакомимся с дальномерами.

Ультразвуковой дальномер HC-SR04

На сегодняшний день (2016 г) стоит не более 1$ на AliExpress.

Датчик имеет 4 вывода:

  • Vcc – На этот контакт подается питание в 5В.
  • Trig – На этот контакт нужно подать логическую единицу на 10мкс, чтобы дальномер испустил ультразвуковую волну.
  • Echo – После того, как ультразвуковая волна вернется обратно, на этот контакт будет подана логическая единица на время, пропорциональное расстоянию до объекта
  • Gnd – Этот контакт подключается к земле.

Ультразвуковой дальномер – работает по принципу “летучей мыши”. Он посылает ультразвуковую волну и считает время, за которое волна возвратится. Зная скорость звука и время, за которое волна пришла обратно, можно рассчитать расстояние до объекта.

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

Дальномер

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

Код

#define ECHO 13 #define TRIG 12 void setup()
{ pinMode(ECHO, INPUT); // На ECHO нужно подать логическую единицу pinMode(TRIG, OUTPUT); //С TRIG мы будем считывать значение расстояния Serial.begin(9600); //Установим соединение с Serial портом
} void loop() { //Подаем на TRIG HIGH и сразу LOW digitalWrite(TRIG, HIGH); digitalWrite(TRIG, LOW); //Считываем длину пришедшего сигнала в микросекундах int dist = pulseIn(ECHO, HIGH) / 54; // Делим на 54, чтобы перевести показания в см Serial.println(dist); //Выводим показания дальномера в Serial delay(300); //Ждем немного, чтобы глаз успевал различать показания
}

Пояснения

pulseIn(ECHO, HIGH); — С помощью этой функции мы считали время, на которое на пине ECHO устанавливается значение HIGH. Это время считается в микросекундах.

В общем виде pulseIn(); можно записать так:

pulseIn(пин, значение, таймаут);

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

Значение – Уровень ожидаемого сигнала, при котором будет проводиться подсчет. HIGH или LOW.

Таймаут – время в микросекундах, в течение которого ожидается приход сигнала. По истечении таймаута значение, возвращаемое функцией, будет приравнено к нулю.

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

Парктроник

Схема парктроника выглядит так:

Код

#define ECHO 3 // Прием сигнала с дальномера
#define TRIG 2 // Подача сигнала на дальномер
#define COUNT 5 // Кол-во светодиодов
#define BUZZ 6 // Пин для пищалки
#define FIRST 9 // Первый пин светодиодов #define dist_setup 1 //Подстроечный коэффициент
#define frequency 5000 void setup() { for(int i = 0; i < COUNT; ++i) //Обозначаем светодиоды как выход... { pinMode(i+FIRST, OUTPUT); } pinMode(ECHO, INPUT); //...ECHO как вход... pinMode(TRIG, OUTPUT); //...TRIG как выход... pinMode(BUZZ, OUTPUT); //...пищалку как выход Serial.begin(9600); //Установим соединение с Serial } void loop() { digitalWrite(TRIG, HIGH); //Подаем команду на дальномер digitalWrite(TRIG, LOW); int dist = pulseIn(ECHO, HIGH) / 54; //Измеряем расстояние до объекта dist = constrain(dist, 2, 60); //Полученные значения загоняем в диапазон от 2 до 60 //Сравниваем полученные показания и включаем нужный режим if (dist < 10) { all_led_on(); } else if ( dist < 20 * dist_setup) { four_led_on(); } else if (dist < 30 * dist_setup) { three_led_on(); } else if(dist < 40 * dist_setup) { two_led_on(); } else if(dist < 50 * dist_setup) { one_led_on(); } else { for(int i = 0; i < COUNT; ++i) { digitalWrite(i+FIRST, LOW); } noTone(BUZZ); } } // Описание режимов void one_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, LOW); digitalWrite(13, HIGH); tone (BUZZ, frequency, 1000); delay(1000); } void two_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, LOW); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 700); delay(700); } void three_led_on() { digitalWrite(9, LOW); digitalWrite(10, LOW); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 400); delay(400); } void four_led_on() { digitalWrite(9, LOW); digitalWrite(10, HIGH); digitalWrite(11, HIGH); digitalWrite(12, HIGH); digitalWrite(13, HIGH); tone(BUZZ, frequency, 200); delay(200); } void all_led_on() { for(int i = 0; i < COUNT; ++i) { digitalWrite(i+FIRST, HIGH); } tone(BUZZ, frequency, 5000); delay(5000); }

Пояснения

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

 dist_setup  – это коэффициент, с помощью которого можно регулировать расстояние до срабатывания парктроника.

У меня он равен единице. Если вам нужно уменьшить расстояние – нужно уменьшить коэффициент, но тогда он будет в виде 0.xxx. Для этого вводится переменная типа float.

Частоту писка можно также изменять. Для этого нужно изменить значение frequency. Но следует помнить, что пищит пьезоизлучатель ужасно. Крайне. И, мне кажется, что он быстро отобьет у вас желание им пользоваться дальше или дольше 5 минут.

Как вариант – понизить частоту до 20 Гц или подключить обычный динамик на 8 Ом, к примеру.

Пароль

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

Внимание на схему.

Код

//Пины первого дальномера #define TRIG1 12 #define ECHO1 13 //Пины второго дальномера #define TRIG2 10
#define ECHO2 11 //Светодиоды #define FIRST 3
#define COUNT 5 //Кнопка сброса #define RESET 2 //Переменные для пароля int key1;
int key2;
int key3; void setup() { //Обозначение светодиодов как выход for( int i = 0; i < COUNT; i++) { pinMode(i+FIRST, OUTPUT); } //Обозначение пинов на дальномерах pinMode(TRIG1, OUTPUT); pinMode(ECHO1, INPUT); pinMode(TRIG2, OUTPUT); pinMode(ECHO2, INPUT); pinMode(RESET, INPUT_PULLUP); } void loop() { //Подача сигнала на дальномеры digitalWrite(TRIG2, HIGH); digitalWrite(TRIG2, LOW); int dist2 = pulseIn(ECHO2, HIGH,3000) / 54; digitalWrite(TRIG1, HIGH); digitalWrite(TRIG1, LOW); int dist1 = pulseIn(ECHO1, HIGH) / 54; //Дополнительная индикация "ввода" символов if(dist1 < 10 && dist2 < 10) { digitalWrite(5, HIGH); delay(100); } if(dist2 > 20 && dist2 < 25) { digitalWrite(4, HIGH); delay(100); } if(dist1 > 20 && dist1 < 25) { digitalWrite(6, HIGH); delay(100); } //Код пароля + индикация "ввода" символов if(dist2 > 10 && dist2 10 && dist1 < 15) { digitalWrite(7, HIGH); delay(100); key1 = 0; } if(dist1 > 20 && dist1 < 25 && key1 == 1) { key2 = 1; } else if(dist2 > 20 && dist2

Читайте также:  Arduino gps: подключение и использование neo-6m

Источник: http://cxem.net/arduino/arduino196.php

Дальномер на платформе Arduino!

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

Желательно небольших размеров, так как в ней будет находится всего лишь один микроконтроллер.

С помощью ультразвукового датчика HC-SR04 мы сможем определять расстояние.

Четырехразрядный индикатор нам нужен для вывода полученных значений.

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

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

Для этого нам нужен паяльник, флюс, припой, а также макетная плата под пайку.

Ну и конечно же, без Arduino нам не обойтись! (Можно выбрать любой микроконтроллер, я предпочел Arduino Leonardo или же ее эквивалент Iskra Neo)

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

Шаг№1

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

Не беспокойтесь! Страшного в этой путанице проводов ничего нет!У датчика HC-SR04 четыре контакта: плюс, минус (которые мы втыкаем в 5V и GND контроллера), Trig и Echo (вставляем в 12 и 11 пины ардуино соответственно)У четырехразрядного индикатора 3 провода: питание, земля и сигнальный. Последний соединяем с 9 пином Arduino.

Три светодиода подсоединяем к 6, 5 и 4 контактам контроллера последовательно с резисторами. Не забываем про полярность. Ток течет от более длинной ножке к короткой.Все, когда мы собрали наш прибор на макетке, загрузили скетч (будет в конце статьи) и удостоверились, что все работает, смело приступаем к пайке.

Шаг№2

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

Также не забываем про кусачки!

Шаг№3Датчик на месте, осталось припаять три светодиода вместе с резисторами.
С обратной стороны это выглядит вот так:
Шаг№4На боковой части коробки вырежем круглое отверстие для питания.На крышке необходимо вырезать полость под размер (чуть меньше по длине) вашей макетки, а также просверлить отверстия для саморезов.

Теперь если мы прикрутим пустую макетку без элементов на ней (я это сделал просто для демонстрации..) получится примерно следующее:
Шаг№5Так, чтобы было удобнее я предлагаю сначала соединить провода с ардуинкой, а уже потом прикручивать макетку к крышке коробки. Также не забудем про наш индикатор, который я расположил выше макетки.

Все на этом сборка устройства закончена!

Осталось лишь загрузить следующий скетч и наслаждать игрушкой!

#include #include NewPing sonar(12,11, 400); int a,j,b; unsigned long t = 0; int masiv[]={1,0,0,0,1,0,0,0,1}; void setup() { for(int i=4; i<7;i++) { pinMode(i,OUTPUT); } displayClear(9); for(int i=4; i<7;i++) { digitalWrite(i,0); } } void loop() { j=7; for(int i=0; i100) tone(2,70); digitalWrite(j,masiv[i]); while(millis() <= t + b ) { delay(50); a = sonar.ping_cm(); displayInt(9, a); b=a; } t = millis(); if(j==4) j=7; if (i==8) { digitalWrite(4,1); while(millis() <= (t + b)+(b*2) ) { delay(50); a = sonar.ping_cm(); displayInt(9, a); b=a; } digitalWrite(4,0); t = millis(); } }

Пару слов у программном коде. Благодаря ему, наши три светодиода станут мигать поочередно друг за другом, а скорость их мигания будет зависеть от расстояния до объекта, которое вычисляет ультразвуковой датчик. Но чтобы осуществить мигание светодиодов не совсем логично использовать функцию delay(), поскольку при ее применении контроллер замирает и никакие вычисления не производятся. Есть несколько способов для решения этой проблемы. В частности одни из них — использование функции millis(), которая возвращает число в миллисекундах с момента работы контроллера. И как же нам осуществить задержку на условные 100 миллисекунд? Для этого я создал по сути пустой цикл, выход из которого будет только после этих 100 миллисекунд, а затем программа переходит к включению/выключению светодиодов.

Ну на этом все! Спасибо, что прочитали эту статью до конца. Надеюсь вам она не только понравилась, но и вдохновила на море новых поделок и изобретений!

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

Источник: https://USamodelkina.ru/8766-dalnomer-na-platforme-arduino.html

HC-SR04 и Arduino – схема подключения

Измерение расстояний в 21 веке при помощи линейки и карандаша считается устаревшим способом. Сейчас наиболее современными методами являются измерения при помощи инфракрасных лучей и ультразвука. При помощи Arduino можно собрать мини-устройство для выполнения этой задачи.

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

Для реализации проекта из этой статьи нам потребуются следующие компоненты:

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

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

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

Модуль HC-SR04 имеют довольно низкую стоимость среди своих аналогов в среде применения. Он способен измерять расстояние в диапазоне с 2 до 450 см. Работает от напряжения в 5 вольт, угол обзора до 15 градусов.

Подключается ультразвуковой датчик к Arduino при помощи четырех выводов: два вывода питания (выводы 5 вольт и gnd – заземление) и два вывода входного TRIG (T) и ECHO (R) выходного сигналов.

Схема подключения изображена на картинке справа:

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

Модуль имеет два так называемых ”глазка” (T и R, которые взаимно связаны с выводами Trig и Echo). Сначала на вывод Trig подается импульс, который преобразуется в 8 импульсов частотой в 40 кГц и посылается к изучаемому объекту через ”глаз” T. Затем сигнал отражается от предмета и принимается ”глазом” R и подается на вывод Echo.

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

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

Код для вывода данных с дальномера HC-SR04

#define Trig   8 /* Обозначаем пин подачи импульса*/#define Echo 9 /* Обозначаем пин приема импульса*/pinMode (Trig, OUTPUT); /*инициируем как выход */pinMode (Echo, INPUT);   /*инициируем как вход */Serial.begin (9600);           /* устанавливаем скорость порта */unsigned int impulseTime=0;unsigned int distance_sm=0;digitalWrite (Trig, HIGH);                       /* Подаем импульс на вход trig дальномера */delayMicroseconds (10);                       /* Импульс длится 10 микросекунд */digitalWrite (Trig, LOW);                        // Отключаем подачу импульсаimpulseTime=pulseIn (Echo, HIGH);    /* Принимаем импульс и подсчитываем его длину*/distance_sm =impulseTime/58;           /* Пересчитываем его значение в сантиметры */Serial.println( distance_sm);                 /* Выводим значение на порт программы */

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

Ответы на часто задаваемые вопросы начинающих:

Почему в монитор порта выводятся какие-то странные символы вместо цифр?

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

– 9600 бод (или бит в секунду). В мониторе порта его можно изменить в правом нижнем углу.

Почему в цикле делят длину на 58? Откуда взялось это число?

Как известно, скорость звука составляет 34 см/мс или 0.034 м/мкс, а расстояние равно произведению времени на скорость. Значит

или

s = время * 1/29 измеряемых расстояния (если преобразуем в обыкновенную дробь).

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

На этом наша статья подошла к концу. Надеюсь, она была для вас интересной. Всем удачной компиляции и ждите новых уроков и статей!

Источник: https://Voltiq.ru/hc-sr04-and-arduino/

Ультразвуковой дальномер HC-SR04

Ультразвуковой дальномер

HC-SR04. Подключаем к Arduino.

        В этой статье мы научимся работать с ультразвуковым дальномером HC-SR04. Как работает ультразвуковой дальномер? Устройство испускает ультразвук, который отражается от препятствий и в виде отражённой волны возвращается обратно.

Измерив возвращения звука и зная скорость распространения звука, можно очень просто посчитать пройденное им расстояние. Модель дальномера HC-SR04 является самой простой и недорогой, однако обладает хорошими техническими характеристиками (измеряемый диапазон расстояний от 2 до 450 см).

Именно поэтому данный модуль можно смело рекомендовать радиолюбителям.

        Описание принципа работы ультразвукового дальномера HCSR04 можно разделить на следующие шаги:

                Шаг 1: На вход Trig подаётся импульс длительностью 10 микроСекунд. Для дальномера это команда начать измерение расстояния перед ним.

                Шаг 2: Устройство генерирует 8 ультразвуковых импульсов с частотой 40 кГц через выходной сенсорT.

                Шаг 3: Звуковая волна отражается от препятствия и попадает на принимающий сенсор R.

                Шаг 4: На выходе Echo формируется импульс, длительность которого прямо пропорциональна измеренному расстоянию.

                Шаг 5: На стороне управляющего контроллера переводим длительность импульса Echo в расстояние по формуле: ширина импульса(мкс) / 58 = дистанция (см).

        Ниже на рисунке приведены временные диаграммы, наглядно поясняющие перечисленные шаги.

        Теперь, когда мы разобрались с устройством ультразвукового дальномера HC-SR04, подключим его к нашему Arduino по следующей схеме:

        Собрав схему, нам остаётся только залить скетч для работы. Ниже приведён пример такого скетча. В нём информация о расстоянии будет выводиться в COM порт компьютера, а также при измеренной дистанции менее 30 см загорится светодиод, подключенный к 13 пину Arduino.

Пример программного кода:

#define Trig 9 #define Echo 8 #define ledPin 13 void setup() { pinMode(Trig, OUTPUT); //инициируем как выход pinMode(Echo, INPUT); //инициируем как вход pinMode(ledPin, OUTPUT); Serial.begin(9600); /* задаем скорость общения. В нашем случае с компьютером */ } unsigned int impulseTime=0; unsigned int distance_sm=0; void loop() { digitalWrite(Trig, HIGH); /* Подаем импульс на вход trig дальномера */ delayMicroseconds(10); // равный 10 микросекундам digitalWrite(Trig, LOW); // Отключаем impulseTime=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=impulseTime/58; // Пересчитываем в сантиметры Serial.println(distance_sm); // Выводим на порт if (distance_sm

Читайте также:  Рождественская ёлка радиолюбителя и электронщика

Источник: http://robstore.ru/podklyuchenie_dalnomera_hc-sr04.html

Подключаем к arduino четыре сонара HC-SR04

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

В данной статье подробно опишу как подключить несколько таких датчиков с помощью Arduino UNO и получить результат на компьютере с помощью языка python для дальнейшей обработки на более высоком уровне.

Объединение нескольких датчиков расстояния может понадобится для случая, когда необходимо отслеживать наличие препятствий одновременно в разных областях. Согласно спецификации эффективный угол составляет +-15 градусов.

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

Итак, на первом этапе необходимо собрать схему. У меня получилось так, где красный провод — 5 вольт, черный — земля:

Arduino UNO и четыре ультразвуковых датчика

На втором этапе напишем код для Arduino. Нам понадобится библиотека для ультразвукового датчика. Подключается библиотека через меню Sketch->Import library…->Add library. Взять библиотеку для HC-SR04 можно здесь. Не забываем указать тип платы и верный порт — в нашем случае «COM3″

#include «Ultrasonic.h» Ultrasonic us_4(8, 9); // Trig — first, Echo — second Ultrasonic us_3(6, 7); Ultrasonic us_2(4, 5); Ultrasonic us_1(2, 3); void setup() { Serial.begin(9600); // start the serial port } void loop() { float d_1 = us_1.Ranging(CM); // get distance float d_2 = us_2.Ranging(CM); // get distance float d_3 = us_3.Ranging(CM); // get distance float d_4 = us_4.Ranging(CM); // get distance Serial.print(d_1); Serial.print(«cm, «); Serial.print(d_2); Serial.print(«cm, «); Serial.print(d_3); Serial.print(«cm, «); Serial.print(d_4); Serial.println(«cm.»); // print the distance delay(500); // arbitrary wait time. }

Уже на данном этапе можно открыть просмотр «сериал порта» в Arduino среде и посмотреть какие расстояния показывают наши датчики. Однако теперь мы попробуем использовать данные с сонаров для дальнейшей обработки на python. Для этого напишем следующий код:

import serial ser = serial.Serial('COM3') print ( «connected to: » + ser.portstr ) while True: print ser.readline() ser.close()

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

Источник: http://zabaykin.ru/?p=57

Ультразвуковой дальномер HC-SR04 подключение к Arduino — PDF

ВВЕДЕНИЕ В ПРОГРАММИРОВАНИЕ ЭЛЕКТРОННЫХ УСТРОЙСТВ НА БАЗЕ ПЛАТФОРМЫ ARDUINO Содержание Аппаратные средства…………………………….. 2 Структура программы……………………………. 5 Мигающий

Подробнее

Уроки Arduino. Делаем датчик расстояния с бипером и светодиодной индикацией Это простой урок, как сделать датчик расстояния, используя Arduino, ультразвуковой дальномер HC-SPO4, бипер и несколько светодиодов.

Подробнее

ЛЕКЦИИ МЕЖДУНАРОДНОЙ ШКОЛЫ «KAZCAS-16» Э.В. Чеботарева Введение в конструирование и программирование электронных устройств на базе платформы Arduino Казань, Казанский федеральный университет, 5 7 ноября

Подробнее

Подключаем 4 светодиода Для этого эксперимента соберем схему с 4-мя светодиодами. Резисторы R1-R4-360 Ом ПРИМЕР 1. Создадим линейку поочередно мигающих светодиодов. «Заставим» моргать светодиоды в бесконечном

Подробнее

Научно-исследовательская работа ИНФОРМАТИКА Прибор, которым управляет «программа». Как работает спидометр для велосипеда? Выполнил: Шелепнев Артем Дмитриевич учащийся 4Б класса МБОУ «Лицей» г.арзамаса

Подробнее

Тема 5. Управление двигателями Урок 5.1. Двигатель постоянного тока 5.1.1. Устройство двигателя Перед тем, как раскрыть устройство двигателя, вкратце опишем еще одно робототехническое понятие актуатор.

Подробнее

Iskra Mini Iskra Mini это миниатюрная платформа на базе микроконтроллера ATmega328 для разработки и программирования электронных устройств, где важен каждый миллиметр свободного пространства. Платформа

Подробнее

Секция 3. Компьютерная инженерия 187 УДК 004.9 С.Е. Колесник, С.А. Цололо Донецкий национальный технический университет, г. Донецк кафедра компьютерной инженерии СОЗДАНИЕ РЕФЛЕКСНОГО РОБОТА НА БАЗЕ И ARDUINO

Подробнее

Цифровые выходы 107 Аналогично входы могут быть цифровыми (например, определяющими факт нажатия кнопки) или аналоговыми (например, подключенные к фотоэлементу). В книге, по существу описывающей приемы

Подробнее

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

Подробнее

Эксперименты с программированием. 1.Введение и подготовка к работе. Arduino — это контроллер (управляющий модуль). На плате контроллера размещены процессор, микросхема конвертора USB и выводы для подключения

Подробнее

Руководство по работе с датчиками на конструкторах СКАРТ серии «УМНЫЙ ДОМ» Г. Москва 2016 Robotolab.ru Проектная деятельность на базе УМС СКАРТ «УМНЫЙ ДОМ» и СКАРТ «ПОДВОДНАЯ ЛОДКА» организуется на основе

Подробнее

Набор СкАРТ УМНЫЙ ДОМ Представляем Вашему вниманию второй продукт серии Скарт- ЛАБ «Умный дом» Набор СкАРТ ЛАБ УМНЫЙ ДОМ предназначен для тех, кто уже прошел первый этап ознакомления с аппаратными и програмными

Подробнее

Кафедра «Автопласт» при ФГБОУ ВПО «Госуниверситет-УНПК» Научно-образовательная лаборатория «Управление в технических системах» Информационное табло на основе LED матриц Подготовили студенты: группы 21-АП

Подробнее

РАЗРАБОТКА РОБОТА НА ОСНОВЕ УЛЬТРАЗВУКОВОГО ДАЛЬНОМЕРА. Ташев А.А., гр. 31-АП Рук. Фёдоров Т.В., к.т.н., доц. «АВТОПЛАСТ» ФГБОУ ВПО «Госуниверситет УНПК» В данной статье описывается управление приводами

Подробнее

Робот-манипулятор механическая рука Робот-манипулятор MeArm карманная версия промышленного манипулятора. MeArm — простой в сборке и управлении робот, механическая рука. Манипулятор имеет четыре степени

Подробнее

Датчик тока (Troyka-модуль) Используйте датчик тока (Troyka-модуль) для контроля потребления тока, фиксируйте блокировку моторов или аварийное обесточивание системы. Работа с высоким напряжением опасна

Подробнее

Умный дом 9-11 1. Задача 1 Определите один правильный ответ Что понимается под термином «интернет всего»? 1 рост объёмов информации в интернете; 2 появление универсального провайдера, обеспечивающего связью

Подробнее

УМНЫЙ ДОМ Представляем Вашему вниманию первый продукт серии Скарт- ЛАБ «Умный дом» Набор СкАРТ ЛАБ УМНЫЙ ДОМ «ПОДЛОДКА» предназначен для тех, кто уже прошел первый этап ознакомления с аппаратными и програмными

Подробнее

ШИМ. Регулировка скорости движения. Метод широтно импульсной модуляции (ШИМ, англ. pulse-width modulation (PWM)) широко применяется для управления мощностью, подводимой к нагрузке, путём изменения скважности

Подробнее

Тема 2. Работа с цифровыми сигналами Урок 2.1. Выводы общего назначения (GPIO) 2.1.1. Схема выводов Arduino Uno (редакция 3) Отрицательный вывод питания (земля, ground) Положительный вывод питания (+3.3В

Подробнее

Версия 1.03 от 26.12.2017 UNO STARTER KIT ИНСТРУКЦИЯ НА РУССКОМ Содержание 1. Состав набора 2. Основная плата arduino uno 3. Среда программирования Arduino IDE 4. Первая программа: мигание светодиодом

Подробнее

Система домашнего мониторинга безопасности на базе Arduino Шаг 1: Список требуемого Arduino умение написания эскизов, используя соответствующее IDE и т.п. Некоторые основные навыки пайки Конкретно, для

Подробнее

13 Цифровая обработка сигналов Плата Arduino способна выполнять простую обработку сигналов. В этой главе обсуждаются разные способы такой обработки, от фильтрации сигнала, поступающего на аналоговый вход,

Подробнее

Тема 4. Работа с аналоговыми сигналами Урок 4.1. Потенциометр 4.1.1. Аналоговый сигнал и АЦП Не секрет, что все величины в физическом мире носят аналоговый характер. Для измерения этих величин, люди придумали

Подробнее

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

Подробнее

Тема 2. Работа с цифровыми сигналами Урок 2.1. Выводы общего назначения (GPIO) У контроллера Arduino Uno есть множество выводов, обозначенных цифрами от 0 до 13 и от A0 до A5. Каждым из этих выводом мы

Подробнее

Источник: https://docplayer.ru/42937111-Ultrazvukovoy-dalnomer-hc-sr04-podklyuchenie-k-arduino.html

Простой робот с ультразвуковым дальномером

Данная тема посвящается созданию простенького робота на основе Arduino nano. Предполагается, что читатель является новичком и обладаешь лишь начальными знаниями данного вопроса. Я постарался изложить все как-можно более подробно и понятно.

Введение в задачу

Начнем с концепции: мы хотим робота, который может самостоятельно передвигаться по комнате, при этом объезжать все препятствия, встречаемые на своем пути.
Задачу поставили. Теперь бегом по магазинам! 1) Платформа.

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

Вид танка, ну или трактора мне почему-то пришелся более по душе, и в итоге я остановился на таком варианте (платформа от DF robot):

В комплекте — платформа (по одному мотору на каждой гусенице) и отсек для батареек.
Ну, тут ничего сложного, поехали дальше.

Дальномер

Сонар (он же дальномер, он же Ultrasonic module) В качестве дальномера изначально выбор был между ультразвуковым и инфракрасным. Поскольку характеристики ультразвукового существенно лучше (максимальная дальность около 4-5 метров, против 30-60 см), а цена примерно одинаковая, то выбор пал на Ultrasonic. Наиболее распространена модель HC-SR04.

Что бы понять, как устроен этот фрукт — есть даташит + достаточно информации в интернете.
Расскажу основное. На фотографии видны 2 цилиндра. Один из них приемник, другой передатчик. Приемник генерирует ультразвуковые волны, передатчик принимает отраженную волну от объекта, и сообщаем нам об этом. На его плате 4 контакта ( 5V, GND, Trig, Echo).
Алгоритм работы таков:

Подаем на ножку Trig сигнал, длительностью 10мкс, что запускает генератор, создающий пачку коротких импульсов на передатчике ( 8 шт ). Далее, приемник получает отраженный сигнал и на ножке Echo генерируется прямоугольный сигнал, длина которого пропорциональна времени между излучением импульсов и детектированием их приемником.

Реальное время, за которое звук дойдет до приемника, конечно же, составит копейки. Что бы по нему определить расстояние, можно воспользоваться нехитрой формулой:

s=vt/2, s — расстояние, v — скорость звука, t — время получения сигнала на приемнике.

Ну почему пополам делим, думаю всем понятно. Только в данном случае эта формула не нужна. Привожу ее здесь исключительно для понимания физики процесса.
С выхода Echo идет уже сформированный сигнал, с достаточно большой длительностью. Заглянув в даташит, мы увидим формулу пересчета: s = t/58, s — расстояние, t — длительность импульса Echo, s — расстояние в сантиметрах.

Ок, вроде все основы разобрали. Перейдем к коду под Arduino:

const int Trig = 3; // обозначим к какой ножке и что подключаем const int Echo = 2; void setup() { pinMode(Trig, OUTPUT); pinMode(Echo, INPUT); Serial.begin(9600); // Инициализируем сериал порт, дабы вывести результат на монитор

}

unsigned int time_us=0; // Переменная для хранения временного интервала
unsigned int distance_sm=0; // Переменная для хранения расстояния в сантиметрах

void loop() { digitalWrite(Trig, HIGH); // Подаем сигнал на выход микроконтроллера delayMicroseconds(10); // Удерживаем 10 микросекунд digitalWrite(Trig, LOW); // Затем убираем time_us=pulseIn(Echo, HIGH); // Замеряем длину импульса distance_sm=time_us/58; // Пересчитываем в сантиметры Serial.print(distance_sm); // Выводим на порт Serial.print(» «); delay(500);

}

Драйвер

Ну что же, с сонаром вроде разобрались. Продолжим.
Платформа содержит 2 мотора. Ими надо как-то управлять. Казалось бы — подключил их напрямую, подавай то HIGH то LOW и радуйся. Тут одно существенное «НО» — с атмеги не получишь ток выше ~40мА, а мотору надо где-то на порядок больше.

Как быть? Первое что приходит в голову это — поставить на выход микроконтроллера транзистор и с него уже питать моторы.

Это конечно хорошо, но не прокатит, если мы захотим мотор в другую сторону пустить… Зато с этой задачей хорошо справится H — мост, который представляем собой немного более сложную схему, чем пара транзисторов.

Но в данном случае их полно в виде готовых интегральных схем, так что думаю велосипед изобретать незачем — купим готовый. К тому же цена располагает — 2-3 доллара…

Немного почитать об этих приборах можно, например, здесь.

Двинемся дальше. Для этих целей я себе купил микросхему L293D, собственно о которой речь дальше и пойдет. Она проста в использовании, повсеместно доступна и имеет удобный корпус Dip16.

Читайте также:  Arduino mega 2560: процессор, распиновка, проекты

Её максимальный ток сравнительно небольшой ( 600 мА ), что для конкретной задачи более чем достаточно. Если нужно больше, то есть, например, L293B (1А) и т.

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

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

Все просто и наглядно. Внимательно изучив первую часть статьи, остановим взор на рисунке:

— схема включения данной микросхемы, собственно, взятая из даташита.

Кратко пробежимся по её ножкам:

1) Инициализация мотора1. Пока вы не подадите на эту ножку HIGH, что бы вы не делали с остальными, моторчик не заработает. Хоть и написано 1,2E — мотор там один. Не путайте. Дело в том, что для управления одним мотором вам понадобится 2 ножки микроконтроллера, а соответственно и H — моста. Подадим на одну ножку HIGH, другую LOW — мотор закрутился в одну сторону.

Подадим на первую LOW, вторую HIGH — закрутится в противоположную. подадим на обе LOW — остановится.
2) 1A. На эту ножку вы будите посылать сигнал с микроконтроллера( слаботочный ) для управления 1 входом мотора.
3) 1Y. А это уже сигнал( большой ток ), который идет непосредственно на мотор.

По своему виду он полностью повторяет сигнал, подаваемый на вход 1A.
4) — 5) Земля
6) 2A Сигнал с микроконтроллера для управления втором входом мотора.
7) 2Y Сюда подключаем вторую ножку мотора.
8) Сюда мы подаем напряжение, которым будут питаться моторы.

По-сути, что подадим на этот вход, то и будет отпираться на ножках 1Y, 2Y.
9) — 16) Полная аналогия с первыми восемью, но для второго мотора.

Далее, схема включения:

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

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

const int motor1Pin = 3; // H-bridge leg 1 (pin 2, 1A) const int motor2Pin = 4; // H-bridge leg 2 (pin 7, 2A) const int enablePin = 9; // H-bridge enable pin void setup() { // set all the other pins you're using as outputs: pinMode(motor1Pin, OUTPUT); pinMode(motor2Pin, OUTPUT); pinMode(enablePin, OUTPUT); // set enablePin high so that motor can turn on: digitalWrite(enablePin, HIGH);

}

void loop() { // Вращаем мотор в одну сторону digitalWrite(motor1Pin, LOW); // set leg 1 of the H-bridge low digitalWrite(motor2Pin, HIGH); // set leg 2 of the H-bridge high delay(1000); // А через секунду в другую digitalWrite(motor1Pin, HIGH); // set leg 1 of the H-bridge high digitalWrite(motor2Pin, LOW); // set leg 2 of the H-bridge low delay(1000); // А теперь всё сначала

}

Сервомашинка

Итак, с работой дальномера мы разобрались. Двинемся дальше. Дальномер у нас один, смотреть надо как вперед, так и по сторонам, что бы знать куда поворачивать в случае чего. Для этих целей воспользуемся серво (сервомашинка, сервопривод, servo).

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

Черный — GND Красный — 5V

Белый — Сигнал

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

Для этих целей с мотора заведена обратная связь на контроллер, которая представляет собой переменный резистор, меняющий своё сопротивление в зависимости от угла поворота. Сам контроллер управляется длиной входного импульса.

Как правило: 380 — 400 мкс — 0 градусов, 2200мкс — 180 градусов. Приведем простой алгоритм управления серво для Arduino:

#define ServoPin 2 // На эту ножку мы подключим наше серво (его белый провод) void setup() { pinMode(2,OUTPUT);

}

void Servo_motion(int angle) // функция управления серво { int time=390+10*angle; // Пересчитываем заданный угол поворота в длину импульса, который подадим на //серво digitalWrite(ServoPin, HIGH); // Сигнал пошел delayMicroseconds(time); // Удерживаем его заданное время digitalWrite(ServoPin, LOW); // Выключаем его delayMicroseconds(20000-time); // Даем серво время, что бы повернуться (20000 мкс — 50 гц)

}

void loop()
{

for(int i=0;i=0; i—) { Servo_motion(i); // Затем в другую сторону delay(10);

}

}

Но в дальнейшем, мы будем использовать специальную библиотеку для управления серво, вот её описание:

www.arduino.cc/en/Reference/Servo

arduino.cc/en/Tutorial/Sweep

Данный пример (2 ссылка) проделывает ровным счётом тоже самое что и программа, описанная выше. Там приведено красочное описание кода с рисунками, картинками, комментариями, так что думаю — особых затруднений не возникнет. Ограничусь лишь небольшими комментариями — при проверки данного кода не забудьте переставить серво на на цифровой порт 9, либо поправить в том коде вот эту строчку:

myservo.attach(9); // attaches the servo on pin 9 to the servo object

А то ничего не заработает. И последнее что хотелось бы добавить — данный пример доступен как по вышеуказанной ссылке, так и в среде разработки Arduino во вкладке «Examples».

Сборка

Перейдем к сборке нашего творения. Поскольку плату я не делал, то и принципиальной схемы, у меня нету, к сожалению. Но я думаю, это не сильно нам помешает — схема простая, все понятно.

Фотографий и небольших комментариев вполне хватит. На данном этапе возникает Arduino nano, как вы уже могли догадаться, поскольку весь предыдущий код был сделан с расчетом на него.

Описывать сей прибор занятие довольно трудоемкое и утомительное, поэтому для тех, кто не знает — ссылки:

arduino.cc/en/Guide/HomePage
freeduino.ru/arduino/index.html
arduino.ru/

Я все же, как и ранее, буду предполагать, что вы имеете хоть небольшой, но все же опыт знакомства с этой штуковиной, ну или хотя бы просто представляете что это это такое. В данном случае этого вполне достаточно. Так, поднабравшись не много знаний, поедим дальше.
Начнем с соединений. Перечислю, к какому входу и что у меня подключено:

4 ножки — входы H моста, по 2 на каждый мотор:
1A — 11 2A — 6 3A — 10

4A — 5

enablePin — 12

1 Ножка под 1,2EN и 3,4EN — посадил их вместе, так как оба мотора все равно по отдельности нам не нужны. В принципе вообще, можно эти 2 ножки моста к Arduino не подключать, а просто подать на них 5V.

2 ножки для сонара:
Trig — 3
Echo — 2

Ножка для подключения серво:
Servo — 8

На этом вроде бы и всё. Далее, в процессе сборки робота, я столкнулся с одной проблемой — периодически робот останавливался, Arduino перезагружалось. Немного подумав, я понял что Arduino nano неспособен питать всю эту систему ( H-мост, серво, сонар) от своего штатного стабилизатора.

Потому на помощь мне пришел стабилизатор напряжения 7805 (L7805, LM7805). Прибор прост в применении, имеет 3 ножки: вход( 6 — 35 В ), земля, выход( ~5В). Даташит к нему можно повсеместно найти в интернете. Объединив его землю, с землёй Arduino и, соответственно с минусом аккумулятора тоже.

Я сделал так — от Arduino я питаю только H — мост, а всё остальное ( серво, сонар ) от стабилизатора. После этого робот стал отлично работать без сбоев.

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

Вся схема:

Стабилизатор напряжения (конденсаторы можно не ставить):

Шлейф от сонара:

H – мост:

Немного о самой конструкции: обошлось без излишеств). Вырезал из пластика крышку на платформу, в ней было проделано отверстие для крепления серво. Из того же пластика выгнута ( предварительно нагрев промышленным феном) Г — образная скобка. К ней приклеен четырехжильный шлейф (под PLS вилку, с шагом 2.54мм), в который уже и вставляется сам сонар.

Программирование

Итак, робот собран. Переходим к заключительному этапу — прошивка. Здесь я опишу мой вариант реализации данного алгоритма. Заранее отмечу, что все можно было существенно упростить, например, вращать сонар не постоянно, а остановиться, когда на пути встречается преграда, «осмотреться» и повернуть в наилучшее направление. Либо вообще не вращать головой.

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

Так что все ваши замечания и предложения приветствуются. Но тем не менее данная версия отлично зарекомендовала себя в полевых условиях. Ну что же, приступим.

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

Объявление переменных:

Переменная, для реализации алгоритма работы сонара — unsigned int time_us=0; Расстояние, определяемое сонаром — unsigned int distance_sm=0; Данная переменная используется в цикле loop для того, что бы при включении робот «осмотрелся» на месте, а потом уже поехал — unsigned int circle=0; Расстояние до ближайшего объекта спереди — unsigned int dist_f=0; Расстояние до ближайшего объекта слева — unsigned int dist_l=0; Расстояние до ближайшего объекта справа — unsigned int dist_r=0; Расстояние до ближайшего объекта под углом 45 градусов — unsigned int dist_45=0;

Расстояние до ближайшего объекта под углом 135 градусов — unsigned int dist_135=0;

Константа времени(мс), определяющая минимальный шаг движения робота. Подобрана экспериментально. В зависимости от скорости движения и скорости вращения серво вашего робота, возможно придется её изменить. Позже станет более понятно для чего она нужна —
unsigned int t=15;

Функции:

sonar() — реализует алгоритм работы сонара, возвращает расстояние [см]. forward (), back (), right (), left () — наши базовые функции движения.

Основная функция, реализующая движение —

void motion (char dimention, int prev_angle, int next_angle, int time) { /*Данная функция одновременно управляет как и вращением моторов, так и серво. char dimention — направление движения int prev_angle — предыдущее положение серво int next_angle — положение, на которое хотим установить серво

int time — временной шаг одного движения робота*/

// Величина, на которую изменяется угол в процессе движения — int a; if(next_angle>=prev_angle) a=15; else a=-15; if (dimention=='f') { // Если сказано двигаться вперед, то int i=prev_angle; while( i!=next_angle) { /*Пока не достигли заданного значения угла, будем в цикле постепенно изменять текущее положение серво на величину a*/ i+=a; myservo.write(i); // И передавать это значение на серво forward(); // После чего делаем движение вперед delay(time); // В течении временного интервала time }

}

/* Аналогичный алгоритм для движения влево, вправо, назад и стоянии на месте*/

…..

}

void front_motion( int time ) { /* Функция, которая осуществляет небольшой «доворот» робота в одну из сторон, если объект расположен под углами 45 и 135 градусов*/ if(dist_45=25) { // Если до ближайшего объекта спереди более 25 сантиметров a: //Двигаемся вперед, при этом осуществляем поворот серво от 180 до 135 градусов motion('f',180,135,t); //Сделаем замер расстояния до объектов под углом 135 градусов dist_135=sonar(); //Если необходимо, сделаем доворот front_motion(t); //Далее аналогично, но с другими значениями motion('f',135,90,t); dist_f=sonar(); front_motion(t); motion('f',90,45,t); dist_45=sonar(); front_motion(t); motion('f',45,0,t); dist_r=sonar(); front_motion(t); motion('f',0,45,t); dist_45=sonar(); front_motion(t); motion('f',45,90,t); dist_f=sonar(); front_motion(t); motion('f',90,135,t); dist_135=sonar(); front_motion(t); motion('f',135,180,t); dist_l=sonar(); front_motion(t); // Если расстояние спереди все еще больше 25 сантиметров, то вернемся в точку 'a' if (dist_f>=25) goto a; } else { //Если нет if(dist_f=dist_r || dist_135>dist_r) { motion('l',180,90,t); dist_f=sonar(); } if(dist_l

Источник: http://www.pvsm.ru/diy/5491

Ссылка на основную публикацию