Эхолокатор на двух датчиках и arduino

Содержание

Исходный код программы

В коде программы автоматического индикатора уровня воды нам первым делом необходимо инициализировать все контакты Arduino, которые мы будем использовать для подключения внешних устройств: реле, ЖК дисплей, буззер (звонок) и т.д.

Затем мы инициализируем все устройства, задействованные в проекте.

После этого инициализируем модуль ультразвукового датчика и считаем время между передачей и приемом ультразвуковой волны с помощью функции pulseIn(pin). Затем произведем вычисления и покажем результат на экране ЖК дисплея.

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

Далее представлен полный текст программы.

Arduino

#include <LiquidCrystal.h>

#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12

LiquidCrystal lcd(7,6,5,4,3,2);

float time=0,distance=0;
int temp=0;
void setup()
{
lcd.begin(16,2);
pinMode(trigger,OUTPUT);
pinMode(echo,INPUT);
pinMode(motor, OUTPUT);
pinMode(buzzer, OUTPUT);
lcd.print(» Water Level «);
lcd.setCursor(0,1);
lcd.print(» Indicator «);
delay(2000);
}

void loop()
{
lcd.clear();
digitalWrite(trigger,LOW);
delayMicroseconds(2);
digitalWrite(trigger,HIGH);
delayMicroseconds(10);
digitalWrite(trigger,LOW);
delayMicroseconds(2);
time=pulseIn(echo,HIGH);
distance=time*340/20000;
lcd.clear();
lcd.print(«Water Space In «);
lcd.setCursor(0,1);
lcd.print(«Tank is: «);
lcd.print(distance);
lcd.print(«Cm»);
delay(2000);
if(distance<12 && temp==0)
{
digitalWrite(motor, LOW);
digitalWrite(buzzer, HIGH);
lcd.clear();
lcd.print(«Water Tank Full «);
lcd.setCursor(0,1);
lcd.print(«Motor Turned OFF»);
delay(2000);
digitalWrite(buzzer, LOW);
delay(3000);
temp=1;
}

else if(distance<12 && temp==1)
{
digitalWrite(motor, LOW);
lcd.clear();
lcd.print(«Water Tank Full «);
lcd.setCursor(0,1);
lcd.print(«Motor Turned OFF»);
delay(5000);
}

else if(distance>30)
{
digitalWrite(motor, HIGH);
lcd.clear();
lcd.print(«LOW Water Level»);
lcd.setCursor(0,1);
lcd.print(«Motor Turned ON»);
delay(5000);
temp=0;
}
}

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
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77

#include <LiquidCrystal.h>

#define trigger 10
#define echo 11
#define motor 8
#define buzzer 12

LiquidCrystallcd(7,6,5,4,3,2);

floattime=,distance=;

inttemp=;

voidsetup()

{

lcd.begin(16,2);

pinMode(trigger,OUTPUT);

pinMode(echo,INPUT);

pinMode(motor,OUTPUT);

pinMode(buzzer,OUTPUT);

lcd.print(»  Water Level «);

lcd.setCursor(,1);

lcd.print(»   Indicator  «);

delay(2000);

}

voidloop()

{

lcd.clear();

digitalWrite(trigger,LOW);

delayMicroseconds(2);

digitalWrite(trigger,HIGH);

delayMicroseconds(10);

digitalWrite(trigger,LOW);

delayMicroseconds(2);

time=pulseIn(echo,HIGH);

distance=time*34020000;

lcd.clear();

lcd.print(«Water Space In  «);

lcd.setCursor(,1);

lcd.print(«Tank is: «);

lcd.print(distance);

lcd.print(«Cm»);

delay(2000);

if(distance<12&&temp==)

{

digitalWrite(motor,LOW);

digitalWrite(buzzer,HIGH);

lcd.clear();

lcd.print(«Water Tank Full «);

lcd.setCursor(,1);

lcd.print(«Motor Turned OFF»);

delay(2000);

digitalWrite(buzzer,LOW);

delay(3000);

temp=1;

}

elseif(distance<12&&temp==1)

{

digitalWrite(motor,LOW);

lcd.clear();

lcd.print(«Water Tank Full «);

lcd.setCursor(,1);

lcd.print(«Motor Turned OFF»);

delay(5000);

}

elseif(distance>30)

{

digitalWrite(motor,HIGH);

lcd.clear();

lcd.print(«LOW Water Level»);

lcd.setCursor(,1);

lcd.print(«Motor Turned ON»);

delay(5000);

temp=;

}

}

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

Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:

HC-SR04 GND VCC Trig Echo
Arduino Uno GND +5V 3 2

Принципиальная схема устройства Ардуино: ультразвуковой дальномер HC-SR04 : 6 комментариев

«Датчик HC-SR04 имеет четыре вывода. Кроме земли (Gnd) и питания (Vcc) еще есть Trig и Echo. Оба этих вывода цифровые, так что подключаем из к любым выводам Ардуино Уно:

OLED дисплей 128×64 GND VCC Trig Echo Arduino Uno GND +5V 3 2»

-Что-то здесь не так…..не так-ли?

В точку! Исправлено:)

Просто и понятно все объяснено. Автору большое спасибо.

Автор у Вас опечатка в статье.

Переводим скорость звука из м/с в см/мкс:

s = duration * 0.034 м/мкс

В единице измерения допущена неточность. Вы же в см/мкс переводите, а не м/мкс (как у Вас)

всё сделал, но в мониторе порта пишет следующее (x⸮x⸮⸮⸮x⸮x⸮⸮⸮x⸮x⸮⸮⸮x⸮), что делать, как быть?))

Проверьте скорость передачи в мониторе последовательного порта. Она должна совпадать со скоростью в программе. Должно быть: 9600

Шаг 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 можно вычислить с помощью теоремы Пифагора:

\

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

Давайте рассмотрим пример простого проекта с платой Arduino Uno и датчиком расстояния HC SR04. В скетче мы будем получать значение расстояния до предметов и выводить их в монитор порта в среде Arduino IDE. Вы сможете легко изменить скетч и схему подключения, чтобы датчик сигнализировал о приближении или отдалении предмета.

Подключение датчика к ардуино

При написании скетча использовалась следующий вариант распиновки подключения датчика:

  • VCC: +5V
  • Trig – 12 пин
  • Echo – 11 пин
  • Земля (GND) – Земля (GND)

Пример скетча

Начнем работу с датчиком сразу с относительного сложного варианта – без использования внешних библиотек.

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

  • Коротким импульсом (2-5 микросекунды) переводим датчик расстояния в режим эхолокации, при котором в окружающее пространство высылаются ультразвуковые волны с частотой 40 КГц.
  • Ждем, пока датчик проанализирует отраженные сигналы и по задержке определит расстояние.
  • Получаем значение расстояния. Для этого ждем, пока HC SR04 выдаст на входе ECHO импульс, пропорциональный расстоянию. Мы определяем длительность импульса с помощью функции pulseIn, которая вернет нам время, прошедшее до изменения уровня сигнала (в нашем случае, до появления обратного фронта импульса).
  • Получив время, мы переводим его в расстояние в сантиметрах путем деления значения на константу (для датчика SR04 это 29.1 для сигнала «туда», столько же для сигнала «обратно», что в сумме даст 58.2).

Если датчик расстояния не выполняет считывание сигнала, то преобразование выходного сигнала никогда не примет значения короткого импульса – LOW. Так как у некоторых датчиков время задержки варьируется в зависимости от производителя, рекомендуется при использовании указанных скетчей выставлять его значение вручную (мы это делаем в начале цикла).

Если расстояние составляет более 3 метров, при котором HC SR04 начинает плохо работать, время задержки лучше выставлять более 20 мс, т.е. 25 или 30 мс.

Скетч с использованием библиотеки NewPing

Теперь давайте рассмотрим вариант скетча с использованием библиотеки NewPing. Код существенно упростится, т.к. все описанные ранее действия спрятаны внутри библиотеки. Все, что нам нужно сделать – создать объект класса NewPing, указав пины, с помощью которых мы подключаем датчик расстояния и использовать методы объекта. В нашем примере для получения расстояния в сантиметрах нужно использовать ping_cm().

Пример подключения ультразвукового дальномера HC SR04 с одним пином

Подключение HC-SR04 к Arduino может быть выполнено посредством использования одного пина. Такой вариант пригодится, если вы работаете с большим проектом и вам не хватает свободных пинов. Для подключения вам нужно просто установить между контактами TRIGи ECHO резистор номиналом 2.2K и подключить к ардуино контакт TRIG.

