Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
  1. Главная
  2. Блоги сообщества Raspberry Pi
  3. Дальномер hc sr04. Lua

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

Запланировано Прикреплена Закрыта Перенесена Блоги сообщества Raspberry Pi
1 Сообщения 1 Posters 28 Просмотры
  • Сначала старые
  • Сначала новые
  • По количеству голосов
Авторизуйтесь, чтобы ответить
Эта тема была удалена. Только пользователи с правом управления темами могут её видеть.
  • piP Не в сети
    piP Не в сети
    pi
    написал в отредактировано pi
    #1

    Приветсвую.

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

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

    Девайс:
    ef84d189-16fd-4a0d-a1a7-874d0ec4dbd8-image.png

    Работает, как заявлено, от 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 сантиметра до стены, что верно.

    1 ответ Последний ответ
    0

    • Войти

    • Нет учётной записи? Зарегистрироваться

    • Login or register to search.
    • Первое сообщение
      Последнее сообщение
    0
    • Категории
    • Главная
    • Документация
    • Последние
    • Пользователи