Projekt z Arduino – kompozytor melodii

Od dłuższego czasu chciałem zrobić projekt bardziej „low-level”, czy to na Raspberry, czy na Arduino. I nadarzyła się ku temu świetna okazja.

Na zaliczenie końcowe Microprocessor Systems musimy wykonać projekt oparty o Atmegę328. A tak się składa, że Arduino Nano właśnie w ten czip jest wyposażone. Gram na gitarze, coś o muzyce wiem, więc wybrałem sobie kompozytor melodii. A że dużo wygodniej pisze się w domu, więc zamiast korzystać ze sprzętu z uczelni, (który dostępny jest tylko na uczelni), zaopatrzyłem się w Arudino Nano oraz kilka modułów.

 

Wstępnie projekt prezentuje się tak:

Żeby zaoszczędzić analogowych wejść zdecydowałem się na sprytne podłączenie przełączników wraz z rezystorami. Takie rozwiązanie ma jednak wadę w postaci zwiększonej komplikacji od strony software. Muszę zmierzyć kilkukrotnie wartości na wejściu, uśrednić je i sprawdzić, które z wejść podaje taką właśnie, unikalną wartość. Wszystko oczywiście na tyle szybko, aby całość była responsywna i przyjemnie się korzystało.

Idea jest taka, aby dało się wgrać domyślne piosenki, ale także aby dało się z miejsca – na ekranie, skomponować własną.

Generowanie dźwięków z głośnika właściwie polega na wysyłaniu zer i jedynek z tak dużą częstotliwością aby wprawić głośnik w drganie w przedziale słyszalnych częstotliwości. Nie jest to tak trudne zadanie, szczególnie z użyciem funkcji tone, jednak ja, zgodnie z założeniami projektu będę musiał to wykonać bezpośrednio na rejestrze.

Aby wzmocnić sygnał na wejściu do głośnika, zastosowałem tranzystor bipolarny. Będę tam jednak jeszcze musiał dodać diodę, aby w przypadku rozwarcia głośnika (który jest właściwie cewką, czyli po rozwarciu osiągnie duży prąd w miejscu przerwania) dioda przejęła i go rozładowała, zapobiegając spaleniu głośnika.

 

Podejścia pod sieci neuronowe

Sztuczna inteligencja, inżynier danych, Big Data to w ostatnich czasach gorące buzzwordy. Przynęty na programistów i wszelkich amatorów nowych technologii. Nie bez powodu, i nie bez powodu też rośnie zainteresowanie w tym temacie.

Sam wydźwięk słów sztuczna inteligencja niesie ze sobą coś odległego, ciekawego, niespodziewanego. Dlatego od zawsze też wzbudzał we mnie zainteresowanie. Postanowiłem wziąć temat na klatę i zmierzyć się z problemem który wyda mi się interesujący. Przypadkiem trafiłem na stronę Narodowego Archiwum Cyfrowego, gdzie znajduje się prawie 220 tysięcy skanów archiwalnych zdjęć dostępnych dla każdego.

Każde zdjęcie ma swoją kategorię, także opis, datę i miejsce wydarzenia, ale również inne informacje. Uznałem, że to świetny materiał na data scraping, w połączeniu z machine learningiem.

Plażowicze podczas wypoczynku przy stolikach pod parasolami. Data: 1931-05

 
Za pomocą skryptu pobrałem po tysiąc zdjęć z dwóch wybranych kategorii. Rozdzieliłem je do osobnych folderów, na część do trenowania i testowania. Dlaczego tylko tysiąc? Uznałem, że to dobre wyzwanie, gdyż zwykle w realnych zbiorach nie są to ogromne ilości jak na Kaggle, a dość skromne, często wybrakowane zbiory. Za pomocą prostych komend w Kerasie rozszerzyłem zbiór do ośmiu tysięcy zdjęć.

Opierałem się na podobnej metodzie, jak przy klasycznym problemie rozróżniania psów od kotów. Powinno być proste, powinno działać dość dobrze. Mimo wszystko niestety architektury od natury nie udało mi się tak sprawnie rozdzielić. Najlepsze uzyskane wyniki były około 60-65%, czyli niewiele lepiej niż losowe strzelanie.

Jakie wnioski? Prawdopodobnie brakuje mi albo lepszego zbioru, albo powinienem lepiej dobrać parametry sieci. A najprawdopodobniej obydwa. Co jednak mnie ucieszyło – wszystko zadziałało i sporo się nauczyłem.

