Bananino – owocowo-warzywna klawiatura MIDI

Ten tekst powstał na zamówienie Niebezpiecznik.pl. Nie został jednak tam opublikowany, a ja zostałem „zghostowany” (?!). Może to znaczy, że ten tekst jest tak zły, że nie warty dalszej uwagi, ale ja się nad nim napracowałem, więc publikuję go tutaj. Jest i dobra okazja 21 urodziny tego bloga.

To teraz coś z zupełnie innej beczki – owocowo warzywna klawiatura midi:

owocowo warzywna klawiatura midi

a działa to tak:

melodia „Flinstonowie” zagrana na bananach (kiepsko)

Pomysł

Pomysł nie jest ani oryginalny, ani nowy. Już lata temu widziałem na YouTube jak ktoś gra na jakichś owocach i bardzo mi się to wtedy spodobało. Kiedyś nawet chciałem sobie kupić takie urządzenie do zabawy, ale zobaczyłem ceny i zrezygnowałem.

Gdy zacząłem sam się bawić w konstruowanie grającej elektroniki (własny syntezator modułowy) pomysł powrócił, jako „coś, co kiedyś zrobię”. Ostateczną motywację dał mi kolega z Warsztatu Miejskiego który akurat robił zupełnie inny projekt z czujnikami dotykowymi (kupnymi). Zapadła decyzja: robię to teraz, a nie „kiedyś”.

Najpierw prototyp, żeby sprawdzić, czy to w ogóle będzie działać tak, jak sobie wyobrażam, że może działać. Oczywiście poczytałem o czujnikach pojemnościowych, ale nie chciałem używać albo kopiować jakiegoś istniejącego projektu.

pierwszy prototyp

Zasada działania

Każde dwa przewodniki oddzielone jakimś izolatorem tworzą kondensator. Większa powierzchnia przewodnika – większa pojemność kondensatora. Dwa piny wyprowadzone z płytki drukowanej to już kondensator, ale o pojemności tak małej, że w większości przypadków pomijalnej. Jednak, gdy człowiek dotknie takiego pinu, to staje się częścią obwodu, zwiększając znacznie powierzchnię przewodzącą. Pojemność istotnie rośnie.

Kondensator może się ładować albo rozładowywać. Czas ładowania i rozładowywania jest proporcjonalny do pojemności kondensatora i do oporu elektrycznego drogi którą ładunki wpływają lub wypływają. Tak więc można zmierzyć pojemność licząc czas w którym się ładuje albo rozładowuje.

W tym przypadku nie muszę dokładnie mierzyć pojemności, wystarczy, że układ rozpozna, że pojemność wejścia istotnie się zwiększyła.

Wykorzystuję tu jedno wyprowadzenie (GPIO – uniwersalne wejście/wyjście) mikrokontrolera najpierw do naładowania naszego kondensatora, a potem do zmierzenia czasu w którym się rozładuje. Wysyłam na to wyjście ‚1’, czyli napięcie 3.3 V i zaraz po tym przełączam wyprowadzenie w tryb wejścia (żeby odczytywać jego stan) o wysokiej impedancji (rezystancji – żeby samo nie rozładowywało kondensatora).

sygnał z czujników na oscyloskopie

Wyprowadzenie mikrokontrolera jest połączone rezystorem 10 MΩ do masy układu, dzięki czemu nasz kondensator rozładowuje się wystarczająco powoli, żeby można było to zmierzyć. mikrokontroler po prostu czeka aż z ‚1’ na tym wejściu zrobi się ‚0’, a czas po którym nastąpiła zmiana zależy od tego czy dotykamy wejścia, czy nie.

W praktyce wejście układu nie jest podłączone bezpośrednio do pinu mikrokontrolera, po drodze jest jeszcze rezystor i kondensator.

