Skocz do zawartości
deshipu

Miniaturowa konsola do nauki programowania gier

Pomocna odpowiedź

Skoro ma być nie tylko o robotach, to opiszę projekt, nad którym obecnie pracuję.

Jest to prosta kieszonkowa konsola do gier wyposażona w wyświetlacz z matrycy ledowej 8x8, przeznaczona do nauki pisania prostych gier w rodzaju snake-a, flappy bird-a czy tetris-a w Pythonie. Idea jest taka, aby usunąć z drogi jak najwięcej przeszkód i pozwolić uczącemu się skupić się na sednie, czyli samej logice gry. Urządzenie podłącza się do komputera przez port USB, po czym widoczne jest ono jako dysk, na którym znajdują się pliki Pythona z kodem do wykonania. Pliki te można edytować na żywo, a po ich zapisaniu konsolka automatycznie restartuje i uruchamia najnowszy kod.

Prosty 4-kolorowy wyświetlacz o niskiej rozdzielczości pozwala skoncentrować się na grze, zamiast zajmować się dopieszczaniem grafiki.

Urządzenie zaprojektowałem pierwotnie ponad rok temu jako shield do płytek Feather Adafruita, ale rozwiązanie takie ma podstawową wadę — aby zorganizować warsztaty z wykorzystaniem konsolki musiałbym kupić dla wszystkich uczestników te płytki, a są one dwa razy droższe niż sam shield. Ponieważ warsztaty są z założenia głównym celem istnienia tego urządzenia, postanowiłem zaradzić temu problemowi projektując wersję zoptymalizowaną pod względem kosztów.

Pierwszym pomysłem było pozbycie się chipa HT16K33, którego używałem do sterowania matrycą i do odczytu naciśnięć przycisków i zastąpienie ich LED-ami przylutowanymi do płytki i sterowanymi bezpośrednio nóżkami mikroprocesora z pomocą charlieplexingu. Oryginalny shield używał matrycy 8x8 bi-color, zatem musiałbym sterować 16×8=128 diodami. Przy charlieplexingu oznacza to 12 nóżek (12 * 12 - 12 = 132), a mikrokontroler, którego używam (SAMD21 w wersji QFN32) ma 16 wolnych nóżek — więc wydaje się to do zrobienia. Jeśli do tego zastąpię przyciski padami dotykowymi (mikrokontroler ma wbudowaną obsługę dla sześciu, więc idealnie), i założę zasilanie wyłącznie z baterii (odpada regulator napięcia), to jestem w stanie to zrobić z minimalną ilością części i nawet w postaci wizytówki! Zabrałem się zatem do projektowania płytki:

Szybko przekonałem się, że charlieplexing 128 led-ów nie jest taki prosty. To znaczy jest prosty, gdy się robi matrycę n×n-1, ale w każdym innym przypadku robi się to skomplikowane. Zatem podzieliłem moją matrycę 16×8 na dwie części: 8×7 oraz 8×9 — w ten sposób mam wymagane wymiary. Co prawda wymaga to 17 nóżek, ale mogę użyć jednej z nóżek do programowanie, tylko muszę dodać zworkę żeby ją odłączać na czas programowania. Wyszło coś takiego:

Wielka czarna dziura to oczywiście miejsce na baterię CR2032 (z dziurami na spinacze do jej przytrzymania).

W tym momencie zacząłem się zastanawiać. Diody dwukolorowe, które tu planowałem zastosować, wcale nie wychodzą tak bardzo taniej od dwukolorowej matrycy. Do tego jest dużo roboty z ich lutowaniem. Co prawda do warsztatów zamawiałbym zmontowanie tego w Chinach, ale i tak liczą sobie tam od punktu lutowania. Do tego zacząłem mieć wątpliwości czy taka zwykła bateria guzikowa uciągnie tyle światła...

Wtedy do mnie dotarło, że skoro i tak będę sterować tymi diodami programowo, a nie za pomocą dedykowanego czipu, to przecież mogę robić odcienie szarości i nie potrzebuję dwóch kolorów żeby mieć cztery odróżnialne stany. Jasne, nie będzie wyglądało tak dobrze jak shieldy, ale będzie tanie. Zatem wystarczy matryca 8×8 z jednokolorowych diód, a taką mogę charlieplexować zaledwie 9 nóżkami! Szybko zaprojektowałem kolejną płytkę:

