День прошел в бесплодных попытках заставить работать ультразвуковой сенсор расстояния. Чтобы значить отзаложить кирпчик в "зрение" робота-картографа.
Проблема оказалась в том, что я купил слишком хороший сенсор: URM37 (по сцылке мануал к нему)
Я-то думал как: подаешь на сенсор сигнал, он испускает ультразвук, ты засекаешь время, из времени исчисляешь расстояние.
Нет! так просто оно не работает! Эта гадина, оказывается, работает в одном из трех режимов:
1. получает команды через серийный порт (UART, насколько я могу предположить) и так же отдает ответ. [по-аглицки]Mode 1: Serial passive control mode Under this mode, the sensor is always waiting for command from serial port. Every time it receives a command, it will return the distance and wait for the next command.The degree in the command will be used to control a servo motor to rotate corresponding degree.Please note that this mode is always on. It can not be switch on or off/ Я пока никак не могу скрестить Python и UART. Знаниев нету
2. Режим, когда сенсор подает признак жизни, когда регулярно измеряемое расстояние превышает какой то лимит) [по-аглицки] Mode 2: Autonomous trigger mode Under this mode, the sensor will make a sensor reading every 25ms and compare the reading with a threshold (preset, user is able to define this value by writing EEPROM), if the reading is equal or smaller than the threshold, pin COMP/TRIGwill have low output. In the meantime, pin PWM will outputthe distance reading, every 50us low level stands for 1cm, by counting the number of these pulses, the distance can be calculated. This mode can be simply used as an ON/OFF switch.
3.Наиболее интересный для меня режим, при котором, когда на входе у сенсора 0, он пущщает импульс и возвращает методом ШИМ (он же PWM) значение, которое, путем деления на 50, дает расстояние в метрах .
[по-аглицки] Mode 3: PWM passive control mode Under this mode, a low pull on pin COMP/TRIG will trigger a sensor reading. The width of the pulse is proportional to the servo rotating degree. After a successful sensor reading, Pin PWM will output pulses, every 50us represents 1cm. If the reading is invalid, a 50000us pulse will be returned.
Т.е. надо то всего лишь:
1. убрать с одного пина логическую "1" 2. измерить продолжительность сигнала на другом пине
Я даже накорябал программку: [Не порно, но задорно] from RPi import GPIO import time GPIO.setmode(GPIO.BOARD) GPIO.setup(12, GPIO.OUT) GPIO.setup(18, GPIO.IN) GPIO.output(12, 1)
while GPIO.input(18)==0: start = time. time()
while GPIO.input(18)==1: stop = time. time()
elapsed = stop-start
GPIO.output(12, 0) print (elapsed) GPIO.cleanup()
Программка впринципе работает (я проверял мультиметром:)) Но вот сигнала с расстоянием на нужном пине она так и не обнаружила.
Конечно, я завтра еще помучаю энту штуку, но кажется мне, что правильнее будет купить более простой и дешевый сонар для опытов. Не дорос ишшо до сурьезных игрушек.
И жалко, что у Raspberry нету аналоговых портов...