Kondensator izoluje wejście jednocześnie zabezpieczając mikrokontroler i zapewniając prawidłowe działanie nawet, gdy wejście zewrze się z masą. Z punktu widzenia mikrokontrolera dla naszego algorytmu ten dodatkowy kondensator jakby nie istnieje – jest połączony szeregowo z mierzoną pojemnością i ma sporo większą wartość niż mierzona, więc wypadkowa pojemność jest i tak zbliżona do tej, którą chcemy zmierzyć (szeregowe połączenia kondensatorów tak mają).

Dodatkowy rezystor zabezpiecza układ przed wyładowaniami elektrostatycznymi – ogranicza prąd który może przepłynąć przy nagłym skoku napięcia.

uproszczony schemat czujnika

Projekt

Prototyp był prosty, ale w głowie już miałem wizję całego projektu:

  • Jako serce układu płytka z mikrokontrolerem Raspberry Pi Pico. Bo tani, bo
    znam, bo lubię.
  • 16 czujników, bo to okrągła liczba i mieści się cała chromatyczna oktawa (12
    dźwięków). Jakby ograniczyć się do skali diatonicznej, to zmieszczą się dwie
    oktawy.
  • Adresowalne diody LED (WS2812B) pokazujące stan klawiszy – prościej, a przez
    to pewnie i taniej niż jakbym miał 16 LEDów sterować bezpośrednio (w samym Pi
    Pico by pinów brakło). Do tego kolorki „gratis”.
  • Tradycyjne wyjście MIDI (gniazdo DIN-5) oraz MIDI przez USB. Żeby dało się
    podłączyć i mój „pół-analogowy” syntezator modułowy, i chociażby smartfona.
  • Przycisk do kalibracji, potencjometr do ustawiania czułości.
  • No i dodatkowe wejście zasilające, bo czemu by nie?

Schemat i projekt płytki drukowanej przygotowałem w programie KiCAD.

Płytkę zaprojektowałem dość specyficznie (miejscami niekoniecznie zgodnie z przyjętymi praktykami), bo z myślą o metodzie w jakiej ją wykonam. Jednak i tak dość ambitnie – dwustronną, na drobne elementy SMD.

Wykonanie

Płytki drukowanej nie zamawiałem w Chinach (typowe rozwiązanie w dzisiejszych czasach), ani nie trawiłem (tradycyjna metoda). Użyłem mini frezarki CNC, którą mamy w Warsztatacie Miejskim w Gliwicach do wycięcia w miedzi izolacji między ścieżkami na płytce.

frezowanie płytki

Pliki Gerber z KiCAD przerobiłem na gcode (język maszyn CNC) przy pomocy pcb2gcode, potem jeszcze przerobiłem moim skryptem, żeby wygodniej się w bCNC tego używało.

Nie udało się za pierwszym razem. Szło dobrze, ale częściowo za płytko, żeby przeciąć warstwę miedzi – to dlatego, że płytka nie była idealnie równa. Gdy próbowałem to poprawić, to tylko pogorszyłem sprawę i zniszczyłem płytkę oraz złamałem frez.

Za drugim razem wykorzystałem opcję auto-poziomowania w programie bCNC i starałem się być nieco
ostrożniejszy. I się udało. Dopiero pod koniec robienia drugiej strony maszyna nieco zaczęła świrować, ale tym razem niczego to nie zepsuło.

ścieżki z bliska

Frezarka też precyzyjnie wywierciła mi otwory. No może trochę za płytko, ale
to już błąd operatora.

otwory z góry
otwory z dołu

Gdy płytka była gotowa i zrobiłem przelotki z mosiężnych nitów, przyszedł czas
na lutowanie. Malutkie elementy SMD to wyzwanie. Brak soldermaski (nie umiem
jej zrobić domowymi metodami) dodatkowo utrudniał. Mimo to poszło mi całkiem
sprawnie. Po paru drobnych poprawkach układ był gotowy. I zadziałał!

nity jako przelotki
przylutowane elementy SMD
gotowa płytka
urządzenie gotowe do gry

Oprogramowanie

Firmware urządzenia napisałem w Rust wykorzystując świetny asynchroniczny framework Embassy.