Niestety, użyłem takich diod jakie miałem, czyli 0608, a te są dość małe. Nie chciałem mieć odstępów pomiędzy pikselami, bo to źle wygląda, więc urządzenie wyszło bardzo małe. Przy tej wielkości zacząłem się także obawiać, że pady dotykowe nie będą wystarczająco dobrze odróżniać który z nich jest dotykany.

Zatem zacząłem się zastanawiać jak powiększyć piksele. Mógłbym użyć większych diod — na przykład 1206 — ale te są droższe i zazwyczaj wyższej mocy, a ja mam limit 7mA na nóżkę. Mógłbym zaprojektować płytkę tak, że diody byłyby przylutowane od spodu, do góry nogami, i przeświecałyby przez FR4 i okienka w miedzi, ale po wypróbowaniu jak się lutuje takie diody szybko odrzuciłem ten pomysł.

W międzyczasie zrobiłem parę eksperymentów z bateriami i potwierdziły się moje obawy — baterie guzikowe się do tego nie nadają, chyba, żebym użył tych ładowalnych litowych. Chciałem, aby można było używać łatwo dostępnych i pospolitych baterii, więc ten pomysł odpadł. Zostałem w praktyce z wyborem pomiędzy 2×AAA albo 2×AA. Szybkie porównanie cen spowodowało, że odrzuciłem pomysł z wizytówką i postanowiłem projektować pod baterie AA.

Wracając do matrycy, dotarło do mnie, że jeśli zdecyduję się na użycie jednokolorowych diod, to nie muszę stosować charlieplexingu — mam do dyspozycji 16 nóżek, którymi spokojnie obsłużę fabrycznie gotowe macierze 8×8. Do tego mam w szufladzie 3-centymetrowe macierze z kwadratowymi pikselami, które byłyby idealne. Odpada problem z wielkością wyświetlacza i z robocizną niezbędną do jego polutowania — taka matryca to jeden komponent. Zatem szybko zaprojektowałem płytkę wielkości koszyka na dwie baterie AA z taką właśnie matrycą. Po sprawdzeniu cen przycisków (kupiłem ostatnio 1000 sztuk za $16) zdecydowałem się także porzucić pomysł z padami dotykowymi, tym bardziej, że matryca jest dość gruba, więc byłoby niewygodnie. Wyszło mi coś takiego:

Z boku wyprowadzone są połączenia do zasilania, resetu i nóżek do debugowania/programowania. Dodałem też wyłącznik na samym dole, bo wyciąganie dwóch baterii jednak jest uciążliwe. Zgrubna analiza pozwala mi szacować koszt materiałów dla 20 sztuk na $60, czyli powinienem być w stanie mieć gotowy produkt za miej niż $10 od sztuki.

Jeszcze słowo o wtyczce USB. Postanowiłem użyć tutaj wtyczki USB A z dwóch powodów: po pierwsze, mogę ją z łatwością zrobić jako część płytki (przy grubości 1.2mm trzeba podkleić drugi kawałek płytki pod spód, żeby uzyskać wymagane 2.4mm), a po drugie, kable micro-USB są na warsztatach zawsze problemem — ktoś nie ma, ktoś ma ale tylko do ładowania, etc. — a tak nie ma problemu, można wetknąć bezpośrednio.

Na koniec dodałem trochę ozdób, spanelizowałem po dwie na płytkę (żeby wykorzystać lepiej to 10x10cm) i dodałem ten nieszczęsny kwadracik do podklejenia pod wtyczkę:

Płytki zamówione w DirtyPCB, bo tylko oni nie czepiają się o panelizację. Wybrałem kolor biały, bo udało mi się dostać białe koszyki do baterii, a macierze też są od zewnątrz białe. Teraz pozostaje poczekać kilka tygodni aż dojdą.

W międzyczasie będę pisał moduł do CircuitPythona robiący skanowanie tej macierzy w tle, tak, aby użytkownik nie musiał się tym przejmować (i nie ryzykował spalenia diod, bo jak widać, oszczędziłem też na opornikach).

