Prosty mikser do automatycznego przełączania sygnałów audio.
Układ został stworzony z myślą o rozwiązaniu uciążliwego problemu przełączania
kabli pomiędzy urządzeniami multimedialnymi, np. MP3, tabletem czy telefonem a
wzmacniaczem i głośnikami. Pozwala na automatyczny wybór jednego z 4 wejść w
zależności od występowania sygnałów wejściowych.
Regulacja głośności powinna odbywać się za pomocą wzmacniacza. Poziom sygnału z urządzeń multimedialnych powinien być ustawiony na średnią wartość.
Opis
Urządzenie sprawdza w pętli na którym wejściu występuje
sygnał audio. Po stwierdzeniu istnienia sygnału układ zatrzaskuje się – zmiana
wejścia możliwa jest jedynie po zaniku obecnego sygnału i odczekania ustalonego
przez nas czasu. Aktywne wejście sygnalizowane jest przez świecącą diodę LED.
Czas oczekiwania powinien wynosić minimum kilka sekund, ponieważ zapobiegnie to
niepożądanej zmianie wejścia, np. podczas przejść pomiędzy utworami.
Wykaz elementów
rezystory:
- R1, R3, R6, R10…13 100k 0,25zł
- R2, R5 1k 0,25zł
- R4 2,2k 0,25zł
- R7, R8 4,7k 0,25zł
- R9 330 0,25zł
kondensatory:
- C1 1u 0,70zł
- C2, C3, C4, C10, C11 10u 0,80zł
- C5…9 100n 0,80zł
półprzewodniki:
- IC1 4052 1,00zł
- IC2 LM358 0,50zł
- IC3 ICL7660 3,00zł
- IC4 Attiny 2313 7,00zł
- LED1...4 0,80zł
inne:
- listwa kątowa goldpin 1,00zł
- 10x gniazdo cinch do druku 8,00zł
- podstawki pod układy scalone (20pin, 16pin, 2x 8pin) 0,59zł
- laminat 90x100mm 1,90zł
suma: 27,34zł
Ceny wyznaczone na podstawie cennika jednego z popularniejszych sklepów internetowych. Pod uwagę
nie wzięto kosztów wykonania płytki PCB oraz obudowy.
Schemat
Schemat ideowy układu
Układ składa się z kilku bloków, m. in.:
Zasilanie
Całe urządzenie zasilane jest napięciem 5V. Wzmacniacz zasilamy
napięciem niesymetrycznym, ponieważ interesuje nas jedynie dodatnia część
sygnału. Kłopot może stanowić kostka 4052, która to wymaga zasilania
symetrycznego. Z tego powodu w projekcie użyto układu ICL7660. Połączenie
kondensatorów elektrolitycznych o pojemności 10uF pomiędzy nóżkami: 2 i 4
(oznaczenie CAP) oraz 5 i 3, czyli odpowiednio wyjściem i masą układu, pozwala
na osiągnięcie napięcia wyjściowego równego wejściowemu ze znakiem minus.
Multiplekser
Multiplekser zrealizowany jest na kostce 4052. Układ posiada
4 dwukanałowe wejścia, które mogą być sterowane sygnałem z mikrokontrolera
(MUXA i MUXB).
Wejście INH zwieramy do masy, dzięki czemu układ zawsze jest aktywny. Detektor pobiera sygnał z wyjścia X, dlatego też na odpowiednich wejściach (X0…3) musimy dać rezystory (R10…13), dzięki czemu w przypadku braku sygnału lub podłączonego kabla, układ nie wzbudza się z powodu zakłóceń. Kondensatory C10 i C11 eliminują (możliwą) składową stałą.
Wejście INH zwieramy do masy, dzięki czemu układ zawsze jest aktywny. Detektor pobiera sygnał z wyjścia X, dlatego też na odpowiednich wejściach (X0…3) musimy dać rezystory (R10…13), dzięki czemu w przypadku braku sygnału lub podłączonego kabla, układ nie wzbudza się z powodu zakłóceń. Kondensatory C10 i C11 eliminują (możliwą) składową stałą.
Detektor sygnału
Detektor sygnału powstał w oparciu o detektor amplitudy.
Moduł składa się 2 wzmacniaczy operacyjnych (LM358), diody oraz kilku
kondensatorów i rezystorów. Sygnał pobierany jest z wyjścia multipleksera.
Kondensator C1 przepuszcza jedynie składową zmienną. Rezystor R1 zabezpiecza
wzmacniacz przed wzbudzaniem w przypadku braku sygnału na wejściu. Powinien
mieć stosunkowo dużą wartość, aby nie stanowić znacznego obciążenia. Układ
LM358 wraz z rezystorami R2 i R3 stanowi wzmacniacz nieodwracający o sporym
wzmocnieniu (około 100). Wzmocnieniu ulega tylko dodatnia część sygnału (ujemna
część jest tracona, ze względu na niesymetryczne zasilanie). Na tym etapie,
dzięki znacznemu wzmocnieniu, sygnał jest zbliżony do przebiegu prostokątnego.
Następnie w urządzeniu znajduje się detektor amplitudy, który podtrzymuje sygnał w stanie wysokim. Elementy C2 i R4 wyznaczają stałą czasową. Kolejny wzmacniacz LM358 wraz z rezystorami R6 i R5 filtruje zakłócenia, które występują przy braku sygnału, zabezpieczając w ten sposób urządzenie przed niekontrolowanymi zmianami wejść. Na wyjściu wzmacniacza dostaniemy stan wysoki w przypadku wystąpienia wzmocnionego sygnału audio lub stan niski, jeżeli napięcie na wejściu nieodwracającym jest niższe niż wynikające z dzielnika R5 i R6. W rezultacie jest to układ prostego komparatora napięcia.
Następnie w urządzeniu znajduje się detektor amplitudy, który podtrzymuje sygnał w stanie wysokim. Elementy C2 i R4 wyznaczają stałą czasową. Kolejny wzmacniacz LM358 wraz z rezystorami R6 i R5 filtruje zakłócenia, które występują przy braku sygnału, zabezpieczając w ten sposób urządzenie przed niekontrolowanymi zmianami wejść. Na wyjściu wzmacniacza dostaniemy stan wysoki w przypadku wystąpienia wzmocnionego sygnału audio lub stan niski, jeżeli napięcie na wejściu nieodwracającym jest niższe niż wynikające z dzielnika R5 i R6. W rezultacie jest to układ prostego komparatora napięcia.
Uwaga! Napięcie wyjściowe z komparatora w logicznym stanie wysokim nie jest równe napięciu zasilania! Wynika to z budowy samego wzmacniacza. Na szczęście spadek ten nie jest duży i mieści się w normach dla układu procesora wynoszącymi minimum 0.6 napięcia zasilania. Z tego powodu stosowanie układu z wyjściem typu open-collector nie jest konieczne.
Płytka PCB
Automatyczny przełącznik audio - widok na układ.
Urządzenie zrealizowane jest na 6 PCB – 5 na wejścia oraz wyjście,
1 na układ wykonawczy. W projekcie użyto laminatu jednostronnego, a nadruki
naniesiono metodą termotransferu. Z tego powodu w niektórych miejscach musimy
wlutować zworki.
Na płytkach odpowiadających za wejście znajdują się
rezystory R10…13. Na płytce odpowiadającej za wyjście nie musimy wykonywać
dodatkowych otworów pod rezystor.
Układ wykonawczy znajduje się na osobnej, największej
płytce.
Elementy SV1…5 to listwy kątowe typu goldpin. Należy
wlutować je najpierw na płytkach z gniazdami cinch, a następnie dopasować na
płycie głównej układu.
Odstęp oraz grubość ścieżek jest stosunkowo duża, dodatkowo
w projekcie użyto wyłącznie elementów przewlekanych. Z tego powodu wykonanie
urządzenia nie powinno sprawić problemu nawet początkującym elektronikom.
Całość od strony ścieżek należy pokryć lakierem kopalowym,
czyli rozpuszczoną w spirytusie żywicą lub kalafonią, która zabezpieczy płytkę
przed zwarciami i korozją, a przy tym pozwoli na bezpieczne wprowadzenie
ewentualnych zmian.
Kod programu
Program został napisany w uproszczonym języku C – Arduino.
Aby zaprogramować dowolny mikroprocesor AVR (z rodziny
ATtiny) w środowisku Arduino IDE musimy pobrać archiwum i rozpakować je w
folderze: ...\Arduino\hardware\
Po wypakowaniu powstaną pliki i foldery: \Arduino\hardware\tiny\boards.txt \Arduino\hardware\tiny\bootloaders\ \Arduino\hardware\tiny\cores\
Dostępne procesory widoczne są w okienku:
Przed zaprogramowaniem układu musimy wgrać bootloader, który ustala fusebity mikrokontrolera. Po wykonaniu powyższych instrukcji możemy zaprogramować procesor podobnie jak Arduino (należy jeszcze wybrać programator, którym dysponujemy).
Po wypakowaniu powstaną pliki i foldery: \Arduino\hardware\tiny\boards.txt \Arduino\hardware\tiny\bootloaders\ \Arduino\hardware\tiny\cores\
Dostępne procesory widoczne są w okienku:
Przed zaprogramowaniem układu musimy wgrać bootloader, który ustala fusebity mikrokontrolera. Po wykonaniu powyższych instrukcji możemy zaprogramować procesor podobnie jak Arduino (należy jeszcze wybrać programator, którym dysponujemy).
Uwaga! Przed napisaniem programu i wgraniu go do procesora
musimy sprawdzić, które piny układu odpowiadają pinom platformy Arduino.
Kod programu automatycznego przełącznika audio jest bardzo
prosty. Składa się z kliku pętli i instrukcji warunkowych.
/*
Automatyczny przełącznik audio
autor: Daniel Turbasa
data: 18-02-2014
*/
int LED = 10;
#define MUXA 14
#define MUXB 15
#define WE 9
#define czas 3000
void setup() //konfiguracja wejść oraz wyjść układu
{
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(MUXA, OUTPUT);
pinMode(MUXB, OUTPUT);
pinMode(WE, INPUT);
}
void fMUX() //funkcja badająca stan sygnału wyjściowego
{
if ( digitalRead(WE) == HIGH ) //dalsza część instrukcji dostępna po wystąpieniu stanu wysokiego
{
digitalWrite(LED, HIGH); //zapalenie diody LED odpowiedniego wejścia
do //pętla nieskończona - stan niski, utrzymujący się dłużej niż czas zadeklarowany w funkcji delay(), wstrzymuje działanie
{
do {} while ( digitalRead(WE) == HIGH ); //pętla - oczekiwanie mikrokontrolera na wystąpienie stanu niskiego
delay(czas); //czas oczekiwania na ponowne pojawienie się sygnału
if ( digitalRead(WE) == LOW ) //wyjście z nieskończonej pętli przy stanie niskim
{
break;
}
} while(1);
digitalWrite(LED, LOW); //zgaszenie diody LED odpowiedniego wejścia
}
}
void loop() //główna pętla programu
{
do
{
for(LED = 10; LED < 14; LED++) //pętla wybierająca pin sterujący diodą LED
{
switch(LED) //wybór wejść multipleksera
{
case 10:
digitalWrite(MUXA, LOW); //sygnał sterujący multiplekserem
digitalWrite(MUXB, LOW); //sygnał sterujący multiplekserem
break;
case 11:
digitalWrite(MUXA, HIGH);
digitalWrite(MUXB, LOW);
break;
case 12:
digitalWrite(MUXA, LOW);
digitalWrite(MUXB, HIGH);
break;
case 13:
digitalWrite(MUXA, HIGH);
digitalWrite(MUXB, HIGH);
break;
default:
break;
}
delay(50); //opóźnienie przełączania
fMUX(); //przejście do funkcji sterującej pracą multipleksera
}
} while(1);
}
void setup() //konfiguracja wejść oraz wyjść układu
{
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(12, OUTPUT);
pinMode(13, OUTPUT);
pinMode(MUXA, OUTPUT);
pinMode(MUXB, OUTPUT);
pinMode(WE, INPUT);
}
Na samym początku w funkcji setup() konfigurujemy wejścia
oraz wyjścia mikrokontrolera.
void loop() //główna pętla programu
{
do
{
for(LED = 10; LED < 14; LED++) //pętla wybierająca pin sterujący diodą LED
{
switch(LED) //wybór wejść multipleksera
{
case 10:
digitalWrite(MUXA, LOW); //sygnał sterujący multiplekserem
digitalWrite(MUXB, LOW); //sygnał sterujący multiplekserem
break;
case 11:
digitalWrite(MUXA, HIGH);
digitalWrite(MUXB, LOW);
break;
case 12:
digitalWrite(MUXA, LOW);
digitalWrite(MUXB, HIGH);
break;
case 13:
digitalWrite(MUXA, HIGH);
digitalWrite(MUXB, HIGH);
break;
default:
break;
}
delay(50); //opóźnienie przełączania
fMUX(); //przejście do funkcji sterującej pracą multipleksera
}
} while(1);
}
W pętli głównej programu – loop(), zmieniamy kolejno wejścia multipleksera oraz badamy sygnał wyjściowy. Zastosowanie opóźnienia - funkcja delay(50), jest konieczne. W przeciwnym wypadku układ nie działa prawidłowo i występują błędy podczas przełączania. Po każdej zmianie wejścia multipleksera, program wchodzi do funkcji fMUX(), która sprawdza stan logiczny na wyjściu.
void fMUX() //funkcja badająca stan sygnału wyjściowego
{
if ( digitalRead(WE) == HIGH ) //dalsza część instrukcji dostępna po wystąpieniu stanu wysokiego
{
digitalWrite(LED, HIGH); //zapalenie diody LED odpowiedniego wejścia
do //pętla nieskończona - stan niski, utrzymujący się dłużej niż czas zadeklarowany w funkcji delay(), wstrzymuje działanie
{
do {} while ( digitalRead(WE) == HIGH ); //pętla - oczekiwanie mikrokontrolera na wystąpienie stanu niskiego
delay(czas); //czas oczekiwania na ponowne pojawienie się sygnału
if ( digitalRead(WE) == LOW ) //wyjście z nieskończonej pętli przy stanie niskim
{
break;
}
} while(1);
digitalWrite(LED, LOW); //zgaszenie diody LED odpowiedniego wejścia
}
}
Funkcja fMUX() sprawdza stan sygnału wyjściowego po zmianie wejścia multipleksera.
W przypadku pojawienia się stanu wysokiego zapala się dioda
LED odpowiedzialna za dane wejście, a układ „zatrzaskuje się” do czasu
pojawienia się stanu niskiego na wyjściu. Po zmianie stanu, procesor oczekuje
krótką chwilę (określoną w funkcji delay()) na pojawienie się stanu wysokiego.
Jeżeli nastąpi zmiana, układ ponownie zatrzaskuje się. Przez ten czas dane
wejście cały czas jest aktywne. Utrzymujący się stan niski prowadzi do wyjścia
z pętli, wygaszenie diody oraz przejście do dalszego sprawdzania sygnału z
wejść multipleksera w głównej pętli układu.
Do pobrania
Schemat układu oraz płytki PCB zrobione w programie Eagle oraz kod programu można pobrać tutaj.Dodatkowe wyposażenie
Ze względu na zastosowanie gniazd audio typu cinch,
konieczne jest zaopatrzenie się w przejściówki typu mini-jack -> cinch.
Możliwości zmian
Niewykorzystane piny mikrokontrolera możemy wykorzystać
dokładając obsługę przycisku, który niezależnie zmieniałby kanały. Pozwoli to
na wybór konkretnego wejścia, a urządzenie będzie pełniło funkcję prostego
miksera audio.
Ponieważ detektor pobiera sygnał z wyjścia multipleksera,
urządzenie ma charakter zatrzasku – zmiana wejść możliwa jest jedynie po
całkowitym wygaszeniu sygnału z aktywnego wejścia.
Aby była możliwość zmiany źródła sygnału podczas, gdy jest
on aktywny, detektor musiałby pobierać informacje bezpośrednio z wejść
urządzenia. Można to zrealizować na dwa sposoby. Poprzez zwielokrotnienie
detektorów, co niestety wiąże się ze znacznym wzrostem elementów oraz kosztów lub
poprzez dodanie drugiego multipleksera, działającego w sposób ciągły i
sprawdzającego aktualny stan wyjść.
Schemat ulepszonego przełącznika mógłby wyglądać tak:
Komentarz
Urządzenie choć proste, pozwoliło mi zdobyć dużo
doświadczenia i wiedzę dotyczącą projektowania urządzeń elektronicznych.
Podczas projektowania używałem prostego symulatora układów elektronicznych,
który wyeliminował część problemów, bez ponoszenia żadnych kosztów i
zmarnowanych elementów.
Już po wykonaniu układu natrafiłem na problemy podobne do
opisanych w tym artykule. Wymusiło
to stosowanie wielu rezystorów 100k, które zwierają wejścia do masy w przypadku
braku sygnału.
Podsumowując – prezentowany przeze mnie artykuł ukazuje
jedynie wierzchołek góry lodowej. Na wykonanie całego urządzenia potrzeba było
wielu godzin spędzonych na rozmyślaniach, szkicach, konsultacjach,
projektowaniu i testowaniu. Nie uważam tego czasu za stracony, jednocześnie mam
nadzieję, że układ przypadnie Wam do gustu i znajdzie się osoba chcąca wykonać
to urządzenie dla siebie :-)
Projekt można znaleźć również na stronie: Mikrokontrolery - Jak zacząć? -> tutaj
Projekt można znaleźć również na stronie: Mikrokontrolery - Jak zacząć? -> tutaj
Brak komentarzy:
Prześlij komentarz