Nie Python, bo chociaż znam go najlepiej, to nie wydaje mi się najlepszym narzędziem do takiego zastosowania. I pewnie byłby po prostu za wolny.

Naturalny wyborem byłoby C – to standard w zastosowaniach wbudowanych i właśnie w C dostarczane jest oficjalne SDK do Raspberry Pi Pico. Jednak w C strasznie łatwo o głupie błędy, które potem trudno wyłapać i poprawić. A w ogóle dobrze się nauczyć czegoś nowego.

Narzędzia Rust okazały się też wiele wygodniejsze w użyciu niż oficjalne SDK.

Program po włączeniu zasilania świeci diodami na kolorowo, a następnie rozpoczyna proces kalibracji. Mierzy czasy rozładowywania każdego z pinów. Użytkownik powinien dotknąć przynajmniej jednego „klawisza”, a najlepiej kilku. Program wtedy zbierze informacje o minimalnych i maksymalnych zarejestrowanych czasach. Na tym etapie wykrywane są też anomalie (zbyt długi czas rozładowania,
jak w przypadku gry wejście jest zwarte do masy). Przyciśnięcie przycisku kończy kalibrację.

W wyniku kalibracji ustalony jest próg załączenia, który można dodatkowo regulować potencjometrem. Teraz program po prostu wysyła co chwilę „1” na odpowiednie wyjścia kontrolera, czeka ustalony czas (ten próg załączenia), i sprawdza które wejścia zmieniły się w tym czasie z „1” na „0”. Wejścia które
nie zmieniły stanu (nie zdążyły się rozładować) zostają uznane za „wciśnięte klawisze”, a zmiana stanu „klawisza” powoduje wysłanie komunikatu MIDI: „note on”, albo „note off” – przez port szeregowy i przez USB.

Kod źródłowy, jak i projekt w KiCAD dostępne są na GitHub: https://github.com/Jajcus/midi_touch_keyboard

Co dalej?

Spróbuję zbudować jeszcze do tego obudowę (w Warsztacie Miejskim mamy też drukarkę 3D) i dodać nowe funkcje w oprogramowaniu (transpozycja i przełączanie w tryb diatoniczny). A potem projekt pójdzie na półkę, gdzie inne urządzenia, które kiedyś zbudowałem i nigdy więcej nie użyłem.

Jajcus Yousician

Był geocaching, było pieczenie chleba, była jazda na rowerze, była uprawa papryczek,  było granie w Ingressa… i wygląda na to, ze w tym sezonie moim głównym hobby jest granie na gitarze, a przynajmniej próby nauki na gitarze.

Zaczęło się od tego, że wyczytałem na Reddicie, że jest pod Linuksa coś w rodzaju Rocksmith. Rockmithem się chwilę pobawiłem parę lat temu, gdy promowano to podczas festiwalu Colours of Ostrava. Jednak to była bardzo droga gra, niezbyt u nas dostępna i oczywiście nie pod Linuksa. Poza tym skąd bym wziął gitarę elektryczną?  Tym razem trafiłem na coś, co działa pod Linuksem (ale też pod Androidem, Windowsem, iOSem i macOSem), nie wymaga żadnego specjalnego sprzętu i można ćwiczyć za darmo, z dowolną gitarą. W domu mamy nawet dwie gitary klasyczne (małą i dużą), bo żona i córka uczyły się grać. Zainstalowałem więc tego Yousiciana, wziąłem gitarę i spróbowałem jak to działa.

Okazało się, że nie tylko działa, ale nawet sprawia frajdę. Nawet większą niż Guitar Hero, które też miałem, ale szybko się znudziłem. Po kilku „lekcjach” grałem z Yousicianem jakieś przyjemne melodie – coś z tego wychodziło.

Początki Yousicianowania

Wypróbowałem wersję ‚Premium’ (bo na tydzień była za darmo) i bez autoreklam i limitów można było ćwiczyć więcej i szybciej. Nie stać mnie jednak na to żeby zapłacić za rok z góry, a miesięczny abonament ma dla nas cenę nieco zaporową. Później sobie jeden miesiąc wykupiłem, ale generalnie ograniczam się do tego, co jest dostępne za darmo.

