Elektroda.pl
Elektroda.pl
X

Wyszukiwarki naszych partnerów

Wyszukaj w ofercie 200 tys. produktów TME
Proszę, dodaj wyjątek elektroda.pl do Adblock.
Dzięki temu, że oglądasz reklamy, wspierasz portal i użytkowników.

"Pianino" z klawiatury komputerowej PS/2

Sh44dow 03 Cze 2011 21:20 28700 21
  • "Pianino" z klawiatury komputerowej PS/2

    Witam.

    Sesja się zbliża, więc tradycyjnie zacząłem już prokrastynować :D . Ostatnio zacząłem pisać bibliotekę do obsługi klawiatury PS/2 w C dla AVR i postanowiłem na szybko w godzinkę lub dwie stworzyć jakiś praktyczny projekt w celu jej przetestowania. Początkowo nie planowałem tego publikować, ale pokazałem to kilku osobom i się spodobało, więc być może spodoba się i Wam. Mi zabawa tym wynalazkiem sprawia radochę jak dziecku ;-).

    Oto moje elektroniczne "pianino" z komputerowej klawiatury PS/2.
    Od strony elektronicznej układ jest bardzo prosty - mikrokontroler ATMega, kondensatory, głośnik, gniazdo PS/2, które barbarzyńsko wyciąłem wraz z kawałkiem uszkodzonej płyty głównej, gdyż nie chciało mi się go wylutowywać i klawiatura PS/2 ze złomu, którą wspaniale oznakowałem zielonym markerem i powyciągałem kilka klawiszy by układ klawiszy przypominał klawiaturę pianina.
    "Pianino" z klawiatury komputerowej PS/2 "Pianino" z klawiatury komputerowej PS/2 "Pianino" z klawiatury komputerowej PS/2
    Na zdjęciach widać moją uniwersalną płytkę, w której siedzi m.in. Mega32 i programator USB DIY - USBAsp. Głośnik pochodzi z obudowy komputerowej.

    Czas wspomnieć coś o softwarze, który jest główną częścią projektu. Być może kogoś to zainteresuje.

    Jak już wspomniałem, napisałem go w C i skompilowałem pod AVR-GCC. Program dzieli się na dwie części - obsługa PS/2 i właściwy program - pianino.

    Warstwa fizyczna PS/2 jest bardzo prosta. W przypadku klawiatury oprócz VCC/GND wykorzystywane są jedynie linie DATA i CLK. Opis można znaleźć m. in.
    [TUTAJ] . W chwili naciśnięcia/puszczenia przycisku klawiatura przesyła 11 bitów (start, data(8), parity, stop) generując przy tym zegar na linii CLK. Zegar połączyłem z wejściem INT0 mikrokontrolera i włączyłem zewnętrzne przerwanie. Dane można odebrać na dwa sposoby - w momencie wystąpienia przerwania można odebrać wszystkie 11 bitów lub odbierać po 1 bicie w każdym przerwaniu. Ja zastosowałem drugą opcję. Dlaczego? Dzięki temu nie marnuję czasu pomiędzy bitami. Jeśli odbierałbym cały bajt, musiałbym czekać na aż klawiatura prześle wszystkie 11, a że działoby się to w przerwaniu zablokowałbym inne przerwania aż do zakończenia odczytu, co mogłoby być niepożądane w przypadku korzystania innych często występujących przerwań. Minusem jest możliwość utraty synchronizacji, kiedy na linii CLK pojawi się jakiś "śmieć" (moja klawiatura ze złomu jest lekko upośledzona i czasem je wysyła ;-) ) - można to wyeliminować wywołując co jakiś czas funkcję synchronizującą.
    Po odebraniu 11-go bitu, bajt trafia do kolejki klawiatury - struktury zawierającej bufor o definiowalnej wielkości i flagi. Dzięki zastosowaniu bufora główna pętla nie musi "interesować się" życiem klawiatury - wystarczy jedynie ściągnąć z kolejki klawisz (o ile tam się znajduje). Ponadto takie podejście umożliwia podłączenie dwu lub więcej klawiatur - wystarczy tylko stworzyć dodatkową strukturę i przerobić funkcje tak, by operowały na wskaźnikach zamiast na globalnej strukturze (stworzyłem globalną dla zwiększenia wydajności/wygody).


    Co do algorytmu pianina - mikrokontroler generuje proste tony (przebiegi prostokątne) za pomocą wbudowanego sprzętowego timera. W momencie, gdy chcę wygenerować dźwięk, przeliczam wartość docelowej częstotliwości na odpowiednią wartość wpisywaną do rejestru (właściwie rejestrów, bo jest to liczba 2-bajtowa) timera, zależną od częstotliwości taktowania i zmieniam stan wyjścia, do którego podłączony jest głośnik przy każdym przerwaniu.
    Pianino posiada własną kolejkę klawiszy - dzięki niej program "pamięta", jakie klawisze są aktualnie wciśnięte i zmienia ton w odpowiedni sposób.
    Niestety mając tylko jeden kanał niewiele można zdziałać, ale przy zastosowaniu pewnego triku można nieco urozmaicić dźwięk. Zastosowałem taki sam trik jak w starych DOSowych grach (to były czasy, nie? :D ) - w momencie wciśnięcia dwu klawiszy częstotliwość jest przełączana z jednego tonu na drugi 20-50ms, co daje (przynajmniej częściowe) wrażenie dwóch tonów jednocześnie. Tryb dwutonu można wyłączyć/wyłączyć za pomocą odpowiednich klawiszy.

    Na koniec najciekawsza opcja - nagrywanie sampli. Pozwala ona nagrać 4 sample o długości do 65 nut (w przypadku, gdy wszystkie dźwięki/przerwy są krótsze od 4 sek.). Podczas nagrywania zapisuję w pamięci zdarzenie (wciśnięcie/puszczenie klawisza N) i odstęp od poprzedniego zdarzenia w rozdzielczości około 16ms (1/64) do zajmuje 2B. Jedna nuta to wciśnięcie i puszczenie klawisza. 65*2*2B*4 sample daje 1040B potrzebnej pamięci na sample. oczywiście, można by to bardziej skompresować, ale nie było sensu marnować czasu na pisanie efektywniejszego algorytmu, bo nie taki był cel tego projektu. W przypadku ATMegi8/16 trzeba by zmniejszyć ten obszar o połowę - potrzebna jeszcze miejsca na kolejki, zmienne pomocnicze i stos (no końcu). Sample możnaby też zapisywać na EEPROMie - były by trwałe.
    Sample można odtwarzać i jednocześnie grać drugą linię ;-). Algorytm odtwarzania ma małe niedociągnięcia, które widać przy przełączaniu oktaw, ale jak już pisałem, celem projektu była biblioteka PS/2.

    A teraz najważniejsze - 2 filmiki: na jednym demonstracja działania tryby dwutonowego i sampli na znanej piosence polskiego zespołu a na drugim... marsz turecki :D .


    Link


    Link


    Jeśli będą chętni, to udostępnię kod programu/bibliotekę PS/2 jak tylko ją dokończę i napiszę dokumentację - pisać.
    Jak mi się zechce, to dopiszę obsługę myszki - można by modulować nią dodatkowo tony klawiszy (coś na zasadzie wajchy w keyboardach :D ).
    Jeśli ktoś chciałby się pobawić, to załączam skompilowany program dla ATMegi32 (8MHz). Schemat połączenia (tak jak było mi wygodnie na mojej płytce testowej):

    Code:
    ATMEGA.PORTD.2 (INT0)   -   PS2.CLK 
    
    ATMEGA.PORTC.1         -   PS2.DATA
    ATMEGA.PORTD.6         -   SPEAKER

    I oczywiście głośnik do masy, VCC=5V dla atmegi i klawiatury i do tego jakiś elektrokit filtrujący miedzy VCC a GND i kondensatory do kwarcu 8MHZ około 27-30p. Program dodatkowo wysyła dane pomocne w debugowaniu po RS232 i czasem się przywiesi na starcie co jest powodem synchronizacji PS/2, której w bibliotece jeszcze nie ma ;-).

    Firmware v. 0.1 (alpha):
    http://silent.it.cx/files/public/avrpiano/arvpiano_aplha_0_1_m32_8MHz.hex

    Sterowanie:
    Code:
    strzałka w górę / w dół - oktawa w górę / w dół
    
    F8 - Tryb jednotonowy
    F9 - tryb dwutonowy
    F1...F4 - wybór sampla
    F12 - rozpoczęcie nagrywania (po sygnale program czeka na wciśnięcie pierwszego klawisza - jeśli chcesz zrobić pauzę na początku, wciśniej przycisk "nie-grający")
    ENTER - odtwarzanie sampla
    Dolna oktawa - Z ... ","; górna - W...O


    Przy okazji zapraszam na moją stronę:
    http://silent.it.cx/home/

  • #2 03 Cze 2011 23:36
    ^Rachel
    Poziom 21  

    świetny pomysł ! a co się stanie gdy wciśniesz kilka klawiszy jednocześnie ?

  • #3 03 Cze 2011 23:43
    Sh44dow
    Poziom 16  

    Zostaną zakolejkowane. Jeśli aktywny jest tryb jednotonowy, po wciśnięciu kilku na raz słychać ostatni w kolejce i przy puszczeniu klawisza jest on usuwany z kolejki. W przypadku dwutonowego - dwa ostatnie.

  • #4 03 Cze 2011 23:56
    w@mpir
    Poziom 18  

    Bardzo fajny projekt, nie piszę programów i nie mam czasu się nauczyć więc nie mogę nic oceniać. Dźwięki generowane przez układ są trochę prymitywne jak dla mnie ale może takie było założenie projektu.

  • #5 04 Cze 2011 09:43
    thereminator
    Warunkowo odblokowany

    krzysztof_326 napisał:
    Taki bajer miałem na karcie Sound Blaster Live 1024 pod Windows-em 98, można se było pobrząkać z klawiatury, nawet na MIDI wysyłać instrukcje.

    Też to mam w SB pod XP, ale wygoda tej gry podobna jak przy obieraniu ziemniaków w rekawicach bokserskich... Także poza celami zabawowymi i edukacyjnymi opisany układ nie ma sensowniejszego zastosowania, niemniej należy docenić pracę włożoną w jego wykonanie.

  • #7 04 Cze 2011 10:33
    Świr
    Poziom 34  

    Samo działanie mi się podoba, choć technika potrzeba do gry na takim czymś to już masakra :D
    Pomyśl nad zrobieniem drugiej klawiatury dla lewej ręki, i jakiegoś pedałboard pod nogi :P

  • #8 04 Cze 2011 10:34
    zdebel
    Poziom 14  

    Jeju jak to pięknie brzmi :D, aż się prosi porobić covery ze starych dobrych gier dosowych. Co do przydatności, na klawiaturze wszyscy umiemy przecież bardzo szybko pisać, czyli równie dobrze można na tym grać po odrobinie treningu, a brzmienie i ton jest wspaniałe jak dla mnie :)

  • #9 04 Cze 2011 11:19
    komatssu
    Poziom 27  

    Mogłeś bardziej się postarać jeśli chodzi o generację dźwięku i zrobić odtwarzanie próbek z tablicy wavetable + przetwornik C/A np. drabinka R2R. Przy okazji realizacja polifonii byłaby możliwa, a także podkładu perkusji.

  • #10 04 Cze 2011 14:58
    Trismagist
    Poziom 10  

    Fajnie jak byś wrzucił tą bibliotekę do obsługi klawiatury ps/2

  • #11 04 Cze 2011 18:19
    628467
    Usunięty  
  • #12 04 Cze 2011 20:55
    Sh44dow
    Poziom 16  

    leonow32 napisał:
    Rzuć schemat, bo ciekawi mnie jak rozwiązałeś układ audio.

    Głośnik jest połączony bezpośrednio z wyjściem mikrokontrolera. Metoda prymitywna bo elektronik ze mnie raczej marny ;-).


    komatssu napisał:
    wavetable + przetwornik C/A np. drabinka R2R

    Mógłbyś napisać coś więcej na ten temat?

    Ton a'la Atari... To by było coś! :D


    Paniki napisał:
    Długo się uczyłeś na niej grać? :D

    Jak widać na filmie - nie ;-). Kiedyś trochę grałem na pianinie, więc idzie łatwo.

  • #13 04 Cze 2011 21:06
    776375
    Usunięty  
  • #14 04 Cze 2011 22:27
    hose2
    Poziom 16  

    Witam,

    komatssu napisał:
    Mogłeś bardziej się postarać jeśli chodzi o generację dźwięku i zrobić odtwarzanie próbek z tablicy wavetable + przetwornik C/A np. drabinka R2R. Przy okazji realizacja polifonii byłaby możliwa, a także podkładu perkusji.

    Dla niezadowolonych chipophone

  • #15 05 Cze 2011 00:13
    hexen2k
    Poziom 16  

    Ciekawy projekt, podczas tworzenia którego autor zapewne dużo się nauczył ;) Przy okazji wyszło z tego urządzenie, które wywołuje uśmiech na twarzy podczas oglądania filmików :D

    BTW tutaj są gotowe biblioteki do PS/2 + AVR - być może przydadzą się autorowi

    Link

    Pozdrawiam

  • #16 05 Cze 2011 00:22
    blue_17
    Poziom 32  

    Oj naprawdę pomysłowe ja mam parę pytań ;)

    Jak rozróżniasz dźwięki, czy u ciebie zielone to czarne przyciski czy też to tylko podstawowe dźwięki.

    Na czym się wzorowałeś robiąc skalę dźwięków :?:

    Jeśli to możliwe to prosił bym o link do tego projektu z usbasp a dokładnie z tą płytką

    Co do techniki gry to nic zadziwiającego bo widziałem keyboard guzikowy na którym gość wymiatał to dopiero było coś :D

    Pozdrawiam

  • #17 05 Cze 2011 12:08
    GienekS
    Poziom 32  

    Ja w kwestii interfejsu dla klawiatury. Piszesz że odbierasz to na "piechotę" bit po bicie. A nie próbowałeś wykorzystać interfejsu SPI do odbioru tych sygnałów z klawiatury? Albo UART synchroniczny? (Ale nie wiem czy ATmega32 ma tą opcję uart'a, któryś z nowych AVR-ow na pewno ma)

  • #18 05 Cze 2011 14:45
    Sh44dow
    Poziom 16  

    Wrzuciłem skompilowany "wsad" dla ATMegi32 (8MHz):

    Code:
    http://silent.it.cx/files/public/avrpiano/arvpiano_aplha_0_1_m32_8MHz.hex



    jakimov napisał:
    Mógłbyś udostępnić płytkę?

    Tutaj raczej nie ma czego udostępniać. W układzie jest ATMega32 z kwarcem i kondensatorami i 3 połączenia - 2 do klawiatury i 1 do głośnika (patrz: pierwszy post).


    blue_17 napisał:
    Oj naprawdę pomysłowe ja mam parę pytań ;)
    Jak rozróżniasz dźwięki, czy u ciebie zielone to czarne przyciski czy też to tylko podstawowe dźwięki.

    Na czym się wzorowałeś robiąc skalę dźwięków :?:

    Jeśli to możliwe to prosił bym o link do tego projektu z usbasp a dokładnie z tą płytką
    Pozdrawiam


    Klawisze ułożone są na wzór klawiatury pianina - przyciski w 2-gim i czwartym rzędzie to całe tony ("białe") a w 1. i 3-cim - półtony ("czarne"). Skala identyczna jak w pianinie.

    Co do programatora to sam zrobiłem płytkę w eaglu na podstawie schematu ze strony autora - proszę:
    Code:
    http://silent.it.cx/files/public/usbasp/usbasp_eagle.zip
    To była jedna z moich pierwszych płytek i dlatego ścieżki są na warstwie top zamiast bottom ;-).



    GienekS napisał:
    Ja w gestii interfajsu dla klawiatury. Piszesz że odbierasz to na "piechotę" bit po bicie. A nie prubowałeś wykorzystać interfejsu SPI do odbioru tych sygnałów z klawiatury ? Albo UART synchroniczny ?? (Ale nie wiem czy ATmega32 ma tą opcję uarta, któryś z nowych AVR-ow na pewno ma)


    Wszystkie mikrokontrolery z serii Mega mają UART/SPI/I2C (TWI) i jeśli to ja pisałbym oprogramowanie dla mikrokontrolerów po obu stronach, pewnie użyłbym sprzętowego rozwiązania, ale urządzenia PS/2 mają własny protokół, do którego muszę się dostosować, dlatego realizuję to programowo.




    Regulamin wewnętrzny pkt.5
    oraz
    3.1.18. (10.11) Zabronione jest publikowanie informacji do źródeł, które po pewnym czasie wygasają (publikowanie odnośników do stron o charakterze krótkotrwałym).
    Prosze to poprawić.
    (joy_pl)

  • #19 06 Cze 2011 15:13
    daavid117
    Poziom 42  

    Genialne! Przypomniała mi się moja stara Commodore 64. Bodajże na Black Box po wpisaniu odpowiedniego polecenia klawiatura zamieniała się również w pianino. Ile godzin spędziłem ucząc się "Ody do radości" czy różnych walców! Aż się łezka w oku kręci :D.

    BTW: Wykonanie jedną ręką, więc błędy można wybaczyć ;). Ehh czego to człowiek nie zrobi żeby nie zajmować się nauką.

    Aaa i ton w stylu ATARI, Commodore byłby doskonałym dopełnieniem całości.

  • #20 09 Cze 2011 19:09
    krdln
    Poziom 12  

    Świetne pianinko, widać, że wygodnie się je obsługuje. I w ogóle niezły pomysł na realizację dwudźwięku w stylu „ksylofonowym” :D. Fajnie, że potrafi Ci robić dwudźwięk, gdzie jeden dźwięk jest z sampla, drugi z klawiatury. Pamiętam, że mój keyboard ma właśnie nawet specjalne tryby do naprzemiennego dawania ostatnich dwóch/ trzech dźwięków. Gdyby do tego dorzucić regulację prędkości tego tremolo, żeby się zsynchronizować z rytmem by było idealnie.

    Pamiętam, kiedyś robiłem takie miniurządzenie grające na µswitchach, i udało mi się z tego wykręcić prostą polifonię, wyjście słuchawkowe podłączyłęm przez filtr RC (100nF i 2kΩ) do pwma, a w programie miałem stablicowanego sinusa o okresie 256. Do tego jakieś zwiększenie głośności na początku dźwięku i powolne wygasanie i brzmiało całkiem miło, trochę jak cymbałki :), aczkolwiek był taki metaliczny pogłos.

    Pozdrawiam

  • #21 05 Lip 2011 12:12
    Alchemik2600
    Poziom 21  

    Niektóre programy muzyczne, też reagują na klawiaturę komputerową np. FL.

  • #22 05 Lip 2011 12:53
    mrrwho
    Poziom 15  

    Ani to fajne, ani przydatne, ani też estetyczne.W 2 minuty sobie napiszę choćby i w stareńkim turbopascalu to samo a nawet z większą ilością funkcji jeśli użył bym któregoś z dostępnych unitów dla obsługi karty dźwiękowej. Do grania i tak się nie nadaje , już było by lepiej jakbyś wykorzystał kawałek jakiejś dziecięcej zabawki i sterownik klawiatury komputerowej i zrobił klawiaturę z pełnego zdarzenia.

Szybka odpowiedź lub zadaj pytanie
Dziękuję Ci. Ta wiadomość oczekuje na moderatora.
 Szukaj w ofercie
Wyszukaj w ofercie 200 tys. produktów TME