План:
1. Дальномер
2. Библиотека NewPing
Хочешь освоить программирование Arduino в аудитории и с преподавателем- записывайся на блиц-курс по робототехнике.
Теоретическая часть
1 Дальномер
Дальномер – это устройство, с помощью которого измеряют расстояние до препятствия. Существуют инфракрасные, ультразвуковые, лазерные дальномеры. Далее рассмотрим ультразвуковой дальномер HC-SR04. Его внешний вид изображен на рисунке 1.
Рисунок 1 – Ультразвуковой дальномер HC-SR04
Как видно из рисунка, у данного дальномера четыре вывода (2.54мм):
VCC: плюс, питание 5В.
GND: минус, питание.
TRIG (T): вывод на излучатель.
ECHO (R): вывод на приемник.
Принцип работы дальномера следующий: Сначала на вывод trig подается импульс, продолжительностью 10мкс. Физически через излучатель в виде ультразвуковой волны посылается 8 импульсов с частотой 40КГц. Волна отражается от ближайшего препятствия и доходит до приемника. На выводе принимающей части возникает импульс, длина которого, пропорциональна времени, за которое волна вернулась к датчику, т.е. пропорциональна расстоянию до препятствия.
В сантиметрах расстрояние до препятствия можно получить по следующей формуле:
Расстояние до препятствия (см) = длина импульса (мкс) / 58.
2. Библиотека NewPing
Библиотека NewPing предназначена для удобной работы с дальномером. Она не входит в число стандартных библиотек, ее можно скачать по ссылке
После загрузки, папку NewPing необходимо поместить в папку libraries в рабочем каталоге arduino. Для того, чтобы добавить библиотеку к проекту нужно прописать строку: #include .
В библиотеке NewPing описан реализован класс. Соответственно, для работы с дальномером, нужно создать объект. При создании объекта, в списке атрибутов указываются номер пина для излучателя, номер пина для приемника и, необязательно, максимальное расстояние. По умолчанию максимальное расстояние равно 500см.
Прототип объявления:
NewPing sonar(trig_pin, echo_pin [, max_distance_sm]);
Пример:
NewPing sonar(9, 10, 100);
Библиотека предоставляет следующие методы класса, для работы с дальномером:
sonar.ping(); — отправляет ультразвуковую волну, возвращает время, за которое она возвращается на приемник. Если за максимально допустимое время волна не вернулась на приемник, метод возвращает 0.
sonar.ping_in(); — отправляет ультразвуковую волну, возвращает расстояние до препятствия в дюймах. Если препятствие находится на расстоянии, превышающем допустимое, возвращается 0.
sonar.ping_cm(); — отправляет ультразвуковую волну, возвращает расстояние до препятствия в сантиметрах. Если препятствие находится на расстоянии, превышающем допустимое, возвращается 0.
sonar.ping_median(ping_number); — посылает несколько импульсов (по умолчанию 5 ), возвращает медианное значение времени их возврата в микросекундах.
sonar.convert_in(echoTime); — преобразует длительность импульса(микросекунды) в расстояние (дюймы).
sonar.convert_cm(echoTime); — преобразует длительность импульса(микросекунды) в расстояние (сантиметры).
sonar.ping_timer(function); — отправляет импульс и вызывает функцию для проверки, был ли завершен передача-прием волны.
sonar.check_timer(); — возвращает значение ИСТИНА, если волна вернулась в допустимое время.
timer_us(frequency, function); — вызывает функцию с определенной частотой в микросекундах.
timer_ms(frequency, function); — вызывает функцию с определенной частотой в миллисекундах.
timer_stop(); — останавливает таймер.
Практическая часть
К набору элементов прошлого урока добавляем дальномер и создаем прототип охранной системы: пока в зоне видимости дальномера нет препятствия, серводвигатель вращается по- и против часовой стрелки на 180 градусов, горит зеленый светодиод. Как только появляется препятствие серводвигатель останавливается, загорается красный светодиод, в порт шлется сигнал ALARM. Расстояние до препятствия регулируется потенциометром и отправляется в порт.
Схема подключения элементов изображена на рисунке 2.
Рисунок 2 – Схема подключения элементов
Листинг программы представлен ниже
#include
#include <NеwPing.h>
#define red 12
#define green 13
#define res A0
#define pinmotor 11
#define echo 8
#define trig 9
Servo motor;
int incpecting_distance=100; //расстояние, на котором будет совершаться поиск объекта.
int previous_incpecting_distance=100;
int red_state=LOW;
int green_state=HIGH;
int motor_state=HIGH;
bool scan_begin=true;
bool alarm_begin=true;
double distance=0;
NewPing sonar(trig, echo, 300);
void setup()
{
Serial.begin(9600);
pinMode(12,OUTPUT);
pinMode(13,OUTPUT);
pinMode(2,OUTPUT);
motor.attach(pinmotor);
}
void loop()
{
for (int i=0;i<180;i++)
{
set_actuators(i);
get_sensors();
if ((distance<incpecting_distance)&&(distance!=0))
alarm();
else scan();
}
for (int i=180;i>0;i—)
{
set_actuators(i);
get_sensors();
if ((distance<incpecting_distance)&&(distance!=0))
alarm();
else scan();
}
delay(100);
}
void alarm()
{
red_state=HIGH;
green_state=LOW;
motor_state=LOW;
if (alarm_begin)
{
Serial.println(«ALARM!»);
alarm_begin=false;
scan_begin=true;
}
}
void scan()
{
red_state=LOW;
green_state=HIGH;
motor_state=HIGH;
if (scan_begin)
{
Serial.println(«SCANING…»);
scan_begin=false;
alarm_begin=true;
}
}
void set_actuators(int i)
{
digitalWrite(green,green_state);
digitalWrite(red,red_state);
if (motor_state)
motor.write(i);
}
void get_sensors()
{
previous_incpecting_distance=incpecting_distance;
distance=sonar.convert_cm(sonar.ping_median(5));
incpecting_distance=analogRead(res)/10+10;
if (abs(previous_incpecting_distance-incpecting_distance)>10)
{
Serial.print(«New inspecting distance «);
Serial.print(incpecting_distance);
Serial.println(» cm»);
}
}