Były jednak drobne problemy techniczne – czasem program zaliczał nutki, których nie zagrałem, bo sam siebie słyszał. Innym razem nie zaliczył co zagrałem dobrze, tylko dlatego że dziecko obok akurat nuciło coś innego. Użycie zewnętrznego mikrofonu zamiast wbudowanego istotnie poprawiało sytuacje, ale nie do końca i nie było zbyt wygodne. Pewnie sporo łatwiej byłoby z gitarą elektryczną, ale kupowanie takiej dla chwilowego kaprysu byłoby głupie. Lepiej sobie radzić z tym co mam.

Pogooglałem i dowiedziałem się, że tanio można kupić przetwornik piezo do gitary klasycznej. Taki przetwornik ma wyjście na wzmacniacz, jak gitara elektryczna. Wciąż wypadałoby mieć czym to podpiąć do komputera. Podobno da się i bezpośrednio do wejścia mikrofonowego (potrzebna tylko przejściówka z dużego na małego jacka), ale dla odpowiedniej jakości dźwięku wypada mieć dedykowane wejście instrumentalne (dużej impedancji). Postanowiłem, że kupię sobie przetwornik, ale od razu i porządny interfejs audio do którego będę mógł go wpiąć. Wybrałem taki, do którego mogę podpiąć też mikrofon albo keyboard – jakbym chciał nagrywać nasze muzykalne dzieci. Stanęło na tanim przetworniku Cherub WCP-60G i nieco lepszych interfejsie audio Lexicon Alpha.

DSC_6518

Ten Cherub okazał się faktycznie tani. Sygnał z przetwornika po nagraniu czy puszczeniu na żywo na głośniki nie był zbyt miły dla ucha, no ale trudno, żeby dynsk za 30zł robił z gitary klasycznej pięknie brzmiącą elektroakustyczną. Dla Yousiciana jednak było to więcej niż wystarczające i jedynym źródłem niezaliczonych ćwiczeń była już tylko moja technika gry.

Natomiast Lexicon okazał się faktycznie bardzo solidnym urządzeniem – robi dokładnie to co trzeba i jak trzeba. Uznałem, że nawet jeśli mi przejdzie Yousicianowanie to nie będą to zmarnowane pieniądze, a jak nie przejdzie… to będę miał gdzie podłączyć gitarę elektryczna. Bo po miesiącu zabawy jeszcze nie miałem dość i zacząłem planować, że jak do urodzin (w lutym) będę dalej tak ćwiczył i robił postępy, to mogę sobie gitarę elektryczną sprawić.

W międzyczasie kupiłem dzieciom ukulele (tanie z promocji w Lidlu) i okazało się, że do tego też Yousician daje radę.

Urodziny się zbliżały, a ja grałem dalej. W bólach zbliżałem się do końca szóstego levelu w „Lead Guitar” (początki były dużo prostsze). Pewności, że jeszcze będę długo grał nie było, ale… cholera, zasłużyłem sobie! Tak więc kupiłem sobie gitarę – Epiphone Les Paul Special Vintage Edition, w kolorze wiśni – Paulinkę.

DSC_6509Z Paulinką zaraz zaliczyłem szósty poziom w gitarze prowadzącej i piąty w rytmicznej. W rytmicznej zaraz też będę miał szósty, ale w prowadzącej zaczęło się robić naprawdę trudno…

Spróbowałem też trochę pograć „na basie” (Yousician przymyka oko na to, że gram oktawę wyżej) i osiągnąłem tam trzeci level. Może mam powód, żeby ostro ćwiczyć do kolejnych urodzin? 😉

Tymczasem z Yousiciana korzystają też Krysia i Krzyś – zarówno z ukulele jak i z gitarami (Krzyś próbował wcześniej z keyboardem, ale nie wciągnęło tak bardzo). Zamówiłem nawet kolejny interfejs audio – tym razem najtańszy (około 30zł), bo ten Cherub wpięty wprost do laptopa niespecjalnie daje radę.  Ciekawe ile jeszcze miesięcy zabawy z tego będzie i co nam po tym zostanie.