Proste rozwiązanie, to dobre rozwiązanie

Ile rzeczy można jeszcze zautomatyzować?

Nie wiem, ale się domyślam.

Jakiś czas temu zacząłem bawić się data scrappingiem. Nie miałem jakiegoś konkretnego celu poza tym, że jest to zwyczajnie przydatna umiejętność. Okazało się jednak, że wykorzystanie tych umiejętności przyjdzie szybciej niż się spodziewałem.

Pewnego razu rozmawiałem ze znajomym. Mówił, że ostatnio wykonuje strasznie nudną i powtarzalną rzecz, gdzie musi przeklikiwać adresy do excela. W mojej głowie zaświeciła się lampka – przecież takie rzeczy można banalnie zautomatyzować! Python, Beautifulsoup4 i godzinę później skrypt był gotowy. Kilkaset pozycji wyeksportowane do Excela. Okazało się, że w bardzo prosty sposób zaoszczędziłem kilkadziesiąt roboczogodzin.

To jest problem, który myślę występuje bardzo często. Ludzie nie mają świadomości, że wiele z „przykrych” czynności można zautomatyzować. Zaoszczędzić nerwy i pieniądze. Dlatego uważam, że nawet dla księgowej czy osoby zajmującej się wszelkim zarządzaniem w firmie, tak przydatne mogą być pozycje książkowe jak Automate the Boring Stuff with Python. Często rozwiązania są prostsze niż nam się wydaje, dlatego tak ważna jest komunikacja i sygnalizowanie problemów. Ale także nie demonizowanie programowania i automatyzacji. Mniej nudnych zadań, to więcej czasu na kreatywne myślenie i rozwój.

Polski rynek nauczania programowania

Postanowiłem podzielić się z wami kilkoma przemyśleniami na temat aktualnego stanu rzeczy, jeśli chodzi o naukę programowania w Polsce, ale nie tylko.

Po pierwsze, jak to już pisał Mateusz na na swoim blogu, wielu z nas myśli, że prawdziwy programista powinien „zamknąć się w piwnicy na rok” i wyjść jako mistrz wszystkich frameworków. O ile chciałbym się za taką osobę uważać, bo z jakiegoś powodu atrakcyjna i szlachetna wydaje mi się taka droga samotnego wojownika o lepszy kod, to mam świadomość, że dla większości osób całkowita izolacja będzie nonsensem. Choćby dlatego, że współczesny programista powinien także posiadać nieco zdolności miękkich (a im więcej tym lepiej), a samo przebywanie w otoczeniu kreatywnych ludzi daje nam więcej pomysłów i potrafi rozjaśnić umysł.

YouTube

O ile scena zagraniczna jest całkiem rozległa, bo całkiem sporo w niej zarówno „nauczycieli” jak i innych świrów / mózgowców którzy chętnie pokazują swoje osiągnięcia, o tyle na Polskiej scenie nieco wieje pustką w tym temacie. Choć tu trzeba zadać sobie pytanie, czy w ogóle mamy na to rynek. Programiści i tak muszą znać angielski, więc może warto zakładać kanały w języku angielskim, mimo większej konkurencji.

Wiem za to, że brakuje materiałów edukacyjnych w dobrej jakości jak ten kanał:

ale mam również świadomość, że tworzenie takich materiałów wymaga dobrego obeznania się z tematem oraz dużo czasu, a rzadko kto, chce pracować za darmo. (swoją drogą zachęcam do zapoznania się z materiałem i z kanałem, jest świetny)

Stan projektu na początek kwietnia 2017

MVC od Microsoftu

Znalazłem kilka materiałów na oficjalnej stronie MS na temat .NET Core, który okazał się całkiem sympatyczny. Zachwalają, że nowoczesna technologia i w ogóle… ale i tak byłem pozytywnie zaskoczony dostępnością dla początkującego programisty.

A jak to mówią, pierwsze kroki są najtrudniejsze, więc wydaje mi się, że od tego momentu ruszę dużo szybciej, tym bardziej, zważając na fakt, że przede mną półtora tygodniowa przerwa od uczelni (uf, nareszcie będę miał czas się uczyć :D).

