Mrtrol2018

Пикабушник
1702 рейтинг 127 подписчиков 9 подписок 6 постов 3 в горячем
Награды:
5 лет на Пикабу
10

AudioSwitcher — автоматизация того, что казалось бы не нужно автоматизировать

Предисловие

У меня дома есть пара комплектов хороших советских акустических систем. Но техника эта довольно старая и просто не может включаться с пульта или автоматически, а постоянно подходить к усилителю звука и включать/выключать его просто лень. Это проблему я и решил. Сначала была куплена ардуино и проект был сделан на ней, но качество работы меня не устроило и проект был переделан под STM32F103C8. В итоге у меня получилось устройство, которое имеет 4 аудио-входа, 1 аудио-выход, вход 220В и выход 220В. При наличии хотя бы одного активного аудио-входа на выходе 220В появляется напряжение, тем самым включая усилитель звука, и активный аудио-канал передается на выход.

Сложности при разработке

Казалось бы все просто: если АЦП получает не 0, тогда считать канал активным. Все почти так, но это работает только если включить источник аудио-сигнала и выключить на нем звук. При выключенном состоянии разные устройства дают разные помехи, тк они не полностью обесточены. Да и у плохих источников звука микроконтроллер мог улавливать помехи при выключенном звуке, причем довольно сильные. И это именно помехи источника, помехи на моей внешней аудиокарте STMка не видит, более того тихий звук с нее — 0.

Как сделать себе такое?

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

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

печатная плата
программатор ST-Link v2
1 чип STM32f103C8
4 реле для коммутации входного аудио-канала на выход
1 реле для коммутации 220В для включения усилителя
AC-DC понижающий преобразователь 220В — 5В(можно взять со старой зарядки телефона)
сетевой провод и разъем для подачи тока нашему устройству и усилителю
розетка
резисторы, конденсаторы и другая мелочь

Естественно нам понадобятся аудио-провода и minijack штекера с гнездами.

Хотелось бы заострить внимание на выборе реле… Если с выбором 220В реле все предельно понятно: оно должно «уметь» коммутировать 220В переменное напряжение и управляться 3.3В. То с выбором звуковых реле не все так просто. Далеко не каждое реле, даже твердотельное, не будет давать помехи на выходе, а нам это очень важно. Я живу в Минске и не смог ничего найти подходящего и по адекватной цене, поэтому были заказаны с известного китайского магазина 4 реле PVT322A. Возможно в вашем регионе вы сможете найти что-то подешевле.
Схема и разводка печатной платы :

Раз уж начали, то продолжим изучать аппаратные особенности. На схеме, которую вы можете найти в репозитории в папке Eagle нужно подобрать токоограничительные резисторы(R4-7) под ваши реле. В моем случае это 30 Ом. Так же есть катушка L1: выбирайте любой фильтр, сглаживающий высокочастотные помехи.

Заказать печатную плату вы можете на PCBWAY или JLCPCB. Цены у них низкие, я заказывал у JLCPCB и они выставили мне счет всего в 2$. При заказе печатной платы вам нужны будут гербер файлы, вы из сможете найти все в той же папке или сами сгенерировать.

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


Рассказывать как подключить программатор к компьютеру, установить среду программирования и драйвер я не буду, т.к. этих инструкций очень много и они предельно доступные. На моей схеме предусмотрены выходы для программаторы. Я использовал Visual Studio 2017 + VisualGDB. Скачав проект из того же репозитория мы сможем открыть проект. Сразу же обратим на файл Settings.cpp.

#define DEBUG0 0//init USART and send all measurement values
#define DEBUG1 1//init USART and send information about recognition music or not
#define DEBUG2 0//just init USART
#define MaxEqualToZeroValue 3 //the value which equal or less is equated to zero
#define MaxAvarageForNoise (float)0.4//this is max avarage of measurement values so that the sound is considered noise for NOT active channel
#define MaxAvarageForActiveNoise (float)0.06//this is max avarage of measurement values so that the sound is considered noise for active channel
#define CountOfConsecutiveZeroValueForNoise 250//if count of consecutive zero values bugger it that sound is equated to noise
#define MinCountOfZeroValue 550//it's minimum count of zero values to equate to music(not consecutive)
#define USE_LED 1
#define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC
#define LED_GPIO_GROUP GPIOC
#define LED_GPIO_PIN GPIO_Pin_13
#define USE_AMP 1
#define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB
#define AMP_GPIO_GROUP GPIOB
#define AMP_GPIO_PIN GPIO_Pin_12

