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

pi

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

Сообщения

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

  • Raspberry Pi Black Box (DIY-корпус)
    piP pi

    Два года назад я купил raspberry pi model b. Я не обладал и не обладаю особыми навыками программирования,поэтому,установив дистрибутив raspbian и наигравшись,я надолго забыл про микрокомпьютер.

    Недавно я откопал свою raspberry и решил докупить недостающее оборудование,заодно собрать корпус. Пересмотрев варианты корпусов,которые в продаже и статьи о самодельных корпусах,я решил собрать что-то своё,уникальное.

    Начертив крышку с выемкой под вентилятор и дно корпуса с отверстиями под болты,я перенес чертеж на плотный картон(обложка учебника),вырезал дно,крышку,выпилил лобзиком отверстия в стенках корпуса(деревянная линейка) с запасом под гнёзда usb,hdmi,композитный выход с миниджеком,карту памяти и micro-usb порт. Под Ethernet гнездо не делал,ибо была задача оснастить raspi для доступа в интернет Wi-Fi. Стыки соединений стенок я укрепил штапиком,после склейки корпус покрасил чернилами 212 ink.Далее я прикрепил 6х6 см вентилятор,отпаял лишний провод и соединил с usb-кабелем,т.к. 6V вентилятор невозможно было запитать от портов GPIO.

    591e7392-afe8-4ce1-988e-9231cc7ec479-image.png

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

    Размер корпуса ДхШхВ:12,5 x 9,5 x 2,5 см.Также я оснастил корпус длинными болтами для того,чтобы закрепить raspberry на стенке.

    Из оборудования докупил wi-fi адаптер TP-Link размером с передатчик от мышки(не проверил совместимость-с ним пришлось повозиться), usb-хаб на 4 порта,мышь и клавиатуру.В целом очень доволен и самой raspi и корпусом-с активным охлаждением микрокомпьютер работает все время в турбо-режиме
    652850d3-66c0-4fa5-b461-606b787e2c57-image.png


  • Подключение RTC (часы реального времени) к Raspberry Pi
    piP pi

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

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

    Самыми популярными RTC являются часы на основе чипов DS1307,DS3231 и т.д. Я рекомендую часы на основе DS3231, т.к они одни из самых точных.

    Рассмотрим, как с ними работать:

    echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    

    регистрируем часы в системе

    Для работы с RTC в Linux существует утилита hwclock

    hwclock -r - считать время, сохранённое в RTC
    hwclock -s - синхронизировать время системы с временем RTC
    hwclock -w - записать текущее системное время в RTC
    

    Таким образом, после того, как вы установите в системе точное время при помощи утилиты date (например date --set=”20140125 09:17:00”, если есть доступ к сети, то можно синхронизировать системное время с точным временем при помощи сетевой службы ntp - ntpd -gq), необходимо записать это время в RTC -

    hwclock -w
    

    При каждой загрузке системы необходимо в качестве системного времени, устанавливать время, сохранённое в RTC.

    Для этого пропишите в /etc/rc.local перед exit0 следующие команды:

    echo ds3231 0x68 > /sys/class/i2c-adapter/i2c-1/new_device
    hwclock -s
    

    Опционально можно отключить синхронизацию системного времени через Интернет:

    sudo update-rc.d ntp disable
    

  • Дача, USB-модемы, две малины, или сказ о том, как я температуру в доме проверял.
    piP pi

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

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

    Дано: 2 дачи.

    • Первая - с газовым отоплением, и основная задача - поймать момент снижения температуры (ака потухший фитиль), чтобы осталось время приехать и зажечь его, не дать трубам разорваться от замерзшей в них воды. Интернет - gprs, качество приема - устойчивое.
    • Вторая - без отопления, только электрические тены. Тут необходимо удаленное включение устройств(тенов), поддержание комфортной температуры для сна. Интернет - отсутствует, gsm сигнал есть, однако работает скверно.

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

    Общение с внешним миром из-за отсутствия Интернет - только по смс.

    Основная последовательность действий:

    1. установка debian os

    2. изменение modeswitch usb свистка, на режим модема

    3. написание программы для работы с приемом, парсингом и отправкой сообщений.

    Язык python, библиотека для общения с модемом - gammu, датчик температуры bmp085, LCD дисплей, и два простых реле.

    Основные функции: Включение питания (пин 4), Включение второго устройства (пин 17), получение сведений о температуре и их отправка, переход в режим поддержания температуры в определенном интервале.

    Самое интересное, код:

    # -*- coding: utf-8 -*-
    import gammu
    import time
    import RPi.GPIO as GPIO
    import Adafruit_BMP.BMP085 as BMP085
    import lcddriver
    import os
    from datetime import datetime
    from subprocess import call
    
    f = open('/var/log/sms','a')
    f.write(str(datetime.now()) + ' System started\n')
    f.close()
    
    GPIO.setmode(GPIO.BCM)
    pinList = [4, 17]
    sensor = BMP085.BMP085()
    lcd = lcddriver.lcd()
    
    #Обьявляем телефоны, с которых мы будем обрабатывать смски
    cellphones = ['+7926XXXXX','+7926XXXXXX']
    currcommand = ''
    
    for i in pinList: 
        GPIO.setup(i, GPIO.OUT) 
        GPIO.output(i, GPIO.HIGH)
    
    
    sm = gammu.StateMachine()
    sm.ReadConfig()
    sm.Init()
    sm.GetSMSStatus()
    
    #Создаем функцую для удаления всех смс, на случай, если аппарат был выключен и накопилась очередь сообщений.
    
    def delete_all_sms():
    	status = sm.GetSMSStatus()
    	remain = status['SIMUsed'] + status['PhoneUsed'] + status['TemplatesUsed']
    	start = True
    	while remain > 0:
    		sms = sm.GetNextSMS(Start = True, Folder = 0)
    		remain = remain - len(sms)
    		for m in sms:
    			sm.DeleteSMS(Location = m['Location'], Folder = 0)
    
    #функция чтения смс, с удалением после прочтения.
    def retSMS():
    	start = True	
    	sms=[{'Number':0,'Text':2},{'Number':0,'Text':2}]
    	while 1:
    		try :
    			if start:
    				sms = sm.GetNextSMS(Start = True, Folder=0)
    				start = False
    			else:
    				sms = sm.GetNextSMS(Location = sms[0]['Location'], Folder=0)
    		except gammu.ERR_EMPTY:
    			break
    		
    	try:
    		
    		delete_all_sms()
    	except gammu.ERR_EMPTY:
    		a=1
    	return(sms[0]['Number'],sms[0]['Text'])	
    
    #Объявляем функцию отправки сообщений, с перезагрузкой, в случае сбоя. Такое случается крайне редко
    # Однако, т.к. система находится далеко, необходимо, чтобы в случае падений, перезапускалось само.
    
    def sndSMS(number,smstext):
    	message = {
    	'Text': smstext,
    	'SMSC': {'Location': 1},
    	'Number': number,
    	}
    	try:
    		sm.SendSMS(message)
    	except gammu.ERR_UNKNOWN:
    		f = open('/var/log/sms','a')
    		f.write(str(datetime.now()) + ' Failed to send sms\n')
    		f.write(str(datetime.now()) + ' Rebooting in 3.5 minutes...\n')
    		print ("failed to send")
    		time.sleep(200)
    		f.write(str(datetime.now()) + ' Rebooting...\n')
    		f.close()
    		os.system("sudo shutdown -r now")
    
    	
    #read temperature
    def readtemp():
    	curtemp=sensor.read_temperature()
    	return curtemp
    
    
    #Основная функция расшифровки сообщений, обработки заданий.
    def parscom(detSms):
    	currcommand=''
    	if detSms[0] in cellphones:
    			if detSms[1]=='On':
    				GPIO.output(4, GPIO.LOW)
    				sndSMS(detSms[0], 'Otoplenie on')
    				currcommand='On'
    			if detSms[1]=='Poliv':
    				GPIO.output(17, GPIO.LOW)
    				sndSMS(detSms[0], 'Poliv ON')
    				currcommand='PolivOn'
    			if detSms[1]=='PolivOff':
    				GPIO.output(17, GPIO.HIGH)
    				sndSMS(detSms[0], 'Poliv Otkluchen')
    				currcommand='PolivOff'	
    			if detSms[1]=='Off':
    				GPIO.output(4, GPIO.HIGH)
    				sndSMS(detSms[0], 'Otoplenie Off')
    				currcommand='Off'
    			if detSms[1]=='Temp':
    				print readtemp()
    				sndSMS(detSms[0], 'Temp: ' + str(readtemp()))
    			if detSms[1].split()[0]=='Set':
    				temp=detSms[1].split()[1]
    				GPIO.output(4, GPIO.LOW)
    				currcommand='Set ' + temp
    				sndSMS(detSms[0], 'Night mode On. Temperature set: ' + str(temp))
    	return currcommand
    
    #Реализация функции поддержания температуры.
    def otoplenie_night(settemp):
    	curtemp=readtemp()
    	try:
    		if curtemp>int(settemp)+0.5:
    			
    			GPIO.output(4, GPIO.HIGH)
    		if curtemp
    			
    			GPIO.output(4, GPIO.LOW)
    	except:
    		GPIO.output(4, GPIO.HIGH)
    
    
    #Основной цикл - отправка смс при включении, вызов функций чтения смс, парсинга, и вывода на lcd дисплей.
    sndSMS('+7926XXXXXX', 'Cucmema Pa6omaem')			
    while 1:
    	detSms=retSMS()
    	newcommand = parscom(detSms)
    	lcd.lcd_display_string("TEMnEPATYPA: " + str(readtemp()) + " C" , 1)
    	if currcommand != newcommand and newcommand != '':
    		currcommand=newcommand
    		lcd.lcd_display_string("KOMAHDA:       " , 2)	
    	lcd.lcd_display_string("KOMAHDA: " + currcommand  , 2)	
    	try:
    		if currcommand.split()[0]=='Set':
    			otoplenie_night(currcommand.split()[1])
    		
    	except IndexError:
    		a=0
    	time.sleep(5)
    

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

    Работает по крону 2 скритпа:

    1. делаем фото окружающей природы с камеры подключенной по usb к малине и отправляем на список почтовых адресов.

    2. вызываем бесплатный интернет-сервис по отправке смс сообщений.

    • Запускается gammu демон, который автоматически подключается к интернету при загрузке малины.

    Код получения картинки и отправки по почте:

    from smtplib import SMTP_SSL
    from email.MIMEMultipart import MIMEMultipart
    from email.MIMEBase import MIMEBase
    from email import Encoders
    import os
    
    
    #Меряем температуру (Датчик DS18B20)
    def readtemp():
        tfile=open("/sys/bus/w1/devices/28-00000633a133/w1_slave")
        ttext=tfile.read()
        tfile.close()
        temp=ttext.split("\n")[1].split(" ")[9]
        temperature=float(temp[2:])/1000
        return temperature
    
    temperatur=str(readtemp())
    
    
    #Делаем фото
    os.system ("fswebcam -r 1024x768 -S 15 /home/pi/pics/static/temp.jpg")
    
    #Путь для аттача
    filepath = "/home/pi/pics/static/temp.jpg"
    basename = os.path.basename(filepath)
    #куда отправлять письма:
    address = ['XXX@gmail.com','XXXX@list.ru','XXX@mail.ru']
    
    Наш аккаунт, откуда отправляем
    adressfrom='XXX@yandex.ru'
    # Compose attachment
    part = MIMEBase('application', "octet-stream")
    part.set_payload(open(filepath,"rb").read() )
    Encoders.encode_base64(part)
    part.add_header('Content-Disposition', 'attachment; filename="%s"' % basename)
    
    # Compose message
    msg = MIMEMultipart()
    msg['From'] = adressfrom
    msg['To'] =  ", ".join(address) 
    msg['Subject'] = 'A vot i temperatura ' +  temperatur
    msg['Body']='Temperatura' 
    msg.attach(part)
    
    
    # Send mail
    smtp = SMTP_SSL()
    smtp.connect('smtp.yandex.ru')
    smtp.login(adressfrom, 'PASSWORD')
    smtp.sendmail(adressfrom, address, msg.as_string())
    smtp.quit()
    

    В результате получаем на почту такую красивую картинку, и на душе как-то становится теплее.

    1dce9a25-d1b2-460d-9861-2e01c6fe3095-image.png

    А это код отправки СМС с использованием бесплатного веб-сервиса:

    import requests
    import os
    
    #Читаем температуру
    def readtemp():
        tfile=open("/sys/bus/w1/devices/28-00000633a133/w1_slave")
        ttext=tfile.read()
        tfile.close()
        temp=ttext.split("\n")[1].split(" ")[9]
        temperature=float(temp[2:])/1000
        return temperature
    
    temperatur=str(readtemp())
    #вызываем веб сервис, для формирования смс.
    r = requests.get('http://sms.ru/sms/send?api_id=ID_API&to=7926NUMBER4&text=Temperatura+'+ temperatur)
    q = requests.get('http://sms.ru/sms/send?api_id=ID_API&to=7910NUMBER&text=Temperatura+'+ temperatur)
    

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

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


  • RPi, Linux, fuse
    piP pi

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

    И снова велосипед, который написал, скорее, для своего удобства. Понадобилось писать скриптик для одного девайса, заливать на девайс и запускать там на исполнение. Заливать по ssh надоело и решил я это исправить. У меня уже есть один лисапед, который называется ferro_remote, который я описывал тут. Собссно решил накидать fuse клиента, чтоб беспрепятственно монтировать устройство типа малины в локальную систему. Про всякие sshfs я тоже вкурсе, но это ж не наш метод ...

    Собссно ничего сверх сложного нет. Просто еще один клиент, который использует протокол ferro_remote и монтирует удаленую FS в локальную директорию. Называл его fuse_client (тада! внезапно). Исходники, как обычно лежат тут. Собранные бинарник агента (серверная часть) и клиента для Rpi можно взять тут. Могу собрать для ubuntu x64 и то и другое, если кому надо будет.

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

    Подразумевая, что агент у нас запущен на девайсе с адресом 192.168.1.11 и портом 12345, можно замапить это устройство локально (можно соединить так же 2 малины, или 2 любых линукса).

    • не следует, однако, мапить устройство само на себя, чревато дедлоками 🙂
    > ./frfuse_client -s 192.168.1.11:12345 -m /home/data/fuse/ -f -d 
    FUSE library version: 2.9.4
    nullpath_ok: 0
    

    .....
    тут

    -m /home/data/fuse/ - локальный путь, куда нужно мапить устройсто. Директория должна быть пустой.

    -f- оставаться в foreground и не уходить в демона. Остановить клиента можно будет по Ctrl+C. Без этого параметра клиент станет демоном и остановить его можно будет командой

    fusermount -u /home/data/fuse/
    -d - писать лог в консоль. Без параметра -f не имеет смысла.

    Все.

    Теперь в директории /home/data/fuse у нас корень устройства. Можно даже можно слушать музыку и менять теги в файлах.

    Можно скопировать туда что-нить

    b556a5b7-b031-4a46-a6b8-1a2165c7bb27-image.png

    Или получить доступ к sysfs
    848713a0-bbd7-4215-ab69-8238b2a613f4-image.png

    Еще есть поддержка базовой аутентификации (ключ --key у агента и клиента)

    За сим все.


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

    Приветсвую.

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

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

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

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

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

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

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

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

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

    gpio = fr.client.gpio -- алиас для таблицы gpio
    
    local TRIG = 2 
    local ECHO = 3
    local last_tick = 0 -- это отметка времени, в которое произошло событие
                        -- отсчитывается от старта агента на RPi
    function handler( data ) -- функция-обработчик для события изменения состояния эхо
        if last_tick ~= 0 then -- начало. Первое событие придет при подписи, 
                               -- поэтому обрабатываем только ситуацию после
    	local val = data.value 
    	if val == 1 then   -- если ехо поднялось, то это посылка сигнала устройством
    	    print( "signal sent!" ) 
    	else               -- а теперь эхо скинулось, стало быть мы получили ответ
    	    print( "echo received; distance = ", 
                       (data.interval - last_tick) / 58, "cm"  ) -- теперь просто вычтем из текущего прошлое 
                                                                 -- и поделим на 58 (можно умножить на 0.01724)
                                                                 -- как нам говорит даташит
    	    fr.exit( ) -- завершим скрипт
    	end
        end   
        last_tick = data.interval -- меняем значение последнего интервала
    end
    
    
    function main( )
        fr.run( )  -- запустит очередь событий
        T = assert(gpio.export(TRIG, "out")) -- откроем триггер на out
        E = assert(gpio.export(ECHO, "in"))  -- эхо на "in"
        assert(E:set( "edge", "both" ))      -- сделаем возможным обрабатывать события эха "both" = сброс и подъем
        assert(E:subscribe( "on_changed", handler, E, T )) -- подписка на событие. 
                                                           -- E и T  переданы как параметры, 
                                                           -- чтоб не были убиты сборщиком мусора
        assert(T:pulse( 50 )) -- вызов pulse поднимет триггер на 50 микросекунд. Кто-то советует сделать больше
    end
    

    Все.

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

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

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

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

    191.03448275862	
    192.55172413793
    189.79310344828
    192.36206896552
    193.94827586207
    

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


  • ExaGear.Запускаем приложения x86 на Raspberry Pi
    piP pi

    Если вам интересно как запустить x86 приложения на Raspberry Pi, то прошу под кат, все намного проще чем вы думаетеСтатья является логическим продолжением вот этой статьи(ссылка).

    Знакомство

    С ExaGear вы можете запустить приложение x86 на Mini PC одновременно с обычными родными приложениями. ExaGear представляет собой виртуальную машину, которая реализует виртуальный контейнер x86 Linux на ARM и позволяет запускать приложения x86 непосредственно на ARM.Вы даже можете запускать приложения для Windows на вашем ARM Mini PC, если вы установите Wine.

    Использование

    Все как-то даже слишком легко Вводим в консолиexagearи понеслась,вы в x86 системе и можете установить x86 программы

    Тесты

    Я тестировал Wine.Все работет очееень быстро,запускается все прекрасно.

    f86e0a7f-2444-41d8-8b8d-29477f9b6c9a-image.png

    На скрине выше я решил показать вам как выглядит запущенная таким образом NOTEPAD++

    Где же это взять?

    Программа платная и продается на офф.сайте разработчика ССЫЛКА

    Послесловие

    ExaGear действительно работает очень хорошо и так как о нем говорит его разработчик. Если вы хотите проверить,будет ли работать то или иное приложение можете связаться со мной через ЛС на сайте или через VK(Указан в профиле на сайте) и я постараюсь потестировать его для вас.

    Благодарности

    Хочу выразить благодарность Eltech.inc Вадиму и интернету в общежитии 🙂


  • Raspberry Pi Zero корпус Корпус для Raspberry Pi Zero: быстро, просто, практично
    piP pi

    Как-то попался на глаза маленький раздвижной пластиковый контейнер, в которых иногда продают модули памяти для ПК.
    ee037dd8-6611-4df2-953d-696e3b3b2965-image.png
    По ширине он ненамного больше, чем Raspberry Pi Zero: так что возникла мысль сделать из него корпус для "микро-малинки". Сказано - сделано: примерил, отрезал по размеру, попробовал. Получилось так:

    9c4e725d-a64c-441b-b82d-9eaf8dae3cb0-image.png

    Осталось только прорезать небольшое отверстие для разъёма питания microUSB - и можно пользоваться! Подключать microUSB / OTG и HDMI не планирую, но можно, если понадобится, вырезать отверстия и для них. Вполне практичный корпус: смотрится неплохо. При желании можно сверху или снизу вырезать "окошечко" для подключения к GPIO.

    fdc961a5-d8b3-49a6-a653-7213f658a035-image.png

    На всё ушло буквально несколько минут, из инструментов нужны только резак для бумаги да ножницы. (Наверное, если не торопиться то получилось бы немного аккуратнее... 🙂

    4ce18fb1-e62a-4453-90db-ead60769adb1-image.png


  • ДЖИПИЭС ГЛОНАС U-BLOX 7 под юсби разъём и установка программы навигатора 7 дорог на расбери пи 3
    piP pi

    У МЕНЯ ПОЛУЧИЛОСЬ ТАК, скачиваете с официального сайта программу 7 дорог на расбери пи 3,в папку /home/pi/Download, там она будет под арм линукс не линукс 86 или се,а именно арм линекс,я указал синим цветом ниже, и так после скачивания и распаковки в хомпи довнлоодс,так написал по русски а то нету времени писать на английском),заходите и открываете в эту папку и ищите в виде рисунка самолётика бумажного нарисованного и в низу написано 7 ways, после нажимаете на этот значёк и открываете его,и откроется программа 7 дорог,послеможете полазить в настройках и скачать если интернет включён карту голосовые настройки скины и так далее,короче настроить нужно.

    После всего этого подключаете к юсби разьёму джипиэс глонас и после заходите с настройки джипиэс и там нужно сделать малые монипуляции местоположение на значке нажать определять Экорректировка времени поставить галочку, определять данные о движении и самое главное как у меня не раз получалось нажать галочку использовать порт и в нижней строке прописать 9600 а выше в строке у меня расбери так отвечает на путь программы и джипиэс глонаса /dev/ttyACM0 потом подтвердить нажать опять на галочку,что бы видно было прозрачно,что вы прописали и цифры и буквы английские и потом нажать ок и если всё прошло хорошо,то ещё раз можете зайти в настройки джипиэс и увидите как линии красного цвета скачут в верх и в низ,значит всё впорядке,зелёными они будут потом,когда вы вынесете расбери на улицу конечно же с джипиэс глонас,но если не получится,значит или вы не то,что то сделали или путь не /dev/ttyACM0, может у вас dev/ttyUSB0 , но ещё в командной строке сделайте такую манипуляцию,если не получится так как я описал выше,я сделал так а потом выше как описывал и всё получилось сразу sudo bashsudo apt-get install gpsd gpsd-clients python-gps и потом закрыл всё и всё работает.ну если на худой конец не получится и так то нужно подолбатся конечно в командной строке и прописывать разную ерунду в виде вот этой,это как бы более правильно но или дев тати юсби ноль или дев тати асм ноль,Пробуйте, может у вас получиться.

    #проверка устройств USB

    lsusb
    
    #проверка ls /dev/ttyUSB
    

    должен определиться: /dev/ttyUSB0

    #нужно установить

    apt-get install gpsd gpsd-clients python-gps
    

    Исправить файл sudo nano /etc/default/gpsd
    Все убрать и вставить это

    START_DAEMON=«true»
    GPSD_OPTIONS=«n»
    DEVICES="/dev/ttyUSB0"
    USBAUTO=«false»
    GPSD_SOCET="/var/run/gpsd.sock"
    

    перегрузить

    sudo /etc/init.d/gpsd restart
    

    #проверка спутников cgps -s или gpsmon или xgps

    #перед запуском «семь дорог» исполнить в терминале (перевод в NMEA )

    gpsctl -f -n -s 4800 /dev/ttyUSB0
    

    для 7дорог в поле порт добавить
    Ваш адрес утройства — /dev/ttyUSB0 скорость 4800

    Чтобы не гас экран (не срабатывал хранитель экрана) в файл /etc/lightdm/lightdm.conf добавить в конец секции

    [SeatDefaults] строку:xserver-command=X -s 0 dpms
    

    #командой править файл sudo nano /etc/lightdm/lightdm.conf


  • Обзор речевых синтезаторов (Text To Speach, TTS) для Raspberry Pi
    piP pi

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

    Festival TTS

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

    Установка:  sudo apt-get install festival
    

    Пример использования:

    echo "This is a sample text" | festival --tts
    
    ESpeak TTS
    
    Установка: sudo apt-get install espeak
    

    Пример использования:

    espeak -ven+f1 -k5 -s200 "This is a sample text"
    

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

    -s - скорость речи, количество слов в минуту,

    -g - длительность паузы между словами в милисекундах

    -v[код языка][высота тональности и тип голоса - мужской женский], пример -ven+f1 : англоязычный женский голос, тональность +1

    -k - выделение слов, начинающихся с заглавной буквы.

    В ESpeak TTS реализована поддержка языка разметки синтеза речи https://ru.wikipedia.org/wiki/Speech_Synthesis_Markup_Language

    Google

    Можно также использовать речевой синтезатор, встроенный в Google Translate. Качество синтеза хорошее, нотребуется подключение к интернету.

    Пример скрипта g_speak.sh для использования Google Translate в качестве речевого синтезатора в вашем проекте :

    #!/bin/bash
    say() {
     local IFS=+;/usr/bin/mplayer -ao alsa -really-quiet -noconsolecontrols "http://translate.google.com/translate_tts?ie=UTF-8&client=tw-ob&q=$*&tl=ru";
     }
    

    say $*
    Запускаем скрипт: ./g_speak.sh Текст, который нужно сказать

    Pico TTS

    Один из лучших синтезаторов речи для Raspberry Pi, который также используется в ОС Android

    Установка:

    sudo apt-get install libttspico-utils
    

    Пример использования:

    pico2wave -w sample.wav "This is a sample text" && aplay sample.wa
    ```v

  • Подключаем датчик движения к Raspberry
    piP pi

    Задача: подключить датчик движения и контролировать события

    ПО: NodeJS
    Hardware: Raspberry, например, Риэлта Фотон-21

    Схема подключения:
    5fa6e912-627d-46fe-8765-ff77c4ed0da1-image.png
    Для управления GPIO я использую библиотеку rpi-gpio.js Пример кода для чтения данных датчика на пине 11 (GPIO17). Не забыть GND подключить к земле блока питания!

    var gpio = require('rpi-gpio');
    gpio.on('change', function(channel, value) {
    console.log('Channel ' + channel + ' value is now ' + value);
    });
    gpio.setup(11, gpio.DIR_IN, gpio.EDGE_BOTH);
    

  • 2 полезных платы электропитания Raspberry Pi Zero
    piP pi

    Хочу поделиться небольшим опытом использования 2-х плат для подключения электропитания ко всем разновидностям Raspberry Pi Zero (1.2, 1.3, W, WH).

    Общее у этих плат то, что они:

    • не занимают для питания контакты GPIO
    • питают Zero через "testing pads" (точки подключения PP);
    • легко подключаются / отключаются без пайки.

    #1. USB Hub & Powermanager for RPi Zero v1.0 (производитель Elcrow).

    8ea1c1c5-2edf-4451-aac3-11276e6100db-image.png
    Цена: $6.15.

    Подключается к Pi Zero с помощью подпружиненных штырьковых контактов к точкам подключения PP1, PP6, PP22 и PP23 на RPi. Прижимается к плате Zero пластиковыми шестигранными распорками с резьбой и гайками (в комплекте).

    В результате у "малинки" будет USB-хаб на 4 полноразмерных USB-порта (2.0) + 1 microUSB порт для дополнительного электропитания. На плате ещё есть разъём для подключения альтернативного питания внешней LiPo батареи.

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

    #2. BadUSB USB-A Addon Board for Raspberry Pi Zero v.1.1.

    5c65f1b5-d40a-4c6a-ab72-8bed42c80174-image.png
    Цена: $6.84.

    Тоже подключается к Pi Zero с помощью подпружиненных контактов к точкам подключения "testing pads". Прижимается к Zero пластиковыми болтиками и гайками (в комплекте). Можно этот "бутерброд" поместить в красивый корпус. В результате Zero выглядит как USB-флэшка или как модный USB-ПК (Dongle Computer).

    В таком виде "малинку" удобно подключать прямо в USB-порт компьютера или запитать от любого USB-разъёма без провода.

    Обе платы покупал на AliExpress, но можно купить и в других местах: они довольно популярны.


  • УСТАНОВИЛ ВИНДОВС 10 НА РАСБЕРИ ПИ 3
    piP pi

    Когда у меня появилась расбери пи 3,всегда очень хотелось установить на неё виндовс,но этого не удавалось,и мало того,все крутили у виска,мол дурак,на арм устройство не ставится виндовс,да,персональная виндовс как у вас у всех на компьютере,конечно не ставится,но заточенная под арм устройство,ставится ещё как),правда как и другие разработки,конечно она сырая,и что то нужно додумывать, и допиливать,установил я совсем недавно, так что додумывать придётся какое то время,если вообще будет время на это), у виндовс 10 понравился запуск самой системы,первое что можно увидеть,это яркая малина на 19-ти дюймовом экране, с зелёной полоской загрузки виндовс10, почему такую малину не придумали при запуске расбиана мне не понятно,добавили бы графики и тд,это же прикольно и интересно пользователю таких систем,но видно это никому не нужно,и так,я отвлёкся немного),после идёт запуск виндовс 10,обычный запуск,как у вас на компе,когда система полностью запустилась,всё как бы на первый взгляд одинаково,что в старой версии,что в новой,но единственное что изменили,это на панели задач добавили пару папок,и значки немного изменённые,а так же в настройках пару приблуд интересных для настроек,а так всё тоже самое,как и у всех виндовс 10,но это я о плюсах,какие есть минусы,ставится система не хотелась, вернее нужно знать как ставить,я установил с 8-го раза.но может кому повезёт,и поставите с первого или пятого),видео я увидел с ютуба,как один американец поставил виндовс себе на расбери пи 3,ниже выложу ссылку,правда поймёте или нет,фото виндовс по позже выложу здесь,а видос посмотрим,может и будет,короче,как точно поставить рассказывает Американец вроде,я немного расскажу про запуск,если будете записывать виндовс 10 арм рс 4 для 64 систем,то желательно записывать на сиди карту 32 гига,потому что,я записал на 16-ти гиговую,так мне выдал копм,короче вся система занимает 10 гиг.и у вас где то от 4-х до 5-ти гиг останется,из за этого система немного тормозит. Вот ссылка для видео https://www.youtube.com/watch?v=6b1IxvKJeho

    После как записали,включаете,и после заставки малины,нажимаете,у всех по разному на клаве,так что у меня ESC,нажимаем,и попадаем в биос,в биосе нужно как на видео поменять кое что,после сохраниться и выйти из системы,после желательно,выключить мышку и клавиатуру,что бы система загрузилась до того момента,пока не выскочит ввести регион странны,конечно выбрал русский,ну и нажимать далее,короче всё по инструкции,желательно это делать быстро,так как может затормозить система,и часто вылетает драйвер,клавиатуры и мышки,а вот там ещё есть виртуальная клавиатура,она не вылетает,после ввода паролей,всё нажимаем далее и система запуститься,но когда система запуститься с панели задач лучше многое удалить,потому что тормозит систему,всё это есть в меню пуск,но вот проблема сейчас пока что с драйверами,то ли они слетели,или их не было,короче нужно ставить каким то образом,потому что флешку или не видит или драйвера нужны,пока в этом и есть проблема,ещё была проблема при запуске,система расчитана вроде на 15-ти или 17-ти 20-тидюймовый экран,мне пришлось прописать в конфиге т икс т разрешение экрана для 19 -ти дюймового экрана,сейчас работает хорошо и видно систему на весь экран,до этого было видно на половину,так что смотрите сами,ещё нужно поработать над ней хорошенько,и она запускается с правой стороны написано в тестовом режиме,сырая разработка ещё.Но за то, есть нормальные первые результаты,и это радует).

    На днях этот Американец,показал,как после установки виндовс 10,установить драйвера,и подключить интернет,кратко описал,может кому и не будет понятно,но вот ссылка https://www.youtube.com/watch?v=sBslh3nWu0U

    Сегодня переустановил ещё раз виндовс 10 с новыми драйверами,и после установки тоже добавил драйвера для того,что бы работал интернет,в итоге всё работает,но повторюсь,у меня 16 гиг сиди,плюс минус,а нужно хотя бы 32 гига,из за этого долго немного включаются те или иные функции,но всё работает,можно смотреть фильмы,слушать музыку,можно работать в майкрософт офис,подключал флешку,флешка работает,правда из за того,что система тормозит,пока точно установку программы не удаётся,а так же с флешки можно устанавливать видео на рабочий стол или куда душе угодно,музыку,фото,делать заставку рабочего стола и тд,всё как обычно в виндовс 10,конечно у меня 2015 года расбери,но я думаю,если купить новейшую расбери,эта система будет летать),в дальнейшем думаю приобрести сиди 32 гига,установить и поработать над программами,что бы можно было их нормально установить и ими пользоваться,мне всего то нужно,что бы на этой системе работало 6 программ,так что системы всё ближе и ближе к тому,что бы запускаться у вас на ладони,и не нужны будут громоздкие платы,которые мы покупаем,тратя бешеные деньги,кому не хочется долбатся с такой системой,есть выбор купить лате панда.но стоит дорого,а я думаю платить дорого ни кто не хочет). Вот ещё ссылка по установке виндовс 10,в тестовом режиме,устанавливал Немец, https://www.youtube.com/watch?v=aMNdoB3smLc


  • vcgencmd
    piP pi

    vcgencmd - консольная программа, которая поможет узнать немного интересной информации о состоянии процессора и прочих частей Raspberry Pi. Данная программа не является базовой для Linux дистрибутивов, поставляется исключительно с Raspbian и заточена на работу с Raspberry Pi

    vcgencmd commands - получение списка доступных команд

    vcgencmd measure_temp - получение температуры процессора

    vcgencmd measure_volts [volts] -показать напряжение модуля, переданного в аргументе [volts]. Доступные значения аргумента:

    • core
    • sdram_c
    • sdram_i
    • sdram_p

    vcgencmd measure_сlock [clock] - показать частоту модуля, переданного в аргументе [clock]. Доступные значения аргумента:

    • arm - частота ядра процессора
    • core - VC4 scaler cores
    • H264 - H264 блок
    • isp - Image Signal Processor
    • v3d - 3D блок
    • uart - UART
    • pwm - ШИМ блок (аналоговый аудиовыход);
    • emmc - интерфейс карты памяти
    • pixel
    • vec - Analogue video encoder
    • hdmi - HDMI
    • dpi - Display Peripheral Interface

    vcgencmd codec_enabled %codec% - проверить доступность аппаратного кодека, переданного в параметре%codec%. Доступные значения -H263, H264, MPG2, WVC1, MPG4, AGIF, MJPA, MJPB, MJPG, WMV9, MVC0.

    vcgencmd get_config [config|int|str] - показать значение определённого параметра из файла /boot/config.txt. Третьим аргументом передаётся название конкретного параметра (значение которого нас интересует), либо int для показа всех параметров с целочисленными значениями, либо str для показа всех параметров со строковыми значениями.

    vcgencmd get_mem arm/gpu - показывает сколько оперативной памяти отведено для использования обычным процессором, а сколько для видеоядра. Значение arm может быть некорректно для моделей Raspberry Pi 4 c 2Gb и 4Gb оперативной памяти, для них лучше использовать команду

    cat /proc/meminfo
    

    vcgencmd version - показать версию и дату сборки прошивки

    vcgencmd otp_dump - показать содержимое OTP-памяти. Адреса 28 и 30 этой памяти содержат значения серийного номера и ревизии платы, которые также можно получить командой cat/proc/cpuinfo Чему соответствуют прочие значения в этой памяти - неизвестно

    vcgencmd set_backlight - в настоящее время не используется. В будущем возможно будет использоваться для управления подсветкой подключённого экрана

    vcgencmd display_power 0/1 [display_id] - включить/выключить видеовыход c идентификатором [display_id]. Список идентификаторов доступных видеовыходов можно получить командой

    tvservice -l
    

    На Raspberry Pi 4 первый HDMI выход имеет идентификатор 7, таким образом команда vcgencmd display_power 0 7 отключит его

    vcgencmd get_lcd_info - показать разрешение и глубину цвета подключенного дисплея

    vcgencmd get_camera - показать подключена или нет официальная CSI-камера

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

    Бит 0 В настоящий момент производительность процессора снижена из-за проблем с питанием, низкое напряжение
    Бит 1 В настоящий момент производительность процессора снижена из-за ручного ограничения частоты
    Бит 2 В настоящий момент производительность процессора снижена
    Бит 3 В настоящий момент производительность процессора снижена из-за перегрева процессора
    Бит 16 Производительность процессора в этом сеансе работы была когда-то снижена из-за проблем с питанием, низкое напряжение
    Бит 17 Производительность процессора в этом сеансе работы была когда-то снижена из-за ручного ограничения частоты
    Бит 18 Производительность процессора в этом сеансе работы была когда-то снижена
    Бит 19 Производительность процессора в этом сеансе работы была когда-то снижена из-за перегрева процессора
    

    vcgencmd mem_oom - Статистика событий Out Of Memory, случившихся в области памяти VC4

    vcgencmd read_ring_osc - показать температуру и напряжение кольцевого осциллятора

    vcgencmd hdmi_timings - показать тайминги текущих настроек HDMI


  • Raspberry Pi 4 и UART
    piP pi

    В Raspberry Pi доступно несколько последовательных портов, каждый из которых управляется UART трансивером. На всех моделях (кроме Raspberry Pi 4) их 2 - UART0, UART1. В Raspberry Pi 4 в дополнение к этим UART трансиверам могут быть активированы ещё 4 - UART2, UART3, UART4, UART5 (для активации нужно прописать в конфиг /boot/config.txt -

    dtoverlay=uartX где x=2,3,4
    
    enable_uart=1
    

    для активациии UART0/1

    Типы UART в Raspberry Pi бывают 2х видов:

    PL011 - полноценный UART во многом совместимый с форматом UART 16550 https://en.wikipedia.org/wiki/16550_UART
    miniUART- UART с урезанным набором возможностей и некоторыми сложностями в использовании.
    Таблица соответствия последовательных устройств и GPIO пинов - UART трансиверам

    /dev/ttyS0	UART1 (MiniUART) TX - GPIO 14, RX - GPIO 15
    /dev/ttyAMA0	UART0 (PL011) TX - GPIO 14, RX - GPIO 15 
    /dev/ttyAMA1	UART2 (PL011) TX2 - GPIO 0, RX2 - GPIO 1
    /dev/ttyAMA2	UART3 (PL011) TX3 - GPIO 4, RX3 - GPIO 5
    /dev/ttyAMA3	UART4 (PL011) TX4 - GPIO 8, RX4 - GPIO 9
    /dev/ttyAMA5	UART5 (PL011) TX5 - GPIO 12, RX5 - GPIO 15
    

    Проверить какие выводы GPIO каким UART трансиверам соответствует можно командой

    raspi-gpio funcs
    

    a8a4182c-56e9-490e-9d95-b7fae66a4b59-image.png

    Если активен Bluetooth, то TX/RX пинами GPIO14/GPIO15 управляет miniUART и подключенное к порту устройство доступно как /dev/ttyS0

    Если отключить Bluetooth, прописав в конфиг /boot/config.txt - dtoverlay=disable-bt (также возможно потребуется выполнить команду sudo systemctl disable hciuart), то TX/RX пинами GPIO14/GPIO15 будет управлять PL011 UART и подключенное к порту устройство доступно как /dev/ttyAMA0


  • Wiring Pi - библиотека работы с GPIO. Часть 1
    piP pi

    Данная статья рассчитана на пользователей, имеющих представления об основах GPIO Raspberry Pi.

    Если эта тема для вас новая, то перед прочтением статьи рекомендую ознакомится с другими статьями для начинающих на тему GPIO - их можно найти в разделе "Документация"

    В настоящее время самой популярной библиотекой для работы с GPIO на Raspberry Pi стала wiringPi

    Установка wiringPi

    1. Если у вас нет утилиты git для работы с github-репозиториями, то устанавливаем:
    sudo apt-get install git-core
    
    1. Скачиваем исходники библиотеки из репозитория -
    git clone git://git.drogon.net/wiringPi
    

    !!!UPD: автор библиотеки прекратил её поддержку и разработку. Крайняя версия WiringPi от Гордона Хендерсона не работает нормально на Raspberry Pi 4. Поэтому следует использовать версию библиотеки, которая разрабатывается сообществом:

    git clone https://github.com/WiringPi/WiringPi.git
    
    1. Устанавливаем:
    cd wiringPi
    ./build
    

    Использование
    После того, как библиотека wiring Pi установлена, вы можете использовать её в своих проектах. Пример:

    #include  <wiringPi.h> //подключаем заголовочный файл библиотеки
    int main (void)
    {
      wiringPiSetup () ; //инициализируем библиотеку
      pinMode (0, OUTPUT) ;
      for (;;)
      {
        digitalWrite (0, HIGH) ; delay (500) ;
        digitalWrite (0,  LOW) ; delay (500) ;
      }
      return 0 ;
    }
    

    Компилируем исходник:

    gcc -Wall -o example example.c -lwiringPi
    

    Запускаем:

    sudo ./example
    

    Библиотека должна быть обязательно инициализирована вызовом функции wiringPiSetup() После этого можно использовать библиотечные функции

    Основные библиотечные функции
    Если библиотека была инициализирована функцией wiringPiSetup() , то в функции следует передавать "виртуальный" номер пина. Таблицу соответствия "виртуальных" пинов (колонка wPi) реальным можно получить при помощи команды gpio readall (утилита gpio устанавливается автоматически вместе с библиотекой WiringPi)
    bfdf9794-5ae8-49b5-8a76-5d41654cd5d6-image.png

    void pinMode (int pin, int mode)
    Устанавливает режим работы пина. Доступные значения параметра mode: INPUT, OUTPUT, PWM_OUTPUT, GPIO_CLOCK. Примечание: режим работы PWM_OUTPUT поддерживается только пином BCM_GPIO 18, режим GPIO_CLOCK поддерживается только пином BCM_GPIO 4

    void pullUpDnControl (int pin, int pud)
    Включает внутренние подтягивающие резисторы для пина, работающего в режиме INPUT. Возможные значения PUD_OFF (подтягивающие резисторы отключены), PUD_DOWN (подтяжка к земле), PUD_UP (подтяжка к 3.3v)/Сопротивление подтягивающих резисторов на Raspberry Pi составляет около 50KОм

    void digitalWrite (int pin, int value)
    Устанавливает высокий (value=1)/низкий уровень(value=0) на пине, работающем в режиме OUTPUT

    void pwmWrite (int pin, int value) Параметр value задаёт коэффициент заполнения импульса (про ШИМ и что такое заполнение импульса можно прочитать в этой статье - https://raspberrypi.ru/50-gpio-dlya-chaynikov-chast-4), value принимает значения от 0 (0% заполнения импульса) до 1024 (100% заполнение импульса). Аппаратная ШИМ поддерживается только пином BCM_GPIO 18

    int digitalRead (int pin)
    Считывание состояния пина. В зависимости от логического уровня функция возвращает 0 или 1

    analogRead (int pin)
    Функция считывает значение АЦП. Поскольку на Raspberry Pi нет встроенного АЦП, то перед вызовом функции в программе необходимо инициализировать внешний АЦП (пример использования можно найти в этой статье - https://raspberrypi.ru/571-poluchenie-dannyh-s-analogovyh-datchikov-podklyuchennyh-k-raspberry-pi)

    analogWrite (int pin, int value)
    Функция записывает значение в АЦП.

    Временные функции

    unsigned int millis (void) Возвращает время (в миллисекундах) прошедшее с момента вызова функции инициализации (wiringPiSetup) библиотеки WiringPi. Значение сбрасывается через 49 дней

    unsigned int micros (void)
    Возвращает время (в микросекундах) прошедшее с момента вызова функции инициализации (wiringPiSetup) библиотеки WiringPi. Значение сбрасывается приблизительно через 71 минуту

    void delay (unsigned int howLong)
    Приостанавливает выполнение программы на период времени, заданный в параметре howLong (задаётся в миллисекундах)

    void delayMicroseconds (unsigned int howLong)
    Приостанавливает выполнение программы на период времени, заданный в параметре howLong (задаётся в микросекундах)

    Прерывания

    *int wiringPiISR (int pin, int edgeType, void (function)(void))
    Регистрирует функцию, которая будет выполнена при наступлении условия прерывания. Условие прерывания (параметр edgeType) может принимать следующие значения:

    INT_EDGE_FALLING (прерывание при смене уровня на пине с высокого на низкий)
    INT_EDGE_RISING (прерывание при смене уровня на пине с низкого на высокий)
    INT_EDGE_BOTH (прерывание при любой смене уровня на пине)
    INT_EDGE_SETUP
    При условии INT_EDGE_SETUP не будет происходить инициализации пина - подразумевается, что он уже был настроен в другом приложении.

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

    Функция-обработчик прерывания выполняется с высоким приоритетом (если программа запущена от пользователя root) и выполняетсяодновременнос основной программой. Также она имеет полный доступ к глобальным переменным и т.д

    Программа gpio

    Вместе с библиотекой Wiring Pi поставляется удобная программа gpio (я её упомянул в начале статьи). С её помощью можно быстро устанавливать пины в нужное состояние из консоли.

    gpio mode <pin> in/out/pwm/clock/up/down/tri - установка режима работы пина.
    gpio write <pin> 0/1 - установить высокий/низкий уровень на пине в режиме работы OUT
    gpio pwm <pin> <value> - генерация ШИМ сигнала на пине. value в диапазоне от 0 до 1023 определяет коэффициент заполнения
    gpio read <pin> - считать состояние пина. 0 или 1
    Продолжение следует...


  • Подключение блока сегментных индикаторов с драйвером 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
    В дырочке спрятался микрофон 🙂

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

  • 1 / 1
  • Войти

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

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