Mikrokontrolery - Jak zacząć?

... czyli zbiór praktycznej wiedzy dot. mikrokontrolerów.

środa, 16 marca 2011

DIY: Automatyczny przełącznik audio na ATtiny2313 by Danielus


Autor: Danielus
Redakcja: Dondu

Zobacz inne artykułu z cyklu: Arduiono ... czyli prościej się nie da :-)

W nieniejszym artykule przedstawię prosty mikser audio 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ł
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: 26,54zł

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


Automatyczny przełącznik audio - schemat ideowy
Automatyczny przełącznik audio - schemat ideowy


Układ składa się z kilku bloków, m. in.:


Zasilanie


Automatyczny przełącznik audio - zasilanie układu
Automatyczny przełącznik audio - zasilanie układu

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 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



Automatyczny przełącznik audio - układ multipleksera
Automatyczny przełącznik audio - układ multipleksera

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).


Automatyczny przełącznik audio - sterowanie multiplekserem
Sterowanie multiplekserem

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


Automatyczny przełącznik audio - detektor sygnału
Detektor sygnału


Detektor sygnału powstał w oparciu o detektor amplitudy. Moduł składa się z 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.


Automatyczny przełącznik audio - Circuit Simulator

Jeżeli symulator "wariuje" naciśnij przycisk RESET.


Uwaga!!! Jeżeli symulator nie działa przeczytaj ten komunikat:
Problem symulatora Circuit Simulator


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.

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.


Automatyczny przełącznik audio - napięcia
Automatyczny przełącznik audio - napięcia


Płytka PCB

Automatyczny przełącznik audio - widok na układ.


Automatyczny przełącznik audio - widok z góry

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.

Automatyczny przełącznik audio - schemat dodatkowy
Schemat dodatkowy

Automatyczny przełącznik audio - dodatkowe PCB
Dodatkowe PCB


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.


Automatyczny przełącznik audio - płyta główna
Płyta główna


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.


Zabezpieczenie płytki PCB
Zabezpieczenie płytki PCB


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 (kopia) 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.


Arduino - obsługiwane procesory
Arduino - obsługiwane procesory

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).


Przed napisaniem programu i wgraniu go do procesora musimy sprawdzić, które piny układu odpowiadają pinom platformy Arduino.




ATtiny 2313 - zgodność z Arduino
ATtiny 2313 - zgodność z 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);        
}    

Zasadę działania programu przedstawia poniższy graf:


Graf algorytmu
Graf algorytmu



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 (kopia).

Dodatkowe wyposażenie

Ze względu na zastosowanie gniazd audio typu cinch, konieczne jest zaopatrzenie się w przejściówki typu mini-jack -> cinch.


Automatyczny przełącznik audio - dodatkowe wyposażenie
Automatyczny przełącznik audio - dodatkowe wyposażenie


Możliwości zmian

Nieużywane 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ść.

Szkic schematu ulepszonego przełącznika mógłby wyglądać tak:


Automatyczny przełącznik audio - ulepszony schemat
Automatyczny przełącznik audio - ulepszony schemat


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, testowaniu i wprowadzaniu ewentualnych poprawek. 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 :-)

Pozdrawiam,
Daniel Turbasa
gil-59.blogspot.com


Zobacz inne artykułu z cyklu: Arduiono ... czyli prościej się nie da :-)


Oceń artykuł.
Wasze opinie są dla nas ważne, gdyż pozwalają dopracować poszczególne artykuły.
Pozdrawiamy, Autorzy
Ten artykuł oceniam na:

6 komentarzy:

  1. Na symulacji pierwszy wzmacniacz jest "do góry nogami" i całość się zatrzaskuje w jednym stanie przez dodatnie sprzężenie zwrotne ;)

    OdpowiedzUsuń
    Odpowiedzi
    1. Wszystko jest OK. Pierwszy układ to wzmacniacz nieodwracający - sygnał podajesz na "+", rezystory odpowiadające za wzmocnienie do "-". Po prostu wzmacniacz jest odwrócony, ale połączenia są ok. Jeżeli chodzi o zatrzaskiwanie to aby w pełni pokazać działanie układu, należałoby za źródłem dać klucz, który będzie symulował występowanie sygnału lub jego brak.

      Usuń
    2. Sam mówisz, ze sygnał idzie na + a sprzężenie jest do - a na symulacji jest dokładnie odwrotnie. Nie mówię o schemacie bo tam jest ok tylko o symulacji.

      Usuń
    3. Racja - na obrazku ze strzałkami jest błąd. Wzmacniacz jest odwrócony i pracuje w konfiguracji komparatora z histerezą (o ile dobrze pamiętam). Natomiast na samej symulacji, którą sprawdzałem (aplet Java) wszystko jest OK.

      Usuń
    4. Sama symulacja również jest z niepoprawnie podłączonym wzmacniaczem operacyjnym. Za błąd przepraszam i zwracam honor kamaloo :) Stosowne poprawki przesłałem do redakcji.

      Usuń
  2. Witam,
    Czy byłaby szansa, żeby zakupić ten układ (zaprogramowany kontroler i może płytka). Chociaż płytkę mogę zrobić sam, elementy także.
    Pozdrawiam
    Maciej Piotrowski

    OdpowiedzUsuń

Działy
Działy dodatkowe
Inne
O blogu




Dzisiaj
--> za darmo!!! <--
1. USBasp
2. microBOARD M8


Napisz artykuł
--> i wygraj nagrodę. <--


Co nowego na blogu?
Śledź naszego Facebook-a



Co nowego na blogu?
Śledź nas na Google+

/* 20140911 Wyłączona prawa kolumna */
  • 00

    dni

  • 00

    godzin

  • :
  • 00

    minut

  • :
  • 00

    sekund

Nie czekaj do ostatniego dnia!
Jakość opisu projektu także jest istotna (pkt 9.2 regulaminu).

Sponsorzy:

Zapamiętaj ten artykuł w moim prywatnym spisie treści.