Все настройки в этом файле задокументированы, но мы все равно остановимся на каждой настройке.
#define DEBUG0 0
#define DEBUG1 1
#define DEBUG2 0

Если присвоить дефайну DEBUG0 единицу, то наше устройство перестанет что либо делать, кроме того, что выводить по UARTу значения, которые он получает с аудио-входов в формате, который может «переварить» SerialPortPlotter. 

Если же присвоить единицу DEBUG1, то устройство уже будет полностью функционировать, но будет выводить немного информации о работе по UARTу. Это все нужно исключительно для отладки.

Присвоение DEBUG2 даст всего лишь инициализацию UARTа. Если вы не понимаете, зачем это, то и не надо :-)
#define MaxEqualToZeroValue 3

Далее у нас параметр отвечающий значение которого или менее будет считать нулем. Как уже было ранее сказано некоторые источники звука плохого качества и сильно зашумлены.
#define MaxAvarageForNoise (float)0.4

Если аудио-канал сейчас не активен(т.е. канал, который сейчас не коммутируется на выход) и среднее значение измерений за один цикл измерений по этому каналу меньше значения этого параметра, то канал считается без звука.
#define MaxAvarageForActiveNoise (float)0.06

Этот параметр почти тоже самое, что и предыдущий, только для активного на данный момент канала. Дело в том, что когда канал активен и усилитель работает, то происходит падение напряжения аудио-канала. И если пренебречь этой настройкой, то устройство будет считать, что звук есть даже когда провод не подключен ни к какому устройству.

#define CountOfConsecutiveZeroValueForNoise 250

Этот параметр исключительно для оптимизации расхода процессорного времени. Если устройство встречает подряд заданное количество нулей, то оно считает, что это сигнал не звук.

#define MinCountOfZeroValue 550

А это уже важная настройка. Некоторые устройства, когда выключены создают странные помехи, но я выделил один общий фактор среди них: они очень редко опускаются до нулевых значения. Именно поэтому пришлось ввести этот параметр. Если количество нулевых значений за один цикл измерений меньше заданного, то сигнал считается шумом.

#define USE_LED 1
#define LED_GPIO_PERIPH RCC_APB2Periph_GPIOC
#define LED_GPIO_GROUP GPIOC
#define LED_GPIO_PIN GPIO_Pin_13 #define USE_AMP 1
#define AMP_GPIO_PERIPH RCC_APB2Periph_GPIOB
#define AMP_GPIO_GROUP GPIOB
#define AMP_GPIO_PIN GPIO_Pin_12

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

Перейдем к следующим настройкам:

Открыв файл main.cpp, в самом начале функции
int main()

вы найдете определение кучи переменных.

Остановимся на этом поподробней. Там достаточно много параметров, отвечающих за аппаратую настройку микроконтроллера. Их мы затрагивать не будем.
const uint8_t channelsCount = 2;


Это количество входных аудиоканалов, которые будут использоваться.

const uint8_t countOfIterationsForSwitch = 5;


Количество циклов измерения, необходимое для изменения состояния активное/пассивное.

const uint8_t ADCSampleTime = ADC_SampleTime_239Cycles5;


Этот параметр отвечает за качество измерения. Оно установлена максимальное, не рекомендую его менять
const uint16_t measurementsDuration = 2000;


Это время в ms, в течение которого будет производится один цикл измерений.

const uint32_t measurementFrequencies[] = { 1000, 1000, 1000, 1000 };


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

Заключение


Ну вот и все. Все необходимые настройки я описал. Осталось только собрать схему, скомпилировать проект, залить прошивку в микроконтроллер и радоваться.

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

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

Спасибо за прочтение.
Статья на хабре

Показать полностью 4
4

Мастер-монтажник или распрелелительная коробка высшего уровня

Мастер-монтажник или распрелелительная коробка высшего уровня

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

114

Подключение PIR(датчика движения) к RaspberryPi.

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

Контакты на датчике:

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

Подключение датчика к GPIO:
GND-2 пин GPIO
OUT-11 пин GPIO
+5V-6 пин GPIO

Создание скрипта на питоне:

Теперь мы делаем скрипт python.
Создаем файл в каталоге MagicMirror с расширением .py(я назвал pir.py). Открываем этот файл любым текстовым редактором и прописываем туда следующие строки :

#!/usr/bin/env python

import sys
import time
import RPi.GPIO as io 
import subprocess

io.setmode(io.BOARD)
SHUTOFF_DELAY = 600 # секунды
PIR_PIN=11

