Ультразвуковий далекомір з використанням Python на Raspberry Pi
Рейтинг статті: / 6
НайгіршеНайкраще 
Ultra-on-RPIСвітлодіоди, зумери і перемикачі є найбільш поширеними предметами, які люди намагаються заставити взаємодіяти зі своїм Raspberry Pi. Автор знайшов в Інтернеті щось трохи інше - це ультразвуковий вимірювальний модуль.
Автор знайшов в Інтернеті щось трохи інше - це ультразвуковий вимірювальний модуль. Він дозволяє виміряти відстань до найближчої стіни або твердого предмета. Модуль легко купити, він дешевий і відносно прямо узгоджується з інтерфейсом роз’єму GPIO.
Ultra-module
Модуль HC-SR04 коштує близько $5 і розміром з коробку сірників. Два перетворювачі надають йому характерний зовнішній вигляд. Він призначений для живлення від 5В, має один вхідний і один вихідний контакти. Модуль працює, посилаючи ультразвуковий імпульс в повітря і вимірюючи час, який потрібен, щоб повернутися назад. Це значення потім може використовуватися для обчислення відстані, пройденої імпульсом.
Підключення до Pi
Підключити модуль легко. Просто підключіть виводи +5В (VCC) і землі (GND), відповідно, до виводів 2 і 6 на роз’ємі GPIO Pi.
Вхідний контакт на модулі називається "Trig" (trigger), бо він використовується, щоб викликати відправку ультразвукового імпульсу. В ідеалі він розрахований на сигнал 5В, але чудово працює з сигналом 3,3В від GPIO. Тому автор підключив вхідний контакт модуля безпосередньо до контакту 16 (GPIO23) на своєму роз’ємі GPIO.
Ви можете використовувати будь-які виводи GPIO, які Вам подобається на Вашому Rpi, але тоді буде потрібно відкорегувати посилання і змінити відповідно сценарій Python.Ultra-on-RPI-2
Вихід модуля називається "Echo" і потребує трохи більшої нашої уваги. На вихідному контакті низький рівень (0В), поки модуль не виконує вимір відстані. Потім він перемикає цей вивід у високий стан (+5В) на той же проміжок часу, поки імпульс не повернеться. Таким чином, наш сценарій повинен виміряти цей час, поки стан виводу залишається високим. Модуль використовує рівень +5В для "високого", але це занадто висока напруга для входів роз’єму GPIO, які розраховані лише на 3,3В. З метою забезпечення подачі на Pi напруги лише 3,3В, ми використаємо базовий подільник напруги, виконаний на двох резисторах.
2Якщо значення R1 і R2 однакові, то напруга поділиться на дві частини. Це дало б нам 2.5В. Якщо R2 вдвічі перевищує значення R1, то отримаємо 3.33В, що чудово. Так в ідеалі бажано, щоб значення R2 було між R1 і R1 х 2. У розглянутому прикладі схеми автор використав резистори 330 Ом і 470 Ом. Як альтернативу, можна використати значення 1 кОм і 1,5 кОм.
Нижче наведена схема остаточного кола. Автор вибрав GPIO23 і GPIO24, але можете використовувати будь-який з 17-ти доступних контактів GPIO на роз’ємі GPIO. Тільки не забудьте відредагувати сценарій.
Ultra-on-RPI-3
Коло ультразвукового модуля
Сценарій на Python
У цьому прикладі сценарій виконує три виміри і обчислює середнє. Результат відображається і через секунду він робить ще одне усереднення. Це дозволяє використовувати сценарій для постійного вимірювання відстані і її друку в командному рядку.
Ось цей сценарій:
#!/usr/bin/python
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#|R|a|s|p|b|e|r|r|y|P|i|-|S|p|y|.|c|o|.|u|k|
#+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+-+
#
# ultrasonic_2.py
# Вимірювання відстані з використанням ультразвукового модуля
# в циклі.
#
# Автор : Matt Hawkins
# Дата   : 28/01/2013

# -----------------------
# Імпорт необхідних бібліотек Python
# -----------------------
import time
import RPi.GPIO as GPIO

