Присоединяйтесь!
Авторизация

Дальномер hc sr04. Lua

30 July 2016 - Автор nwnclv

Приветсвую.

Просто пример измерения расстояния сабжевым девайсом.

Сам пример тут. Агент, fuse_client и lua_client, собранные для малины тут

Девайс:

Работает, как заявлено, от 2 до 400 см. На деле после 350 показания начинаюсь сильно плавать. При расстояниях меньше 4 см, "показывает" ересь от 3см до 20 (!!!) метров.

Суть:

У девайса есть триггер и ехо.

Работа:

Девайсу необходимо на время поднять триггер. Далее он сам поднимет ехо и сбросит его, через время, которое зависит от расстояния до цели.

Так как пример основан на асинхронных событиях, пин ехо должен уметь поддерживать "edge". На RPi это 2, 3, .. 9, если все правильно помню. У меня триггер - GPIO2, ехо - GPIO3.

Отметка времени (interval) есть количество микросекунд, прошедших со старта агента на малине. Проставляется на стороне агента.

Сам пример с пояснениями:

gpio = fr.client.gpio -- алиас для таблицы gpio

local TRIG = 2 
local ECHO = 3
local last_tick = 0 -- это отметка времени, в которое произошло событие
                    -- отсчитывается от старта агента на RPi
function handler( data ) -- функция-обработчик для события изменения состояния эхо
    if last_tick ~= 0 then -- начало. Первое событие придет при подписи, 
                           -- поэтому обрабатываем только ситуацию после
	local val = data.value 
	if val == 1 then   -- если ехо поднялось, то это посылка сигнала устройством
	    print( "signal sent!" ) 
	else               -- а теперь эхо скинулось, стало быть мы получили ответ
	    print( "echo received; distance = ", 
                   (data.interval - last_tick) / 58, "cm"  ) -- теперь просто вычтем из текущего прошлое 
                                                             -- и поделим на 58 (можно умножить на 0.01724)
                                                             -- как нам говорит даташит
	    fr.exit( ) -- завершим скрипт
	end
    end   
    last_tick = data.interval -- меняем значение последнего интервала
end


function main( )
    fr.run( )  -- запустит очередь событий
    T = assert(gpio.export(TRIG, "out")) -- откроем триггер на out
    E = assert(gpio.export(ECHO, "in"))  -- эхо на "in"
    assert(E:set( "edge", "both" ))      -- сделаем возможным обрабатывать события эха "both" = сброс и подъем
    assert(E:subscribe( "on_changed", handler, E, T )) -- подписка на событие. 
                                                       -- E и T  переданы как параметры, 
                                                       -- чтоб не были убиты сборщиком мусора
    assert(T:pulse( 50 )) -- вызов pulse поднимет триггер на 50 микросекунд. Кто-то советует сделать больше
end

Все.

вывод будет пример такой:

> ./lua_client -s 192.168.1.11:12345 -e sonic-hc-SR04.lua
signal sent!
echo received; distance = 	189.39655172414	cm

Это расстояние до соседней стены. Рулетка вполне согласна (+-5см).

Погрешность:

Она все равно есть. Например вот несколько замеров одного и того же расстояния:

191.03448275862	
192.55172413793
189.79310344828
192.36206896552
193.94827586207

что в среднем ~191.937931. ~192 сантиметра до стены, что верно.

30 July 2016
nwnclv
автор статьи

Комментариев: 4

  1. Ferilde

    12 August 2016 - Ответить

    Отлично. Теперь буду знать

  2. mshock

    14 July 2017 - Ответить

    Многие датчики подвирают всегда.  Видимо, надо иметь функцию, делающую несколько замеров, отбрасывающую заведомо неправдоподобные "выхлесты" значений и усредняющую полученные измерения.

  3. олег

    25 November 2018 - Ответить

    я на ардуине делал примерно так для борьбы с "чудесами" брал массив 5 элементов , складывал делил на 5... получал медиану , делаю замер и смотрю чтоб значение было не больше медианы и не меньше 10 % от медианы ... т.к. датчик стояи стационарно и внезапно там не может быть препятствия.

  4. олег

    25 November 2018 - Ответить

    но ! проблема в том что если датчик не 1 и ждать пока он раздуплится 50 мс ...это долго и будет вешать систему в цикл ожидания ...на ардуине нет потоков и мультизадачности , автор как вы решали данную проблему ?

Отправить комментарий

Авторизуйтесь для отправки комментария

