Почти во всех интернет магазинах, специализирующихся на микроконтроллерах, можно найти ультразвуковые датчики расстояния типа HC-SR04 или HY-SRF05. Как их подключить к arduino для банального измерения расстояния до ближайшей точки в зоне видимости примеров в интернете полно, а я расскажу как с помощью такого дальномера и шагового двигателя 28BYJ-48 собрать круговой сонар, схожий с теми, что устанавливаются на морских суднах. Зачем такое делать пока не знаю, тем более что зона видимости модуля всего 5 метров, но для интереса можно и повозиться.
Что нам понадобится:
- Arduino любой модификации с USB;
- Дальномер HC-SR04 или аналогичный;
- Драйвер шагового мотора (подойдет UNL 2003);
- Шаговый двигатель;
- Станина для двигателя (подойдет даже кусок деревянной доски);
- Провода.
Для начала нужно закрепить ультразвуковой датчик на двигателе. Я взял крышку от пластиковой бутылки, сделал два диаметрально-противоположных надреза и отверстие по центру для шкива двигателя. В надрез вставляем дальномер, насаживаем на шкив и закрепляем стяжкой. Примитивно, но держаться будет. Провода подключаем непосредственно к модулю и Ардуино, полный круг наш сонар делать не будет, поэтому тоже сойдет.
Уже готовый подвижный модуль крепим к чему-то тяжелому, чтоб не перемещался по столу во время движения.
Как соединять… Разъем двигателя вставляем в соответствующий разъем драйвера (трудно ошибиться). Питание драйвера и дальномера (GRD и 5+) скручиваем (паяем, соединяем) в кучу и тыкаем в соответствующие выходы Ардуино. Входы драйвера подсоединяем к пинам A0, A1, A2, A3, A4. Я не стал заморачиваться с проводами и воткнул драйвер прямо в Ардуино. Tring дальномера тыкаем во второй пин Ардуины, а echo — в третий пин.
Вот что получилось:
В принципе все собрано, теперь заливаем скетч:
#include <Stepper.h> Stepper myStepper(64, A3, A1, A2, A0); //Входы шагового двигателя int trigPin = 3; //Триггер int echoPin = 2; //Эхо long duration;//Задержка аудиоволвы int ugol=0, vekt=1, poverPr=0, pover=0;//Текущий угол сонара, Направление движения, Состояние работает - не работает void setup() { pinMode(trigPin, OUTPUT); pinMode(echoPin, INPUT); myStepper.setSpeed(128);//задаем скорость мотора Serial.begin(9600);//Открываем серийный порт } void loop() { if (vekt==1&&pover==1){ myStepper.step(16);//Делаем 16 шагов влево ugol=ugol+4;//Меняем значение переменной ugol } if (vekt==0&&pover==1){ myStepper.step(-16);//Делаем 16 шагов вправо ugol=ugol-4;//Меняем значение переменной ugol } if (ugol<=0){ vekt=1;//Если достигаем крайней левой точки - меняем направление движения if(Serial.available()>0){poverPr=Serial.read()-48;} if (poverPr==0||poverPr==1){pover=poverPr;}// если мы прочитали из серийного порта 0 или 1 - пишем это в переменную pover } if (ugol>=128){ vekt=0;//Если достигаем крайней правой точки - меняем направление движения } delay(100); Serial.println(0x01);//Пишем в серийный порт контрольный байт Serial.println(cm());//Пишем расстояние до объекта (выполняется функция ниже) Serial.println(ugol);//Угол, на который сейчас повернута голова } int cm(){ digitalWrite(trigPin, LOW); delayMicroseconds(5); digitalWrite(trigPin, HIGH); delayMicroseconds(10); digitalWrite(trigPin, LOW); // Считываем данные с ультразвукового датчика: значение HIGH, которое // зависит от длительности (в микросекундах) между отправкой // акустической волны и ее обратном приеме на эхолокаторе. pinMode(echoPin, INPUT); duration = pulseIn(echoPin, HIGH); // преобразование времени в расстояние return (duration/2) / 29.1; }
На компьютере открываем программу (просьба сильно не пинать, ибо сделана на коленке) – sonar_na_arduino и вписываем
порт, к которому подключен наш сонар. Жмем кнопку старт и видим, как в окне программы прорисовываются точки удаленные от центра аналогично расстоянию до препятствий на пути звуковых волн сонара:
Перед тем как выдергивать питание, нужно нажимать стоп в окне программы, чтоб «голова» сонара успела вернуться в исходное положение.
Ну, вот и все, удачи в ваших самоделках!
а, построение карты, для движения робота ,на этой основе можно сделать?