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

pi

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

Сообщения

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

  • Подключение блока сегментных индикаторов с драйвером MAX7219
    piP pi

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

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

    Драйвер MAX7219 решает эту проблему. К 1 чипу MAX7219 можно подключить до 8 семисегментных светодиодных индикаторов, управлять которыми можно по интерфейсу SPI.

    d9476e86-329b-4fb7-95d5-9851d8ce4d01-image.png

    В этой статье мы рассмотрим модуль из 8-ми индикаторов, которыми управляет MAX7219 (http://smartelectronika.com/viewproduct/82/)

    У модуля имеются 5 выходов (VCC, GND, DIN, CS, CLK). Подключаем их к Raspberry Pi следующим образом

    VCC - 5V
    GND - GND
    DIN - GPIO10 (MOSI)
    CS - GPIO8 (CE0)
    CLK - GPIO11 (SCLK)
    

    После подключения модуля приступаем к написанию управляющей программы. Для работы с SPI я использовал библиотеку wiringPi

    Сначала модуль должен пройти инициализацию. Инициализация происходит посредством записи значений в управляющие регистры:

      1. Для включения модуля записываем 0x01 в регистр Shutdown (адрес 0x07). Соответственно для выключения в этот регистр следует записать 0x00
      1. В регистр Scan Limit (адрес 0x0B) записывается значение, соответствующее количеству 7-сегментных индикаторов, подключенных к MAX7219. Для восьми индикаторов это значение будет 0x07
    • 3.Регистр Decode Mode (адрес 0x09) определяет режим работы индикаторов. Для каждого индикатора (а в нашем модуле их восемь) доступно 2 режима работы.

    Первый режим - декодер включён. В этом случае на индикаторе загорается цифра или символ, соответствующая записанному в регистр индикатора значению - например, записали в регистр 9, на индикаторе загорается 9.

    Второй режим - декодер выключен. Он нужен если требуется управлять каждым из семи сегментов индикатора по отдельности.

    Регистр Decode Mode 1-байтный. Каждый бит в регистре соответствует режиму работы соответствующего индикатора. Если в бите стоит 1, то индикатор работает в первом режиме, если 0, то во втором. Соответственно, если нужно чтобы все индикаторы работали в первом режиме то записываем в регистр 11111111 (это 0xFF в шестнадцатиричной системе)

    После инициализации, можно выводить значения на индикаторы. Это осуществляется записью значения в регистр индикатора.

    Адрес регистров идут по порядку (0x00,0x01,0x02...0x08). Информация о том, какое значение нужно записать, чтобы получить на индикаторе тот или иной символ представлена в этой таблице:

    57d28c65-8d98-40ab-bc3b-5834ee3a04de-image.png

    Например, если третий индикатор работает в первом режиме, то для вывода на индикатор цифры "2” необходимо в регистр 0x03 записать 0010 (0x02 в шестнадцатиричной системе). Для того, чтобы после цифры загорелась точка, нужно записать 1 в регистр D7 (для 2. - 10000010). В первом режиме можно выводить на индикатор цифры 0-9, точку, знак минуса, буквы E,H,L,P

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

    c9582bb9-da07-49f1-bc2f-002ba11178ce-image.png

    Если индикатор работает во втором режиме, то для того, чтобы зажечь сегмент "A" в управляющий регистр записываем 10000000

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

    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    #include 
    
    int main (int argc, char *argv[])
    {
    
    	uint8_t valueToDisplay[2];
    	uint8_t wCommand_1[2];
    	uint8_t wCommand_2[2];
    	uint8_t wCommand_3[2];
    	
    	wCommand_1[0] = 0x0C; //shutdown register
    	wCommand_1[1] = 0x01; 
    
    	wCommand_2[0]= 0x09; //decode mode
    	wCommand_2[1]= 0xFF;
    
    	wCommand_3[0]= 0x0B; //scan limit
    	wCommand_3[1]= 0x07;
    
    	wiringPiSetup () ;
    	if (wiringPiSPISetup (0, 10000000) < 0)
    	{
    		fprintf (stderr, "Unable to open SPI device 0: %s\n", strerror (errno)) ;
    		exit (1) ;
    	}
    
    	//init commands/
    	wiringPiSPIDataRW (0,wCommand_1,2);
    	wiringPiSPIDataRW (0,wCommand_2,2);
    	wiringPiSPIDataRW (0,wCommand_3,2);
    
    	//clear_screen
    	for ( int i = 1 ; i < 9; i++)
    	{
    		valueToDisplay[0]=i;
    		valueToDisplay[1]=0x0F;
    		wiringPiSPIDataRW(0,digit_value,2);
    
    	}
    
    	int cd = 0;
    	for (int i=0; i
    	{
    		char next=argv[1][i+1];
    		if (next!='.')
    		{
    			valueToDisplay[1]=argv[1][i];
    		}
    		else
    		{
    			valueToDisplay[1]=argv[1][i]+80;
    		}
    		if (argv[1][i]!='.' && cd<9)
    		{
    			valueToDisplay[0]=8-cd;
    			cd++;
    			wiringPiSPIDataRW(0,valueToDisplay,2);
    		}
    	}
    	
    
    	return 0;
    }
    

    Сохраняем исходник в файл indicator.c и компилируем:

    gcc -Wall -o indicator indicator.c -lwiringPi -std=c99
    

    Запускаем программу - ./indicator 1.2.3.4.5678

    На индикаторе должно высветиться 1.2.3.4.5678, как на фото:

    0be3f571-4e85-4b39-9075-7b8f6b895c05-image.png

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

    #!/bin/bash
    /home/pi/indicator $(vcgencmd measure_temp | egrep  '([0-9]{1,3}\.[0-9]{1,3})' -o)
    

    В следующей статье рассмотрим матричный индикатор на MAX7219


  • Управление Raspberry Pi с компьютера через USB-TTL адаптер
    piP pi

    Если у вас нет возможности подключить к RasPi монитор и клавиатуру, то управлять миникомпьютером можно по сети через SSH соединение.
    Но что делать, если возможность сетевого подключения отсутствует? Можно подключить Raspberry Pi к управляющему компьютеру через USB-TTL конвертер PL2303
    2cff64f1-1a4a-4709-a4f8-39963b1c2961-image.png
    В этой статье рассмотрим как это сделать

    USB-TTL конвертер обязательно должен иметь логику 3v3, а не 5V. Иначе есть риск повреждения GPIO, пины которого рассчитаны на использование 3V3 логики. Не все конвертеры удовлетворяют этому требованию, я использую такой - http://smartelectronika.com/viewproduct/96/

    Подключаем USB-TTL адаптер к управляющему компьютеру. Если он автоматически не определился, ищем в интернете и устанавливаем драйвера для PL2303. В случае успешной установки драйвера в диспетчере устройств адаптер должен определиться как Profilic USB-to-Serial Comm Port(COMxx):
    9571ca5a-abe8-460e-aef3-9bca99c343bb-image.png

    Теперь подключим Raspberry Pi к USB-TTL адаптеру. На конце адаптера 4 провода, которые необходимо подключить к GPIO пинам Raspberry Pi следующим образом:

    чёрный и красный провода это соответственно минус и плюс питания. Если вы питаете Raspberry Pi через microUSB разъём, то они остаются неподключёнными. Чтобы запитать Raspberry Pi от подключаемого по GPIO источника подключаем красный провод к пину 5V, чёрный к пину GND. Одновременное питание через GPIO и микроUSB разъём ЗАПРЕЩЕНО

    белый провод подключаем к пину TXD
    зелёный провод к пину RXD
    d96e9f1e-b1cf-41d2-a40f-0b9fd9d8f58b-image.png

    Далее запускаем на управляющем компьютере Putty, в строке Connection Type отмечаем пункт Serial. В поле Seial Line вводим номер порта (можно посмотреть в диспетчере устройств), в моём случае это COM13, в поле скорость соединения (Speed) вводим 115200 и нажимаем кнопку Open.
    35bdf138-35a2-4dd7-8c05-70b4572d0632-image.png
    После этого должно появится окно с приглашением консоли Raspberry Pi.

    Если на управляющем компьютере установлен Linux, то всё ещё проще:

    screen /dev/%usb_ttl_converter_device_file% 115200
    

    P.S убедитесь, что в файлах Raspberry Pi

    1. /etc/inittab прописано что-то типа T0:23:respawn:/sbin/getty -L ttyAMA0 115200 vt100
    2. /boot/cmdline.txt прописано console=ttyAMA0,115200

  • Система верификации пользователей посредством RFID карт с отправкой сообщений в Telegram
    piP pi

    Сегодня речь пойдет о системе верификации пользователей, которая в будущем сможет стать (и станет, я надеюсь) полноценной системой двухфакторной верификации пользователей. В качестве первого фактора будем использовать RFID карту, в качестве второго - распознавание лица пользователя с помощью OpenCV. На данный момент второй фактор работает в ручной режиме и фото отправляется в Телеграм оператору. Но автор топика активно работает над адаптацией каскада Хаара для распознавания лиц. И, как знать, может скоро и выйдет еще одна статья. Не будем загадывать. Все равно в одну статью это все не уместить. Поэтому начнем. Кому интересно - добро пожаловать под кат.

    1. Схемотехническое проектирование

    1.1 Лирическое отступление

    Я считаю, что наш ГОСТ вполне имеет право на жизнь. И, если следовать порядку проектирования, описанному в нем, то процесс разработки и поддержки любого реального проекта становится проще и понятнее любому члену команды. По крайней мере это точно касается маленьких проектов вроде этого, особенно если не заниматься занудством до невозможности и не пытаться соблюсти его кругом и всюду.

    1.2 Непосредственно проектирование

    Проектирование устройства было начато с разработки электрической структурной схемы, представленной ниже. Из схемы видно, что устройство состоит из трёх основных блоков: Raspberry Pi, модуля считывания RFID карт RFID-RC522 и WEB-камеры.

    Монитор - не обязательная вещь. На него просто будут выводиться логи вроде "Карта №... Доступ разрешен".

    Выбор считывателя ничем не обоснован. Взял тот, что был под рукой.

    abc99339-e08a-4461-907d-e6f71bc48f26-image.png

    Процесс работы устройства выглядит следующим образом: пользователь прикладывает RFID карту к считывателю, Raspberry Pi проверяет разрешен ли доступ для владельца карты, если доступ разрешен, то делается фотография web-камерой. Информация о владельце карты (для примера, у нас будет ID карты) и фотография автоматически отправляются оператору устройства на заранее сконфигурированный номер в Telegram. Если пользователю данной карты доступ запрещен, то фотографирования не происходит, выдается сообщение «Доступ запрещен!» и сообщение не отправляется.

    В качестве WEB-камеры может использоваться любая WEB-камера совместимая со стандартным классом USB устройств USB Image. Т.е. практически любая USB WEB-камера, за исключением совсем экзотики.

    При отправке Telegram-боту сообщения вида /photo в ответ оператор получает последнее фото с камеры.

    При отправке Telegram-боту сообщения вида /text в ответ, для примера, будем выводить информацию о том какой пользователь воспользовался системой последним (прошел через турникет, например).

    2. Разработка ПО

    2.1 Структура ПО

    В начале я хотел написать свой модуль ядра для работы с SPI, но про это можно написать целую отдельную статью. Да и зачем?? Если есть готовый. Может когда-нибудь в академических целях...

    Поэтому использовать мы будем стандартный драйвер spi_bcm2708.

    По умолчанию он занесен в blacklist ввиду не использования его большинством пользователей. Поэтому комментируем соответствующую строчку в соответствующем файле. Это делается так:

    sudo nano /etc/modprobe.d/raspi-blacklist.conf
    

    в этом файле комментируем строку

    blacklist spi-bcm2708
    

    Модуль активировали.

    Хотел написать библиотеку для работы с этим модулем. Но и тут не получилось выпендриться. Уже есть готовая.

    Для взаимодействия будем использовать уже написанную библиотеку. Она требует для работы другую - SPI-Py

    Следующий набор команд установит все, что нам потребуется (git, разумеется, уже должен быть установлен):

    sudo apt-get install python-dev
    git clone https://github.com/lthiery/SPI-Py.git
    cd SPI-Py
    sudo python setup.py install
    git clone https://github.com/rasplay/MFRC522-python.git
    

    Писать будем на языке python. Работать будем в директории MFRC522-python.

    cd MFRC522-python
    

    Структура нашего проекта представлена на рисунке ниже.
    39f23ef5-797b-4ec3-8829-e741445ea7a6-image.png

    Взаимодействие со считывателем RFID карт осуществляется через стандартный модуль ядра spi_bcm2708. Основные функции работы с SPI из userspace реализованы в библиотеке SPI-Py. По средствам этой библиотеки модуль чтения запускает опрос считывателя. Конфигурация модуля чтения RFID меток (регистры, функции для работы) реализованы в модуле конфигурации. В нем же хранится конфигурация Telegram бота (token). После считывания RFID метки модуль чтения обращается к модулю фото. В ответ получает фото пользователя, которое направляется в модуль отправки сообщений для отправки оператору в Telegram вместе с информацией о пользователе.

    Раз уж мы решили использовать OpenCV для распознавания лиц, то осуществлять захват изображения с камеры тоже будем с её помощью. OpenCV ставится на Raspberry Pi ровно также как и на любую другую Linux-машину. Описывать процесс её установки в рамках топика не вижу смысла. Мануал по установке есть на официальном сайте, просто повторяем шаги и всё.

    Далее будет описана реализация основного функционала. А полный код проекта будет доступен по ссылке в конце статьи.

    Опрос RFID считывателя происходит в бесконечном цикле вида:

    while continue_reading:
      (status,TagType) = MIFAREReader.MFRC522_Request(MIFAREReader.PICC_REQIDL) # Опрашиваем RFID считыватель
      if status == MIFAREReader.MI_OK: # Если обнаружена карта
        print "Card detected" 
      (status,backData) = MIFAREReader.MFRC522_Anticoll()
      if status == MIFAREReader.MI_OK: 
        print "Card read UID: "+str(backData[0])+","+str(backData[1])+","+str(backData[2])+","+str(backData[3])+","+str(backData[4])
        if (( backData == cardA ) or ( backData == cardB ) or ( backData == cardC )): # Сравниваем для примера с тремя захардкоженными идентификаторами трёх билетиков московского метро
          print "welcome"
          ### Получаем снимок с камеры через OpenCv ###
          capture = cv.CaptureFromCAM(0)
          frame = cv.QueryFrame(capture)
          cv.SaveImage("../../../Camera/telegram/image/ny.jpg", frame)
          del(capture)
          ### ####
          ### Запись файла с информацией о пользователе ####
          f1 = open("../../../Camera/telegram/text1.txt", 'wb')
          f1.write("The")
          if ( backData == cardB ):
              f1.write("User with cardB is comming")
          elif ( backData == cardA ):
              f1.write("User whith cardA is comming")
          ### ####
          # запуск отправки в Телеграм     
          os.system('python3 telegram.py') 
        else:
          print "wrong Card"
    

    Я постарался максимально закомментировать код дабы исключить пояснения в основном тексте статьи. С остальными фрагментами кода буду поступать аналогично.

    Теперь надо зарегистрировать Telegram-бота. Простейший мануал опять же есть на официальном сайте и пересказывать его шаги в этой статье я не буду. Ещё есть документация и примеры исходных кодов для интересующихся.

    Требуемый нам функционал реализуем так:

    ### Отправка текcтовой информации ###
    def mes ():
            f = open('../../../Camera/telegram/text1.txt')
            bot.send_message(<тут ваш идентификатор>, f.read())
            return 0
    ### Отправка фото ###
    def photo ():
            photo = open('../../../Camera/telegram/image/ny.jpg', 'rb')
            bot.send_photo(<тут ваш идентификатор>, photo)
            return 0
    mes()
    photo()
    

    Вместо <тут ваш идентификатор> вписываем идентификатор абонента, которому отсылаем сообщение.

    Осталось реализовать ответы бота на сообщения. Для этого надо создать обработчики соответствующих команд /photo и /text:

    ### Обработка команды /text ###
    @bot.message_handler(commands=['text'])
    def mes (message):
            f = open('../../../Camera/telegram/text1.txt') # файл с информацией, который сохраняли ранее
            bot.send_message(message.chat.id, f.read()) # отправка
            return 0
    ### Обработка команды /photo ###
    @bot.message_handler(commands=['photo'])
    def photo (message):
            photo = open('../../../Camera/telegram/image/ny.jpg', 'rb') # фото, которое сохраняли ранее
            print(message.chat.id)
            bot.send_photo(message.chat.id, photo) # отправка
    

    Реализацию основных частей рассмотрели.

    3. Макет

    На основании п.1 и п.2 был разработан макет устройства, представленный на фото ниже. В качестве RFID карт использовались билеты для проезда в Московском метрополитене.

    d3d2b26c-cac4-442b-bfeb-866d36243006-image.png

    2c0cd1db-9634-4ae0-abef-edbc518f65ab-image.png

    К Raspberry Pi подключен RFID считыватель по интерфейсу SPI согласно таблице представленной ниже. WEB-камера подключается к USB-порту, расположенному на плате. Взаимодействие с сетью (API сервера Telegram) осуществляется через Ethernet порт.

    Таблица подключения RFID считывателя RC522 к Raspberry Pi

    RPi пин	RC522 пин
    
    1	Vcc
    6	GND
    19	MOSI
    21	MISO
    22	RST
    23	SCK
    24	NSS
    

    На этом статья подходит в концу. Полный код проекта доступен в моем репозитории на github . Не забываем вписывать ваш токен для Telegram-бота в файле config.py, а также вписывать свой идентификатор абонента, которому надо посылать фото и информацию.

    P.S.

    Статья написана для участия в конкурсе т.к. своей Rasberry Pi не имею. Для реализации этого проекта взял у друга на пару месяцев первую Raspberry.

    Да, разработка - процесс неспешный. Тем более, что проектом занимаюсь исключительно в свободное время.


  • Прошивка чипов с SPI интерфейсом при помощи Raspberry Pi
    piP pi

    Всем привет!

    Как-то раз мне потребовалось прошить чип Flash памяти типа 25x40 Если прошивка заливается в чип через SPI интерфейс, то я обычно использую дешёвый китайский программатор CH341A. Но в этот раз чип никак не хотел прошиваться, хотя статусная полоска прогресса записи добегала до 100% без ошибок.

    Тогда я решил подключить чип к SPI линии Raspberry Pi и прошить чип при помощи RasPi и программы Flashrom Сделать это оказалось несложно. Для тех, кто захочет использовать RasPi в качестве программатора я приведу в этом блоге небольшую инструкцию.

    Подключаем чип к Raspberry Pi

    e1214dd5-2892-4b8a-b68e-dec3164c9b18-image.png

    CS - SPI_CE0
    DO - MISO
    WP - 3.3V
    GND - GND
    VCC - 3.3V
    HOLD -3.3V
    CLK - SPI_CLK
    DIO - MOSI
    

    Устанавливаем Flashrom

    Перед установкой активируем SPI-интерфейс через raspi-config, либо подгружаем spi-модули ядра вручную при помощи modprobe
    Устанавливаем необходимые пакеты, от которых зависит успешная компиляция Flashrom:

    sudo apt-get install subversion pciutils pciutils-dev libusb-0.1 libusb-1.0 libusb-1.0-dev
    

    Скачиваем последнюю версию исходников Flashrom из SVN репозитория, компилируем, устанавливаем

    $ svn co svn://flashrom.org/flashrom/trunk flashrom 
    $ cd flashrom 
    $ make 
    $ sudo make install
    

    Прошиваем чип

    Flashrom умеет определять тип подключенного чипа, стирать чип, записывать/считывать прошивку, верифицировать (проверять соответствие файла прошивки с записанной в чип информацией) чип.

    Для прошивки чипа используется команда:

    sudo flashrom -w /home/pi/firmware.bin -V -p
    

    здесь

    • -w - команда на запись прошивки (write), после неё указывается путь до файла с прошивкой (/home/pi/firmware.bin),
    • -p - тип программатора. Если в качестве программатора выступает Raspberry Pi, то тип будет linux_spi:dev=/dev/spidev0.0,
    • -V - verbose режим (вывод служебных сообщений во время прошивки)

    Перед записью чип желательно очистить командой

    sudo flashrom -E -p linux_spi:dev=/dev/spidev0.0
    

    Считать прошивку в файл можно командой

    sudo flashrom -r /путь_до_файла/ -p linux_spi:dev=/dev/spidev0.0
    

    Верификация

    sudo flashrom -v /путь_до_файла/ -p linux_spi:dev=/dev/spidev0.0
    

    Если запустить flashrom без параметров, то он попытается определить тип подключенного чипа

    sudo flashrom -p linux_spi:dev=/dev/spidev0.0
    

    Более подробно о командах flashrom можно прочитать тут:

    man flashrom
    

    https://www.flashrom.org/Supported_hardware - на этой странице можно найти список чипов, с которыми flashrom реально тестировался

    На этом всё. Всем добра!
    cb3a4804-9947-40d1-8fe5-947766d7c13b-image.png


  • Голосовой ассистент на Raspberry Pi
    piP pi

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

    Предисловие

    В не столь далеком детстве во время просмотра фильма "Железный человек" у меня появилась маленькая мечта,сделать свой Джарвис с блекджеком и скриптами.И вот спустя 4 года я снова загорелся желанием,а наличие дома RasPI 3 выигранной в майском конкурсе только подстегнуло интерес и желание.

    Начинаем
    Дисклеймер.Все что вы делаете,делается вами на ваш страх и риск.Я лишь описываю вам свой опыт и впечатления.

    Нам понадобиться:

    • Звуковая карта с чипом от C-Media
    • Колонка
    • Микрофон
    • Raspberry Pi
    • Интернет соединение
    • и много,очень много свободного времени.

    Шаг 1.Подготовим систему,установим софт

    Подключаем звуковую карту со всей периферией

    Логинимся в систему

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

    cd /etc/modprobe.d
    sudo nano alsa-blacklist.conf
    

    и добавляем строку

    blacklist snd_bcm2835
    

    и перезагружаемся - sudo reboot
    После этих махинаций запускаем команду aplay -l
    На экране должны увидит,что-то похожее на то,что на скрине с моей системы

    08186409-ecec-4f81-86b3-157b290a7fba-image.png

    Также можно через GUI убедиться,что звуковая карта назначена по умолчанию

    Для регулировки звука можно воспользоваться alsamixer

    Установим синтезатор речи

    sudo apt install festival festvox-ru
    

    Перейдем в домашнюю директорию

    cd ~/
    

    Создадим конфиг Festival

    sudo nano .festivalrc
    

    и внесем в него эти строки

    (Parameter.set 'Audio_Command "aplay -Dplug:default -q -c 1 -t raw -f s16 -r $SR $FILE")
    (Parameter.set 'Audio_Method 'Audio_Command)
    

    А теперь попробуем что нибудь сказать

    echo "Проверка" | festival --tts --language russian
    

    От ввода команды до произношения обычно проходит от 5 до 30 секунд. Медленно,но довольно качественно.

    Если услышали мужской голос из динамика,значит у нас все получилось

    Установим Python3

    sudo apt-get install python3
    

    И модули для него

    pip3 install SpeechRecognition
    pip3 install pocketsphinx
    

    Шаг 2.Скриптовая часть

    Для начала проверим,а работает ли у нас микрофон то вообще?

    arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
    

    Говорим что нибудь 4 секунды.

    aplay voice.wav -Dplug:default
    

    Слышим себя? Если да,то все прекрасно.

    Рекомендую создать отдельную директорию под проект.Я использовал имя '0' (ноль)

    cd 0
    

    Запишем основной и самый главный скрипт

    sudo nano 0.py
    #! /usr/bin/env python
    #-*-coding:utf-8-*-
    import os
    import speech_recognition as sr
    r = sr.Recognizer()
    with sr.WavFile("voice.wav") as source:              # use "test.wav" as the audio source
        audio = r.record(source)                        # extract audio data from the file
    
    try:
        t = r.recognize_google(audio,language = "ru-RU", key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw")
        print(t)   # recognize speech using Google Speech Recognition
    except LookupError:                                 # speech is unintelligible
        print("Could not understand audio")
    if t  == 0:
         print("Error")
    elif t==("Привет"): #Hi
        os.system('echo Привет | festival --tts --language russian')
    

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

    python3 0.py
    

    Если на выводе уводили тот текст,что содержится в записи,то все успешно распозналось(У меня распознает все точно в 99% случаев)

    и запускалку для этого скрипта

    sudo nano launcher
    #!/bin/bash
    echo "Ассист+ент зап+ущен" |festival --tts --language russian
    while [ true ]
    do
    arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
    filesize=$(stat -c%s "voice.wav")
    echo $filesize
    python3 0.py
    rm voice.wav
    echo completed
    done
    sudo chmod +x launcher
    

    и запустим

    ./launcher
    

    Прервать адский круг можно долгим зажатием CTRL+C

    Шаг 3.Запускалка запускалки

    Для удобства я сделал запускалку запускалки

    sudo nano launcher
    #!/bin/bash
    while [ true ]
    do
    arecord -B --buffer-time=1000000 -f dat -r 16000 -d 4 -D plug:default voice.wav
    filesize=$(stat -c%s "voice.wav")
    echo $filesize
    python3 z.py
    rm voice.wav
    echo completed
    done
    sudo chmod +x launcher
    sudo nano z.py
    
    import os
    import speech_recognition as sr
    #Recognizer(language = "ru-RU", key = "AIzaSyBOti4mM-6x9WDnZIjIeyEU21OpBXqWBgw")
    r = sr.Recognizer()
    with sr.WavFile("voice.wav") as source:              # use "test.wav" as the audio source
        audio = r.record(source)                        # extract audio data from the file
    
    try:
        t = r.recognize_sphinx(audio)
        print(t)   # recognize speech using Google Speech Recognition
    except LookupError:                                 # speech is unintelligible
        print("Could not understand audio")
    if t==("hi"):
       os.system('~/0/assistant')
    

    Как можно понять из скриптов,то запускать основной наш скрипт будут только после "hi".Но вот беда,распознает оффлайн утилита очень-очень плохо.Я частично исправил положение наглым выпиливанием половины словаря программы.

    cd /usr/local/lib/python3.4/dist-packages/speech_recognition/pocketsphinx-data/en-US
    sudo nano pronounciation-dictionary.dict
    

    А теперь нам придется попотеть.Удалим из словаря все не нужное.
    Кому лень это делать,может написать мне в лс, я скину файлик.

    И вот после всего этого запускалка начала более менее по божески работать

    cd ~/0
    sudo nano 0.py
    

    В конец файла добавим

    os.system('~/0/launcher')
    

    Сохраним

    Шаг3. А вы верите в скрипты?

    в директории 0 создадим еще одну

    mkdir scripts
    cd scripts
    

    и создадим скриптик для того,чтобы нам по запросу говорили,какова погода на улице

    sudo nano forecast
    #!/bin/sh
    
    URL='http://www.accuweather.com/en/ru/tolyatti/295302/weather-forecast/295302'
    
    wget -q -O- "$URL" | awk -F\' '/acm_RecentLocationsCarousel\.push/{print "сейчас на улице ",$12, "градусов"}'| head -1
    

    Содержимое строки URL меняем на нужное вам местоположение с этого же сайта

    Сделаем говорилку для этого скрипта

    sudo nano weather
    #!/bin/sh
    ~/0/scripts/forecast | festival --tts --language russian
    

    и наконец в скрипт 0.py добавим еще одно ветвление для IF

    cd ~/0
    sudo nano 0.py
    elif t==("Какая сейчас погода"): #weather
        os.system('~/0/scripts/weather')
    elif t==("погода"):
        os.system('~/0/scripts/weather')
    elif t==("Какая погода"):
        os.system('~/0/scripts/weather')
    

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

    Благодарности
    Спасибо администрации Raspberrypi.ru
    Михаилу Андрею За помощь в создании проекта

    Фото устройства в собранном виде
    beab6546-a96b-43f2-9714-a304bb850031-image.png
    56814595-f7ed-4961-80f3-989c4fa0b467-image.png
    В дырочке спрятался микрофон 🙂

    Статья будет обновляться,обязательно будет,так как я не считаю это проект завершеным.


  • Бесперебойный блок питания(преобразователь) для Raspberry Pi
    piP pi

    99864471-7652-4532-8a26-742545849caf-image.png
    Привет всем,

    Бесперебойный преобразователь PiGO предназначен для использования в автомобилях, либо в устройствах, где нет стабильного питания. Преобразователь снижает входящее напряжение до 5V, которое используется для питания Raspberry или Arduino, либо другие устройства, которым для питания необходимо 5V и до 2,5A. А также может использоваться в качестве зарядного устройства для смартфонов.

    Автономная работа зависит от емкости подключенного аккумулятора, а также потребления. При отключении внешнего питания (например, включение зажигания в автомобиле), выходящее напряжение не прерывается, что обеспечивает бесперебойную работу устройств. Блок управления напряжением PiGO имеет характеристики:

    • Входящее напряжение, U 4,5...18V
    • Потребляемый ток, I 6A
    • Выходное напряжение, U 5V
    • Выходной ток, I 5A
    • Рабочие температуры -40+85C
    • Время автономной работы *зависит от аккумулятора (Li-Pol 3.7V)
    • Порты USB 2.0 для зарядки смартфонов 2шт. Напряжение на USB порту 4,85...5,15V Выходной ток USB порта 600mA Дополнительный USB порт для Raspberry 1шт
    • Порт для Raspberry и Arduino 3шт Напряжение на портах 4,95V Ток на каждый порт 2,5A
    • Рабочие температуры -40+85C
    • Размеры 64x56x12мм
    • Вес 75гр

    Комплектация: плата PiGO, коннектор для подключения в прикуриватель автомобиля, 1 коннектор для подключения Raspberry, 1 коннектор для подключения Arduino, 1 коннектор для подключения внешнего аккумулятора, винты крепления, инструкция. 3D модель корпуса для 3D печати можно скачать бесплатно на сайте.

    Я думаю, что для вас будет полезно использовать в своих проектах.Более детально можно посмотреть по ссылке - https://www.indiegogo.com/projects/pigo-power-supply-arduino-powerbank/x/15069311#/

    Если есть вопросы, буду рад ответить тут.


  • Raspberry PI и цифровое телевидение dvb-t2
    piP pi

    Для просмотра передач цифрового телевидения на Raspberry pi нужно обзавестись тюнером, работающий по стандарту dvb-t2 и решить 3 задачи:

    • Убедиться, что Raspberry видит тюнер
    • Убедиться, что тюнер видит телевышку
    • Убедиться, что правильно настроены программы для приема, показа и записи телепередач

    Все это было реализовано на Raspberry Pi 3 под управлением Raspbian Stretch (Version:November 2018, Release date:2018-11-13, Kernel version:4.14)

    А теперь подробнее. (Букв будет много, но результат того стоит ☺)

    Задача 1. Убедиться, что Raspberry видит тюнер

    Для приема передач использовался тюнер AstroMeta Digital TV Dongle , который можно найти и купить на aliexpress, введя в поиск строку «DVB-T2 DVB-C FM DAB USB tv stick». Внутренности этого тюнера можно посмотреть по ссылке https://www.ixbt.com/monitor/astrometa-digital-tv-dongle.shtml
    837cb699-9bf1-409c-b35f-ba1b46026dd7-image.png
    После подключения тюнера к USB разъему нужно выйти в терминал и выполнить команду

    $ lsusb | grep HanfTek
    

    Если не экране появится строка, похожая на такую Bus 001 Device 007: ID 15f4:0131 HanfTek значит Raspberry видит тюнер на аппаратном уровне. В противном случае надо разбираться с плохими контактами, сгоревшими портами и плохим электропитанием.

    Если тюнер виден на аппаратном уровне, можно продолжить иввести команду $ sudo dmesg -t | grep dvb

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

    [ 31.201602] mn88473 4-0018: Direct firmware load for dvb-demod-mn88473-01.fw failed with error -2 
    [ 31.201653] mn88473 4-0018: firmare file 'dvb-demod-mn88473-01.fw' not found
    

    Это сообщение означает, что не найден файл dvb-demod-mn88473-01.fw , необходимый для работы тюнера. Файл нужно найти в интернете и положить его в папку /lib/firmware/ .

    Сделать это можно, выполнив следующие команды:

    $ cd /lib/firmware/
    $ sudo wget http://palosaari.fi/linux/v4l-dvb/firmware/MN88473/01/latest/dvb-demod-mn88473-01.fw
       или
    $ cd /lib/firmware/
    $ sudo wget https://github.com/OpenELEC/dvb-firmware/raw/master/firmware/dvb-demod-mn88473-01.fw
    

    После этого нужно перегрузиться и убедиться в нормальной работе тюнера.

    $ sudo reboot
    $ sudo dmesg -t | grep dvb
    

    Raspberry видит тюнер на программном уровне, если на экране будут такие строки:

    usb 1-1.3: Product: dvbt2
    usb 1-1.3: Manufacturer: astrometadvbt2
    usb 1-1.3: dvb_usb_v2: found a 'Astrometa DVB-T2' in warm state
    usb 1-1.3: dvb_usb_v2: will pass the complete MPEG2 transport stream to the software demuxer
    usb 1-1.3: dvb_usb_v2: schedule remote query interval to 200 msecs
    input: MCE IR Keyboard/Mouse (dvb_usb_rtl28xxu) as /devices/virtual/input/input1
    rc rc0: lirc_dev: driver ir-lirc-codec (dvb_usb_rtl28xxu) registered at minor = 0
    usb 1-1.3: dvb_usb_v2: 'Astrometa DVB-T2' successfully initialized and connected
    usbcore: registered new interface driver dvb_usb_rtl28xxu
    

    Ввод команды $ ls /dev/dvb/ покажет номер адаптера «adapter0», соответствующего подключенному тюнеру, а команда $ ls /dev/dvb/ adapter0 покажет название интерфейсов, которые поддерживает этот адаптер 0 demux0 dvr0 frontend0 frontend1 net0

    Для дальнейших настроек установите два пакета

    $ apt-get install dvb-tools dtv-scan-tables
    

    Можно посмотреть, что такое frontend0 и frontend1 у адаптера 0. $ dvb-fe-tool -a 0 -f 0 Вывод программы однозначно показывает, что frontend0 – это интерфейс для приема сигнала в формате DVB-T. $ dvb-fe-tool -a 0 -f 1 Глядя на вывод программы, убеждаемся, что frontend1 – это интерфейс для приема сигнала в формате DVB-T2 со всеми необходимыми возможностями и именно этот интерфейс будет использоваться для дальнейших настроек.

    Замечу, что вместе с работающим тюнером у Raspberry pi появился инфракрасный датчик, который отлично работает под lirc, но это в данной публикации рассматриваться не будет.

    Задача 2. Убедиться, что тюнер видит телевышку

    На сайте http://карта.ртрс.рф надо найти точку, в которой будут расположены тюнер и Raspberry. Щелкнув мышкой по этой точке можно увидеть параметры ближайших телевышек, с которых в дальнейшем будет приниматься телетрансляция. Для моего случая параметры такие:

    Расстояние: 10,13 км
    Направление: 339
    Пакет телеканалов РТРС-1 - ТВК 30 (546 МГц)
    Пакет телеканалов РТРС-2 - ТВК 24 (498 МГц)
    

    Расстояние и направление нужно для выбора антенны и ее ориентации при размещении.Частоты потребуются и при выборе антенны, и при настройки тюнера.

    У меня штатная антенна из комплекта тюнера не заработала при удаленности от вышки на 10 км и пришлось рассчитывать и делать антенну типа «Двойной квадрат Харченко».

    3fa1da51-1ad8-464f-905b-26439d205481-image.png

    Расчет делался по средней длине волны первого и второго мультиплекса. Кстати, третий мультиплекс на ТВК 34 (578 МГц) так же отлично принимается из-за широкополосности этой антенны.

    Скорость света = 299,792458 км/сек
    Средняя частота 1 и 2 мультиплексов = (546 + 498) / 2 = 522 Мгц
    Рабочая длина волны антенны = 299,792458 / 522 = 57,43 см
    Сторона квадрата антенны равна четверти длины волны, т.е. 57,43 / 4 = 14,36 см.
    Взявши медный провод длиной 115 см и диаметром 2,5 мм я сделал фигуру, похожую на восьмерку из двух квадратов со стороной 144 мм, запаяв стык в талии восьмерки. Зазор в талии восьмерки оставил равным 10 мм, припаяв экран коаксиала к одной стороне, а центральную жилу - к другой стороне талии. Место пайки поместил в пластиковую крышку от молока и залил пластиком, сохраняя зазор в 10 мм. Длина коаксиала до тюнера примерно 80 см. Сам тюнер включил в метровый USB удлинитель, рассчитанный на скорости USB2. Антенну разместил вертикально (т.е. как восьмерку), т.к. поляризация в Москве горизонтальная. Для приема сигнала с вертикальной поляризацией антенну надо размещать как восьмерку, лежащую на боку. Ориентировал антенну по компасу плоскостью на телевышку (в моем случае на 399 градусов).

    Антенна готова и можно приниматься за сканирование эфира.

    Таблицы сканирования расположены в папке /usr/share/dvb/dvb-t/, но нужный мне город отсутствует. Там есть таблица ru-all, которая рассчитана на сканирование всех частот, но она не учитывает используемый в Москве Multiple PLP - режим передачи нескольких каналов физического уровня внутри одного транспортного потока (мультиплекса).

    Для Москвы реальные трансляции такие:

    Мультиплекс 1 - 546 Mhz (plp 0, 1, 2)
    Мультиплекс 2 - 498 Mhz (plp 0)
    Мультиплекс 3 - 578 Mhz (plp 0)
    И соответствующая таблица сканирования выглядит так:

    [MULTIPLEX 1]
            FREQUENCY = 546000000
            MODULATION = QAM/256
            BANDWIDTH_HZ = 8000000
            INVERSION = AUTO
            CODE_RATE_HP = AUTO
            CODE_RATE_LP = AUTO
            GUARD_INTERVAL = AUTO
            TRANSMISSION_MODE = AUTO
            HIERARCHY = NONE
            STREAM_ID = 0
            DELIVERY_SYSTEM = DVBT2
    
    [MULTIPLEX 1-1]
            FREQUENCY = 546000000
            MODULATION = QAM/256
            BANDWIDTH_HZ = 8000000
            INVERSION = AUTO
            CODE_RATE_HP = AUTO
            CODE_RATE_LP = AUTO
            GUARD_INTERVAL = AUTO
            TRANSMISSION_MODE = AUTO
            HIERARCHY = NONE
            STREAM_ID = 1
            DELIVERY_SYSTEM = DVBT2
    
    [MULTIPLEX 1-2]
            FREQUENCY = 546000000
            MODULATION = QAM/256
            BANDWIDTH_HZ = 8000000
            INVERSION = AUTO
            CODE_RATE_HP = AUTO
            CODE_RATE_LP = AUTO
            GUARD_INTERVAL = AUTO
            TRANSMISSION_MODE = AUTO
            HIERARCHY = NONE
            STREAM_ID = 2
            DELIVERY_SYSTEM = DVBT2
    
    [MULTIPLEX 2]
            FREQUENCY = 498000000
            MODULATION = QAM/256
            BANDWIDTH_HZ = 8000000
            INVERSION = AUTO
            CODE_RATE_HP = AUTO
            CODE_RATE_LP = AUTO
            GUARD_INTERVAL = AUTO
            TRANSMISSION_MODE = AUTO
            HIERARCHY = NONE
            STREAM_ID = 0
            DELIVERY_SYSTEM = DVBT2
    
    [MULTIPLEX 3]
            FREQUENCY = 578000000
            MODULATION = QAM/AUTO
            BANDWIDTH_HZ = 8000000
            INVERSION = AUTO
            CODE_RATE_HP = AUTO
            CODE_RATE_LP = AUTO
            GUARD_INTERVAL = AUTO
            TRANSMISSION_MODE = AUTO
            HIERARCHY = NONE
            STREAM_ID = 0
            DELIVERY_SYSTEM = DVBT2
    

    Подготовить таблицу для своего города очень просто.В квадратных скобках указывается произвольное название транспортного потока.

    FREQUENCY = частота вещания потока в Гц

    MODULATION = вид модуляции. Если не знаете точно, то ставьте QAM/AUTO

    STREAM_ID = это тот самый номер канала физического уровня внутри транспортного канала с заданной частотой.

    Сохраните таблицу в папке /usr/share/dvb/dvb-t/ под именем «ru-название города». (В моем случае /usr/share/dvb/dvb-t/ru-Moscow). Далее нужно перейти в домашнюю папку и можно сканировать эфир программой dvbv5-scan, указав в параметрах номер адаптера, номер frontend и таблицу сканируемых частот.

    В моем случае это делается так: $ cd ~ $ dvbv5-scan -a 0 -f 1 /usr/share/dvb/dvb-t/ru-Moscow

    В домашней папке появится файл dvb_channel.conf, который можно посмотреть командой «less dvb_channel.conf».Если в нем есть названия каналов с частотами, модуляциями и т.д., по тюнер видит телевышку и можно настраивать программы для просмотра телепередач. Уровень принимаемого сигнала для разных каналов можно посмотреть так (указав название канала после параметра -r): $ dvbv5-zap -a 0 -f 1 -c dvb_channel.conf -r '01 ПЕРВЫЙ КАНАЛ'

    Если же сигнал не идет, то надо серьезно заняться подбором и настройкой антенны.

    Задача 3. Убедиться, что правильно настроены программы для приема, показа и записи телепередач.

    Для удобства просмотра нужно установить потоковый сервер и рекордер tvheadend .

    $ sudo apt-get install tvheadend
    

    При установке будут запрашиваться пароли для входа в настройки.Забытый пароль можно посмотреть в файле /var/lib/hts/.hts/tvheadend/superuser

    Чтобы работать без пароля нужно сделать 3 шага:

    • Остановить сервер (sudo service tvheadend stop)
    • В файле /etc/init.d/tvheadend строку ARGS="-f" заменить на ARGS="-f --noacl"
    • Запустить сервер (sudo service tvheadend start).

    Все настройки делаются через web интерфейс по адресу http://127.0.0.1:9981 и многократно описаны в инет. Минимально необходимые инструкции приведены ниже.

    Логика настроек tvheadend такая:

    Создать сеть внутреннего телевещания с частотами из таблицы сканируемых частот (напоминаю о /usr/share/dvb/dvb-t/ru-Moscow).
    Связать правильный интерфейс адаптера (напоминаю о adapter0 frontend1) с этой созданной сетью.
    Подождать завершения сканирования и разрешить трансляцию всех найденных каналов.
    Для создания сети на вкладке «Configuration» -&amp;amp;amp;amp;amp;amp;gt; «DVB Input» -«Networks» нажать на зеленый плюс «Add»;Из списка выбрать тип сети «DVB-T» (именно «DVB-T», а не dvb-t2); В форме заполнить поля «Network:» (любое имя), «Pre-defined muxes:» (выбрать созданную ранее таблицу сканирования, например ru-Moscow), «Character set:» (выбрать AUTO) и нажать кнопку «Create»

    Для связывания адаптера с созданной сетью на вкладке «Configuration» - «DVB Input» - «TV adapters» ткнуть мышкой в «Panasonic MN88473 #0 : DVB-T #1» (что соответствует adapter0 frontend1). В форме, открывшейся справа, в разделе «Basic Settings» в поле «Networks:» выбрать созданную сеть. Там же поставить галку в поле «Enabled» и нажать на кнопку «Save».

    Для разрешения трансляции всех найденных каналов нужно перейти на вкладку «Configuration» -«DVB Input» - «Muxes», дождаться появления в колонке «Scan result» сообщения «OK» (либо «FAIL»). Далее на вкладке «Configuration» -«DVB Input» - «Services» в выпадающем списке «Mux Services» выбрать «Map all services» и нажать на кнопку «Save».

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

    • Чтобы посмотреть телетрансляции не выходя из web интерфейса tvheadend надо перейти на самую левую вкладку верхнего уровня «Electronic Progran Guide» с загруженной программой передач и ткнуть в иконку телевизора около требуемого канала.

    • Если хотите, чтобы у каждого канала показывался логотип, перейдите на вкладку «Configuration» -«General» - «Base». В нижней части открывшейся таблицы в поле «Picon path:» введите «file:///var/lib/hts/picons» (без кавычек), а в поле «Prefer picons over channel name:» поставьте галочку. Все файлы с логотипами телеканалов (png размером 256х256) скопируйте в папку /var/lib/hts/picons и смените владельца и группу для этих файлов на hts:hts. Далее на вкладке «Configuration» - «ChannelEPG» - «Channels» в каждое поле «User Icon» нужно ввести имя файла(без кавычек) с логотипом канала в формате «picon://01.png», «picon://02.png» и т.д.

    • Для просмотра на любом vlc плеере в сети нужен плейлист, который можно получить, набрав в браузере http://127.0.0.1:9981/playlist. Загрузится файл channels, который рекомендую переименовать в channels.m3u и использовать для просмотра в сети со всех компьютеров, планшетов и мобильных телефонов.

    • Для iPad и iPhone есть программа TvhClient, которая позволяет смотреть вещание сервера tvheadend и при необходимости запускать запись на Raspberry Pi.

    • Для Android-устройств так же есть программы-клиенты tvheadend, которые можно найти в Google Play, задав в строке поиска tvheadend.

    Для удобного просмотра телепередач непосредственно на Raspberry pi я использую kodi с пакетом kodi-pvr-hts.

    Установка и настройка kodi не сложна, но это уже совсем другая история.


  • Raspberry Pi PICO
    piP pi

    393bbf60-30d7-4150-987a-0899b2daeada-image.png
    Raspberry Pi не всегда является идеальным выбором для взаимодействия с внешней периферией - из-за того, что ПО запущено внутри операционной системы Linux оно не всегда подходит для работы с внешними I/O устройствами, если требуются минимальные задержки в приёме/передаче данных. Также на Raspberry Pi отсутствует встроенный АЦП для обработки аналоговых данных и большое энергопотребление - даже самая экономичная Raspberry Pi Zero потребляет минимум 100 мВт мощности.

    Во многих проектах Raspberry Pi используется в связке с микроконтроллером - RasPi выполняет сложные вычисления, обеспечивает доступ к сети и осуществляет хранение информации, а микроконтроллер обрабатывает данные, поступающие на аналоговые входы и общие порты ввода/вывода для обеспечения минимальных задержек. Также микроконтроллер может работать в режиме ожидания с минимальным энергопотреблением.

    Раньше у Raspberry Pi Foundation не было своих продуктов на основе микроконтроллеров (вроде Arduino или esp 32/esp 8266). Но теперь разработчики выпустили свой чип микроконтроллера RP2040 - и плату Raspberry Pi Pico на его основе.

    RP2040 - чип для платы Rasperry Pi Pico

    ed7e5dd5-f24b-4d01-b123-c285b45b8c3b-image.png

    При разработке RP2040 уделялось особое внимание 3 главным параметрам - высокой производительности (в частности при работе с целочисленными вычислениями), функциональности I/O портов для возможности взаимодействия с любыми внешними устройствами, и сохранению низкой цены. В итоге получился невероятно мощный и компактный чип (размером всего 7x7 мм в корпусеQFN-56, толщина кремния 40nm), обладающий следующими характеристиками:

    • Двухядерный Arm Cortex-M0+ частотой 133Мгц
    • 264Кб оперативной памяти
    • Поддержка чипов флэш-памяти до16 Mб через шину QSPI
    • DMA контроллер
    • 30 GPIO портов, 4 из которых могут быть испольщованы как аналоговые входы
    • 2 × UART, 2 × SPI, 2 × I2C
    • 16 × ШИМ каналов
    • 1 × USB 1.1 контроллер PHY, с поддержкой режимов host и device
    • 8 × программируемых I/O (PIO) машин состояния
    • Режим USB mass-storage boot с поддержкой прошивки через UF2
    • Для разработчиков ПО предоставляется также C SDK, тулчейн на основе GCC и интеграция со средой разработки Visual Studio Code.

    Так как в архитектуре Cortex-M0+ не предусмотрен "аппаратный" модуль для операций с плавающей точкой, разработчики предлагают использовать программные функции для операций с плавающей точкой от Марка Оуэна (их лицензия позволяет использование в любых продуктах на основе чипа RP2040 и они значительно быстрее аналогов gcc), автора популярной библиотеки Qfplib.

    С двумя быстрыми ядрами и большим количеством оперативной памяти RP2040 подходит и для проектов с машинным обучением (смотрите форк TensorFlow Lite Micro для RP 2040 от Пита Вордена -https://github.com/raspberrypi/pico-tflmicro)

    Для начинающих разработчиков, а также любителей Python совместно с разработчиком MicroPython создан порт MicroPython для RP2040, который позволяет использовать все возможности чипа, включая программируемые машины состояния. Также реализована поддержка MicroPython для RP2040 в популярной среде разработке Thonny

    Плата Raspberry Pico

    Raspberry Pi Pico недорогая двухслойная плата с чипом RP2040. На плате также присутствует чип Flash памяти на 2Mб и стабилизатор напряжения, позволяющий питать Pico от источника питания с напряжением от 1.8 до 5.5В.
    6ce81643-8872-4eae-9938-5b634e0aba67-image.png
    Также на плате есть кнопка, которой осуществляется вход в режим USB mass-storage boot (кнопка также может выполнять определённые пользователем функции) и светодиод.

    К отверстиям с шагом 2.54 мм по крайням платы подведены 26 линий (из 30 возможных) от GPIO контактов чипа RP2040, включая 3 (из 4 возможных) аналоговых порта. Также будет возможно купить Raspberry Pico с припаянными в отверстия контактными штырьками.

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

    Документация

    Datasheet чипа RP 2040

    Datasheet платы Raspberry Pico

    [Руководство для разработки плат с чипом RP 2040](Руководство для разработки плат с чипом RP 2040)

    Руководство по программированию Pico на C/С++

    Pico C/C++ SDK

    Pico Python SDK

    Описание ("распиновка") GPIO контактов Raspberry Pi Pico
    626dd633-5c73-4a25-86d7-90f0bb937613-image.png


  • Поддержка SATA добавлена в Raspberry Pi OS
    piP pi

    Раньше, чтобы использовать SATA накопители с Rasberry Pi, пользоваться скоростными преимуществами этого интерфейса и объединять SATA диски в RAID массивы, необходимо было пересобирать ядро, настраивая параметры SATA и AHCI

    Конечно можно было пользоваться и SATA-USB переходниками, но это приводило к падению производительности до 20% и невозможности построения RAID массивов.

    Но в этом месяце в Raspberry Pi OS наконец добавили встроенную поддержку для большинства PCI Express SATA адаптеров.

    Воспользоваться опцией смогут пользователи Raspberry Pi Compute Module 4, т.к многие отладочные платы для CM4 оснащены портом PCI express (на Raspberry Pi 4 порт PCI express не выведен).
    41abbf68-02bd-45f3-be1e-5cf5c6c533d7-image.png
    Встроенная поддержка SATA сильно облегчает построение RAID NAS на Raspberry Pi, например при помощи OpenMediaVault. Больше не нужно собирать и поддерживать кастомное ядро или проводить дополнительные работы - всё работает из коробки.

    Теперь множество задач, ранее выполнявшихся на огромных компьютерах и серверах, можно делегировать компактному Raspberry Pi

    В будущем предстоит реализовать возможность загрузки Raspberry Pi с SATA дисков (пока загружаться можно с USB, microSD, eMMC и даже с NVM)


  • Использование Raspberry Pi как беспроводной точки доступа
    piP pi

    564f9576-c0fb-4205-bad1-4a1f2a1f6d41-image.png
    Raspberry Pi внутри Ethernet сети может выступать как беспроводная точка доступа для беспроводных устройств.

    Существует два режима работы такой точки доступа - обычный и мост. В обычном режиме Raspberry Pi создаёт дополнительную сеть, которая изолирована от Ethernet сети. Схема сети для этого режима:

    Screenshot from 2024-11-21 05-14-44.png

    Если вам нужно раздать существующее Ethernet соединение беспроводным устройствам, то на Raspberry Pi нужно настраивать как точку доступа, работающую в режиме моста:
    Screenshot from 2024-11-21 05-15-11.png
    В этой статье сначала рассмотрим обычный режим, а потом мост

    Подготовка

    Для настройки необходим администраторский (root) доступ к Raspberry Pi.

    Подключите Raspberry Pi к Ethernet сети кабелем и загрузите его.

    В этой статье предполагается, что сеть с IP адресами 10.10.0.0/24 основная, а Raspberry Pi управляет сетью для беспроводных клиентов 192.168.4.0/24

    Также для тестирования точки доступа необходим клиент беспроводной сети(ноутбук, смартфон, и т.д)

    Установка необходимого ПО

    Чтобы Raspberry Pi мог работать как точка доступа необходимо установить пакет hostapd

    sudo apt install hostapd
    

    Активируйте службу беспроводной точки доступа и включите для неё автозапуск после загрузки:

    sudo systemctl unmask hostapd
    sudo systemctl enable hostapd
    

    Чтобы предоставить беспроводным клиентам службы управления сетью (DNS, DHCP) установите пакет dnsmasq

    sudo apt install dnsmasq
    

    Чтобы настройки файервола не сбрасывались после перезагрузки, установим пакет netfilter-persistent и плагин к нему iptables-persistent.

    sudo DEBIAN_FRONTEND=noninteractive apt install -y netfilter-persistent iptables-persistent
    

    Установка ПО закончена и далее нам предстоит его настроить

    Настройка маршрутизатора

    Raspberry Pi поднимет отдельную одиночную беспроводную сеть и будет управлять ей. А также маршрутизировать трафик между клиентами беспроводной сети и клиентами основной Ethernet сети и роутером.

    Для беспроводной сети на Raspberry Pi запущен DHCP сервер, для работы которого требуется присвоить беспроводному интерфейсу (wlan0) статический IP адрес

    Присваиваем статический IP адрес (192.168.4.1) точке доступа:

    sudo nano /etc/dhcpcd.conf
    

    В конец файла добавьте следующие строки:

    interface wlan0
        static ip_address=192.168.4.1/24
        nohook wpa_supplicant
    

    Настройка маршрутизации и IP маскарадинга
    В этом разделе рассмотрим вопрос доступа беспроводных устройств из вспомогательной сети, организованной Raspberry Pi, к компьютерам основной Ethernet-сети и интернету.

    Для включения маршрутизации добавим в конфиг /etc/sysctl.d/routed-ap.conf строку:

    # Enable IPv4 routing
    net.ipv4.ip_forward=1
    

    Активация маршрутизации откроет участникам сети 192.168.4.0/24 доступ к основной сети и доступ в Интернет через основной роутер. Raspberry Pi может подменять IP адреса участников беспроводной сети своим IP адресом в основной сети, используя правило "маскарада" в своём файерволе, чтобы разрешить сетевой трафик между участниками беспроводной сети и Интернетом без изменения настроек роутера.

    Основной роутер будет воспринимать весь трафик от клиентов беспроводной сети, как трафик от Raspberry Pi
    Весь входящий трафик будет поступать на Raspberry Pi и перенаправляться клиенту беспроводной сети
    Добавляем новое правило в файервол Raspberry Pi:

    sudo iptables -t nat -A POSTROUTING -o eth0 -j MASQUERADE
    

    Сохраняем правило при помощи netfilter-persistent, чтобы оно не сбросилось при перезагрузке.

    sudo netfilter-persistent save
    

    Настройки файервола хранятся здесь - /etc/iptables/. Не забывайте использовать netfilter-persistent при внесении изменений в правила файервола.

    Настройка DHCP и DNS для беспроводной сети

    Службы DHCP и DNS предоставляются пакетом dnsmasq. В стандартном конфиге dnsmasq содержатся примеры всех возможных настроек, нам нужны только некоторые, поэтому проще создать конфиг с нуля. На всякий случай сохраняем старый конфиг и создаём новый с таким же именем:

    sudo mv /etc/dnsmasq.conf /etc/dnsmasq.conf.orig
    sudo nano /etc/dnsmasq.conf
    

    Прописываем настройки в конфиг:

    interface=wlan0 # Listening interface
    dhcp-range=192.168.4.2,192.168.4.20,255.255.255.0,24h
                    # Pool of IP addresses served via DHCP
    domain=wlan     # Local wireless DNS domain
    address=/gw.wlan/192.168.4.1
                    # Alias for this router
    

    Raspberry Pi будет выделять клиентам IP-адреса в диапазоне 192.168.4.2-192.168.4.20

    Клиенты могут обращаться к RaspberryPi по доменному имени gw.wlan

    В разных странах действуют свои телекоммуникационные правила и разрешённые для радиопередачи диапазоны. Операционная система Linux помогает пользователям выполнять эти правила

    В операционной системе Raspberry Pi OS работа беспроводной сети в диапазоне 5GHz запрещена до тех пор, пока пользователь не внесёт в настройках двухбуквенный код страны (RU для России).

    Настройка ПО

    Чтобы убедиться, что работа Wi-Fi не заблокирована выполните команду

    sudo rfkill unblock wlan
    

    Далее создадим конфиг hostpad ( /etc/hostapd/hostapd.conf) и пропишем в него настройки:

    country_code=RU
    interface=wlan0
    ssid=NameOfNetwork
    hw_mode=g
    channel=7
    macaddr_acl=0
    auth_algs=1
    ignore_broadcast_ssid=0
    wpa=2
    wpa_passphrase=AardvarkBadgerHedgehog
    wpa_key_mgmt=WPA-PSK
    wpa_pairwise=TKIP
    rsn_pairwise=CCMP
    

    Обратите внимание, что имя сети (параметр ssid) и пароль (параметр wpa_passphrase) не должны содержать кавычек. Пароль должен иметь длину от 6 до 64 символов

    Указание кода страны позволяет Raspberry Pi использовать для передачи данных разрешённые в этой стране частоты.

    Чтобы использовать для передачи данных диапазон 5 GHz, нужно поменять параметр hw_mode=g на hw_mode=a. Возможные значения параметра hw_mode:

    a = IEEE 802.11a (5 GHz) (доступно начиная с модели Raspberry Pi 3B+)
    b = IEEE 802.11b (2.4 GHz)
    g = IEEE 802.11b (2.4 GHz)
    

    После смены режима hw_mode, возможно потребуется и смена номера канала (параметр channel)

    Завершение

    Теперь осталось только перезагрузиться.

    В следующей статье рассмотрим организацию точки доступа на Raspberry Pi в режиме моста


  • Подключение DC электромоторов к Raspberry Pi через драйвер L298N
    piP pi

    Если вы захотите собрать робота на колёсах, то столкнётесь с необходимостью изучения принципов работы управляющего электромоторами драйвера. Самый простой, недорогой и распространённый драйвер - L298N . Он может управлять скоростью и направлением вращения электромоторов
    fd30b231-86ed-4312-a116-d0ad05c8eebc-image.png

    Управление DC электромоторами

    Управление электромотором подразумевает под собой управление скоростью и направлением его вращения. Это достигается сочетанием двух методов:

    ШИМ (широтно-импульсная модуляция) для управления скоростью вращения
    H-Bridge - для управления направлением вращения

    Управление скоростью вращения при помощи ШИМ

    Скорость вращения мотора регулируется через изменение уровня подаваемого на него напряжения.

    ШИМ это методика, суть которой состоит в том, что среднее значение напряжение на входе регулируется серией импульсов ВКЛ-ВЫКЛ, т.е быстрыми включениями и выключениями подачи напряжения питания к двигателю.

    Средняя величина напряжения будет пропорциональна коэффициенту заполнения (ширине) импульса - чем больше коэффициент, тем выше напряжение, и наоборот.

    Эта картинка иллюстрирует данную зависимость:
    ddaa7f8d-5031-4af3-81f4-4f3535be002d-image.png

    H-Bridge

    Направление вращения регулируется сменой полярности входного напряжения. Стандартным способом реализации такой смены является H-Bridge

    В электрической цепи (которая визуально напоминает букву Н) H-Bridge присутствуют 4 ключа с мотором в центре этой цепи.

    Полярность входного напряжения на моторе будет зависить от того, какая пара ключей замыкает цепь в настоящий момент. Вот так это выглядит:
    Описание

    L298N - драйвер электромотора

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

    Питание драйвера

    Питание к L298N подаётся через трёхконтактный зажимной терминальный разъём (провода вставляются в разъём и зажимаются вращением винта на разъёме).

    • 1 контакт Vs - питание, которое будет подаваться через драйвер на моторы;
    • 2 контакт GND - земля;
    • 3 контакт Vss - питание 5V для управляющего драйвером устройства, в качестве которого может выступать микроконтролер или Raspberry Pi)

    L298N имеет также встроенный стабилизатор (78M05) напряжения до 5V. Когда установлен джампер, то этот стабилизатор работает и с контакта Vss можно снимать 5V 0.5А для питания управляющего драйвером устройства. Когда джампер снят, то стабилизатор выключен, а значит нам нужно питатьуправляющее драйвером устройство от независимого источника питания.

    Использование джампера запрещено, при подаче на 1-ый контакт (Vs) напряжения, превышающего 12В. Это может привести к выходу из строя стабилизатора78M05 .

    Если джампер установлен, то контакт Vss работает как выход . Подавать на него напряжение извне в этом случае запрещено

    Падение напряжения на L298N

    Падение напряжение на драйвере может достигать 2В, за счёт падения напряжения на транзисторах Н-Моста. Таким образом, при подаче на контакт Vs 12В до электромоторов дойдёт только 10В, а значит они не смогут выйти на максимум своих оборотов (естественно речь идёт о 12-ти вольтовых DC электромоторах). Таким образом напряжение, подаваемое на контакт Vss должно быть на 2V выше напряжения работы электромотора (14В для 12-ти вольтовых моторов, 7В для пятивольтовых соответственно)

    Подключение DC электромоторов к драйверу

    Электромоторы подключаются к зажимным контактам по краям платы.
    5a63650b-b1c9-4a8f-b6dd-b7cf295740a5-image.png
    Можно подключать электромоторы, рассчитанные на напряжение 5-35V. Максимальный ток от драйвера к каждому мотору - 2А (если источник питания драйвера умеет отдавать столько тока)

    Контакты контроля направления вращения

    Используя контакты IN1-IN4, можно менять направление вращения электромоторов (различные уровни напряжения на этих контактах приводят к замыканию нужных пар ключей Н-Моста драйвера L298N) - по часовой стрелке или в обратном направлении.

    Контакты IN1 IN2 управляют направлением вращение первого электоромотора (А), IN3 IN4 - второго электромотора (В) Направление вращения моторов зависит от того, какой уровень напряжения (высокий или низкий) подаётся на эти контакты.

    Возможно 4 варианта:

    • Низкий уровень напряжения на обоих контактах - мотор выключен
    • Высокий уровень напряжения на обоих контактах - мотор выключен
    • In1 высокий уровень, In2 низкий уровень - мотор вращается вперёд
    • Ln1 низкий уровень, In 2 высокий уровень - мотор вращается назад

    Контакты контроля скорости

    Для управления скоростью вращения моторов используется контакты ENA (мотор А), ENB(мотор В)

    Низкий уровень - мотор отключен, высокий уровень - мотор работает на максимальных оборотах, ШИМ - различная скорость вращения в зависимости от коэффициента заполнения импульсов. По умолчанию на этих контактах установлены джамперы, их следует снять, если вы хотите управлять оборотами.

    Подключение L298N к Raspberry Pi

    Теперь, когда мы хорошо знакомы с драйвером L298N, можно подключить к нему питание, моторы и Raspberry Pi

    66096124-25be-4a46-bdaf-f63aae402ee7-image.png

    Raspberry Pi я запитал через 5V внешний аккумулятор PowerBank. Поскольку у меня не было аккумулятора на 12V драйвер L298N я запитал от того же внешнего аккумулятора, вставив в него повышающий DC/DC преобразователь

    f1186e19-1d62-4aee-bb42-12add363b640-image.png

    В следующей статье рассмотрим программирование двухколёсного робота с драйвером L298N


  • Еще раз для чайников и только для чайников - будьте внимательны, особенно кому за 50.
    piP pi

    Как миновать простых и незаметных ошибок при первоначальном запуске.

    Если Вам за пятьдесят и Вы очень уверены в себе, все равно внимательно изучите требования к этой "игрушке".

    Для меня запуск платы стал очередным маленьким уроком.

    Как говорят в армии - читайте устав.
    Итак, ошибки, которые для меня оказались незамеченными и привели к некоторым нервным движениям.

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

    Только для чайников!!!
    Буду предельно краток и приведу только результаты.

    1. На поверку оказалось, что система стартует, если даже не совпадает контрольная сумма дистрибутива. Как это отразится в дальнейшем пока не знаю. На всякий случай перекачиваю, хотя мой инет желает лучшего.

    2. Не верьте, точнее читайте внимательней, что система работает с любыми мониторами и телевизорами.

    Касательно монитора, то с VGA не работает, только с DVI.
    Посему приобретите кабель HDMI-DVI.

    Не обращайте внимание на подобное :

    Телевизор или монитор, имеющий входы HDMI или композитный (колокольчики), а так же подходящий кабель

    1. Блок питания постарайтесь приобрести более-менее стабильный. Я применил от моего HTC на 1А.

    2. Карту SD перед инсталяцией образа ОС отформатируйте sd-card reader/writer и panasonic sd карты formatter http://panasonic.jp/support/gl.....index.html.

    У меня заработала карта, которая не прописанная в списке разрешенных - Samsung 2 GB Micro SD от моего HTC.

    1. Если при записи имиджа возникает ошибка записи на SD, то карту меняйте или выбрасывайте. Не заморачивайтесь на восстановление.

    2. В статье http://habrahabr.ru/post/149890/ указано, что при загрузке малинка моргает всеми диодами, но у меня только PWR и OK, что ввело меня в заблуждение относительно работоспособности устройства. PWR и ОК - все в норме.

    3. Для первоначального запуска не нужно редактировать config.txt, как это указано в http://habrahabr.ru/post/149890/. Все должно заработать по умолчанию. Это все делается после освоения Linux.

    В итоге я потратил около 4 часов на исправление указанных ошибок. А все из-за невнимательности при изучении вопроса.

    Малинка загрузилась.

    О дальнейшем буду сообщать. Имеются планы по ее применению.

  • 1
  • 2
  • 310
  • 311
  • 312
  • 313
  • 314
  • 314 / 314
  • Войти

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

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