Zdalne sterowanie mikserem audio za pomocą Arduino

Zdalne sterowanie mikserem audio za pomocą Arduino

Jakiś czas temu Teściu poprosił mnie o zmajstrowanie urządzenia, które umożliwiłoby zdalne sterowanie głośnością jednym z kanałów w mikserze audio.  Wyzwanie przyjąłem i zacząłem się zastanawiać, jak do tego tematu podejść. Początkowo planowałem puścić wyjście tego kanału przez dodatkowy układ (elektroniczny potencjometr), który by odpowiadał za regulację głośności.

Ostatecznie postanowiłem jednak pójść inną drogą i zmajstrowałem coś, co nie ingeruje bezpośrednio w tor audio. Do regulacji głośności wykorzystałem… serwomechanizm, który najzwyczajniej w świecie kręci jedną z gałek w mikserze:

Przeszedłem jednak długą drogę, zanim udało mi się ten projekt uruchomić…

O ile zdobycie taniego serwa nie jest problemem, o tyle miałem mały problem z rozwiązaniem kwestii zdalnego sterowania. Sprawę dodatkowo komplikował fakt, że sterowanie musiało się odbywać drogą radiową. Nie dość, że pilot musi mieć zasięg minimum 100m, to jeszcze całość będzie często działać na świeżym powietrzu (nierzadko w pełnym słońcu), więc wszelkie rozwiązania na podczerwień musiałem z góry odrzucić.

Długo szukałem gotowego modułu radiowego, którego mógłbym spiąć np. z pilotem od samochodu i podpiąć do Arduino. Niestety niczego podobnego nie znalazłem. Na eBayu znalazłem jeden zestaw (pilot + odbiornik), ale zdyskwalifikował go rozmiar pilota, który wielkością przypominał paczkę papierosów.

Nie mogąc znaleźć nic lepszego, chciałem zastosować… dzwonek bezprzewodowy :D Piloty od dzwonków są względnie małe (do kieszeni by się zmieścił) i zasięg też mają niczego sobie. Już nawet zdążyłem rozkręcić nasz dzwonek w myszce i pobadałem oscyloskopem, gdzie można by się wpiąć, żeby za pomocą Arduino wyłapywać fakt wciśnięcia przycisku. Problemem było jedynie to, że 99% dzwonków ma tylko jeden przycisk. Plan miałem taki, żeby przy pierwszym przytrzymaniu przycisku serwo kręciło się w jedną stronę, a po puszczeniu i ponownym wciśnięciu w drugą. Rozwiązanie niezbyt eleganckie, ale raczej by się sprawdziło.

Wtem, całkiem przypadkowo wypatrzyłem w jednym z lokalnych sklepów układ do zdalnego sterowania jasnością taśm LED:

Zdalny regulator jasności diod LED

Układ spełniał wszystkie warunki – miał malutkiego i zgrabnego pilota o zasięgu do 150m. Dodatkowym atutem było to, że oprócz zwykłego przycisku on/off ma też przyciski + i -, które fajnie można w tym projekcie wykorzystać :)

Od samego początku założyłem (jak się później okazało – błędnie), że układ ten jest źródłem prądowym, czyli ma na wyjściu stałe napięcie, a jasność diod reguluje zmniejszając i zwiększając prąd.

Jak odczytać w Arduino wartość prądu w źródle prądowym?

Standardowo Arduino umie odczytywać jedynie napięcia w zakresie od 0V do 5V, musiałem więc zmontować prosty przetwornik I/U, który by mi przełożył zmiany prądu na zmiany napięcia. Na szybko podpiąłem podczerwoną diodę LED do wyjścia regulatora i zaraz przy niej umieściłem fotodiodę, której rezystancja jest zależna od natężenia światła podczerwonego, które na nią pada. Do tej diody odbiorczej podpiąłem rezystor tworząc w ten sposób najzwyklejszy dzielnik napięcia, na wejście którego podałem 5V, a wyjście podpiąłem do Arduino.

Działa to prosto – za pomocą pilota regulowałem jasność świecenia diody LED. Wraz ze zmianą jasności diody, zmieniała się rezystancja diody odbiorczej, więc i zmieniały się proporcje rezystancji w dzielniku napięcia, co przekładało się z kolei na zmianę napięcia trafiającego na wejście Arduino :)

W teorii wszystko powinno działać pięknie, ale niestety rzeczywistość często okazuje się brutalna ;) Nie wiedzieć czemu, Arduino całkowicie głupiało przy odczytywaniu tego napięcia. Szybko odpaliłem oscyloskop i sprawdziłem, co dokładnie pojawia się na wyjściu tego dzielnika. I w tym momencie wszystko się skomplikowało – okazało się, że ten cały regulator wcale nie jest źródłem prądowym, a generatorem PWM.

