Парктронік своїми руками (Arduino)

Під час мого останнього візиту до батьків у мене виникли труднощі з паркуванням автомобіля (великий пікап) у їхньому гаражі. І у мене виникла ідея зробити простенький стаціонарний парктронік для гаража. Я використав контролер Arduino Duemilanove та ультразвуковий датчик відстані (Sonar Range Finder).

Матеріал:

Для того, щоб зробити парктронік своїми руками, нам знадобиться:

  • Контролер Arduino (я використав Duemilanove)
  • Ультразвуковий датчик відстані
  • Проводи
  • Пластиковий бокс
  • 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);
// показати кольори світлодіодів 
  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 
  
   створено 3 листопада 2008 
   Девід А. Мелліс 
   модифіковано 30 червня 2009 
   Том Іго 
  
   Цей приклад коду є суспільним надбанням. 
  
 */
  
pinMode(13, OUTPUT); // синій 
pinMode(12, OUTPUT); // зелений 
pinMode(11, OUTPUT); // червоний 
const int pingPin = 7; 
  
void setup() { 
  Serial.begin(9600); 
}  
  
void loop() 
{ 
  long duration, cm; 
  
  // PING))) активується високим імпульсом тривалістю 2 або більше мікросекунд. 
  // Дайте короткий низький імпульс перед цим, щоб забезпечити чистий високий імпульс: 
  pinMode(pingPin, OUTPUT); 
digitalWrite(pingPin, LOW); 
delayMicroseconds(2); 
digitalWrite(pingPin, HIGH); 
delayMicroseconds(5); 
digitalWrite(pingPin, LOW); 
  
  // Той же пін використовується для зчитування сигналу з PING))): високий 
  // імпульс, тривалість якого - це час (в мікросекундах) від відправлення 
  // пінгу до отримання його еха від об'єкта. 
  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("см"); 
  Serial.println(); 
  
delay(1000); 
}  
  
long microsecondsToCentimeters(long microseconds) 
{ 
  // Швидкість звуку 340 м/с або 29 мкс на сантиметр.
  // Під час вимірювання відстані хвиля проходить туди і назад, 
  // тому потрібно ще поділити на двоє отримане значення від датчика
  return microseconds / 29 / 2; 
}

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

Оригінал статті

Top