1671981524002657232.thumb.jpg.9b69c8a54cd3e8252b3fbf9c50684c41.jpg

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Kolejne kroki. Po pierwsze, dotarły pojemniki na baterie, więc mam już docelowy wygląd:

IMG_20180804_124537.thumb.jpg.47631dede416253fe58a6efb39a8d297.jpg

Niestety urządzenie wyszło troszkę bardziej toporne i ciężkie, niż się spodziewałem. Jednak baterie AA małe nie są i swoje ważą. Zastanawiam się nad zmianą orientacji urządzenia na poziomą (z przyciskami po bokach ekranu) i użyciem baterii AAA — ale nie wiem jeszcze co wtedy zrobić z wtyczką USB.

Po drugie, kod sterujący matrycą LED przepisany do C działa dobrze jeśli wyświetlam tylko zapalone lub zgaszone piksele. Niestety, przy próbie uzyskania wymaganych czterech odcieni szarości okazało się, że przerwanie systemowe odpalane co 1ms to trochę za mało i widać miganie. Mam zatem trzy możliwości: pohaczyć CircuitPythona żeby przerwanie systemowe wykonywało się szybciej (zrobiłem to dla testów), użyć osobnego timera z osobnym przerwaniem (docelowo i tak będę chciał to zrobić, bo mam w planach też wersję z charlieplexowanymi LEDami), albo użyć sprzętowego PWM do kontrolowania odcieni szarości. Niestety, ten ostatni punkt wymaga, żeby wszystkie piny użyte do sterowania kolumn (czy też wierszy, wszystko jedno) obsługiwały PWM, a niestety mój robiony na szybko projekt płytki tego nie przewidział i dwa piny nie mają takiej opcji.

Zatem trzeba przeprojektować płytkę. Przy okazji poprawiłem też parę niedociągnięć poprzedniej i ładniej poprowadziłem ścieżki:

96ae60c371675154cea5a7ccbf576f11.thumb.png.d3256a944b98535f2015a5c8f3073b2b.png

Dzięki uprzejmości OSHPark płytki będą zrobione ekspresowo i powinienem mieć je za kilka dni — wtedy będę kontynuować eksperymenty.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Była ciemna i burzliwa noc.

Jak zwykle w takich sytuacjach dopadło mnie przekleństwo majsterkowicza: myślenie. Otóż pomyślałem sobie, że fajnie by było gdyby oprócz pisania prostych gier dało się z tym urządzeniem robić także eksperymenty z hobbystyczną elektroniką, tak jak to umożliwia Micro:bit czy inne płytki prototypowe. Mielibysmy wtedy takiego naszego microbita, tylko tańszego, wygodniejszego w obsłudze i lepiej się nadającego do realistycznych aplikacji. Byłoby super, ale w tym celu musiałbym wyprowadzić co najmniej kilka wyjść GPIO tak, aby dało się do nich coś podłączyć. Niestety, mój budżet pinów w tym projekcie wygląda obecnie tak:

  • 8 kolumn matrycy LED
  • 8 wierszy matrycy LED
  • 6 przycisków
  • 2 piny programatora/debugera
  • 2 linie danych USB

Te dwa piny dla debugera to jednak trochę mało, choć można ich użyć zarówno jako zwykłych GPIO jak i jako magistrali I²C, a to już coś. No ale przydałoby się jednak więcej. Co można zrobić?

Charlieplexowanie LED-ów rozwiązałoby problem pozwalając obsłużyć wyświetlanie zaledwie 9 pinami, zamiast 16, ale wtedy nie mógłbym użyć gotowej matrycy LED, tylko musiałbym mieć indywidualne diody jak w tym prototypie karty — podraża to montaż i nie wygląda najlepiej.

Być może dałoby się coś ugrać przyciskami? W końcu osobny pin na każdy przycisk do marnotrawstwo. Mógłbym je połączyć w macierz 3×2 uzyskując jedną wolną nóżkę, ale wtedy musiałbym dodać sześć diod żeby uniknąć efektu ghostingu. Mógłbym też podłączyć te przyciski przez diody do wierszy matrycy LED i dodać w kodzie dziewiąta "wirtualną" komunę, przy skanowaniu której sprawdzałbym przyciski. Niestety, to jest nadal 6 dodatkowych komponentów i wolniejsze skanowanie, które odbiłoby się na jasności pikseli.