Jak odczytać wartość wypełnienia PWM w Arduino?

Początkowo nie miałem w ogóle pomysłu, jak się za to zabrać. Z pomocą przyszedł mi Sprae (jeden z redaktorów bloga Starter Kit działającego pod banderą Nettigo), który dał mi cynk o Arduinowej funkcji pulseIn(), która umożliwia w banalny sposób odczytywać wartość wypełnienia PWM :) Na wyjściu regulatora jest około 12V, więc wystarczyło zrobić prosty dzielnik napięcia na dwóch rezystorach i podać około 5V na wejście cyfrowe w Arduino.

Żeby odczytać wartość wypełnienia wystarczy użyć takiego przykładowego programu:

Z takim kodem w zmiennej wypelnienie będzie się zapisywać wartość wypełnienia sygnału PWM wyrażona liczbą o wartości od 0 do 9999.

Jak sterować serwomechanizmem za pomocą PWM?

Dalej nie pozostało już nic innego, jak przełożyć wartość wypełnienia na położenie serwomechanizmu, który może się obracać od 0° do 180°. Do takich zadań świetnie nadaje się funkcja map(), o której pisałem w tym poście:

Cały mój program odpowiedzialny za sterowanie serwem za pomocą sygnału PWM wygląda tak:

Do takiego programu wystarczy zmontować taki prosty układ:

Schemat regulatora LED

W tym momencie wszystko działało już tak, jak powinno:

Na koniec trzeba jeszcze tylko przerzucić cały program na osobny mikrokontroler i wcisnąć wszystko w jakąś obudowę. Jak zaprogramować mikrokontroler ATtiny za pomocą Arduino opisywał ostatnio Maciej, więc nie będę się tutaj powtarzał :) Powiem jedynie, że program ten nie mieścił mi się na opisywanym przez Macieja ATtiny2313, dlatego wrzuciłem go na ATtiny44, który ma do dyspozycji dwa razy więcej pamięci.

Na tym etapie cały układ sprowadza się do takiego prostego schematu:

Regulator LED z ATtiny44

Zmianie uległ też troszkę program, ponieważ przy wgrywaniu go na ATtiny trzeba było zastąpić bibliotekę Servo.h biblioteką SoftwareServo.h. Po zmianach program wygląda tak:

Bibliotekę SoftwareSerwo możecie ściągnąć z tej strony. Po ściągnięciu trzeba ją rozpakować i skopiować do katalogu /libraries/, który znajduje się w folderze z programem Arduino IDE.

W programie wykorzystującym tą bibliotekę zmieniły się linie 1 i 2, oraz została dodana linia 21.

Czym zasilić cały układ?

Do zasilania sterownika LED wykorzystałem znaleziony w szafce zasilacz 12V niewiadomego pochodzenia ;) Niestety ze względu na konstrukcję i sposób działania tego regulatora nie mogłem wykorzystać tego samego zasilacza do zasilania mikrokontrolera oraz serwa, więc musiałem dorzucić jeszcze drugi zasilacz 5V, który kupiłem za dosłownie kilka złotych w markecie jako “Zasilacz USB” :)

Oczywiście z obu zasilaczy ściągnąłem oryginalne obudowy i samą elektronikę umieściłem razem z mikrokontrolerem i sterownikiem LED w jednej wspólnej obudowie:

Rozmieszczenie elektroniki w obudowie

Do płytki z mikrokontrolerem dolutowałem też 6-pinowe złącze ICSP, do którego w przyszłości będę mógł podpiąć Arduino (czy dowolny inny programator) i szybko zmienić program w ATtiny, bez potrzeby wyciągania go z podstawki.

Jak połączyć serwomechanizm z potencjometrem?

Nie chciałem stosować żadnych inwazyjnych rozwiązań, dlatego kupiłem jedną plastikową gałeczkę do potencjometrów, w której wywierciłem otwór Ø3mm i przykręciłem do ośki serwomechanizmu. Dla pewności pomaziałem jeszcze miejsce połączenia klejem epoksydowym.

Gałka potencjometru przyczepiona do serwomechanizmu

Dzięki takiemu rozwiązaniu będzie można szybko całość zdemontować i założyć oryginalną gałeczkę od miksera.

Jedynym problemem pozostało jeszcze unieruchomienie serwa, żeby samo się nie obracało. Za pomocą kawałka blaszki przykręciłem serwo do obudowy miksera jedną ze śrubek znajdujących się na jego spodzie.