Присоединяйтесь
Новые сообщения
  • Disabling IRQ
    10 December, 2019
    Тут еще заметил один нюанс. Если запустить программу сразу после перезагрузки, она работает без каких-либо нареканий. Можно...…
  • Вопрос по энкодеру
    10 December, 2019
    Если это родная CSI камера, то у ** raspivid ** есть параметр ** --annotate ** , который накладывает текст на видео …
  • Disabling IRQ
    10 December, 2019
    Я думаю, что проблема в ядре, попробуй обычное, а не realtime Попробуй BT отключить, он висит в 3-ке на UART'е - `...…
  • Disabling IRQ
    10 December, 2019
    Был вариант что это происходит из-за одновременного обращения к ttyS0 из разных потоков. Сейчас переделал программу и...…
  • Disabling IRQ
    10 December, 2019
    ``` [ 199.901675] ------------[ cut here ]------------ [ 199.901708] WARNING: CPU: 1 PID: 86 at kernel/irq/handle.c:151...…
  • Disabling IRQ
    10 December, 2019
    А что в логи ядра (dmesg, /var/log/messages) пишется, когда такая ошибка вываливается? …
  • Disabling IRQ
    10 December, 2019
    Пишу программу для Raspberry PI 3 Model B v1.2, система Raspbian GNU/Linux 9.4 (stretch) realtime . При работе с ttyS0 у меня...…
  • Установка node-red-contrib-modbus
    08 December, 2019
    Вроде бы все прошло удачно. Обновил NodeJS. Попытался установить Node-red-contrib-modbus. Как будто бы установка прошла...…
  • Вопрос по энкодеру
    03 December, 2019
    Добрый день! Необходимо сделать так чтобы метраж отмотанного троса накладывался на видео с камеры. Сможет кто-нибудь помочь? …
  • MAX31855 + L298N
    01 December, 2019
    Здравствуйте столкнулся с такой проблемой,задача кода управлять частотой вражения двигателя в зависимости от температуры...…
  • Выбор для новичка
    30 November, 2019
    @nbo#5996 спасибо большое ;) …
  • Выбор для новичка
    30 November, 2019
    Бери 4-ую. все модели совместимы между собой. Все инструкции Pi3 подойдут и к Pi4 …
  • Выбор для новичка
    30 November, 2019
    Прошу помощи у юзеров Малинки, определиться с покупкой начинающему пользователю Выбор стоит между raspberry pi 3 model b и...…
  • 5 дюймовый экран переключился с HDMI на AV2
    29 November, 2019
    как же бесит всё это китайское говнище, которое без допиливания не работает …
  • 5 дюймовый экран переключился с HDMI на AV2
    29 November, 2019
    Тут нашли решение проблемы https://www.raspberrypi.org/forums/viewtopic.php?t=249997#p1572992 …
  • NRF24L01
    28 November, 2019
    #include <stdio.h> #include <unistd.h> #include <wiringPi.h> #include <wiringPiSPI.h> int main()...…
  • NRF24L01
    28 November, 2019
    Ну хоть бы пример кода привёл, как считываешь состояние регистров. …
  • NRF24L01
    28 November, 2019
    Подключил радио модуль NRF24L01 к raspberry по следующей схеме...…
  • Нужно доработать приложение на малине и на андроиде
    28 November, 2019
    Управление gpio с помощью приложения на android Сервер на C# Клиент на Java …
  • Вопрос о аозможностях
    26 November, 2019
    > @Aleksei#5985 То есть возможно все это на Raspberry, я правильно понял? Можно смело лезть в документацию? :-...…
  • Вопрос о аозможностях
    25 November, 2019
    И ещё вопрос. Я не дружу с Линукс. Мой опыт использования Ubuntu был сплошной мукой. Можно ли теоретически все это сделать на...…
  • Вопрос о аозможностях
    25 November, 2019
    То есть возможно все это на Raspberry, я правильно понял? Можно смело лезть в документацию? :-) …
  • Вопрос о аозможностях
    25 November, 2019
    @mojo#5983 настроить не смогу, а вот с паяльником я с детства дружу :-) …
  • Вопрос о аозможностях
    25 November, 2019
    Ну тогда гугли по запросу "Raspberry Pi Wi-Fi repeater". И для репитера скорее всего потребуются 2 внешних USB адаптера, т.к...…
  • Вопрос о аозможностях
    25 November, 2019
    Да, такие устройства тоже есть. Но цена раз в 20 выше, чем плата Raspberry. …