Aktualnie udało mi się zmajstrować prosty serwis z kilkoma rekordami, które mogę oznaczać jako aktywne lub nie, gdzie mam konto administratora jak i użytkownika i obydwa mają inne przywileje. Myślę, że to dobry wstęp do planowanego wyglądu aplikacji, który w zasadzie nie jest niczym nadzwyczajnym.

Choć muszę się przyznać, że do tej pory nie jestem zadowolony ze swojej wydajności (którykolwiek programista jest?). Uczelnia skutecznie niweluje moje zasoby kreatywnej energii, i mam nadzieję, że to nie tylko słaba wymówka. Zresztą… przekonam się o tym w najbliższych dniach, w końcu będę miał „wolne” :).

Aktualizacja biurka, czyli cable management v2

Biurko jest już właściwie gotowe, przyszła pora na pierwsze wrażenia.

Wygląd

To tylko jedna ze składowych, ale osobiście lubię, jeśli w moim otoczeniu panuje harmonia i względny porządek, szczególnie, jeśli jest to dobrze przemyślane i raz zaprojektowane rozwiązanie działa później przez dłuższy czas, nawet po modyfikacjach – zupełnie jak w programowaniu :). Aktualnie biurko znacznie nabrało na przestrzeni użytkowej, przez pozbycie się drukarki i podstawek monitorów. Z pozoru może się wydawać, że zyskujemy jedynie przestrzeń którą wcześniej zajmowała podstawka. Prawda jest jednak taka, że zwykle między monitorami (jeśli mamy więcej niż jeden) często pozostaje niewykorzystane miejsce, tak samo jeśli monitor nie jest dosunięty całkowicie do ściany. Dzięki przejściu na uchwyty miejsca znacząco przybyło, także za sprawą bezprzewodowej, kompaktowej klawiatury. Ostatnio nie miałem potrzeby korzystać z aż tak dużej ilości miejsca, ale myślę, że (niestety) jeszcze przyjdzie czas na studiach, kiedy to miejsce się przyda.

Funkcjonalność

Jak wspomniałem, jako tako o funkcjonalności zmian jeszcze nie zdążyłem się całkowicie przekonać, ale to dopiero początek i „widzę potencjał”. Także, kiedy z samego komputera nie korzystam, a nawet przede wszystkim wtedy. Mogę wszystkie peryferia wsunąć całkowicie pod ścianę, dzięki czemu miejsca pozostaje naprawdę dużo.

Wady

Na wady zrobiłem osobny podpunkt, choć przypomniałem sobie o tym dopiero po napisaniu następnego, ale pewnie warto wspomnieć o kilku rzeczach, w zasadzie skupię się na uchwytach.

Funkcja pivot, nie jest idealna i myślę, że w droższych modelach będzie działać lepiej, przy obecnym ustawieniu musiałbym poluzować jeden z uchwytów imbusem, podnieść monitor do góry i dopiero wtedy obrócić, a i to, trzeba się upewnić, czy zabezpieczyliśmy monitor „od góry” bo sam uchwyt działa na zakładkę, gdzie wkładamy monitor od góry na „zasuwkę”. Generalnie można uznać, że pivota nie ma.

Trzeba także zauważyć, że większy i cięższy z monitorów (Dell U2515H – 25 cali, ok 10kg) jest lekkim problemem dla uchwytu, ale tylko przy większym rozciągnięciu ramienia. Ramię wtedy lekko się przechyla a monitor opada w dół, ale być może przy twardszych biurkach, a nie ze sklejki problem byłby rozwiązany.

Warto było?

Moim zdaniem warto, jeszcze jak. Nie są to sprawy groszowe, ale myślę, że nikogo, kto pracuje przy komputerze także taki wydatek nie zrujnuje (ok 100zł za jeden uchwyt do 15kg). Poprawiły się wszystkie aspekty, na których mi zależy zarówno czysto praktycznie przy pracy jak i estetycznie. Nie wiem jak sprawdzają się inne marki, ale z aktualnej, jako pierwszy kontakt z takim sprzętem, jestem zadowolony.

Projekt update

Przez chorobę która mnie rozłożyła, ostatnie dni były dość bezproduktywne. Nie ukrywam.

JavaScript fun

Co jednak zrobiłem? Podjąłem próbę napisania Flappy Bird w JS, żeby troszkę się z nim zapoznać. O ile sama próba się powiodła, o tyle wrzucenie tego do posta na blogu już nie, tak więc efekty widzicie, a w zasadzie nie widzicie poniżej:

[PUSTKA]

Ale gdyby ktoś chciał zrobić to samo, to znów odsyłam do Pociągu Kodowania:

Nieszczęsny Git

Do tego przypomniało mi się, że w zasadzie potrzebuję poznać lepiej Gita, gdyż do tej pory moja wiedza opierała się głównie na push i pull request. Warto by było sięgnąć nieco głębiej, choć nie ukrywam, akurat to traktuję jako mus, a nie jako specjalną przyjemność.

Brak konsekwentności

To chyba bolączka większości programistów. Zaczynamy, klepniemy kawałek projektu – „hej, wiem, co napiszę dalej, a mój mózg w tym czasie wyrzucił mi 10 pomysłów, trzeba spróbować je napisać!” i w ten sposób kończymy z brakiem jakichkolwiek projektów. Po to też powstał w zasadzie konkurs Daj Się Poznać. Ale wciążwidzę to u siebie. Klepnę coś w C#, coś w JS, przypomni mi się, że jeszcze coś ciekawego miałem poznać i w końcu nie robię nic konkretnego. A najgorsze, że nie wiem jak temu zapobiec tak do końca. Ale może to dobrze z drugiej strony, że podążam za ciekawością? Pewnie tak, ale fajnie, gdyby były tego jakieś namacalne efekty, które można zaprezentować.

Może napiszę apkę, żeby przypominać sobie, że nie powinienem zaczynać nowych projektów? Tak, to świetny pomysł, na nowy projekt.

Projekt poboczny – inteligentny dom

Kupiłem jakiś czas temu. Powąchałem, pomacałem, włożyłem co trzeba, odłożyłem na biurku i zaczyna się kurzyć.

Była to paczka pre… nie no, żartuję, nie szerzmy stereotypów o programistach. Chodzi mi o Raspberry Pi. Na którym zainstalowałem Raspiana, potem Kodi, a potem dałem sobie spokój. Nie miałem pomysłu co z nim zrobić dalej.

Pierwotne założenia

No dobra, prawdę mówiąc miałem pomysł, bo zawsze jakiś mam. Z początku chciałem stworzyć rolety do okien sterowane czujnikiem światła. Okazało się, że to jednak całkiem sporo jak na pierwszy projekt na Raspberry. A przynajmniej całkiem sporo jak na moje umiejętności. Projekt porzuciłem. Wielokrotnie później przeglądałem jeszcze strony z pomysłami na projekty, ale albo były zbyt drogie i czasochłonne, albo nie spełniały moich oczekiwań. W ten oto sposób efekt jest taki, jak opisałem na początku – malinka leży i się kurzy.

Xiaomi Yeelight RGBW

Aktualny plan

Jako, że, jak wspominałem, trwa w moim mieszkaniu remont, uznałem to za wspaniały moment, aby wykorzystać Pi do czegoś kreatywnego. Niedawno oglądałem jakie efekty da się uzyskać za pomocą Philips HUE i przyznam, że mimo, że to tylko zmiana kolorów, no cóż, jestem gadżeciarzem i byłem zachwycony. Tak szybko, jak rozpętałem w sobie ogień pożądania, tak samo szybko zgasł, gdy zobaczyłem cenę za żaróweczkę – 250zł, nie, to zero na końcu nie jest pomyłką. Szybko jednak przypomniałem sobie, że przecież nawet obecnie w mojej lampie mam zainstalowaną żarówkę LED Xiaomi, która dodatkowo ma tryb developera. Idealnie.

Nie ukrywam, mimo, że Xiaomi stał się królem Januszy i Grażyn, łowców cebula okazji z Aliexpres, sam śledzę markę od dłuższego czasu i jestem niesamowicie zadziwiony jak dobrze sobie radzi i mocno im kibicuję.

Tak czy owak, gdy remont dobiegnie końca, a ja dostanę moje żaróweczki RGB postaram się
postawić serwer za pomocą Raspberry który będzie mi zarządzał kolorami, ponieważ obecnie mam tylko jedną żarówkę i to białą. Być może dokupię także pasek LEDów i puszczę dookoła biurka. Wszystko jest do zrobienia. Tym bardziej, że przynajmniej jakieś podstawowe materiały są dostępne, nawet na stronie Xiaomi.

Organizacja miejsca pracy, czyli cable management i inne