def main():
    io.setup(PIR_PIN, io.IN)
    turned_off = False
    last_motion_time = time.time()
    while True:
        if io.input(PIR_PIN):
            last_motion_time = time.time()
            sys.stdout.flush()
            if turned_off:
                turned_off = False
                turn_on()
        else:
if not turned_off and time.time() > (last_motion_time + SHUTOFF_DELAY):
                turned_off = True
                turn_off()
            if not turned_off and time.time() > (last_motion_time + 1):
        time.sleep(.1)
def turn_on():
    subprocess.call("sh /home/pi/MagicMirror/monitor_on.sh", shell=True)

def turn_off():
    subprocess.call("sh /home/pi/MagicMirror/monitor_off.sh", shell=True)

if __name__ == '__main__':
    try:
        main()
    except KeyboardInterrupt:
        io.cleanup()
Проверяем скрипт. Если датчик не улавливает движения в течение 600с(10мин), то монитор выключается. Всё работает
Теперь сделаем так, чтобы скрипт запускался автоматическое при запуске системы. Для этого Переходим по этому адресу ~/.config/lxsession /, открываем LXDE-pi в текстовом редакторе и добавляем эту строку :
@sudo / usr / bin / python /home/pi/MagicMirror/pir.py
Сохраняем изменения, выходим и перезагружаем raspberry pi.
Мои посты:

Умное зеркало на Raspberry pi 4

Процесс создания умного зеркала на raspberry pi.

Показать полностью 2
870

Процесс создания умного зеркала на raspberry pi.

Что нам потребуется :
-raspberry pi 2-4(в моем случае raspberry pi 4)
-Карта памяти не меньше 8гб
-блок питания 5В
-монитор, чем больше тем лучше (я использовал 24-х дюймовый монитор)
-зеркало гизелла или стекло с наклеенной зеркальной плёнкой
-рамка для зеркала
-hdmi провод
-провод питания для raspberry pi и для монитора

6)Дожидаемся окончания установки операционной системы.
7)После перезагрузки видим установленный Raspbian

Установка MagicMirror:
Здесь все предельно просто.
открываем окно терминала и вводим эту команду

bash -c "$(curl -sL https://raw.githubusercontent.com/MichMich/MagicMirror/maste...)"

Началась установка MagicMirror.

После установки запустится окно умного зеркала,чтобы его свернуть нажимаем Ctrl+M.

Включение русского языка:
1)Переходим по адресу /home/pi/MagicMirror/config и открываем config.js(далее просто конфиг) в текстовом редакторе. В строке language заменяем значение "en" на "ru". Сохраняем файл config.js.

2)Разворачиваем окно MagicMirror и перезапускаем его сочетанием клавиш Ctrl+R. Теперь все модули, кроме комплиментов и новостей, переведены на русский язык.

Настройка погоды:
1)По этой ссылке скачиваем архив городов, распаковываем его и находим свой город.
2)Регистрируемся на Openweathermap.org по этой ссылке и получаем api_key
3)Открываем конфиг, ищем модули "currentweather", "weatherforecast". В поле location указываем ваш город. В поле locationID указываем ID города из скачанного архива. В поле appid указываем api_key, который мы получили на openweathermap.org.

Сохраняем все изменения и перезагружаем MagicMirror. Теперь модуль погоды показывает погоду вашего города

Настройка календаря :
Открываем конфиг и ищем модуль "calendar". В поле header указываем название календаря, оно будет отображаться в зеркале . В поле URL вы можете указать URL своего календаря Google, Icloud или любого другого календаря.

Сохраняем конфиг и перезапускаем приложение MagicMirror.

Настройка новостей :
В конфиге находим модуль "newsfeed". В поле title изменяем название источника новостей, а в поле URL указываем ссылку на источник новостей rss.

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

Модуль комплиментов :
Лично я отключил этот модуль(удалил в конфиге). Кому-то понравится этот модуль, поэтому опишу процесс изменения английских комплиментов на русские.
Переходим по адресу home/pi/MagicMirror /modules/default/compliments/ и Открываем файл compliments.js в текстовом редакторе. Находим строку compliments, ниже указаны комплименты на английском, заменяем на свои и сохраняем файл. Перезапускаем приложение MagicMirror. Теперь текст в модуле комплименты отображается на русском языке.