Słodko-gorzkie kupowanie na amazon.de

Przyszedł czas, żeby sprawić sobie nowego laptopa. Laptopa używam głównie do grania, ale mimo to nie jestem skłonny zapłacić za „gamingową” maszynę. Jednak chciałbym coś mocniejszego niż moje dwuletnie Lenovo. Po zastanowieniu uznałem, że chcę laptop z procesorem Intel i5 i grafiką Intel Iris Graphics. Po ustaleniu podstawowych parametrów wystarczyło znaleźć ofertę na Allegro, morelach, czy innych owocach…

Problem w tym, że w Polsce takich laptopów nie ma. Bo nie liczę maszyn Apple, które poza tym, że są Apple, to kosztują sporo więcej niż jestem skłonny za laptopa zapłacić. Postanowiłem jeszcze zajrzeć na amazon.de, skoro już bezproblemowo wysyłają do Polski.

Tam wybór też nie był wielki, ale coś było. Znalazłem komputer w pasującej konfiguracji i cenie, a gdy tylko przyszła wypłata wyklikałem zakup. Coś się jednak nie zgadzało. Na liście przedmiotów w koszyku jest „i3”, chociaż wybierałem „i5”. Wróciłem do wyboru – gdy zmieniam opcje, zmienia się tytuł oferty (np. z SSD lub bez), ale „i3” pozostaje. Gdzieś jest babol, albo w tytule, albo w wybieranych opcjach. Pogooglałem i wyszło że taka kombinacja, z taką ceną to raczej  musi być i5. Przy okazji wyszło, że nawet producent na swojej stronie do takiego modelu się nie przyznaje, ale ileś niemieckich stron o nim wspomina i parę sklepów oferuje. Wypadałoby się skontaktować z Amazonem i wyjaśnić sprawę… ale ja, będąc mną, wolałem zaryzykować zakup niż próbować kontaktu z żywym człowiekiem, nawet mailowo. Tak więc w czwartek około 16:00 kupiłem laptopa na amazon.de i czekało mnie parę dni nerwów o to, co przyjdzie. Darmowa standardowa wysyłka oznaczała w tym przypadku „poniedziałek albo wtorek”. Można było dopłacić za ekspresową wysyłkę, wtedy „na pewno poniedziałek, albo zwracamy kasę” – aż tak mi się nie spieszyło.

W piątek, o 14:38 mail „Your Amazon.de order of „Acer Aspire E 15…” has been dispatched!” potwierdził, że wszystko idzie zgodnie z planem. Zaskoczenie przyszło wieczorem… SMS z DHL, że paczkę dostarczą w sobotę i że mogę sobie wybrać gdzie. Ale że jak w sobotę?! To już w weekend będę mógł się pobawić nową zabawką? 😀

Skorzystałem z formularza przekierowania paczki, bo przecież w sobotę nie będę siedział w biurze. Odpuściłem sobie obronę czołgu i od rana siedziałem w domu z komórką pod ręką, żeby czatować na kuriera… O 8:32 przyszedł SMS, że kurier już jedzie… o 11:17… że był, ale mnie nie zastał, a szczegóły na WWW. Szczegóły mówią, że spróbują ponownie we wtorek… Noż… To dzwonię do DHL. O dziwo od razu się połączyłem z kimś, kto był w stanie powiedzieć co się dzieje z moją paczką. Miła pani spróbowała się najpierw połączyć z kurierem, a jak to się nie udało, przekazała sprawę do „działu interwencji”. Wkrótce mieli się ze mną skontaktować. O 13:20 przyszedł mail (z „13:04” w dacie): „Kurier jest w tym momencie pod Państwa adresem, niestety nikogo nie zastał, brak również kontaktu telefonicznego.”. Noż…

