Skip to content
  • Категории
  • Главная
  • Документация
  • Последние
  • Пользователи
Collapse
piP

pi

@pi
Сводка
Сообщения
6.3k
Темы
1.6k
Группы
1
Подписчики
0
Подписки
0

Сообщения

Последние Лучшие сообщения Спорные

  • Удаленное управление. События. Энкодер инкрементальный.
    piP pi

    И снова здравствуйте!

    Отрыл сегодня инкрементальный енкодер на полке. Попытаюсь описать как с ним работать и как снимать направление вращения.

    Что такое этот энкодер, думаю, смысла говорить нет. Это легко гуглится. Выглядит эта штука вот так:

    7c20efe7-5a28-45df-8089-a32f5df60b01-image.png

    У него есть 3 пина и если посмотреть на железку сверху, то по часовой стрелке можно эти пины обозначить как A, O, B.

    Пин O - пин, работающий на выход, пины A и B работают на вход, то есть "читают" состояние пина O.

    Теперь ситуация:

    Поворачиваем енкодер по часовой стрелке и ...

    Сначала меняется состояние пина A

    потом B

    потом меняется состояние пина A обратно

    затем снова B возвращает свое первоначальное значение. Картина, в общем такая:

    36df1b86-31ef-4464-997e-5e9ff118371a-image.png

    (Картинка не моя; взял с интернета)

    Можно заметить, что в один момент времени пины принимают одинаковое значение, НО при этом имеют разный расклад на предыдущем шаге. Таким образом мы можем понять в какую сторону крутится ручка енкодера.

    Покажу на примере ferro-remote как можно это обработать и сделать простейший счетчик, который при повороте по часовой стрелке увеличивает значение, а против - уменьшает.

    Тут я описывал как можно ловить события (сигналы, прерывания ... называть можно как угодно) с пинов GPIO, работающих в режиме IN. Думаю повторить тоже самое для данного примера.

    Возьмем 3 пина на RPi: GPIO 2, 3, 4.

    2 будет A
    3 будет O
    4 будет B

    Для начала простой скрипт, который их откроет и расставит им верное направление

    -- gpio-encoder.lua
    gpio = fr.client.gpio -- алиас
    
    current = 0 -- сам счетчик. Просто глобальная переменная
    
    function main( argv ) 
         
        fr.run( ) -- нужно ждать события, скажем не завершать исполнение после  main
    
        -- откроем 3 пина 2, 4 - IN 3 - OUT
        local A = assert(gpio.export( 2, "in"  ))
        local O = assert(gpio.export( 3, "out" ))
        local B = assert(gpio.export( 4, "in"  ))
    
        -- для пинов A и B установим edge в значение both
        assert(A:set( "edge", "both" ))
        assert(B:set( "edge", "both" ))
    
    end
    

    Если такой скрипт исполднить lua_client'ом, то делать он не будет ничего, кроме того, что получит объекты для работы с пинами, а потом прибьет их сборщиком мусора.

    Добавлю-ка я ему обработку события. Тут сделаю так (я видел в интернетах, что у народа довольно большие проблемы с энкодерами и логикой работы с ними. Хотя ничего страшного и сложного нет):

    Оба события будет обрабатывать один и тот же обработчик. Можно сделать ДВА разных обработчика, но получится длинее и не уверен, что проще. В параметры обработчику будет передаваться признак того, какой именно пин сработал. false - сработал пин A, true - пин B. Мысль дальше: Чтобы понять как вращается ручка, в момент установки пина на 1, нужно уметь получить состояние другого пина, если оно установлено в 1, значит мы должны увеличить или уменьшить счетчик.

    Если мы в обработчике пина B и пин A изменен, то мы вращаем по часовой стрелке и нужно прибавить и наоборот. добавим это в код:

    • pin - false(А) или true(B)
    • states - таблица, которая изначально имеет такой вид: {[false] = 0, [true] = 0}
    • то есть оба состояние выставлены на 0
    function change_handler( data, pin, states )
    
        -- directions это просто вспомогательная таблица 
        --            суть ее в том, что в случае вращения по часовй стрелке
        --            к счетчику будет прибавляться 1, а против -- -1
        local directions  = { [false] = -1, [true] = 1 }
        states[pin] = data.value -- установит состояние текущего пина в текущее значение
    
        -- states[not pin] - состояние соседнего пина
        -- если текущий пин установлен и соседний тоже установлен
        if data.value == 1 and states[not pin] == 1 then
            current = current + directions[pin] -- прибавим или отнимем
            print( current ) 
        end
    end
    и того полный скрипт выглядит так:
    
    -- gpio-encoder.lua
    gpio = fr.client.gpio
    
    current = 0
    
    function change_handler( data, pin, states )
    
        local directions  = { [false] = -1, [true] = 1 }
        states[pin] = data.value
    
        if data.value == 1 and states[not pin] == 1 then
            current = current + directions[direct]
            print( current ) 
        end
    end
    
    function main( argv ) 
         
        fr.run( )
        
        local states = {[true] = 0, [false] = 0}
        local A = assert(gpio.export( 2, "in"  ))
        local O = assert(gpio.export( 3, "out" ))
        local B = assert(gpio.export( 4, "in"  ))
       
        assert(A:set( "edge", "both" ))
        assert(B:set( "edge", "both" ))
    
        -- подпишемся на события от GPIO
        assert(A:subscribe( "on_changed", change_handler, false, states, A )) -- пин А false
        assert(B:subscribe( "on_changed", change_handler, true, states, B ))  -- пин B true
    
    end
    

    Теперь код можно сохранить (например как gpio-encoder.lua) и выполнить lua_client'ом. 192.168.1.11:12345 - адрес и порт малины. Если при открытии не вылетело никаких ошибок, то можно покрутить ручку после запуска.

    $ lua_client -s 192.168.1.11:12345 -e gpio-encoder.lua
    1
    2
    3
    4
    5
    4
    3
    2
    1
    0
    -1
    -2
    -3
    -4
    -3
    -2
    -1
    0
    1
    2
    1
    0
    -1
    

    Работает! Можно использовать.

    PS: а нет никакого PS.


  • Пытаемся смотреть IPTV на Raspbian.
    piP pi

    Я решил закончить свои эксперименты по поводу просмотра IPTV на Raspberry Pi.

    Представляю полученные результаты.

    И так, имеем в наличии:

    • -Raspberry Pi с установленной ОС Raspbian сборки от 16.08.2012;
    • -подключенная лицензия на кодеки MPEG2 и VC1;
    • -штатный медиаплеер OMXplayer;
    • -установленные медиаплееры XINE-UI и VLC-player;
    • -провайдерская мультикаст-трансляция каналов IPTV (простые и FULL-HD каналы).

    Хотя видеопоток успешно подхватывался всеми перечисленными медиаплейерами, XINE и VLC оказались на данный момент абсолютно непригодные для этой задачи в виду того, что пока их сборки не используют GPU. Трансляция велась со скоростью не более 1-5 кадров в секунду при 100% загрузке процессора. Даже если эти плееры запускать не из LXDE.

    Консольный OMXplayer гораздо лучше справился с этой задачей. Благо его научили работать с GPU.

    Но всё равно, его работу можно назвать удовлетворительной лишь с натяжкой.

    Первая проблема- у меня неполучилось скормить ему плейлист. Пришлось каждый канал запускать в ручную. Но это в принципе не так критично. Гораздо более критичным оказался недостаток памяти в Raspberry Pi.

    Каналы в формате FULL-HD, транслирующиеся в формате h.264, оказались ему не по зубам.

    Картинка возникает на 1-2 секунды (правда картинкой её назвать сложно- более половины экрана разбито на кубики), после этого плеер вылетает с пожеланиями "всего хорошего".

    С обычными каналами, транслирующимися в формате MPEG2, плеер в общем-то справляется более-менее. Но опять же, относительно чистой картинки получилось добиться лишь на каналах, которые транслируются с уменьшенным разрешением. На каналах, транслирующихся в обычном разрешении (720 точек), по экрану периодически пробегают квадратики. Т.е. Raspberry не успевает уверенно декодировать этот поток налету.

    Увеличение частоты процессора до 800МГц абсолютно никак не влияет на качество картинки. HD-каналы так-же вылетают, а простые- всё так же квадратятся.

    Играться с оверклокингом GPU и памяти я не стал. Ибо сильно сомневаюсь, что прирост производительности в 10% исправит ситуацию.

    На этом я свои эксперименты завершил. На данный момент Raspberry Pi невозможно использовать для нормального просмотра IPTV используя штатные средства ОС Raspbian. Остаётся надеяться на то, что кто-нибудь напишет специализированный плагин для просмотра IPTV под XBMC, или создаст оптимизированную сборку, выделив максимум ресурсов IPTV-плееру.

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

    1. Перераспределите память в пользу GPU, через raspi-config.

    2. OMXplayer запускайте из терминала, не запуская LXDE.

    3. Чтобы плеер увидел мультикаст-поток, адреса нужно изменять.

    Например, в плейлисте моего провайдера адреса каналов представлены в таком виде:

    rtp://@239.1.1.24:1234
    

    Для плеера этот адрес должен выглядеть так:

    udp://239.1.1.24:1234
    

    Т.е. чтобы посмотреть этот канал, я ввожу следующую команду:

    omxplayer udp://239.1.1.24:1234
    

    Далее плеер задумывается на 5-10 секунд, потом выводит информацию о найденном потоке и его характеристиках и ещё секунд через 5 начинается трансляция.

    Выйти из трансляции можно нажатием клавиши Q

    Вот в общем то и всё, что я хотел сказать.

    Попробуйте сами, может вы добъётесь более положительных результатов.


  • радио ТЕХНО-ДИЗАЙН по радиолюбительски
    piP pi

    В итоге дискуссий по теме "GPIO для чайников (часть 5-продолжение)" получился вот такой интернет-приемничек, с дизайном без претензий на международную выставку.
    ba180a90-5886-4f1a-bc6b-a6605672bdb9-image.png


  • Новая жизнь старого кассетника
    piP pi

    Завалялся у меня старый проигрыватель дисков, кассет и т.д. – старый стал, лазер подсел, даже на максимальном токе диски уже не читал. Да и морально устарел – ни тебе MP3, ни USB. Но сделан был добротно, посему и выкинуть жалко было. Валялся в подвале, место занимал. Но благодаря гениально-простому применению ARM-а английскими инженерами, наличию свободного времени в связи с отсутсвием загрузки в проектах, решил я вдохнуть жизнь с железяку, безмолвно просившую меня открытой крышкой дископриемника.

    Да в принципе, я уже давно задумывался об устройстве, позволяющем мне слушать радио на русском/украинском языках, ввиду отсутсвия наличия эфирного радио на оных.
    80bbc764-3651-421b-9745-267e57089871-image.png

    Проигрыватель был успешно принесен из подвала и разобран для идентификации нужных входов/выходов. А нужно мне было не много – 5В и вход стерео на усилитель мощности. В принципе, это заняло найбольшую часть времени, потраченного на конструирование – без осцилографа при помощи одного только мультиметра ... Но, метод научного тыка доказал свою эффективность и необходимые входы были найдены. Правда вместо необходимых 5 В нашел только 13В, посему пришлось ставить КРЕН на 5В/1А, соответственно лишние 4..8Вт пришлось рассеивать, благо под рукой оказался радиатор из старого блока питания. Ну, зато дёшево

    2d033f36-0d4e-489e-9366-b850263740a4-image.png

    Дополнительно поставил релюшку – 13 вольт брались непосредственно с блока питания и в стендбае не отключались. Итак, привод диска – на выкинштейн. Плату управления – туда-же. Освобождаем место под радиатор. Закрепляем «малинку» винтами к корпусу. Между делом паяем блок управления и индикации (во как), состоящее из одного светодиода и двух кнопок, подтягиваем к +3.3В, чтобы противостоять наводкам от ВиФи (в «GPIO для чайников» все подробно описано).

    dc8efba6-e963-4b37-a709-da18be90db17-image.png

    За основу программногообеспечения берем примерчик из 5го урока и модифицируем следующим образом:

    А) список каналов держим в отдельном файле – в этом случае можно просто обновлять файл без перекомпиляции программы. Думаю, нет смысла приводить код, стандартные файловыеоперации

    Б) добавляем обработку второй кнопки (одна кнопка щелкает каналы вперед, другая – назад)

    int do_parent (int fd, pid_t p, int n)
    {
        signed char key_pressed =0;
        while(!key_pressed)   {
    
          if (bcm2835_gpio_lev(KEY_UP)) key_pressed = INCREASE_STATION;
          if (bcm2835_gpio_lev(KEY_DN)) key_pressed = DECREASE_STATION;
          if (key_pressed) printf("Key : %d\n", key_pressed);
    
        }
    

    В) Когда переключаемся на другой канал – гасим светодиод . В случае успешного захвата канала – зажигаем светодиод. Достаточно тривиально.

    Г) для автостарта пришлось вводить искусственную задержку в пару секунд – я подозреваю, что вайфаю нужно пару секунд, чтобы законектиться. Если в это время стартует плеер, программа подвисает.

    02578143-c7c6-4246-864b-06e2bf691365-image.png


  • Обновление форума
    piP pi

    Форум обновился.
    Старые сообщения удалось перенести, но информация об авторах сообщений утеряна.
    Поэтому у всех старых сообщений один и тот же автор


  • Ультразвуковой глубиномер
    piP pi

    По воздуху то будет работать, а в воду не засунете!


  • who am i...
    piP pi

    Таки да, что-то притихло слегонца!


  • Не запускается raspberry pi 3B Ver1.2
    piP pi

    Но что видно на экране?

    Уточняю. Вы это сделали:

    1. Подключили телевизор к HDMI разъёму малинки
    2. Подключили клаву к одному USB порту
    3. Подключили мышку к другому USB

    И что видно на экране? Если с питанием всё нормально, а разноцветный квадрат НЕ появляется, то (скорее всего) у вас SD-карточка не загрузочная. Достаньте где нибудь заведомо нормальную карточку и попытайтесь загрузиться с неё.


  • Не запускается raspberry pi 3B Ver1.2
    piP pi

    Может образ ОС не тот записал на карту?
    Образы для 4ки не будут работать на тройке


  • MAX6675
    piP pi

    Описание

    К SPI видимо
    SCK - GPIO 11
    CS - CE0/CE1
    SO - GPIO9
    Vcc - к питанию (первый или второй пин, в зависимости от того, сколько нужно 5 или 3.3В)
    Gnd- Gnd


  • не устанавливается ПО
    piP pi

    Что-то активность на форуме упала!?


  • не устанавливается ПО
    piP pi

    Весь этот огромный лог состоит из повторяющихся участков, в которых пишется:

    Internal Server Error  500    # На сервере, к которому Вы обращаетесь, возникла ошибка. 
    [IP: 93.126.105.202 80]         #  Вот IP этого сервера
     Error reading from server.  # Ошибка возникла при чтении файла
    Failed to fetch                          #  На сервере нет вот этого файла
    http://fastmirror.pp.ua/raspbian/raspbian/pool/main/libx/libxss/libxss1_1.2.3-1_armhf.deb 
    Remote end closed connection   # После этого сервер закрывает соединение.
    

    Можно сделать два предположения:

    1. Ваш инсталлятор не адекватен репозитарию
    2. Сервер грохнулся.

    Что из них истина - это надо разбираться.

    @sokol#6866 fastmirror.pp.ua

    Но этот URL наводит на грустные размышления.


  • не устанавливается ПО
    piP pi

    @sv-lary#6865
    Ок, это мой первый опыт с малинкой.

    по этапно что я делаю:
    записываю на флешку образ 2022-01-28-raspios-bullseye-armhf-lite

    закидываю на флешку файл ssh и файл wpa_supplicant.conf, в котором прописанно:

    country=UA
    ctrl_interface=DIR=/var/run/wpa_supplicant GROUP=netdev
    update_config=1
    network={
            ssid="логин"
            psk="пароль"
            key_mgmt=WPA-PSK
    }
    

    логин и пароль естественно подставленны от сети ви-фи.
    далее захажу через PuTTY в командную строку распберри, делаю три команды по очереди:

    sudo apt-get update
    sudo apt-get upgrade
    sudo apt-get install fluidsynth
    

    и вот что получаю:

    pi@raspberrypi:~ $ sudo apt-get update
    Get:1 http://raspbian.raspberrypi.org/raspbian bullseye InRelease [15.0 kB]
    Get:2 http://archive.raspberrypi.org/debian bullseye InRelease [23.5 kB]
    Get:3 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf Packages [13.2 MB]
    Get:4 http://archive.raspberrypi.org/debian bullseye/main armhf Packages [250 kB]
    Fetched 13.5 MB in 11s (1,264 kB/s)
    Reading package lists... Done
    pi@raspberrypi:~ $ sudo apt-get upgrade
    Reading package lists... Done
    Building dependency tree... Done
    Reading state information... Done
    Calculating upgrade... Done
    The following packages will be upgraded:
      libcamera-apps-lite libcamera0 libcryptsetup12 libexpat1 libwbclient0
      raspi-config rpi-eeprom
    7 upgraded, 0 newly installed, 0 to remove and 0 not upgraded.
    Need to get 2,935 kB of archives.
    After this operation, 1,599 kB of additional disk space will be used.
    Do you want to continue? [Y/n] y
    Get:1 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera0 armhf 0~git20220201+e96d0201-1 [547 kB]
    Get:4 http://archive.raspberrypi.org/debian bullseye/main armhf libcamera-apps-lite armhf 0~git20220131+7ac5197-1 [239 kB]
    Get:2 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libwbclient0 armhf 2:4.13.13+dfsg-1~deb11u3 [294 kB]
    Get:6 http://archive.raspberrypi.org/debian bullseye/main armhf raspi-config all 20220126 [30.2 kB]
    Get:7 http://archive.raspberrypi.org/debian bullseye/main armhf rpi-eeprom armhf 13.8-1 [1,529 kB]
    Get:3 http://raspbian.raspberrypi.org/raspbian bullseye/main armhf libcryptsetup12 armhf 2:2.3.7-1+deb11u1 [222 kB]
    

  • не устанавливается ПО
    piP pi
    1. Большая просьба - никогда не формируйте свои вопросы с использованием скриншотов. Только текстовые копии. Скриншот невозможно загрузить в текстовый редактор, процитировать что-то из него и что-то искать.
    2. "При попытке установки" - Вы не написали самое главное - как Вы пытались выполнить установку? Какой же Вы ждёте ответ?!
    3. Разглядывая картинку (!) можно увидеть, что выдаётся сообщение "internal server error" (это я набирал вручную, глядя на картинку) которое говорит о том, что проблемы не у Вас, а на сервере, к которому Вы обращаетесь. Я не знаю, что это за сервер и зачем Вы к нему обращаетесь. Но проблема - там.

    Кстати говоря, на моей "малинке" этот синтезатор установлен по умолчанию. Я его вручную не устанавливал. Но, если у Вас его почему-то нет, то может быть "как все - по камушкам":

    1. В главном мею выбираем "Настройки"
    2. Add / Remove software
    3. В строке поиска пишем fluidsynth
    4. В строке с найденной программой взводим галку
    5. Нажимаем "Ок"

    Ну если у Вас не устновлена никакая графическая оболочка, то в командной строке введите

    sudo apt-get install    fluidsynth
    

    И всех делов...


  • Отключение ИК подсветки на камере
    piP pi

    Честно говоря, я подробности не вникал, но мне кажется, что такая конфигурация, как у Вас - это просто механическая комбинация камеры OV5647 и двух IR светильников. Вот таких:

    Screenshot from 2024-11-27 05-23-25.png

    Каждый светильник имеет свой датчик освещённости и, при снижении освещённости ниже порога, включает подсветку. Автоматически. А с платой камеры он связан всего двумя проводниками - питанием. Так что, если Вы хотите просто отключить подсветку - выкиньте нафиг эти фонарики и всё. Они 300 р стоят. А если Вы хотите их включать и выключать по командам из малинки, то тогда (мне кажется) надо оторвать плюсовую ногу светильника от питания камеры и завести её на любую ножку GPIO.


  • Отключение ИК подсветки на камере
    piP pi

    @sv-lary#6861 да, такая


  • Отключение ИК подсветки на камере
    piP pi
    • "чебурашка с ушами ИК прожектори и объективом сразу из платы"

      Вот это ?

    https://aliexpress.ru/item/32724553264.html?algo_expid=25e01597-f676-4d39-ac1d-0540ac99fe2b-14&algo_pvid=25e01597-f676-4d39-ac1d-0540ac99fe2b&sku_id=61231506767&spm=a2g0v.search0302.3.124.72a1c922BBy3oX&ws_ab_test=searchweb0_0%2Csearchweb201602_0%2Csearchweb201603_0%2CppcSwitch_0


  • Отключение ИК подсветки на камере
    piP pi

    @sv-lary#6858 да вот хз, загуглил омни и сони, по фото у меня что-то иное, чебурашка с ушами ИК прожектори и объективом сразу из платы, вокруг объектива нет площадки


  • Отключение ИК подсветки на камере
    piP pi

    Какая камера?

    • OmniVision OV5647
    • Sony IMX219
    • USB камера?

  • Замкнул пины
    piP pi

    Включи на 10 секунд. Выключи. Потрогай чип процессора. Если резко сильно нагрелся, то точно всё.

    Если чип процессора жив, то замерь выходные напряжения с PMIC чипа MXL7704.
    Описание
    Если будет не как на картинке, то чип умер. Закажи новый на aliexpress'е и попроси ремонтников телефонов поменять, если сам паять не умеешь такие компоненты

  • 1
  • 2
  • 12
  • 13
  • 14
  • 15
  • 16
  • 313
  • 314
  • 14 / 314
  • Войти

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

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