Во время моего последнего визита к родителям, у меня возникли трудности парковки автомобиля (большой пикап) в их гараже. И у меня возникла идея сделать простенький стационарный парктроник для гаража. Я использовал контроллер Arduino Duemilanove и ультразвуковой датчик расстояния (Sonar Range Finder).
Материал:
Для того, чтобы сделать парктроник своими руками нам понадобится:
- Контроллер Arduino (я использовал Duemilanove)
- Ultrasonic Range Finder
- Провода
- Пластиковый бокс
- 9В источник питания
- Трехцветный светодиод
- Клей
- Макетная плата
Сборка парктроника
1. Приклейте плату Arduino ко дну ящика при помощи клея или силикона и подведите питание к контроллеру.
2. Присоедините питание ультразвукового датчика 5В.
3. Подключите выход ультразвукового датчика «SIG» к выводу ШИМ Arduino (это нужно для того, чтобы мы могли слать импульсы в датчик, а потом считывать их возврат). Я использовал вывод 7 контроллера.
4. Перед подключением 3-хцветного светодиода, определите какие ноги за какой цвет отвечают. Красный, зеленый и синий я подсоединил соответственно к 11, 12 и 13 выводу Arduino.
5. Теперь осталось дело за программой. После тестирования ПО, если все нормально работает, то закрепите датчик на стене вашего гаража, а светодиод выведите в удобное для вас место.
Программа
К счастью, софт Arduino уже содержит пример для работы с ультразвуковым датчиком. Пример этот находится: File -> Examples -> Sensors -> Ping example. Откройте этот пример и скопируйте весь код в новый проект. Назовите его как-нибудь (к примеру Parking Example) и сохраните.
Внесем некоторые изменения в программу. Для начала мы увеличим интервал посылок к датчику, т.к. нам не нужно посылать сигнал каждые 100 мс, достаточно и 1 секунды.
delay(1000);
Далее, мы должны установить номера выводов для светодиода. Для этого перед строкой
const int pingPin = 7;
добавьте:
pinMode(13, OUTPUT); // синий
pinMode(12, OUTPUT); // зеленый
pinMode(11, OUTPUT); // красный
Теперь мы должны определиться, при каком расстоянии, какие цвета светодиода будут показываться. К примеру я сделал так: дальше чем 60 см от стены горит зеленый цвет, когда остается меньше 60 см, загорается синий цвет, а когда до стены остается менее 15 см загорается красный цвет.
Наш код с учетом вышеприведенных вычислений будет таким:
cm = microsecondsToCentimeters(duration);
// show LED colors
if(cm > 0 && cm <= 15) {
// горит красный цвет
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
} else if(cm <= 60 && cm > 15) {
// горит голубой
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(13, HIGH);
} else {
// горит зеленый цвет
digitalWrite(13, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
}
Вышеприведенный код управляет выходами Arduino для индикации определенного цвета светодиода, в зависимости от дистанции до препятствия (в данном случае автомобиль), которую определил ультразвуковой датчик. Наш конечный код будет выглядеть следующим образом:
/* Ping))) Sensor
Схема:
* +V выход датчика подсоединяется к +5V
* GND выход датчика подсоединяется к земле
* SIG выход датчика подсоединяется к цифровому выводу 7
http://www.arduino.cc/en/Tutorial/Ping
created 3 Nov 2008
by David A. Mellis
modified 30 Jun 2009
by Tom Igoe
This example code is in the public domain.
*/
pinMode(13, OUTPUT); // синий
pinMode(12, OUTPUT); // зеленый
pinMode(11, OUTPUT); // красный
const int pingPin = 7;
void setup() {
Serial.begin(9600);
}
void loop()
{
long duration, cm;
// The PING))) is triggered by a HIGH pulse of 2 or more microseconds.
// Give a short LOW pulse beforehand to ensure a clean HIGH pulse:
pinMode(pingPin, OUTPUT);
digitalWrite(pingPin, LOW);
delayMicroseconds(2);
digitalWrite(pingPin, HIGH);
delayMicroseconds(5);
digitalWrite(pingPin, LOW);
// The same pin is used to read the signal from the PING))): a HIGH
// pulse whose duration is the time (in microseconds) from the sending
// of the ping to the reception of its echo off of an object.
pinMode(pingPin, INPUT);
duration = pulseIn(pingPin, HIGH);
// конвертируем время в расстояние
cm = microsecondsToCentimeters(duration);
// показ определенного цвета, в зависимости от расстояния
if(cm > 0 && cm <= 15) {
// горит красный цвет
digitalWrite(13, LOW);
digitalWrite(12, LOW);
digitalWrite(11, HIGH);
} else if(cm <= 60 && cm > 15) {
// горит голубой
digitalWrite(12, LOW);
digitalWrite(11, LOW);
digitalWrite(13, HIGH);
} else {
// горит зеленый цвет
digitalWrite(13, LOW);
digitalWrite(11, LOW);
digitalWrite(12, HIGH);
Serial.print(cm);
Serial.print(«cm»);
Serial.println();
delay(1000);
}
long microsecondsToCentimeters(long microseconds)
{
// Скорость звука 340 м/с или 29 мкс на сантиметр.
// Во время измерения расстояния волна проходит туда и обратно,
// поэтому нужно ещё поделить пополам полученное значение от датчика
return microseconds / 29 / 2;
}