W końcu mnie oświeciło. Powinienem podłączyć jeden koniec każdego z przycisków do poszczególnych kolumn matrycy (kod skanujący łączy po kolei każdą z nich z masą), a drugi koniec razem do jednego pinu GPIO ustawionego na input z rezystorem podciągającym. Coś takiego:

IMG_20180814_105851.thumb.jpg.1595a1a8c551703c19cd4c5be3496e20.jpg

Wówczas kod skanujący matrycę może przy każdej kolumnie przy okazji także sprawdzać stan przycisku na tym jednym dodanym pinie. Zaoszczędziłem 5 pinów i uprościłem kod programu.

No to dalej. Trzeba się zastanowić jak te piny powinny być wyprowadzone. Po pierwsze, patent z wtyczką USB z płytki PCB odpada, bo jak chcemy to podłączać do płytki stykowej, to jednak potrzebujemy kabel USB. Zatem powrót gniazdka micro-USB. Mogę też obrócić urządzenie do wygodniejszej, poziomej konfiguracji i zastąpić baterie AA bateriami AAA, żeby całość była trochę cieńsza i lżejsza. Wyprowadzenie pinów powinno być z innej strony niż port USB i wyłącznik, żeby te nie zawadzały przy budowaniu naszych układów. Najlepiej, gdyby piny wyprowadzone były na górze płytki, a porty i wyłącznik znajdowały się na dole. Nie mogę użyć standardowych męskich goldpinów, choć byłoby wygodnie po prostu wpinać całe urządzenie w płytkę stykową — niestety, założenie jest takie, że to ma być noszone w kieszeni, a nie chcemy kontuzji, podartych ubrań i pogiętych nóżek. Nie chcę też żadnych dziur na wtyczki bananowe ani specjalnych łączy jak w Micro:bit — to ma być proste urządzenie nie wymagające dodatkowego specjalnego sprzętu. Pozostają zatem dwie opcje: header goldpinów damski, albo po prostu dziury w płytce ustawione tak, żeby dało się w nie wstawić godlpiny (albo wlutować damskie złącze) w razie potrzeby. Ta ostatnia opcja jest szczególnie kusząca, bo oszczędza mi jedną część i sporo lutowania.

Po podsumowaniu wszystkiego, wychodzi mi coś w ten deseń:

pew.thumb.png.bcd5a6ced883a690165013c4a72eaa11.png

Nie będę na razie nic zamawiał, już dosyć płytek zamówiłem w tym miesiącu, pozwolę się pomysłom ustabilizować i będę wprowadzał drobne poprawki w miarę jak mi będą przychodzić do głowy, ale chyba jest to ten kierunek, w którym chciałbym z tym projektem pójść. Co prawda port USB i mniejsze baterie zwiększają nieco koszt (i powodują powrót potencjalnych problemów z kablami tylko do ładowania), ale za to zdecydowanie zwiększają komfort pracy, więc chyba się z tym pogodzę.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Pisałeś o problemie z panelizacją. Dzisiaj przyszło mi zamówienie z Elecrow 10 szt (wysłali 12) takich płytek 10x5cm:

IMG_20180817_134858.thumb.jpg.93bb79236418797cef3ede313baec877.jpg

Po przełamaniu będę miał 24 szt. Płaciłem jak za normalne płytki 10x5cm czyli 5$ produkcja + 8$ wysyłka i o nic się nie czepiali.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Wieczór spędzony na programowaniu. W zasadzie musiałem tylko dodać nową definicję płytki (bo zmieniły się połączenia) oraz dopisać do skanowania macierzy sprawdzanie także stanu przycisków, z dodatkowym debouncingiem (uznaję przycisk za wciśnięty dopiero jak jest wciśnięty przez dwa cykle). Wszystko wydaje się działać dobrze:

IMG_20180823_231218.thumb.jpg.73b4dbe9f390acc14f1a53b9816adbae.jpg

