Парктроник своими руками

Во время моего последнего визита к родителям, у меня возникли трудности парковки автомобиля (большой пикап) в их гараже. И у меня возникла идея сделать простенький стационарный парктроник для гаража. Я использовал контроллер Arduino Duemilanove и ультразвуковой датчик расстояния (Sonar Range Finder).

Материал:

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

  • Контроллер Arduino (я использовал Duemilanove)
  • Ultrasonic Range Finder
  • Провода
  • Пластиковый бокс
  • 9В источник питания
  • Трехцветный светодиод
  • Клей
  • Макетная плата

Комплектующие

Сборка парктроника

1. Приклейте плату Arduino ко дну ящика при помощи клея или силикона и подведите питание к контроллеру.

Монтаж контроллера в бокс

2. Присоедините питание ультразвукового датчика 5В.

Питание УЗ датчика

3. Подключите выход ультразвукового датчика «SIG» к выводу ШИМ Arduino (это нужно для того, чтобы мы могли слать импульсы в датчик, а потом считывать их возврат). Я использовал вывод 7 контроллера.

4. Перед подключением трехцветного светодиода, определите какие ноги за какой цвет отвечают. Красный, зеленый и синий я подсоединил соответственно к 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;  }  

Фото готового парктроника