{"id":141,"date":"2011-06-04T13:02:13","date_gmt":"2011-06-04T12:02:13","guid":{"rendered":"http:\/\/silent.org.pl\/home\/?p=141"},"modified":"2011-09-29T09:40:50","modified_gmt":"2011-09-29T08:40:50","slug":"pianino-z-klawiatury-komputerowej-ps2","status":"publish","type":"post","link":"http:\/\/silent.org.pl\/home\/2011\/06\/04\/pianino-z-klawiatury-komputerowej-ps2\/","title":{"rendered":"Pianino z klawiatury komputerowej PS\/2"},"content":{"rendered":"<p>Sesja si\u0119 zbli\u017ca, wi\u0119c tradycyjnie zacz\u0105\u0142em ju\u017c prokrastynowa\u0107 (a Wy? \ud83d\ude09 ). Ostatnio zacz\u0105\u0142em pisa\u0107 bibliotek\u0119 do obs\u0142ugi klawiatury PS\/2 w C dla AVR i postanowi\u0142em na szybko w godzink\u0119 lub dwie stworzy\u0107 jaki\u015b praktyczny projekt w celu jej przetestowania. Pocz\u0105tkowo nie planowa\u0142em tego publikowa\u0107, ale pokaza\u0142em to kilku osobom i si\u0119 spodoba\u0142o, wi\u0119c by\u0107 mo\u017ce spodoba si\u0119 i Wam. <font size=\"2\">Mi zabawa tym wynalazkiem sprawia radoch\u0119 jak dziecku \ud83d\ude09 <\/font>.<\/p>\n<p>Oto moje elektroniczne &#8222;pianino&#8221; z komputerowej klawiatury PS\/2.<br \/>\nOd strony elektronicznej uk\u0142ad jest bardzo prosty &#8211; mikrokontroler ATMega, kondensatory, g\u0142o\u015bnik, gniazdo PS\/2, kt\u00f3re barbarzy\u0144sko wyci\u0105\u0142em wraz z kawa\u0142kiem uszkodzonej p\u0142yty g\u0142\u00f3wnej, gdy\u017c nie chcia\u0142o mi si\u0119 go wylutowywa\u0107 i klawiatura PS\/2 ze z\u0142omu, kt\u00f3r\u0105 wspaniale oznakowa\u0142em zielonym markerem i powyci\u0105ga\u0142em kilka klawiszy by uk\u0142ad klawiszy przypomina\u0142 klawiatur\u0119 pianina.<\/p>\n<p><a href=\"http:\/\/silent.org.pl\/images\/p21.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"http:\/\/silent.org.pl\/images\/thumbs\/p21.jpg\" border=\"0\"><\/a> <a href=\"http:\/\/silent.org.pl\/images\/p22.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"http:\/\/silent.org.pl\/images\/thumbs\/p22.jpg\" border=\"0\"><\/a> <a href=\"http:\/\/silent.org.pl\/images\/p23.jpg\" target=\"_blank\"><img decoding=\"async\" src=\"http:\/\/silent.org.pl\/images\/thumbs\/p23.jpg\" border=\"0\"><\/a><\/p>\n<p>Na zdj\u0119ciach wida\u0107 moj\u0105 uniwersaln\u0105 p\u0142ytk\u0119, w kt\u00f3rej siedzi m.in. Mega32 i programator USB DIY &#8211; USBAsp. G\u0142o\u015bnik pochodzi z obudowy komputerowej. <\/p>\n<p>Czas wspomnie\u0107 co\u015b o softwarze, kt\u00f3ry jest g\u0142\u00f3wn\u0105 cz\u0119\u015bci\u0105 projektu. By\u0107 mo\u017ce kogo\u015b to zainteresuje. <\/p>\n<p>Jak ju\u017c wspomnia\u0142em, napisa\u0142em go w C i skompilowa\u0142em pod AVR-GCC. Program dzieli si\u0119 na dwie cz\u0119\u015bci &#8211; obs\u0142uga PS\/2 i w\u0142a\u015bciwy program &#8211; pianino. <\/p>\n<p>Warstwa fizyczna PS\/2 jest bardzo prosta. W przypadku klawiatury opr\u00f3cz VCC\/GND wykorzystywane s\u0105 jedynie linie DATA i CLK. Opis mo\u017cna znale\u017a\u0107 m. in.<br \/>\n<a href=\"http:\/\/www.computer-engineering.org\/\" target=\"_blank\">[TUTAJ]<\/a> . W chwili naci\u015bni\u0119cia\/puszczenia przycisku klawiatura przesy\u0142a 11 bit\u00f3w (start, data(8), parity, stop) generuj\u0105c przy tym zegar na linii CLK. Zegar po\u0142\u0105czy\u0142em z wej\u015bciem INT0 mikrokontrolera i w\u0142\u0105czy\u0142em zewn\u0119trzne przerwanie. Dane mo\u017cna odebra\u0107 na dwa sposoby &#8211; w momencie wyst\u0105pienia przerwania mo\u017cna odebra\u0107 wszystkie 11 bit\u00f3w lub odbiera\u0107 po 1 bicie w ka\u017cdym przerwaniu. Ja zastosowa\u0142em drug\u0105 opcj\u0119. Dlaczego? Dzi\u0119ki temu nie marnuj\u0119 czasu pomi\u0119dzy bitami. Je\u015bli odbiera\u0142bym ca\u0142y bajt, musia\u0142bym czeka\u0107 na a\u017c klawiatura prze\u015ble wszystkie 11, a \u017ce dzia\u0142oby si\u0119 to w przerwaniu zablokowa\u0142bym inne przerwania a\u017c do zako\u0144czenia odczytu, co mog\u0142oby by\u0107 niepo\u017c\u0105dane w przypadku korzystania innych cz\u0119sto wyst\u0119puj\u0105cych przerwa\u0144. Minusem jest mo\u017cliwo\u015b\u0107 utraty synchronizacji, kiedy na linii CLK pojawi si\u0119 jaki\u015b &#8222;\u015bmie\u0107&#8221; (moja klawiatura ze z\u0142omu jest lekko upo\u015bledzona i czasem je wysy\u0142a \ud83d\ude09 ) &#8211; mo\u017cna to wyeliminowa\u0107 wywo\u0142uj\u0105c co jaki\u015b czas funkcj\u0119 synchronizuj\u0105c\u0105.<br \/>\nPo odebraniu 11-go bitu, bajt trafia do kolejki klawiatury &#8211; struktury zawieraj\u0105cej bufor o definiowalnej wielko\u015bci i flagi. Dzi\u0119ki zastosowaniu bufora g\u0142\u00f3wna p\u0119tla nie musi &#8222;interesowa\u0107 si\u0119&#8221; \u017cyciem klawiatury &#8211; wystarczy jedynie \u015bci\u0105gn\u0105\u0107 z kolejki klawisz (o ile tam si\u0119 znajduje). Ponadto takie podej\u015bcie umo\u017cliwia pod\u0142\u0105czenie dwu lub wi\u0119cej klawiatur &#8211; wystarczy tylko stworzy\u0107 dodatkow\u0105 struktur\u0119 i przerobi\u0107 funkcje tak, by operowa\u0142y na wska\u017anikach zamiast na globalnej strukturze (stworzy\u0142em globaln\u0105 dla zwi\u0119kszenia wydajno\u015bci\/wygody). <\/p>\n<p>Co do algorytmu pianina &#8211; mikrokontroler generuje proste tony (przebiegi prostok\u0105tne) za pomoc\u0105 wbudowanego sprz\u0119towego timera. W momencie, gdy chc\u0119 wygenerowa\u0107 d\u017awi\u0119k, przeliczam warto\u015b\u0107 docelowej cz\u0119stotliwo\u015bci na odpowiedni\u0105 warto\u015b\u0107 wpisywan\u0105 do rejestru (w\u0142a\u015bciwie rejestr\u00f3w, bo jest to liczba 2-bajtowa) timera, zale\u017cn\u0105 od cz\u0119stotliwo\u015bci taktowania i zmieniam stan wyj\u015bcia, do kt\u00f3rego pod\u0142\u0105czony jest g\u0142o\u015bnik przy ka\u017cdym przerwaniu.<br \/>\nPianino posiada w\u0142asn\u0105 kolejk\u0119 klawiszy &#8211; dzi\u0119ki niej program &#8222;pami\u0119ta&#8221;, jakie klawisze s\u0105 aktualnie wci\u015bni\u0119te i zmienia ton w odpowiedni spos\u00f3b.<br \/>\nNiestety maj\u0105c tylko jeden kana\u0142 niewiele mo\u017cna zdzia\u0142a\u0107, ale przy zastosowaniu pewnego triku mo\u017cna nieco urozmaici\u0107 d\u017awi\u0119k. Zastosowa\u0142em taki sam trik jak w starych DOSowych grach (to by\u0142y czasy, nie? ;-D ) &#8211; w momencie wci\u015bni\u0119cia dwu klawiszy cz\u0119stotliwo\u015b\u0107 jest prze\u0142\u0105czana z jednego tonu na drugi 20-50ms, co daje (przynajmniej cz\u0119\u015bciowe) wra\u017cenie dw\u00f3ch ton\u00f3w jednocze\u015bnie. Tryb dwutonu mo\u017cna wy\u0142\u0105czy\u0107\/wy\u0142\u0105czy\u0107 za pomoc\u0105 odpowiednich klawiszy. <\/p>\n<p>Na koniec najciekawsza opcja &#8211; nagrywanie sampli. Pozwala ona nagra\u0107 4 sample o d\u0142ugo\u015bci do 65 nut (w przypadku, gdy wszystkie d\u017awi\u0119ki\/przerwy s\u0105 kr\u00f3tsze od 4 sek.). Podczas nagrywania zapisuj\u0119 w pami\u0119ci zdarzenie (wci\u015bni\u0119cie\/puszczenie klawisza N) i odst\u0119p od poprzedniego zdarzenia w rozdzielczo\u015bci oko\u0142o 16ms (1\/64) do zajmuje 2B. Jedna nuta to wci\u015bni\u0119cie i puszczenie klawisza. 65*2*2B*4 sample daje 1040B potrzebnej pami\u0119ci na sample. oczywi\u015bcie, mo\u017cna by to bardziej skompresowa\u0107, ale nie by\u0142o sensu marnowa\u0107 czasu na pisanie efektywniejszego algorytmu, bo nie taki by\u0142 cel tego projektu. W przypadku ATMegi8\/16 trzeba by zmniejszy\u0107 ten obszar o po\u0142ow\u0119 &#8211; potrzebna jeszcze miejsca na kolejki, zmienne pomocnicze i stos (no ko\u0144cu). Sample mo\u017cnaby te\u017c zapisywa\u0107 na EEPROMie &#8211; by\u0142y by trwa\u0142e.<br \/>\nSample mo\u017cna odtwarza\u0107 i jednocze\u015bnie gra\u0107 drug\u0105 lini\u0119. Algorytm odtwarzania ma ma\u0142e niedoci\u0105gni\u0119cia, kt\u00f3re wida\u0107 przy prze\u0142\u0105czaniu oktaw, ale jak ju\u017c pisa\u0142em, celem projektu by\u0142a biblioteka PS\/2. <\/p>\n<p>A teraz najwa\u017cniejsze &#8211; 2 filmiki: na jednym demonstracja dzia\u0142ania tryby dwutonowego i sampli na znanej piosence polskiego zespo\u0142u a na drugim&#8230; marsz turecki \ud83d\ude09 .<\/p>\n<p><iframe loading=\"lazy\" width=\"425\" height=\"349\" src=\"http:\/\/www.youtube.com\/embed\/dW-pAu5P2xY\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p><iframe loading=\"lazy\" width=\"425\" height=\"349\" src=\"http:\/\/www.youtube.com\/embed\/-ekuMTBzDiE\" frameborder=\"0\" allowfullscreen><\/iframe><\/p>\n<p><b>Je\u015bli b\u0119d\u0105 ch\u0119tni, to udost\u0119pni\u0119 kod programu\/bibliotek\u0119 PS\/2 jak tylko j\u0105 doko\u0144cz\u0119 i napisz\u0119 dokumentacj\u0119 &#8211; pisa\u0107. <\/b><br \/>\nJak mi si\u0119 zechce, to dopisz\u0119 obs\u0142ug\u0119 myszki &#8211; mo\u017cna by modulowa\u0107 ni\u0105 dodatkowo tony klawiszy (co\u015b na zasadzie wajchy w keyboardach  ).<br \/>\nJe\u015bli kto\u015b chcia\u0142by si\u0119 pobawi\u0107, to za\u0142\u0105czam skompilowany program dla ATMegi32 (8MHz). Schemat po\u0142\u0105czenia (tak jak by\u0142o mi wygodnie na mojej p\u0142ytce testowej):<br \/>\n<code>ATMEGA.PORTD.2 (INT0)   -   PS2.CLK<br \/>\nATMEGA.PORTC.1         -   PS2.DATA<br \/>\nATMEGA.PORTD.6         -   SPEAKER<\/code><\/p>\n<p>Do tego oczywi\u015bcie g\u0142o\u015bnik do masy, VCC=5V dla atmegi i klawiatury i do tego jaki\u015b elektrokit filtruj\u0105cy miedzy VCC a GND i kondensatory do kwarcu 8MHZ oko\u0142o 27-30p. Program dodatkowo wysy\u0142a dane pomocne w debugowaniu po RS232 i czasem si\u0119 przywiesi na starcie co jest powodem synchronizacji PS\/2, kt\u00f3rej w bibliotece jeszcze nie ma . <\/p>\n<p><code>Link do mojego tematu w serwisie elektroda.pl:<\/code><br \/>\n<a href=\"http:\/\/www.elektroda.pl\/rtvforum\/viewtopic.php?p=9574045#9574045\" target=\"_blank\">http:\/\/www.elektroda.pl\/rtvforum\/viewtopic.php?p=9574045#9574045<\/a><\/p>\n<p>Firmware v. 0.1 (alpha):<br \/>\n<?php filelink('avrpiano\/arvpiano_aplha_0_1_m32_8MHz.hex'); ?><\/p>\n","protected":false},"excerpt":{"rendered":"<p>Sesja si\u0119 zbli\u017ca, wi\u0119c tradycyjnie zacz\u0105\u0142em ju\u017c prokrastynowa\u0107 (a Wy? \ud83d\ude09 ). Ostatnio zacz\u0105\u0142em pisa\u0107 bibliotek\u0119 do obs\u0142ugi klawiatury PS\/2 w C dla AVR i postanowi\u0142em na szybko w godzink\u0119 lub dwie stworzy\u0107 jaki\u015b praktyczny projekt w celu jej przetestowania. Pocz\u0105tkowo nie planowa\u0142em tego publikowa\u0107, ale pokaza\u0142em to kilku osobom i si\u0119 spodoba\u0142o, wi\u0119c by\u0107 <a href='http:\/\/silent.org.pl\/home\/2011\/06\/04\/pianino-z-klawiatury-komputerowej-ps2\/' class='excerpt-more'>[&#8230;]<\/a><\/p>\n","protected":false},"author":1,"featured_media":0,"comment_status":"open","ping_status":"open","sticky":false,"template":"","format":"standard","meta":{"footnotes":""},"categories":[4],"tags":[],"_links":{"self":[{"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/posts\/141"}],"collection":[{"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/posts"}],"about":[{"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/types\/post"}],"author":[{"embeddable":true,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/users\/1"}],"replies":[{"embeddable":true,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/comments?post=141"}],"version-history":[{"count":8,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/posts\/141\/revisions"}],"predecessor-version":[{"id":171,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/posts\/141\/revisions\/171"}],"wp:attachment":[{"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/media?parent=141"}],"wp:term":[{"taxonomy":"category","embeddable":true,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/categories?post=141"},{"taxonomy":"post_tag","embeddable":true,"href":"http:\/\/silent.org.pl\/home\/wp-json\/wp\/v2\/tags?post=141"}],"curies":[{"name":"wp","href":"https:\/\/api.w.org\/{rel}","templated":true}]}}