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

pi

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

Сообщения

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

  • Удаленное управление. I2C. Сломаный акселерометр.
    piP pi

    Приветствую!

    Сегодня я расскажу, как на ferro_remote удаленно сделать i2cdump. i2cdump это мелкая утилита, которая берет номер шины I2C, адрес устройства и дампит на консоль значения всех его регистров.

    Для примера я возьму акселерометр на чипе mma7660fc. К большому сожалению девайс издох, и поэтому показывает всякую хрень вместо нормальных значений. Хотя есть вариант, что я что-то не так сделал с подключением. Но так как раньше он работал исправно, считаю, что он сломан. Но не важно. Сломаность акселерометра не мешает показать работу i2cdump.

    Я уже его воткнул, включил (установка 7 регистра в значение 1) и делаю штатный вызов на самой распберри: 0x4c - адрес устройства (можно получить при помощи i2cdetect, например)

    $ sudo i2cdump -y 1 0x4c
    No size specified (using byte-data access)
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 18 18 18 18 18 18 18 18 18 18 18 18 57 17 17 17    ????????????W???
    10: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ????????????????
    20: 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    30: 18 18 18 18 18 18 18 18 18 18 18 18 17 17 17 17    ????????????????
    40: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ????????????????
    50: 17 17 17 17 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    60: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    70: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    80: 18 18 18 18 18 18 18 19 19 19 19 19 19 19 19 19    ????????????????
    90: 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19    ????????????????
    a0: 19 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    b0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    c0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    d0: 18 58 17 17 17 17 17 17 17 17 17 17 17 19 19 19    ?X??????????????
    e0: 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19    ????????????????
    f0: 19 19 19 19 18 18 18 18 18 18 18 18 18 18 18 18    ????????????????
    

    Как видно в регистрах мусор. 😞 А раньше там были вполне годные данные.

    Вот теперь такую же картинку я получу при помощи lua_client с малины.

    И так скрипт, который считает данные с устройства

    i2c = fr.client.smbus -- алиас
    
    function main( )
        local dev = assert(i2c.open(1, 0x4c)) -- откроем шину и установим адрес 0x4c
        local request = { } -- таблица с запросом. См. пояснение после кода.
        for i=0, 255 do
            table.insert( request, i ) -- таблица просто содержит значения от 0 до 255
        end
        local dump = assert(dev:read_bytes( request )) -- вызов. если он успешен,
         -- в dump мы получим таблицу, в которой будут записаны значения каждого регистра.
        while i < 256 do -- просто выведем все значения 
    	print( i, " = ", dump[i] )
    	i = i + 1	
        end
    end
    

    Про таблицу в запросе read_bytes.

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

    Данный, не слишком длинный и сложный код, читает и выводит значения всех регистров устройства.

    $ ./lua_client -s 192.168.1.11:12345 -e i2cdump.lua 
    0	 = 	23
    1	 = 	23
    2	 = 	23
    ......... skipped ....... 
    254	 = 	24
    255	 = 	24
    

    Собственно это все, что от него требовалось, но, немного прикрутив форматирование:

    i2c = fr.client.smbus
    
    function main( )
        local dev = assert(i2c.open(1, 0x4c))
        local request = {}    
         
        for i=0, 255 do
            table.insert( request, i )
        end
    
        local dump = assert(dev:read_bytes( request ))
    
        -- выведем красивую табличку с hex значениями
        io.write( "     0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f",
                  "    0123456789abcdef\n")
        local i, r, str = 0, 0, ""
    
        io.write( "00: " )
        while i < 256 do
           local b = dump[i]
           io.write( string.format('%02X ', b ) )
    
           str = str..string.char(b)
           i = i + 1
           if i % 16 == 0 then
               r = r + 16
               io.write( '   ', str:gsub('%c','.'), '\n' )
               str = ""
               if i < 256 then
                   io.write( string.format('%02X: ', r ) )
               end
           end
        end
    end
    

    Всё! 😃 Получили почти аналог i2cdump.

    PS:

    $ ./lua_client -s 192.168.1.11:12345 -e i2cdump.lua 
         0  1  2  3  4  5  6  7  8  9  a  b  c  d  e  f    0123456789abcdef
    00: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ................
    10: 18 18 18 16 16 16 16 16 16 16 16 16 16 16 16 16    ................
    20: 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16 16    ................
    30: 16 16 16 16 16 57 17 17 17 17 17 17 17 17 17 17    .....W..........
    40: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ................
    50: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ................
    60: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ................
    70: 17 17 17 17 17 17 17 17 17 17 19 19 19 19 19 19    ................
    80: 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19 19    ................
    90: 19 19 19 19 19 19 19 19 19 19 19 19 17 17 17 17    ................
    A0: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17    ................
    B0: 17 17 17 17 17 17 17 17 17 17 17 17 17 17 17 18    ................
    C0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ................
    D0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ................
    E0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ................
    F0: 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18 18    ................
    

  • Удаленное управление. SPI. spidev-test
    piP pi

    Всем привет, кто тут есть.

    Всем, наверняка, известна утилита spidev_test, которой обычно проверяют правильность работы SPI на малине или других железках с линуксами. Скачать ее можно, например, тут.

    После скачивания и удачной сборки, можно включить SPI на raspberry (через raspi-config) и замкнуть 2 пина SPI_MOSI и SPI_SOMI (Master Out Slave In и Slave Out Master In) и выполнить то, что собралось в предыдущем шаге.

    Тут есть подробнее

    Должно получиться что-то типа

    ./spidev_test -D /dev/spidev0.0
    spi mode: 0
    bits per word: 8
    max speed: 500000 Hz (500 KHz)
    
    FF FF FF FF FF FF
    40 00 00 00 00 95
    FF FF FF FF FF FF
    FF FF FF FF FF FF
    FF FF FF FF FF FF
    DE AD BE EF BA AD
    F0 0D
    

    Это же самое можно сделать на ferro_remote.

    Для начала открою spi

    spi = fr.client.spi -- alias
    local dev = assert(spi.open(0, 1)) -- откроем устройство 
    Теперь нужно передать в устройство какие-то данные. Я возьму кусок, прям из spidev_test
    
    local inbuf = "\xFF\xFF\xFF\xFF\xFF\xFF\x40\x00"..
                  "\x00\x00\x00\x95\xFF\xFF\xFF\xFF"..
                  "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"..
                  "\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x0D"
    

    И далее просто сделаю вызов transfer из таблицы dev

    local res = dev:transfer( inbuf )
    

    В res придет уже то, что вернула железка. Если все правильно настроено, то результат должен быть ровно тем же, что и у spidev_test. Для этого добавил функцию hex_dump, которая возьмет строку и выведет ее в красивый вид на консоль.

    Итого получилось:

    spi = fr.client.spi
    
    function hex_dump(buf)
        for i=1,math.ceil(#buf/16) * 16 do
            if (i-1) % 16 == 0 then 
                io.write(string.format('%08X  ', i-1)) 
            end
            io.write( i > #buf and '   ' or string.format('%02X ', buf:byte(i)) )
            if i %  8 == 0 then 
                io.write(' ') 
            end
            if i % 16 == 0 then 
                io.write( buf:sub(i-16+1, i):gsub('%c','.'), '\n' ) 
            end
        end
    end
    
    function main( ) 
        local inbuf = "\xFF\xFF\xFF\xFF\xFF\xFF\x40\x00"..
                      "\x00\x00\x00\x95\xFF\xFF\xFF\xFF"..
                      "\xFF\xFF\xFF\xFF\xFF\xFF\xFF\xFF"..
                      "\xFF\xFF\xFF\xFF\xFF\xFF\xF0\x0D"
        local dev = assert(spi.open(0, 1))
        local res = dev:transfer( inbuf )
        print( "Input: " )
        hex_dump( inbuf )
        print( "Result:" )
        hex_dump( res )
    end
    

    Это весь код.

    Теперь подключимся к агенту, который запущен на малине и посмотрим. Пины разомкнуты:

    $ ./lua_client -s 192.168.3.1:12345 -e spidev-test.lua 
    Input: 
    00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
    00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.
    Result:
    00000000  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    00000010  00 00 00 00 00 00 00 00  00 00 00 00 00 00 00 00  ................
    

    А теперь замкнуты:

    $ ./lua_client -s 192.168.3.1:12345 -e spidev-test.lua 
    Input: 
    00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
    00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.
    Result:
    00000000  FF FF FF FF FF FF 40 00  00 00 00 95 FF FF FF FF  ������@....�����
    00000010  FF FF FF FF FF FF FF FF  FF FF FF FF FF FF F0 0D  ���������������.
    

    Все как и должно быть.


  • Удаленное управление. I2C. Гироскоп.
    piP pi

    bddbe4c6-038d-4470-9cc5-e89aea4527db-image.png
    И снова здравствуйте.

    Раз уже сайт совсем умер, то напишу, пожалуй, ещё...А ну, как оживет.

    По случаю достал гироскоп на чипе L3G4200D, которым можно управлять как по I2C, так и по SPI. Даташит приводить на него, думаю, не стоит, потому как это легко гуглится. При помощи интерфейса i2c буду получить от него какие-нибудь сведения. Например значения по x, y и z. Что ж еще нужно от гироскопа?

    Сначала некоторые константы:

    адрес по-умолчанию = 0x69 (можно обнаружить прямо на малине при помощи, например i2cdetect)

    5 контрольных регистров 0x20..0x24

    Регистры значений X, Y, Z соответственно (0х28, 0х29), (0х2A, 0х2B), (0х2C, 0х2D). Значения занимают каждый по 2 байта в таком виде (Low, High).

    Lua:

    device_address	= 0x69
    ctrl_regs	= { 0x20, 0x21, 0x22, 0x23, 0x24 }
    
    R_xL = 0x28
    R_xH = 0x29
    
    R_yL = 0x2A
    R_yH = 0x2B
    
    R_zL = 0x2C
    R_zH = 0x2D
    

    Чтоб было интереснее сделаем метатаблицу lua для работы с данным чипом. Чтоб работать с гироскопом, как с отдельным объектом.

    i2c = fr.client.smbus -- псевдоним для клиента smbus
    
    -- пустая таблица без ничего.
    L3G4200D = { }
    
    -- метод new, который вернут новый экземпляр таблицы
    L3G4200D.new = function( ) 
        inst = { }
        for k, v in pairs(L3G4200D) do 
            inst[k] = v 
        end
        -- откроем девайс и сохраним его в нашей таблице.
        inst.i = assert(i2c.open( 1, device_address ))
        -- это метатаблица
        setmetatable( inst, L3G4200D )
        return inst
    end
    

    теперь можно сделать что-то типа

    local r = L3G4200D.new( )
    

    Код создаст экземпляр таблицы, откроет девайс и если все нормально, с ним можно работать.

    для того, чтоб настроить на работу устройство, добавлю функцию setup

    -- настройка состоит в том, чтоб записать нужные регистры нужными значениями. 
    L3G4200D.setup = function( self, scale ) 
        -- настроим таблицу. write_bytes ожидает таблицу, в которой указано [регистр]=значение
        local data = { 
    	[ctrl_regs[1]] = 15, -- включим
    	[ctrl_regs[2]] =  0, -- нормальный режим. По-умолчанию 
    	[ctrl_regs[3]] =  8, 
    	[ctrl_regs[4]] = scale_values[scale], -- установка scale
    	[ctrl_regs[5]] =  0 -- по-умолчанию
        }
        -- запишем. 
        assert(self.i:write_bytes(data))
    end
    

    Если не сработал assert, то гироскоп будет включен и готов к чтению данных. Функция для чтения тоже довольно проста

    -- табица для чтения. read_bytes ожидает в таблице номера регистров для чтения.
    read_xyz_data = { R_xL, R_xH, R_yL, R_yH, R_zL, R_zH }
    L3G4200D.read_xyz = function( self )
        -- читаем
        local res = assert(self.i:read_bytes( read_xyz_data ))
        -- возвращаем таблицу с уже поправленными значениями { x = ..,y = .., z = .. }
        return { x = res[R_xH] << 8 | res[R_xL],
                 y = res[R_yH] << 8 | res[R_yL],
                 z = res[R_zH] << 8 | res[R_zL] }
    end
    

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

    i2c = fr.client.smbus
    eq  = fr.client.event_queue -- для работы с очередью событий клиента
    eqt = eq.timer  -- таймеры клиента
    
    device_address	= 0x69
    ctrl_regs	= { 0x20, 0x21, 0x22, 0x23, 0x24 }
    scale_values	= { [250]=0, [500]=16, [2000]=48 }
    
    R_xL = 0x28
    R_xH = 0x29
    
    R_yL = 0x2A
    R_yH = 0x2B
    
    R_zL = 0x2C
    R_zH = 0x2D
    
    read_xyz_data = { R_xL, R_xH, R_yL, R_yH, R_zL, R_zH }
    
    L3G4200D = { }
    
    L3G4200D.new = function( ) 
        inst = { }
        for k, v in pairs(L3G4200D) do 
            inst[k] = v 
        end
        inst.i = assert(i2c.open( 1, device_address ))
        setmetatable( inst, L3G4200D )
        return inst
    end
    
    L3G4200D.setup = function( self, scale ) 
        -- setup table for write
        local data = { 
    	[ctrl_regs[1]] = 15,
    	[ctrl_regs[2]] =  0,
    	[ctrl_regs[3]] =  8,
    	[ctrl_regs[4]] = scale_values[scale],
    	[ctrl_regs[5]] =  0 
        }
        -- write registry
        assert(self.i:write_bytes(data))
    end
    
    L3G4200D.read_xyz = function( self )
        local res = assert(self.i:read_bytes( read_xyz_data ))
        return { x = res[R_xH] << 8 | res[R_xL],
                 y = res[R_yH] << 8 | res[R_yL],
                 z = res[R_zH] << 8 | res[R_zL] }
    end
    
    -- функция таймера, которая вычитает данные и выведет их на консоль
    function show_values( err, dev ) -- первый параметр - ошибка таймера. при нормальной работе err=nil
        if nil == err then  
            local values = dev:read_xyz( ) -- вычитаем
    	print( "X:", values.x, 
                   "Y:", values.y, 
                   "Z:", values.z )        -- ... и выведем
    	eqt.post( show_values, {milli=100}, dev ) -- поставим новое задание в таймер на 100 milliсекунд
        else -- если ошибка 
    	fr.exit(err) -- завершимся. fr.exit( ) остановит очередь
        end
    end
     
    function main( )
        fr.run( ) -- запустим очередь событий
        local r = L3G4200D.new( ) -- откроем устройство
        r:setup(2000) -- настроем устройство
        show_values( nil, r ) -- запустим вывод.
    end
    

    теперь можно проверить: 192.168.1.3:12345 - адрес и порт агента на малине. Запущу и подвигаю железку немного.

    $ ./lua_client -s 192.168.1.3:12345 -e L3G4200D.lua 
    X:	129	Y:	500	Z:	65489
    X:	50	Y:	65468	Z:	65508
    X:	26	Y:	4	Z:	14
    ...............
    X:	34869	Y:	37125	Z:	21348
    X:	57781	Y:	65259	Z:	3636
    X:	32752	Y:	32752	Z:	32832
    ...............
    X:	76	Y:	78	Z:	23
    X:	73	Y:	7	Z:	11
    X:	78	Y:	62	Z:	65519
    X:	48	Y:	65495	Z:	45
    X:	14	Y:	4	Z:	6
    ^C
    

    На этом все, спасибо за внимание.

    PS: скрипт можно взять тут

    PPS: Добавил в пример получение значения температурного регистра: 0x26


  • Windows приложения на Raspberry Pi 2
    piP pi

    Доброе утро!

    Мы разработчики ОС для тонких клиентов WTware.

    Недавно выпустили бесплатную версию WTware для Raspberry Pi 2. Теперь малину можно использовать как тонкий клиент, подключать к терминальному серверу Windows и работать с Windows-приложениями на Raspberry Pi 2 как на обычном x86 компьютере.

    Предлагаем попробовать: http://winterminal.com/ru/


  • Подключаем камеру к Raspberry Pi
    piP pi

    Краткая инструкция по подключению и использованию аппаратной камеры для Raspberry Pi
    Обратите внимание, что камера может быть повреждена статическим электричеством. Перед тем, как достать камеру рекомендуется дотронуться до заземлённого объекта (например до радиатора батареи отопления), чтобы снять заряд. Камера подсоединяется к плате при помощи гибкого шлейфа. Разъём для шлейфа находится между Ethernet и HDMI портами. Объектив камеры может быть закрыт прозрачной защитной плёнкой, перед использованием её нужно удалить.

    9cd2e054-53ef-424e-a0fd-58d8948bd9cb-image.png

    Включаем поддержку камеры в Raspbian

    Загрузите Raspberry Pi и осуществите вход в систему (по умолчанию имя пользователя - pi , пароль - raspberry ).
    В терминале выполните команды для обновления дистрибутива Raspbian до последний версии:

    sudo apt-get update
    sudo apt-get upgrade
    

    Далее командой sudo raspi-config запускаем программу настройки и в строке меню camera выбираем enabled , после чего перезагружаем RPi.

    816a11ea-2ef5-4eb5-9595-c0fb0695f585-image.png

    Программное обеспечение для работы с камерой

    • raspivid консольное приложение для записи видео с камеры.

    • raspistill приложения для получения изображений с камеры параметры -o или –output определяют имя выходного файла -t или –timeout длительность записи видео (по умолчанию 5 секунд) -d или –demo запись в режиме демонстрации возможностей. Будут использованы все возможные эффекты

    Примеры:

    raspistill -o image.jpg
    

    захват изображения в .jpg формате

    raspivid -o video.h264
    

    захват 5-ти секундного видео в формате h264

    raspivid -o video.h264 -t 10000
    

    захват 10-ти секундного видео в формате h264

    raspivid -o video.h264 -t 10000 -d
    

    захват 10-ти секундного видео в формате h264 в режиме демонстрации возможностей

    Посмотреть все возможные параметры для приложений raspivid и raspistill можно следующим образом:

    raspivid | less, raspistill | less
    

    Используйте курсор для перемещения по списку или введите "q" для выходаПодробное описание параметров для программного обеспечения камеры можно найтитут

    Передача потокового видео по сети

    Для передачи видео выполняем на Raspberry Pi команду

    raspivid -t 999999 -o - | nc [IP адрес клиента] 5001
    

    Для просмотра видео на клиенте необходимо установить mplayer и netcat и запустить их следующим образом

    nc -l -p 5001 | mplayer -fps 31 -cache 1024
    

    для Linux

    для Windows

    [путь к nc.exe]\nc.exe -L -p 5001 | [путь к mplayer.exe]\mplayer.exe -fps 31 -cache 102
    

    Скачать MPlayer для Windows

    Скачать Netcat для Windows

    Для Linux'а соответственно скачиваете из репозиториев своих дистрибутивов
    Если у вас ещё нет камеры для Raspberry Pi, то приобрести можно тут


  • Подключаем датчик температуры к шине данных i2c
    piP pi

    Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

    ответ
    Люди, подскажите где мы берем коэффициент 0,125 на который умножаем. Никак не могу понять…

    из документации к датчику

    1. If the Temp data MSByte bit D10 = 0, then the temperature is positive and Temp value (°C) = +(Temp data)×0.125°C.
    2. If the Temp data MSByte bit D10 = 1, then the temperature is negative and Temp value (°C) =−(2’s complement of Temp data)×0.125°C.

  • Подключаем датчик температуры к шине данных i2c
    piP pi

    ответ
    Люди, подскажите где мы берем коэффициент 0,125 на который умножаем. Никак не могу понять…


  • Подключаем датчик температуры к шине данных i2c
    piP pi

    Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

    а нельзя ли использовать внутреннюю подтяжку линий к + питания?

    Если температура отрицательная, то бит D10 старшего байта температурного регистра будет равен 1, т.е если значение старшего байта регистра температуры >127. В этом случае температура будет вычислять следующим образом: значение регистра температуры приводится к дополнительному коду (dop_code=~temp_registry_value+1), сдвигается на 5 разрядов вправо и умножается на 0.125: temp = (dop_code>> 5)*0.125


  • Подключаем датчик температуры к шине данных i2c
    piP pi

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


  • Подключаем датчик температуры к шине данных i2c
    piP pi

    Пользователь @pi написал в Подключаем датчик температуры к шине данных i2c:

    а нельзя ли использовать внутреннюю подтяжку линий к + питания?

    Можно. На Raspberry Pi реализована внутренняя подтяжка SDA и SCL 1,8kОм резисторами. Просто эта панелька с датчиком температуры у меня валялась давно и подключалась к плате, в которой не было внутренней подтяжки на i2c линиях


  • Подключаем датчик температуры к шине данных i2c
    piP pi

    а нельзя ли использовать внутреннюю подтяжку линий к + питания?


  • Подключаем датчик температуры к шине данных i2c
    piP pi

    i2c - шина данных для обмена информацией между устройствами. Представлена двумя линиями - линия данных SDA (второй вывод в колодке GPIO) и тактовая линия SCL (третий вывод в колодке GPIO).

    5b0015af-7fc7-49c7-bb47-2dfb38271567-image.png

    Как передаются данные по i2c на электрическом уровне я описывать не буду, это всё можно прочитать в гугле, поэтому перейдём сразу к практической части. Нам потребуется чип датчика температуры LM75A:

    737363b0-1121-4b58-a3a1-d2fd175ab108-image.png

    Поскольку чип выполнен в очень неудобном для домашнего использования форм-факторе soic-8 (очень мелкий), то нам также потребуется переходник на DIP-8,

    a16ac172-d1e7-4b5c-a358-b6f5d9aa1eef-image.png

    чтобы можно было сделать проводное соединение с Raspberry Pi. Припаиваем чип к переходнику. Линии SDA и SCL необходимо подтянуть резисторами 1кОм к питанию.В итоге конструкция должна выглядеть примерно так:

    f6d9cf7c-11d7-48e5-9ecd-4d0a5a0b9650-image.png

    59ab0dc4-2b34-48c4-8db2-d28acb0b5866-image.png

    Я использовал Raspbian по 2 причинам:

    1. В дистрибутив включены i2c драйвера в виде модулей ядра, которые остаётся лишь подгрузить командой modprobe

    2. в репозитории есть i2c-tools, которые нам потребуются для работы с датчиком температуры Итак, подгружаем модули ядра, которые позволят нам работать с i2c:

    sudo modprobe i2c-dev
    sudo modprobe i2c-bcm2708
    

    Устанавливаем i2c-tools из репозитория:

    sudo apt-get install i2c-tools
    

    В i2c-tools входят следующие утилиты:

    • i2cdetect - для определения устройств, подключенных к шине i2c
    • i2cget - для чтения данных из регистров подключенных устойств
    • i2cset - запись данных в регистры подключённых устройств

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

    i2c-detect -l
    

    Если в выводе команды отобразились доступные шины i2c (i2c-0, i2c-1), то значит можно двигаться дальше.

    Будем работать с i2c-0. Подключим датчик температуры к линиям SDA0 и SCL0, 5V питания и GND для датчика также будем брать с колодки GPIO.

    Если датчик правильно подключён, то в ответ на команду i2cdetect -y 0 мы увидим сетку, в одной из ячеек которой будет стоять адрес датчика (в моём случае 48).

    К одному ведущему (master) устройству по i2c можно подключить множество ведомых (slave), поэтому каждому ведомому устройству необходим адрес, по которому к нему будет обращаться ведущее устройство. Адрес датчика LM75A задаётся в регистре Conf

    67ef6bb3-b471-449c-8353-b66ee40f2402-image.png

    A2,A1,A0 - выводы 7,6,5 чипа LM75A(см.схему ниже). Если они присоединены к питанию, то принимают значение 1, если к земле, то 0. У меня А0 A1 A2 посажены на землю, а значит регистр, отвечающий за адрес имеет значение (1001000=0x48), что подтверждается командой i2cdetect

    60fc933b-bc3d-4b74-903c-8ee5d20fe5fb-image.png

    Теперь получим значение температуры. LM75A проводит замеры температуры каждые 100мс. Её значение хранится в регистре Temp, который состоит из двух байтов. t=(значение регистра Temp, сдвинутое на 5 битов вправо)*0.125

    a5fde0f9-df12-4a00-8e37-7d2e8cda0e2c-image.png

    Получим значение регистра:

    i2cget -y 0x48 0x00 w
    

    -y: игнорировать предупреждение о потенциальной опасности i2c-tools для вашего оборудования.

    0x48 - адрес датчика на шине i2c

    0x00 - адрес регистра Temp

    w - получить слово данных (поскольку ответ состоит из двух байтов. Для получения одного байта нужно использовать параметр b)

    в ответ мы должны увидеть значение регистра Temp. У меня это 0xa014

    0xa0 - значение младшего байта (LSByte)0x14 - значение старшего байта (MSByte) записываем в двоичной форме и сдвигаем на 5 битов вправо: 10100101=165

    165*0.125 = 20.625 градусов значение температуры на датчике.

    Запись в регистры рассмотрим в следующей статье, в которой будем управлять чипом FM приёмника по i2c


  • RISC OS- ещё одна ОС для Raspberry Pi
    piP pi

    Небольшая, шустрая, но неочень понятная ОС.

    27 октября 2012 года состоялся релиз ещё одной операционнойсистемы для Raspberry Pi. Операционнаясистема называется RISC OS. Еёразработчиками являются инженеры компании, которая собственно и разработала первыйпроцессор с архитектурой ARM. Саму ОС можно скачать по этому адресу: http://downloads.raspberrypi.org/images/riscos/riscos-2012-11-01-RC6/riscos-2012-11-01-RC6.zip

    Основными отличиями RISC OS от других операционных системявляются:

    • модульная структура, позволяющая подключать необходимые модули и отключатьненужные во время работы, обращение к модулям осуществляется при помощипрерываний, а не системных вызовов;

    • однопользовательская (кооперативная) многозадачность,большинство же других ОС использует вытесняющую многозадачность

    • файловая система построена по иному принципу, все файлыпредставляют собой тома;

    • двоичный интерфейс приложений, позволяющий изменять поведениесистемы с помощью дополнительных модулей.

    Я никогда ранее об этой ОС ничего не слышал, поэтому сразурешил её установить и посмотреть, что это такое. После скачивания архива с ОСего нужно при помощи программы DiscImager развернуть на SD-карту. Всё делается точно так же, как и при установке Raspbian. После запуска(который происходит достаточно быстро), мы попадаем на рабочий стол, выполненный в минималистском стиле.

    Скажусразу, тем, кто привык к рабочим столам Windows, или LXDE,данный рабочий стол первое время будет казаться неудобным. Некоторые вещи, ккоторым мы привыкли ранее, в RISC OS делаются несколько иначе, нужно привыкать. Например там, гдемы нажимали правую кнопку мыши, в RISC OS нужно нажимать на среднюю кнопку, иликолёсико. После запуска большинство программ не разворачиваются на экране, атолько отрисовывают свою иконку на системном трее. И уже с этой иконки посленажатия на колёсика можно уже развернуть эту программку на рабочий стол. Иногдаперед запуском нужно выбрать опции.

    Настройка системы мне тоже не показалась интуитивной, хотя ине сложной. Вероятно, первое, что вы захотите сделать, это подкорректироватьразмер рабочего стола под ваш монитор. Для этого нужно клацнуть по иконке «Configuration» на рабочемстоле. После этого раскроется панель с настройками системы. Просто так системане даёт возможности установить необходимое разрешение, по этому, придётсясначала выбрать из списка монитор, который по своим характеристикам схож свашим. Обязательно установите частоту и количество цветов, без этого система непримет изменения настроек разрешения экрана.

    Далее нужно установить сетевые настройки. Для этого нужнокликнуть по иконке Network.Я долго искал, где же находятся настройки Ethernet, но не нашёл. К выбору система предлагала лишь настройку“Ethernet over USB”.Пришлось клацнуть по ней. В настройках ткнул на DHCP и после этого сеть заработала. Для доступа к интернету в системе есть браузер«NetSurf».

    Из программ в комплекте идёт минимум простеньких программокдля работы с текстами, рисования иконок, музыкальный редактор и прочие подобныегаджеты. Установка дополнительного ПО доступна через приложение Appstore. К слову там выбортоже не особо богат. Более-менее приличные приложения стоят денег, и не сказалбы что маленьких. А бесплатное ПО больше похоже на упражнения начинающихпрограммистов. Не знаю, может со временем что и поменяется. На сайте https://www.riscosopen.org/news/articles/2012/10/26/nutpi-pack-now-available-for-the-raspberry-pi

    предлагают купить оптом за 35 фунтов пакет программ, которыепо отдельности в сумме стоят 600 фунтов. Я покопался в этих программках и не нашёлв них ничего заслуживающего внимания.

    Из языков программирования в системе идёт комплектнаяпоставка BASIC. К немуприлагается неплохой учебник и примеры программ из разных областей.

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

    Резюме: RISC OS-довольно шустрая и неприхотливая ОС. Требует привыкания к себе. С перифериейработает нормально, мне даже показалось, что мышка в этой ОС как то быстрееоткликается на все манипуляции. Аудио по качеству- средней паршивости. Видео-не нашёл чем смотреть. Софт- в комплекте ничего стоящего не идёт. Нормальныйсофт только за деньги (может быть, просто не знаю где его вообще для RISC OS брать?).Ну и главное, я так и не понял, для чего нужна эта ОС и в чём её прелесть. Нуэто каждый решает сам. Видимо, прежде чем поставить эту ОС, пользователь долженчётко осознавать для чего это ему нужно и что ему от этой ОС ожидать. А я воткнул флешку с Raspbian и с удовольствием вернулся в привычное окружение.


  • Установка игры Quake III Arena на Raspberry Pi
    piP pi

    Установка выполнялась мной на операционную систему Raspbian “wheezy”.
    00f69a23-efcb-4317-83b5-c29087e8c059-image.png

    Для того чтобы установить игру игру Quake 3 заходим в терминал и набираем:

    sudo apt-get install git gcc build-essential libsdl1.2-dev
    

    После установки нам нужно скачать исходный код игры:

    git clone https://github.com/raspberrypi/quake3.git
    

    После скачивания заходим в каталогquake3следующей командой в терминале:

    cd quake3
    

    Теперь нужно отредактировать исходный код скрипта (открываем файл в консольном текстовом редакторе nano):

    sudo nano build.sh
    

    Ищем строку (8), которая начинается на ARM_LIBS, если вы не можете ее найти, то нажмите сочетания клавиш Ctrl+W и введите ARM_LIBS. После того как вы найдете соответствующую строку измените ее. После изменения она должна иметь следующий вид:

    ARM_LIBS=/opt/vc/lib
    

    Далее таким же образом редактируем строку (16):

    INCLUDES="-I/opt/vc/include -I/opt/vc/include/interface/vcos/pthreads"
    

    И напоследок строку (19):

    #CROSS_COMPILE=bcm2708-
    

    Сохраните файл, нажав Ctrl-X и подтвердите изменения нажав "y". Теперь можно начинать процесс компиляции:

    ./build.sh
    

    Процесс компиляции занимает от 30 минут до часа.Как только компиляция файлов завершилась, Вам необходимо скачать архив файлов:

    wget http://dl.dropbox.com/u/1816557/Q3%20Demo%20Paks.zip
    

    Распаковываем файлы:

    unzip Q3\ Demo\ Paks.zip
    

    Убедитесь, что вы распаковали файлы в папку"baseq3". Дерево каталогов должно выглядеть следующим образом:/home/pi/quake3/build/release-linux-arm/baseq3Удаляем ненужный теперь нам архив следующей командой:

    rm Q3\Demo\Paks.zip
    

    Для того чтобы запустить игру Вы должны находится в соответствующей директории:

    cd /quake3/build/release-linux-arm/
    

    Если желаете настроить звук на аналоговый выход, а не на HDMI, то перед запуском выполните команду:

    sudo modprobe snd_bcm2835
    

    Для того чтобы начать введите в терминале следующее:

    sudo ./ioquake3.arm
    

    Игра просит ключ - ничего не вводите, а просто кликните на кнопку для продолжения.

    Готово! Можете наслаждаться легендарной игрой, многопользовательским шутером от первого лица - Quake 3 Arena, которая выпущена 2 декабря 1999 года!!! Удачного прохождения! 😉

    Две оригинальных статьи на английском языке: http://www.raspians.com/Knowledgebase/quake-iii-arena

    Информация об игре: http://ru.wikipedia.org/wiki/Quake_III_Arena
    Игра отлично себя ведет на Raspberry Pi Rev. 2 в обычном режиме и с 512 Мб памяти. Ну и от себя добавлю, что игра прикольная, хоть я и не заядлый геймер, но немного поиграл!


  • Удаленное управление (Ferro-Remote)
    piP pi

    Сразу прошу извинить, если стиль написания плохой. не писатель я совсем 🙂

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

    Ну а так как не хотелось пользовать всякие node.js и прочие готовые инструменты, решил немного повелосипедить. Так что про то, что "Есть же вот такая штука!" или на худой конец "ssh", я вкурсе. Велосипедил я Just For Fun

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

    В общем так родился проект, который я, недолго думая, назвал ferro-remote. Все исходники проекта можно взять тут

    Проект состоит из 2 частей:

    • agent - часть, работающая на стороне железки (малина, или другая). Агент собирается только под системы Linux;
    • Client - часть, которая соединяется с агентом и может получить доступ к ресурсам (fs, gpio, i2c...) вышеозначенной железки. Клиент, вообще, это библиотека, на основе которой можно написать что-то свое. Вполне собирается под linux, windows и не вижу причин, почему бы ей не собраться под какую-нибудь MacOS. Для примера использования я начинал делать lua-client, который оказался полезен не только как пример, но и как вполне рабочий инструмент. На это примере я и собираюсь показать что можно сделать при помощи lua и ferro-remote

    Агент.

    Агент это один исполняемый бинарник, который запускается на стороне RPi (раз уж на сайте raspberrypi пишу), открывает один или несколько серверных точек и предоставляет доступ к:

    • os: запуск консольной команды (вызов system)
    • fs: доступ к файловой системе. Итерация содержимого директорий. Доступ к содержимому файлов (чтение/запись)
    • gpio: доступ к пинам. Возвожность получения нотификаций об изменении состояния пина (разумеется для пинов, которые поддерживают данный механизм).
    • i2c: доступ к шине
      Вообще, чтоб не повторяться тут дам ссылку на ключи запуска агента. Когда есть время, наполняю wiki

    А например...

    тут напишу пару примеров работы
    Кто не хочет сам собирать агента и клиента, если готовая сборка тут.
    Там агент для малины, клиент для малины и клиент для windows. Сборки статические. Для малины нужна glibc 2.6, так что на старой прошивке работать не будет, сборка для windows не будет работать на XP, скорее всего, потому как собиралась на VS2013, которая не поддерживает XP. Скрипты будет одинаково работать как на клиенте Windows, так и на клиенте Linux.

    И так:

    Запустим агента на стороне малины:

    $ ./ferro_remote_agent -s 0.0.0.0:12345 -l-
    2015-Aug-31 13:19:07.734228 [INF] [log] Started.
    2015-Aug-31 13:19:07.734344 [INF] [lua] Started.
    2015-Aug-31 13:19:07.734842 [INF] [fs] Started.
    2015-Aug-31 13:19:07.735115 [INF] [gpio] Started
    2015-Aug-31 13:19:07.735427 [INF] [i2c] Started.
    2015-Aug-31 13:19:07.735619 [INF] [listener] tcp://0.0.0.0:12345 started
    2015-Aug-31 13:19:07.735628 [INF] [listener] Started.
    2015-Aug-31 13:19:07.735633 [INF] [main] Agent started.
    

    агент откроет 1 сервер и будет выводить логи в текущую консоль.

    А теперь я напишу скрипт, который покажет содержимое, например директории /home/data/pi

    fs = fr.client.fs -- алиасы
    iter = fs.iterator 
    
    function main(argv)
        local dir = "/home/data/pi"
        local i, err = iter.begin( dir )
        if not err then 
            while i:has_next( ) do 
    	    local path = i:get( )
    	    local stat = fs.stat( path )
    	    print( path, stat.size, "bytes" )
    	    i:next( )
    	end 
        else 
            print( err )
        end
    end
    

    Сохраню этот файл рядом с lua_client в dir.lua, например и выполню (малинка висит на 192.168.1.11):

    $ ./lua_client -s 192.168.1.11:12345 -e dir.lua 
    /home/data/pi/r.txt	0	bytes
    /home/data/pi/hello.txt	15	bytes
    /home/data/pi/img1.jpg	90540	bytes
    /home/data/pi/diff1.txt	15746	bytes
    

    Все просто. Клиент подключился, экспортировал таблицы с вызовами в lua, исполнил скрипт. В скрипте работа происходит с удаленной системой, как с локальной.

    Еще один пример - скачивание файла, чтоб показать что работа с удаленным файлом не отличается от работы с локальным:

    function main( argv )
    	
        local path = argv[1] -- параметр первый - что скачать
        local out  = argv[2] -- параметр второй - куда скачать
        if not path then return end
        if not out then
            out = "pulled.file"
        end	
    
        local fs   = fr.client.fs -- локальные 
        local file = fs.file      -- алиасы чтоб удобнее было
    
        local f, e = file.open( path, "rb" ) -- откроем удаленный файл (на малинке)
        local out, eout = io.open( out, "wb" ) -- локальный файл, куда будет писать
        if f and out then
            f:seek( 0, "end" )  -- определение размера 
            print( "file size:", f:tell( ) ) -- просто для примера работы
            f:seek( 0 )
            local d = f:read( ) -- читаем удаленный файл 
            while d do          -- пока он не кончился
                out:write( d )  -- пишем в локальный
                d = f:read( )   -- снова читаем удаленный 
            end
        else
            print( "remote error:", e, "local error:", eout )
        end
    end
    

    исполним: (параметры в скрипт передаются ключами -p клиента)

    $ ./lua_client -s 192.168.1.11:12345 -e file-pull.lua -p /home/data/pi/img1.jpg -p img.jpg
    file size:	90540
    $ ls -la 
    total 13224
    drwxrwxr-x  3 nwnclv nwnclv    4096 авг.  31 14:14 .
    drwxrwxr-x 10 nwnclv nwnclv    4096 авг.  31 11:01 ..
    ...................
    -rw-rw-r--  1 nwnclv nwnclv    1205 авг.  31 14:14 dir.lua
    -rw-rw-r--  1 nwnclv nwnclv   90540 авг.  31 14:14 img.jpg
    -rwxrwxr-x  1 nwnclv nwnclv 3775064 авг.  31 13:46 lua_client
    ...................
    

    Вот как-то так. Все довольно просто получилось.

    Ну и раз уж в тегах стоит GPIO, пример с GPIO: Возмем схему из топика GPIO для чайников (часть 1)

    Включить диод в этом случае можно примерно так:

    function main( )
        local g, e = fr.client.gpio.export( 3, "out" ) -- получим доступ к GPIO3
        if not e then 
            g:set( 0 ) -- установим значение в 0. диодик горит. 
        else 
            print( "export error:", e )
        end
    end
    

    Помимо этого можно отлавливать события с GPIO (изменения значения с 1 на 0 и наоборот) тут описал как

    А еще клиент умеет таймер, умеет внутренние события, умеет работать с I2c пример работы с акселерометром mma7660fc. Умеет работать с консолью

    Думаю, напишу еще примеров в следующих блогах. Если кому-то пригодится, буду рад замечаниями и предложениям.


  • Kali Linux для Raspberry Pi
    piP pi

    Kali Linux - специальный Linux дистрибутив, заточенный на выполнение задач, связанных с информационной безопасностью, таких как тестирование на проникновение, исследование ИБ, реверс-инжениринг.

    https://www.kali.org/get-kali/#kali-arm

    Kali-dragon-icon.svg.png


  • Raspberry Pi Pico 2W
    piP pi

    Вышла новая официальная плата Pico 2W с микроконтроллером RP2350 и WiFi+Bluetooth
    Screenshot from 2024-11-25 19-48-31.png

    Screenshot from 2024-11-25 19-43-49.png

    Сетевой модем Infineon CYW43439 обеспечивает работу в WiFi сетях 2.4GHz 802.11n, а также работу Bluetooth 5.2. Для работы с этим модемом доступно множество библиотек на C и Micropython

    Официальная цена - 7$


  • SSD
    piP pi

    Список поддерживаемых SSD дисков

    Фото Устройство CM4 Pi5 Нужен драйвер
    m2-cytron-makerdisk-nvme-2242-m-key-ssd.jpeg Cytron MakerDisk SSD NVMe 2242 M-key M.2 да да нет
    m2-kioxia-xg8-m2-nvme-ssd.jpg KIOXIA XG8 M.2 NVMe SSD да да нет
    m2-pinedrive-2242-nvme-ssd.jpeg Pinedrive NVMe SSD 256GB (2242) да да нет
    m2-raspberry-pi-ssd.jpg Raspberry Pi SSD неизвестно да нет

  • WiFi/4G/5G модули
    piP pi

    список поддерживаемых PCIe WiFi/4G/5G модулей и вопросы по их подключению


  • Внешние видеокарты
    piP pi

    список поддерживаемых внешних видеокарт и вопросы по их подключению
    инструкция по подключению

    Фото Устройство CM4 Pi5 Нужен драйвер
    gpu-radeon-hd-7470.jpg AMD Radeon HD 7470 1GB частично тест да
    gpu-amd-radeon-pro-w7700.jpg AMD Radeon Pro W7700 16G нет да да
    gpu-radeon-pro-wx2100.jpg AMD Radeon Pro WX 2100 Graphics тест неизвестно да
    gpu-amd-radeon-rx-7600.jpeg AMD Radeon RX 7600 нет да да
    gpu-radeon-rx6700xt.jpeg AMD Radeon RX 6700 XT 12GB PCIe x16 нет тест да
    gpu-radeon-rx7900xtx.png AMD Radeon RX 7900 XTX 24GB PCIe x16 нет неизвестно да
    gpu-asrock-rack-m2-vga.jpg ASRock Rack M2_VGA частично неизвестно да
    gpu-xfx-radeon-rx460-4gb.jpg XFX AMD Radeon RX 460 4GB PCIe x16 нет да да
  • 1 / 1
  • Войти

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

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