Serwomechanizm przyczepiony do miksera

Serwomechanizm na potencjometrze

Jako ciekawostkę dodam, że blaszkę tą wygrzebałem ze swojego starego zestawu “młodego technika”:

Zestaw małego technika - zabawka z ZSRR

Tak – mam jeszcze resztki tego zestawu w piwnicy :D

Gotowy sterownik RC do miksera audio

Całość po złożeniu i podłączeniu prezentuje się tak:

Mikser audio ze zdalnym sterowaniem

Pewnie dałoby się to zrobić lepiej, zgrabniej i prościej. Najważniejsze jednak, że to rozwiązanie działa i dobrze sprawdza się w praktyce :) I nawet, całkiem niezamierzenie, jest w tym sterowniku tryb półautomatyczny. W trybie “ręcznym” można sterować położeniem potencjometru za pomocą przycisków plus i minus. Ale można też ustawić sobie przyciskiem minus dowolną wartość, a później wciskając tylko przycisk on/off robić szybkie przejścia między ustaloną pozycją a max (co dobrze widać na pierwszym filmiku załączonym do posta). Po prostu po wyłączeniu regulatora serwo wraca do pozycji 0, czyli maksymalnie podkręca potencjometr w mikserze. Natomiast po ponownym włączeniu wraca do zadanej wcześniej pozycji.

Najlepsze jest to, że układ ten można zastosować także do wielu innych rzeczy – np. do sterowania żaluzjami (chociaż tutaj nadał by się też dużo tańszy pilot na podczerwień), sterowania światłami przed domem, itp. Nic też nie stoi na przeszkodzie, żeby kupić sterownik do diod RGB i jednym pilotem sterować nawet trzema serwomechanizmami :)

A Wy macie jakieś pomysły, do czego można by wykorzystać takie zdalne sterowanie drogą radiową?

Ocena: 4.82/5 (głosów: 11)

Podobne posty