Płytka ma zostawione miejsce na regulator 3.3V, który w tym wypadku dodałem, żeby dało się płytkę zasilać z USB (wersja na warsztaty prawdopodobnie nie będzie go miała, dla oszczędności) i działa to chyba nawet lepiej, niż przy baterii. Możliwe, że to przez nieco wyższe napięcie (bateria daje tylko te swoje 3V).

Czekam jeszcze na pojemniki na baterie i będę mógł przetestować dodanie wyciętych laserem elementów do podklejenia/przykręcenia z tyłu konsoli — żeby łatwiej się ją trzymało i żeby baterie tak nie wystawały. Być może spróbuję też dodać jakieś osłony na przód.

W każdym razie projekt wydaje się gotowy i zaczynam rozmowy z producentami. Zobaczymy przy tym o ile właściwie byłem w stanie zbić cenę urządzenia.

  • Lubię! 2

Udostępnij ten post


Link to post
Share on other sites
6 godzin temu, deshipu napisał:

W każdym razie projekt wydaje się gotowy i zaczynam rozmowy z producentami.

Próbujesz zlecić całość w Chinach czy gdzieś lokalnie?

Udostępnij ten post


Link to post
Share on other sites
17 minut temu, Treker napisał:

Próbujesz zlecić całość w Chinach czy gdzieś lokalnie?

Lokalnie wychodzi niestety trochę drogo, a po znajomości jest ciężko jak się nie zna języka. Na razie mam na oku dwie fabryki w Shenzhen i jedną na Florydzie. Ta ostatnia to siakaś nowa i mają ciekawą ofertę dodatkową: magazynowanie i wysyłanie na podane adresy, co w przypadku zamówień z USA ma dużo sensu. W sumie Seeedstudio też ma takie coś (tylko z Chin), ale jak dotychczas nie odpowiadają na żadne moje maile, więc nie udało mi się z nimi nawiązać żadnej współpracy. Zobaczymy co odpowiedzą inni.

  • Lubię! 1

Udostępnij ten post


Link to post
Share on other sites

Właśnie o Seeedstrudio myślałem, bo wydają się idealni pod takie projekty 🙂

Udostępnij ten post


Link to post
Share on other sites

Mogę Ci zasugerować poproszenie o wycenę w firmie EPROM. Żeby nie było - nie mam z nimi nic wspólnego, po prostu kiedyś wycenialiśmy wykonanie małej serii 50 sztuk (PCB 4 warsty i przelotki zagrzebane + lutowanie) i wyszło taniej albo porównywalnie, jak u konkurencji z Azji. PCB oczywiście i tak zamawiają w Chinach (honyapcb.eu/)  , ale montują w kraju.

Pewien znany sklep dla elektroników, w którym 5 lat temu pracowałem, też korzystał wtedy z usług tej firmy (nie wiem jak dzisiaj) i jakość wykonania była ok.

 

Udostępnij ten post


Link to post
Share on other sites
15 minut temu, Nawyk napisał:

Mogę Ci zasugerować poproszenie o wycenę w firmie EPROM. Żeby nie było - nie mam z nimi nic wspólnego, po prostu kiedyś wycenialiśmy wykonanie małej serii 50 sztuk (PCB 4 warsty i przelotki zagrzebane + lutowanie) i wyszło taniej albo porównywalnie, jak u konkurencji z Azji. PCB oczywiście i tak zamawiają w Chinach (honyapcb.eu/)  , ale montują w kraju.

Pewien znany sklep dla elektroników, w którym 5 lat temu pracowałem, też korzystał wtedy z usług tej firmy (nie wiem jak dzisiaj) i jakość wykonania była ok.

 

Zapytać o wycenę nigdy nie zaszkodzi. Masz może do nich jakiś kontakt? Bo wyszukiwarka internetowa znajduje dużo firm o takiej nazwie, ale żadna nie wydaje się zajmować składaniem elektroniki...

Udostępnij ten post


Link to post
Share on other sites

Bądź aktywny - zaloguj się lub utwórz konto!

Tylko zarejestrowani użytkownicy mogą komentować zawartość tej strony

Utwórz konto w ~20 sekund!

Zarejestruj nowe konto, to proste!

Zarejestruj się »

Zaloguj się

Posiadasz własne konto? Użyj go!

Zaloguj się »

×