Объяснение программы для Arduino

Полный код программы приведен в конце статьи, здесь же мы кратко рассмотрим его основные фрагменты.

Первым делом в программе необходимо подключить все используемые библиотеки, в нашем случае это библиотека LiquidCrystal.h для работы с ЖК дисплеем. Данную библиотеку можно использовать как в случае 4-битного подключения ЖК дисплея, так и в случае 8-битного его подключения.

Arduino

#include<LiquidCrystal.h>

1 #include<LiquidCrystal.h>

Далее в следующей команде укажем плате Arduino к каким ее контактам подключен ЖК дисплей.

Arduino

LiquidCrystal lcd(12, 11, 5, 6, 7, 8);

1 LiquidCrystallcd(12,11,5,6,7,8);

Затем дадим осмысленные имена контактам платы, к которым подключены контакты trigger и echo ультразвукового датчика.

Arduino

#define ECHOPIN 3
#define TRIGPIN 2

1
2

#define ECHOPIN 3
#define TRIGPIN 2

Внутри функции setup() зададим режимы работы используемых контактов платы Arduino: контакт trigger на вывод данных, а контакт echo – на ввод данных. Также инициализируем последовательную связь со скоростью 9600 бод для целей отладки и инициализируем ЖК дисплей.

Arduino

void setup() {
Serial.begin(9600);
lcd.begin(16, 2);
pinMode(ECHOPIN,INPUT_PULLUP);
pinMode(TRIGPIN, OUTPUT);
digitalWrite(ECHOPIN, HIGH);
}

1
2
3
4
5
6
7

voidsetup(){

Serial.begin(9600);

lcd.begin(16,2);

pinMode(ECHOPIN,INPUT_PULLUP);

pinMode(TRIGPIN,OUTPUT);

digitalWrite(ECHOPIN,HIGH);

}

В функции loop сначала установим на контакте TRIGPIN напряжение низкого уровня (LOW) на 2 мкс чтобы «очистить» его. Затем мы установим на нем на 15 мкс напряжение высокого уровня (high) чтобы датчик излучил в пространство ультразвуковую волну. После этого с помощью функции pulseIn() мы будем считывать длительность импульса на контакте ECHOPIN, которое равно времени распространения ультразвуковой волны до препятствия и обратно. Далее на основе этого времени мы рассчитываем расстояние до препятствия и выводим его в окно монитора последовательной связи и на экран ЖК дисплея.

Arduino

