Half-Life Combine's голос и roger beep для Baofeng

12.01.2019 23:14
11
Когда-то давным-давно, когда деревья были большие, был такой шутер Half-Life, продолжение которого ждут до сих пор - это уже притча во языцах.
Были там такие противники как Combines (Combine Soldiers)- либо люди, работающие на инопланетных захватчиков, либо измененные ими для работы.

Так вот можно было слышать их переговоры типа вот такого:


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

В игре тон его меняется в зависимости от солдата, вот что-то среднее:


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

И да - real time audio processing на крохотной ATTINY85 - это вполне возможно :)

Результат работы на примере голоса Геральта из Ривии
Оригинал:


Радиопередача:


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

Что касается степени замедления или убыстрения голоса, то нужный коэффициент должен быть записан в 0 адрес EEPROM ATTINY, и, соответственно, его можно менять в пределах от 0 до 255.

Примеры значений:
30убыстрение голоса
55без изменений
75замедление голоса

Можно сказать, что это все "just for fun", однако если убрать трансформацию голоса, то схема позволяет добавить roger beep любой радиостанции, если у нее есть разъем для аксессуаров типа "kenwood" (тот самый двойной разъем).

Я тестировал это на Baofeng-888s, и как раз у нее roger beep-а в принципе нет - так что возможность сделать это или, например, скрэмблинг - вполне себе не только забава.

Как работает прошивка?
На самом деле ничего сложного там нет.

FUSE-биты для ATTINY85 (8Mhz, питание >= 2.7в):
0xE2LOW
0xDDHIGH
0xFFEXTENDED

Используется низко-скоростной режим работы с периферией (через PLLCSR) - в этом случае питать ATTINY можно от 2.7 вольта и это дает частоту дискретизации около 9kHz.
Можно было использовать и высокоскоростной режим, что дало бы частоту около 18kHz, но тогда пришлось бы использовать напряжение питания от 4.5 вольт, а с этим были проблемы (см. ниже).

При нажатии на кнопку передачи на тангенте, она генерирует прерывание и ATTINY выходит из сна, включает режим передачи на радиостанции и использует ADC на частоте примерно 8.9kHz чтобы цифровать голос с микрофона в циклический буфер:



При занесении очередного значения в буфер, оно миксуется с предыдущим - находится среднее, т.е. ( старое значение + новое ) / 2. Это дает нам возможность переживать случай, когда старое значение еще не отдалось, а на его место уже пришло новое. А это рано или поздно случится, т.к. скорости чтения и записи - разные.
Указатели на буфер увеличиваются после каждой такой операции, когда они доходят до максимума, то сбрасываются в ноль (в начало буфера) - потому он и зовется кольцевым.

Памяти у ATTINY не много - всего 500 байт, в данном случае под кольцевой буфер будет использоваться 450 байт, т.к. память нужна еще для переменных.

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

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

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

При отпускании кнопки, ATTINY все еще удерживает режим передачи, прекращает оцифровку, и отдает через PWM оцифрованный звук roger beep-а, затем выключает режим передачи и уходит в сон, чтобы снизить потребление электроэнергии.

Звук (т.к. занимает достаточно много места) занимает часть памяти под программу - т.к. данной памяти придостаточно для кода - это решает проблему с нехваткой памяти.

Схема
Она очень и очень простая, легко собирается "на коленке".

Модуль микрофонного усилителя заказал на Aliexpress, причем рекомендую именно такой тип модуля (работа от 3-5в, стоимость около 2$).
Динамик надо что-то около 8 ом, 0.5-1 ватт.
Кнопку любую, работающую на замыкание.
Светодиод любой на 3 вольта.



Есть одна особенность, которая не попала в эту схему - в разьеме для аксессуаров предусмотрено 5 вольтовое питание аксессуаров, но вот конкретно в Baofeng-888s что-то у китайцев сделано не так. Мало того, что там 3 вольта, так еще и при нагрузке оно падает до 0.7 вольта и, естественно, схема не работает.

Для того, чтобы это обойти, был добавлен крохотный DC-DC преобразователь с 1.2 до 3.3 вольта с Aliexpress и внешний разъем для подключения любой AA-батарейки.
Причем по-умолчанию, когда в разъем ничего не вставлено, схема будет пытаться питаться от радиостанции.

Как выглядит схема в сборе:



Как сделать двойной штеккер (KENWOOD-разъем) для радиостанции:

Это два обычных стерео-джека 3.5 и 2.5, смотанных изолентой.

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

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

Здесь еще нет разъема под внешнее питание.





Ну и все в сборе


Вобщем, детскую мечту я свою исполнил и хоть она и была иррациональна - ее исполнение греет мою душу :)

Скачать все файлы прошивки + 3 файла EEPROM для разных голосов одним архивом

hlwt.zip
скачать