Wybiegłem przed blok, poleciałem pod drugi (biuro mam dwa bloki dalej). Śladu po kurierze nie ma. Dzwonię znowu do DHL… Miła pani (nie jestem pewien, czy ta sama) znowu próbuje wyjaśnić sytuację. Kurier był, nawet zrobił zdjęcia i zachował historię połączeń. Nikogo na miejscu nie było, telefonów nie odbieram. Ale kurier był pod adresem biura, bo informacja o przekierowaniu co prawda jest w systemie, „ale się nie ściągnęła”. Część tajemnicy rozwiązana, ale co dalej. Jak już mi narobili nadziei na ten weekend, to do wtorku nie mam zamiaru czekać. Podobno przesyłka wróciła na terminal w Zabrzu i można ją jeszcze tego samego dnia odebrać… upewnią się i dadzą mi znać. W międzyczasie wróciła Krysia, poprosiłem ją, żeby do mnie zadzwoniła. Mój telefon działał.

Przyszedł mail, że przesyłka jest do odbioru osobistego, ale jakoś z niego nie wynika, że na pewno już mogę tam jechać. Już nie chciałem do nikogo dzwonić, pojechałem…

Na miejscu nieco mniej miła pani od razu moją paczkę znalazła i wydała. Przekonywała mnie, że kurier był pod oboma adresami i nikogo nie zastał. „Może pan złożyć reklamację”. Teraz to już na nic, ważne że mam laptopa!

Wróciłem do domu, rozpakowałem. Cały, wygląda solidnie. W pudełku materiały po angielsku – fajnie, że nie wszystko po niemiecku. Dałem mu chwilę odpocząć i się podładować. Odpalam… Windows 10, tak jak miało być, bo opcji bez systemu nie było… i gada do mnie po niemiecku! Do tego to ma klawiaturę niemiecką! Jakieś umlauty, „Z” z „Y” zamienione i „gdzie jest Delete?”. Najbardziej mnie zaskoczyło moje zaskoczenie. Miałem już przecież do czynienia z laptopami z niemiecką klawiaturą i wiedziałem że kupuję produkt dostępny tylko na niemieckim rynku. No cóż, do klawiatury zawsze można się przyzwyczaić (byle na nią nie patrzeć!), a Windowsa i tak nie będę używał, przynajmniej poza tym, ile potrzebne do przygotowania laptopa pod Linuksa.

 

Pełny dysk i film z Australii

Teściowa mi od jakiegoś czasu się skarżyła, że ma mało miejsca na dysku. Jak to mało? Nowy laptop im kupiłem, może z nie największym dyskiem, ale do kulek i madżonga powinno starczyć.
 
Poprosiłem córkę, żeby dowiedziała się coś więcej i może sama zobaczyła co się dzieje. Dziś więc mogło coś zacząć się wyjaśniać. Na początek informacja przekazana od babci: „jest tu jakiś film z Australii, co nie da się go skasować i można tylko przesłać dalej”. Chciałem dowiedzieć się coś więcej, ale nic z tego, bo filmu nie znalazły. Udało mi się za to dowiedzieć co „df” pokazuje. Owszem, 100% zajęte, ale na /boot. Znaczy się, miejsca nie brakuje tam gdzie jest potrzebne, ale coś /boot zeżarło (czyżbym za mały zrobił? ale przecież użyłem defaultów z i instalatora). Telefonicznie więcej nie zrobię, ale okazało się, że Krysia może laptopa przynieść.
Przyniosła laptopa, zawiniętego w kocyk, „żeby się nie przeziębił”. Odpalam, zagląda do /boot, a tam… dziesięć i pół kernela. Kto wymyślił, że zwykły użytkownik, który nawet nie musi wiedzieć co to jest, potrzebuje więcej niż jeden kernel?
Wygooglałem jak usuwać nadmiarowe kernele, wpisałem do crona i z tym powinien być spokój. Ciekawe jaką następną niespodziankę nam to Ubuntu zaserwuje. Jak na „bezobsługowy” system dla „zwykłego użytkownika” coś to mało od PLD odbiega. 😉
Co to za film z Australii i czemu nie można go skasować, to dalej nie wiem.