Zawsze byłem raczej minimalistą, szczególnie w podejściu do mojego miejsca pracy, ale ze względu na brak możliwości dokonania większych zmian na biurku, czekałem na dobry moment, by takowe uczynić. I taki moment właśnie nastał. Mianowicie w moim mieszkaniu organizuje się remont, także i na swoim polu będę przeprowadzał zmiany, na które tak czekałem.

Cable management

Tytułowe zarządzanie kablami, to nic innego, jak kupienie koszyka, który będzie pod biurkiem, gdzie podwiązane rzepami kable będą spoczywać, zamiast wisieć na ścianie niczym liany w Tarzanie. Jak mówiłem, chciałbym, by te wpisy miały również wymiar praktyczny, także pod spodem znajdziecie wymienione przedmioty, którymi planuję zreorganizować moje liany.

IKEA SIGNUM
Taśma rzepowa
VELCRO (również do znalezienia pod hasłem „taśma rzepowa”)

Nic, nadzwyczajnego, ale może zupełnie zmienić estetykę naszego biurka.

Uchwyt na monitory

Chciałbym pozbyć się podstawek pod monitory, a zamiast tego zamontować uchwyty mocowane na tyle biurka, nie jest to najtańszy zakup, ale moim zdaniem akceptowalny jeśli chodzi o higienę miejsca pracy. W moim przypadku wybór padł na Maclean MC-628, który możecie znaleźć w kwocie około 110zł (na jeden monitor). Kryterium wyboru to był udźwig – ten ma do 15kg, co było wymogiem przy moim ukochanym Dellu U2515H, oraz w miarę rozciągliwe ramię, które pozwoli na swobodną korektę pozycji monitora.

Uchwyt Maclean MC-628

 

Klawiatura

Jakiś czas temu kupiłem również dość małą, bezprzewodową klawiaturę, mianowicie Logitech K230, która zapewnia dla mnie kompromis między byciem kompaktową, ale nie na tyle, by utrudniać pisanie. Jedyny minus, to brak klawiszy multimedialnych, które przydają się do choćby do przełączania muzyki podczas gry.

Logitech K230

 

Myślę, że te kilka elementów może zaważyć na komforcie pracy, szczególnie jak ktoś jest wzrokowcem i lubi mieć zarówno porządek, jak i po prostu dużo miejsca do przykładowo – organizacji papierów. Po zakończonym przemeblowaniu wrzucę zdjęcia przed i po, liczę na efekt podobny jak poniżej 🙂 (no, może nie przesadzajmy).

Z czym do ludzi, czyli cele do nauki

Jak już zostało powiedziane, jakiś czas temu rozpoczął się konkurs Daj Się Poznać 2017 i o ile bardzo chciałem w nim uczestniczyć, o tyle nie umiałem ostatnio się zmotywować, żeby poczynić jakieś realne kroki ku jego realizacji. Dobrze natomiast, że w wymogach konkursu są dwa wpisy tygodniowo na bloga, wprowadza to pewną dyscyplinę, dzięki której czuję, że będę w stanie podołać wyzwaniu.

1. JavaScript

Nie byłem nigdy fanem front-endu, także i JS był mi obcy. Niedawno jednak, odkryłem kanał Coding Train, gdzie w niezwykle ciekawy sposób wykorzystywane jest kilka bibliotek związanych z np. symulacją fizyki, a to już temat, który niesamowicie mnie fascynuje.

Także, oprócz składni języka będę chciał stworzyć jakieś atrakcyjne dodatki wizualne, być może wykorzystujące właśnie p5js, czy inne biblioteki.


2. C# i .NET

Co prawda z C# miałem już do czynienia, ale tylko w swoich małych projekcikach, więc do komunikacji serwerem, razem z SQLem będę musiał podszkolić się w tym temacie. Jako, że chciałbym, żebyście wynieśli coś z tego wpisu, tu także dodam, z czego zamierzam się uczyć. Od dłuższego czasu śledzę kanał Dereka Banasa i uważam, że jest to świetny materiał, nie za długi, nie za krótki, mnóstwo języków omówionych, a tak się złożyło, że ostatnio jest właśnie seria z C# jako głównym bohaterem. Link do playlisty na YouTube

Na ten moment chyba nie mam nic więcej ciekawego do dodania, także nic tylko przeć do przodu z nauką :).