12.01.2019, Protocoder
Esisl12.03.2019 18:55:49#ответить
А исходников не дадут?
Protocoder12.03.2019 22:39:02#ответить
Как найду время привести их в порядок - обязательно выложу.
vasia04.05.2019 17:01:06#ответить
а можно прошивку без бипера ?
Protocoder08.05.2019 03:09:07#ответить
Она заточена под бипер, чтобы его убрать, надо много перелопачивать, по-этому пока нет.
VoJak15.09.2019 13:23:10#ответить
Добрый день. Собрал Вашу схему и залил прошивку. Сын фанат HL2, решил сделать ему подарок. Тини85 выпаял из дигиспарк. Собрал все на макетке, прошил и установил фьюзы. Ничего не работает.
При нажатии на кнопку должен загореться светодиод. Но ничего не происходит, ни звука нет ни индикации работы. 7 вывод вообще висит в лог 0, хотя я так понимаю, должна идти потдяжка к 1, чтобы кнопкой ее садить на 0.
Со схемой возился более 2х часов, ситуация не изменилась.
Ваша схема и прошивка точно рабочая?

Я нашел только 2 статьи одна на хабре и одна на pvsm. В каментах так и не понял, повторил кто-то конструкцию или нет?
Другой тини для проверки пока нет. Но и не особо хочется покупать ее, если проект нерабочий.
У Вас есть этот проект на других МК АВР? Или может кто-то повторял данный проект и отпишется здесь?

P.S.
МК выпаивал из нового купленного дигиспарк. Контроллер шьется и никаких визуальных причин нет считать, что он не работает.
Хотя не исключаю вариант неисправности МК. Также есть вариант какой-то неточности в схеме. Она еще и зеркально отрисована.
Если есть возможность выслать исходник или разжевать, где я сделал ошибку, буду очень признателен. Моя почта javvch@gmail.com
Protocoder18.09.2019 15:14:15#ответить
День добрый.
Контроллер точно ATTINY85-20PU/SU?
На других МК по данной прошивке скорее всего ничего не заведется.

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

>>Также есть вариант какой-то неточности в схеме. Она еще и зеркально отрисована.
Эм... что такое "зеркально отрисована"? Это обычная принципиальная схема. Если Вы про ключ у МК - то никаких стандартов на то, где в схемах он должен быть - вверху или внизу, насколько знаю - нет.

Неточностей никаких нет - сами же пишете, что прошивка не работает, причем тут схема?

Ошибку разжевать не смогу, т.к. не телепат. Схема простая и рабочая, так что либо ошиблись при сборке, либо проблемы с фьюзами, либо - с МК.
Кнопка да, подтянута на питание - поэтому и говорю, что у Вас, скорее всего, прошивка даже не стартовала, в прошивке DDRB = b00010001 и PORTB = b00000100, кнопка генерирует прерывание.

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

Прошивка, как и проект - лично мной написан с нуля, поэтому знаю, что говорю.
VoJak26.09.2019 01:09:13#ответить
Atmel20U Tiny85 такая маркировка на алишном МК из дигиспарка. Буду тогда покупать новый МК.
А портировать на ардуино нет возможности или желания? Или сырой исходинк скинуть?
Просто ардуин как грязи и МК Atmega328 хватает в запасниках, тини45 тоже есть пару штук(но они не подходят).
Сидеть писать с нуля нет возможности, тем более когда есть готовый проект.
Protocoder27.09.2019 03:05:59#ответить
Портировать на ардуино нет никакого желания, т.к. я пишу на чистом C в AtmelStudio и использовать промежуточную среду вместо нативной не вижу никакого смысла.

ATMEGA328 - это оверинжиниринг для данного проекта - все вполне укладывается в 8-ножную микросхему и Tiny-архитектуру. А вот Tiny45-й хватать уже не будет.

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

Однако, если не заведется на новом проце - пишите - будем думать, в чем проблема.
Виктор19.08.2020 23:00:05#ответить
Привет Protocoder! Хорошая штукенция Но есть вопрос. Можно ли выход подключить на микрофонный вход компьютера, а если можно то как? Какие контакты будут выступать каналами передачи звука? Объясните мне тупому идиоту
Protocoder20.08.2020 11:47:44#ответить
Если нужно подключить выход схемы ко входу компьютера, то нужно подключить контакт, обозначенный на схеме "snd" к контакту входа звуковой картв компьютера и второй контакат - землю - соединить с общим на входе звуковой карты.

Подключать следует именно ко входу звуковой карты (line-in), а не к микрофонному входу.

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

Если все-таки охота к микрофонному входу подключаться, то вместо 10к резистора нужно взять бОльшего сопротивления, например 50к, т.к. микрофонный вход гораздо более чувствительный.
Виктор20.08.2020 19:31:01#ответить
Понял, буду экспериментально выяснять сопротивление резистора на своём компе, а если выясню то поставлю на домашний. Спасибо за совет!
Написать комментарий