void loop() {
digitalWrite(TRIGPIN, LOW);
delayMicroseconds(2);
digitalWrite(TRIGPIN, HIGH);
delayMicroseconds(15);
digitalWrite(TRIGPIN, LOW);
int distance = pulseIn(ECHOPIN, HIGH, 26000);
distance=distance/58;
Serial.print(distance);

1
2
3
4
5
6
7
8
9

voidloop(){

digitalWrite(TRIGPIN,LOW);

delayMicroseconds(2);

digitalWrite(TRIGPIN,HIGH);

delayMicroseconds(15);

digitalWrite(TRIGPIN,LOW);

intdistance=pulseIn(ECHOPIN,HIGH,26000);

distance=distance58;

Serial.print(distance);

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

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

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

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

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

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

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

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

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

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

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

Example code for HC-SR04 with Arduino

Now that you have wired up the sensor it is time to connect the Arduino to the computer and upload some code. You can upload the following example code to your Arduino using the Arduino IDE. Next, I will explain to you how the code works.

/* Example code for HC-SR04 ultrasonic distance sensor with Arduino. No library required. More info: https://www.makerguides.com */

// Define Trig and Echo pin:
#define trigPin 2
#define echoPin 3

// Define variables:
long duration;
int distance;

void setup() {
  // Define inputs and outputs:
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //Begin Serial communication at a baudrate of 9600:
  Serial.begin(9600);
}

void loop() {
  // Clear the trigPin by setting it LOW:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);

  // Trigger the sensor by setting the trigPin high for 10 microseconds:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

  // Read the echoPin, pulseIn() returns the duration (length of the pulse) in microseconds:
  duration = pulseIn(echoPin, HIGH);
  // Calculate the distance:
  distance = duration * 0.034 / 2;

  // Print the distance on the Serial Monitor (Ctrl+Shift+M):
  Serial.print("Distance = ");
  Serial.print(distance);
  Serial.println(" cm");

  delay(50);
}

How the code works

First, the trigger pin and the echo pin are defined. I call them  and . The trigger pin is connected to digital pin 2 and the echo pin to digital pin 3 on the Arduino.

The statement  is used to give a name to a constant value. The compiler will replace any references to this constant with the defined value when the program is compiled. So everywhere you mention , the compiler will replace it with the value 2 when the program is compiled.

// Define Trig and Echo pin:
#define trigPin 2
#define echoPin 3

Next I defined two variables:  and . Duration stores the time between sending and receiving the sound waves. The distance variable is used to store the calculated distance.

// Define variables:
long duration;
int distance;

In the , you start by setting the trigPin as an output and the echoPin as an input. Next you initialize serial communication at a baud rate of 9600. Later you will display the measured distance in the serial monitor, which can be accessed with Ctrl+Shift+M or Tools > Serial Monitor. Make sure the baud rate is also set to 9600 in the serial monitor.

void setup() {
  // Define inputs and outputs:
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);

  //Begin Serial communication at a baudrate of 9600:
  Serial.begin(9600);
}

In the , you trigger the sensor by setting the trigPin HIGH for 10 µs. Note that to get a clean signal you start by clearing the trigPin by setting it LOW for 5 microseconds.

void loop() {
  // Clear the trigPin by setting it LOW:
  digitalWrite(trigPin, LOW);
  delayMicroseconds(5);

  // Trigger the sensor by setting the trigPin high for 10 microseconds:
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);

Next, you need to read the length of the pulse sent by the echoPin. I use the function  for this. This function waits for the pin to go from LOW to HIGH, starts timing, then waits for the pin to go LOW and stops timing.

After that, you can calculate the distance by using the formula mentioned in the introduction of this tutorial.

// Read the echoPin, pulseIn() returns the duration (length of the pulse) in microseconds:
duration = pulseIn(echoPin, HIGH);
// Calculate the distance:
distance = duration * 0.034 / 2;

Finally, the calculated distance is printed in the serial monitor.

// Print the distance on the Serial Monitor (Ctrl+Shift+M):
Serial.print("Distance = ");
Serial.print(distance);
Serial.println(" cm");

delay(50);
}

Альтернативы

Ультразвуковые датчики не единственные, которые позволяют определять расстояние до объекта. Есть более точные лазерные дальномеры Laser Sensor предназначенные для работы в паре с ардуино. К сожалению, и цена у них различается в несколько десятков раз от датчика расстояния HC SR04, который стоит в среднем около 70 рублей. Лазерный же обойдется от суммы в 1200 р. Если же требуется определение только присутствия человека или животного в поле зрения контроллера, то тут лучшим станет инфракрасный сенсор. К примеру, такой, как GP2Y0A21YK0F.

Суть проблемы заключается в том, что большая часть ложных срабатываний, ультразвуковых сенсоров связана с попаданием в контролируемое ими поле мелких летящих соринок или насекомых. Не зря в «характеристиках» была сделана пометка о чувствительности к предметам в поле зрения сонара размером от 3 мм. То есть, грубо говоря, использовать их на улице бессмысленно. Снег, дождь, мусор, насекомые — все эти факторы приведут к неверным показаниям прибора. Другое дело инфракрасное устройство. Оно реагирует только на нагретые предметы. Хотя, конечно, все упирается в конкретную сферу жизни. Для сигнализаторов расстояния от багажника автомобиля до стены тепловой детектор подходит мало. Да и на ультразвуковой в таких случаях меркантильный хозяин надеяться не будет. Тут нужен лазерный датчик расстояния из-за своей надежности и точности. Как раз тот случай, когда переплатить стоит того.

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

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

}

}

Необходимые компоненты для подключения

Для полноценной работы нашего мини-проекта, нам понадобятся следующие устройства:

  • Плата Arduino (мы используем Arduino UNO)
  • Сервопривод
  • Ультразвуковой дальномер HC-SR04
  • Соединительные провода
  • Sensor Shield v5.0
  • Паяльник и вспомогательные элементы

Все эти элементы можно приобрести по низкой цене и с высоким качеством в интернет магазине SmartElements.

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

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

Предисловие

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