28 komentarzy do “Zdalne sterowanie mikserem audio za pomocą Arduino

  • We wszystkich komercyjnych rozwiązaniach LEDy są sterowane przez PWM. Jest tak z prostego powodu – wartość prądu ma bezpośredni wpływ na emitowaną barwę.

    Odpowiedz
    • Układ pod dużym obciążeniem może się przegrzać a nawet spalić ,nie polecam , prosty regulator ma jedną wadę , trzeba zmienić i dokupić lepszy pilot sterujący , usunąć regulator nad potencjometrem i wbudować go pod płytę czołową .Moje kondolencję za doskonały pomysł ,jak zawsze Więcku

      Odpowiedz
  • miałbym jedno pytanie. Czemu w pierwszej wersji (na arduino) kabelek żółty od servo idzie na DIGITAL 2 które nie jest PWM-owe ?? Chyba powinien iść na chociażby DIGITAL 3.
    No chyba ze się mylę :)

    Dla Attiny44 idzie na prawidłowo na PIN8 (PWM)

    Odpowiedz
  • Pomysl może i okej ale nie widzę tutaj żadnego praktycznego zastosowania. Prościej jest zrobić potencjometr cyfrowy ze sterowaniem poprzez jakis mały uC i pilota. Brawo za inwencję twórczą:) pozdrawiam

    Odpowiedz
    • @Patryk: Praktyczne zastosowanie jest – przynajmniej dla mojego Teścia, który prowadzi różne imprezy, w tym festyny. W czasie festynów chodzi między ludźmi z bezprzewodowym mikrofonem i zawsze potrzebował pomocnika, który by ściszał muzykę, gdy chciał coś powiedzieć (albo przekrzykiwał muzykę). Teraz może sobie sam ściszać muzykę pilotem :)

      Oczywiście zdaję sobie sprawę, że jest to projekt bardzo niszowy i raczej nikt nie będzie go powielać. Podzielić się jednak chciałem, bo ktoś zawsze może chcieć zrobić coś podobnego podpinając np. taki regulator do Arduino :)

      Odpowiedz
  • Łukasz duże brawa za pomysł.Masz podobne podejście do majsterkowania.Czasami proste urządzenia świetnie dają sobie radę bez zaawansowanej elektroniki mimo swojej prostoty.

    Odpowiedz
  • Lepiej moim zdaniem było by dobudować osobne urządzenie tj potencjometr cyfrowy podłączony pomiędzy wyjście miksera, a wejście wzmacniacza. Można by było wtedy realizować bardziej skomplikowane funkcje, tak jak podwójne kliknięcie przyciszało by do określonego niższego natężenia dźwięku i tym podobne. Nawet nie trzeba by dotykać fabrycznego urządzenia, a to jest niesamowicie istotne.

    Trzymanie przycisku przez 2s tylko po to żeby przyciszyć może być trochę nie wygodne. Opóźnienie jest znaczne, aż za duże.

    @Łukasz Więcek: Jakim cudem nie zmieściłeś tak prostego programu na 2313? Nie ogarniam. Odczytanie jednej wartości i przepisanie na wyjście, nie ma żadnego dekodowania danych z pilota, nawet z bootloaderem nie powinien tyle zająć. Przyjrzę się temu później.

    Estetyka zewnętrzna jest całkiem w porządku, ale na przyszłość ogranicz do minimum ilość kleju. To nie jest adekwatny materiał montażowy.

    Pozdrawiam

    Odpowiedz
      • @Łukasz Więcek:

        Myślę, że bardziej problem jest w opóźnieniu, bo przycisk trzyma się do momentu reakcji urządzenia… Taki odruch człowieka. :)

        No nie wiem ja staram się omijać mechanikę szczególnie przy czymś co z definicji ma być mobilne i przenoszone. Z tym są zawsze problemy.

        Nie miałem do czynienia z arduino, w C wydaje mi się to nie realne zapisać tyle kodu dla tej funkcjonalności. Ale przy pojedynczej sztuki praktycznie nie ma to znaczenia.

        Odpowiedz
  • Czytam wpisy i nie mogę pojąć,jak wiele osób lubi utrudniać sobie życie.Łukasz zrobił jak dla mnie genialne w swojej prostocie urządzenie ,które zdaje egzamin (ku zadowoleniu wujka) ,ale nie,zawsze znajdzie się kilku malkontentów którym zawsze coś nie pasuje. Podam przykład: zrobiłem taczkę i czytam :mogłeś dać grubszą blachę,mogłeś pomalować na niebiesko ,choć jest na czerwono,mogłeś pospawać ramę chociaż jest skręcana. Właściwie to można podpiąć Atmegę lub Arduino.to byłby hit.Właśnie takie nic nie wnoszące merytorycznego wpisy wpieniają mnie najbardziej.Chłopak zrobił proste i fajne urządzenie i chwała mu za to.

    Odpowiedz
    • @Łukasz Więcek:
      @carbon54:

      Przepraszam, a to ma być kółko wzajemnej adoracji?
      Już niejednokrotnie w komentarzach wytykano błędy merytoryczne i co więcej często padają bardzo sensowne pomysły rozwinięcia, czy udoskonalenia danej rzeczy.

      Więc proszę przestać marudzić na marudzenie. :)

      Odpowiedz
      • @Michal: A nie, nie – za te rzeczowe komentarze, to jestem jak najbardziej wdzięczny :) Czepiam się tych, który od domowego majsterkowicza wymagają zachowania takich norm, jak by te rzeczy miały trafić do seryjnej produkcji z przeznaczeniem do użytkowania od 3 roku życia ;)

        Odpowiedz
        • @Łukasz Więcek:
          Seryjne urządzenia i prototypowe używane są przez te same osoby. Na obudowie nie naklejasz naklejki „uwaga to nie jest z produkcji seryjnej”. Więc czepianie się jest jak najbardziej na miejscu. Więcej może zdarzy się, że któryś ze swoich pomysłów w którymś momencie skomercjalizujesz, a wtedy wiedza i uwagi na temat zachowania norm może okazać się bezcenna.

          Zawsze trzeba patrzeć krok do przodu…

          A samych celowych złośliwości jakiś nie zauważam (chyba, że są wycięte? :P ), co najwyżej nutka zazdrości, ale to nic strasznego.

          Odpowiedz
          • Kiedyś, nie mając żadnej wiedzy z dziedziny elektroniki, zrobiłem sterowanie głośnością miniwieży używając do tego celu aparatury zdalnego sterowania, serwa, silniczka i gumki recepturki. Na serwie skonstruowałem stycznik zmieniający kierunek przepływu prądu. Napęd z silniczka przenoszony był gumką recepturką na pokrętło potencjometru. Miałem zasięg 1,5 km :-) To było dopiero niszowe zastosowanie, ale cieszyło…

            Odpowiedz
  • Czy nie można by sterować serwomechanizmem bezpośrednio z tego sterownika LED który generuje PWM? Trzeba by zrobić dopasowanie poziomu PWM z 12V na 5V (dzielnik rezystorowy) i na chłopski rozum powinno zadziałać bez tego atmelka.

    Odpowiedz

Odpowiedz

anuluj

Masz uwagi?