Skocz do zawartości

Miniaturowa konsola do nauki programowania gier


Pomocna odpowiedź

  • 3 tygodnie później...

Podoba Ci się ten projekt? Zostaw pozytywny komentarz i daj znać autorowi, że zbudował coś fajnego!

Masz uwagi? Napisz kulturalnie co warto zmienić. Doceń pracę autora nad konstrukcją oraz opisem.

Płytki wreszcie dotarły, czas na zmontowanie prototypu:

Niestety nadal czekam na pojemniki na baterie — tym czasem użyłem innego, który ma odwrotnie wyprowadzone piny, więc wlutowałem go także odwrotnie. Oczywiście docelowo będzie pod urządzeniem.

Bootloader UF2 dla SAMD21 udało się wgrać J-Linkiem bez problemu za pierwszym razem, urządzenie pojawiło się jako dysk USB. Następnie trzeba było przygotować firmware z CircuitPythonem. Stworzyłem nową definicję płytki, z takimi pinami, jak wynika ze schematu. Dodatkowo zmodyfikowałem listę dostępnych modułów, bo nie będziemy używać busio czy audioio. To pozwoliło mi także zwiększyć ilość dostępnego miejsca na dysku USB, bo zwolniło się trochę flasha.

Następny krok to prosty kod sterujący macierzą:

import board
import digitalio

ROWS = (
   digitalio.DigitalInOut(board.R8),
   digitalio.DigitalInOut(board.R7),
   digitalio.DigitalInOut(board.R6),
   digitalio.DigitalInOut(board.R5),
   digitalio.DigitalInOut(board.R4),
   digitalio.DigitalInOut(board.R3),
   digitalio.DigitalInOut(board.R2),
   digitalio.DigitalInOut(board.R1),
)

COLS = (
   digitalio.DigitalInOut(board.C1),
   digitalio.DigitalInOut(board.C2),
   digitalio.DigitalInOut(board.C3),
   digitalio.DigitalInOut(board.C4),
   digitalio.DigitalInOut(board.C5),
   digitalio.DigitalInOut(board.C6),
   digitalio.DigitalInOut(board.C7),
   digitalio.DigitalInOut(board.C8),
)

buffer = bytearray(8 * 8)
buffer[0*8 + 2] = 1
buffer[1*8 + 3] = 2
buffer[2*8 + 4] = 3

for row in ROWS:
   row.switch_to_output()

col = 0
turn = 0


def tick():
   global col, turn

   COLS[col].switch_to_input()
   col += 1
   if col >= 8:
       col = 0
       turn += 1
       if turn >= 4:
           turn = 0
   for row in range(8):
       c = buffer[col * 8 + row]
       if c & 0x01 and turn in (1, 0) or c & 0x02 and turn in (2, 0, 3):
           ROWS[row].value = 1
       else:
           ROWS[row].value = 0
   COLS[col].switch_to_output()


while 1:
   tick()

Oczywiście robienie tego w pythonie jest trochę bez sensu — wolne tak, że widać gołym okiem miganie, a do tego nie działa w tle. Zatem mój kolejny krok to przepisanie tego do C tak, aby mogło działać cały czas, niezależnie od programu użytkownika.

  • Lubię! 2
  • 2 tygodnie później...

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

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ę! 2

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
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?

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

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.

 

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...

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ę »
×
×
  • Utwórz nowe...