# -----------------------
# Визначення деяких функцій
# -----------------------

def measure():
  # Ця функція вимірює відстань
  GPIO.output(GPIO_TRIGGER, True)
  time.sleep(0.00001)
  GPIO.output(GPIO_TRIGGER, False)
  start = time.time()

  while GPIO.input(GPIO_ECHO)==0:
    start = time.time()

  while GPIO.input(GPIO_ECHO)==1:
    stop = time.time()

  elapsed = stop-start
  distance = (elapsed * 34300)/2

  return distance

def measure_average():
  # Ця функція робить 3 вимірювання і
  # повертає середнє значення.
  distance1=measure()
  time.sleep(0.1)
  distance2=measure()
  time.sleep(0.1)
  distance3=measure()
  distance = distance1 + distance2 + distance3
  distance = distance / 3
  return distance

# -----------------------
# Основний сценарій
# -----------------------

# Використання параметрів BCM GPIO
# замість фізичного номера виводу
GPIO.setmode(GPIO.BCM)

# Визначення GPIO для використання на Pi
GPIO_TRIGGER = 23
GPIO_ECHO    = 24

print "Ultrasonic Measurement"

# Встановлення виводів як вихідний і вхідний
GPIO.setup(GPIO_TRIGGER,GPIO.OUT)  # Trigger
GPIO.setup(GPIO_ECHO,GPIO.IN)      # Echo

# Встановлення trigger в хибне (Низький рівень)
GPIO.output(GPIO_TRIGGER, False)

# Запис основного змісту в блок перевірки, щоб ми могли
# спімати натиснення користувачем CTRL-C і запустити
# фукцію скидання GPIO. Це також допоможе уникнути
# отримання користувачем багатьох повідомлень
# про незначні помилки.
try:

  while True:

    distance = measure_average()
    print "Distance : %.1f" % distance
    time.sleep(1)

except KeyboardInterrupt:
  # Користувач натиснув CTRL-C
  # Скидання налаштувань GPIO
  GPIO.cleanup()
Цей сценарій також можна завантажити на безпосередньо свій Pi, використовуючи такий командний рядок:
wget https://bitbucket.org/MattHawkinsUK/rpispy-misc/raw/master/python/ultrasonic_2.py
Потім сценарій можна запустити за допомогою:
sudo python ultrasonic_2.py
Результатом буде командний рядок, який виглядає приблизно так:
Ultra-on-RPI-4
Очевидно, що Ваші вимірювання залежатимуть від того, на що Ви вказуєте своїм датчиком!
Точність вимірювання
Ось деякі моменти, які впливають на точність:
  • Точність вимірювання відстані залежить від часу. Python під Linux не є ідеальним для точної синхронізації, але загальні вимірювання на ньому будуть працювати добре. Для підвищення точності Вам потрібно придивитися на використання C замість нього.
  • Коли GPIO налаштований, то модулю потрібен якийсь час, перш ніж він готовий прийняти перше читання, тому автор додав затримку 0,5 с на початку сценарію.
  • Датчики мають широкий кут чутливості. У метушливому навколишньому середовищі Ви можете отримати більш короткі читання через об'єкти з боків модуля.
  • Вимірювання працює приблизно до 2 см. Нижче цієї межі вимірювання може дати дивні результати.
  • Якщо торкнутися ультразвукового перетворювача де-небудь, то результати непередбачувані.
Якщо хтось хоче поекспериментувати з цим пристроєм на C, то відвідайте сторінку http://rasathus.blogspot.co.uk/2012/09/ultra-cheap-ultrasonics-with-hy-srf05_27.html
Також є порівняння реалізацій на Python і C: http://www.raspberrypi-spy.co.uk/2012/12/ultrasonic-distance-measurement-using-python-part-1/
(За матеріалами EN: raspberrypi-spy.co.uk)
 
>
КнигаНовиниПрактика пошукуПартнериПро нас
Підтримка та дизайн: Могильний С.С. Шаблон: Joomla Templates by BuyHTTP Joomla Hosting