Добавление других модулей:
1)Переходим по ссылке, выбираем интересующий вас модуль и скачиваем его.
2)скачанный модуль перемещаем по адресу :home/pi/MagicMirror /modules/
3)Изучаем файл Readme и редактииуем конфиг согласно инструкции.
4)Сохраняем все изменения и перезапускаем MagicMirror.

Автозапуск MagicMirror при перезагрузке raspberry pi:
1)Открываем окно терминала и вводим эти команды:

sudo npm install -g pm2

sudopm2 startup

cd ~
nano mm.sh

Откроется редактор текста, добавляем следующие строки:

cd ~/MagicMirror
DISPLAY=:0 npm start

Сохраняем изменения и закрываем, используя сочетания клавиш CTRL+O и CTRL+X.

Далее поочерёдно вводим эти команды :

chmod +x mm.sh

pm2 start mm.sh

pm2 save

Закрываем окно терминала и перезагружаем RaspbianOS. Теперь при перезагрузке MagicMirror запускается автоматически

Отключение сна :
Открываем окно термина и вводим команду:

sudo nano /etc/xdg/lxsession/LXDE-pi/autostart

Добавляем строки в конец файла
@xset s noblank
@xset s off
@xset -dpms

Выходим, сохраняя изменения и вводим новую команду:

sudo nano /etc/lightdm/lightdm.conf

В текстовом редакторе прокручиваем вниз до раздела  [SeatDefaults] и находим xserver-command. Измените строку, чтобы она выглядела так:
xserver-command=X -s 0 -dpms
Нажимаем CTRL+X затем Y.

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

Спасибо всем кто дочитал этот пост до конца попытался описать все наиболее подробно и понятно.

Показать полностью 16
586

Умное зеркало на Raspberry pi 4

Всех приветствую.
Несколько месяцев назад наткнулся на очень интересный проект на базе raspberry pi "MagicMirror", решил сделать себе такое зеркало. Мне кажется, что получилось достаточно неплохо. Может кто-то подскажет как ещё можно использовать raspberry pi 4 параллельно с зеркалом чтобы максимально использовать ресурсы компьютера?

Умное зеркало на Raspberry pi 4

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

Показать полностью 1
1

Отчисление из военного ВУЗа(3 курс)

Приветствую всех. Хочу поделиться своей историей...
Два с половиной года назад я поступил в один из ведущих военных ВУЗов страны. С самого начала мне не особо нравилась система обучения и отношение к курсантам в этом учебном заведении, но я продолжал учиться, утешая себя тем, что потом будет проще и лучше. На 2-ом курсе подошло время подписания контракта, не долго думая, я решил стать "контрактником" из-за повышения денежного довольствия и, как мне тогда казалось, изменения отношения со стороны офицерского состава академии, но я сильно ошибался....
После пподписания контракта в моей жизни и жизни моих олнокурсников ничего не поменялось, кроме повышения денежного довольствия, дя офицеров мы все так же оставались срочниками с погонами курсантов. Я продолжал учится...
На 3 курсе я решил отчислится из учебного заведения ПСЖ. После отчисления по условию контракта мне придётся компенсировать затраты государства потраченные на моё обучение(около 150,000₽).
Кто-нибудь знает, возможно ли восстановление в гражданский ВУЗ на 3 курс с условием сдачи предметов, которые я не проходил?

Отличная работа, все прочитано!

Темы

Политика

Теги

Популярные авторы

Сообщества

18+

Теги

Популярные авторы

Сообщества

Игры

Теги

Популярные авторы

Сообщества

Юмор

Теги

Популярные авторы

Сообщества

Отношения

Теги

Популярные авторы

Сообщества

Здоровье

Теги

Популярные авторы

Сообщества

Путешествия

Теги

Популярные авторы

Сообщества

Спорт

Теги

Популярные авторы

Сообщества

Хобби

Теги

Популярные авторы

Сообщества

Сервис

Теги

Популярные авторы

Сообщества

Природа

Теги

Популярные авторы

Сообщества

Бизнес

Теги

Популярные авторы

Сообщества

Транспорт

Теги

Популярные авторы

Сообщества

Общение

Теги

Популярные авторы

Сообщества

Юриспруденция

Теги

Популярные авторы

Сообщества

Наука

Теги

Популярные авторы

Сообщества

IT

Теги

Популярные авторы

Сообщества

Животные

Теги

Популярные авторы

Сообщества

Кино и сериалы

Теги

Популярные авторы

Сообщества

Экономика

Теги

Популярные авторы

Сообщества

Кулинария

Теги

Популярные авторы

Сообщества

История

Теги

Популярные авторы

Сообщества