Chcę zrobić drewnianą szachownicę, na której możesz grać zwykłymi kawałkami (tj. Niezmodyfikowanymi kawałkami, które wykorzystują kody RFID, magnesy,…), ale które są podłączone do oprogramowania, które rejestruje moje ruchy i działa jak drugi gracz.
Zastanawiałem się, jak wykryć pionki na planszy i podjąłem decyzje, że nie muszę rozpoznawać, który fragment jest gdzie: „prawda” znajduje się w oprogramowaniu, więc jeśli przeniosę kawałek z A do B , oprogramowanie jest w stanie dowiedzieć się, który kawałek został przeniesiony.
Tak więc wpadłem na pomysł wywiercenia dwóch otworów w każdym polu szachownicy, jednego w środku i jednego w prawym górnym rogu:
- Ten w środku zostanie użyty do czujnika jasności w celu wykrycia, czy kawałek stoi na polu, czy nie.
- Ten w rogu zostanie użyty dla diody LED, aby pokazać, którą część użytkownik musi przenieść do komputera, aby sytuacja w świecie rzeczywistym ponownie pasowała do sytuacji w oprogramowaniu.
Chcę użyć Raspberry Pi jako podstawy sprzętowej do uruchomienia oprogramowania, które zostanie napisane w Node.js (ale to nie powinno być ważne w przypadku tego pytania).
Tak więc, kończę na 64 czujnikach jasności i 64 diodach LED, które muszę rozwiązać indywidualnie. Innymi słowy: potrzebuję 64 wyjść i 64 wejść. I oczywiście jest to coś, z czym Raspberry Pi nie radzi sobie po wyjęciu z pudełka - i myślę, że musi być lepszy sposób niż mieć 128 portów I / O.
Ponieważ uważam, że wykrycie stanu płyty jest ważniejszym zadaniem, zacząłem szukać w Internecie, jak obsługiwać matrycę przełączników 8x8. Znalazłem sugestię, aby użyć mikrokontrolera, który skanuje kolumny tablicy sekwencyjnie, aw każdej kolumnie wykrywa, czy wiersz (= pole) jest używany, czy nie.
Ograniczyłoby to złożoność do 8 wyjść i 8 wejść (aby móc odczytać stan płyty).
W związku z tym mam kilka pytań:
- Czy moje myśli są prawidłowe, tj. Czy jest to właściwe podejście, czy też istnieje lepsza alternatywa, na którą powinienem uważać?
- Ponieważ nie mam doświadczenia z mikrokontrolerami, na co muszę uważać? Czy potrzebuję tylko mikrokontrolera z 16 pinami, który można programować w języku, który potrafię pisać, czy…?
- Czy ktoś zbudował taką tablicę i ma jakieś porady lub zna tutorial, który przeprowadzi cię przez ten proces?
Odpowiedzi:
Ponieważ obraz jest wart tysiąca słów, oto przykład LDM-24488NI : macierz 64- diodowa
Do aplikacji potrzebna będzie jedna taka matryca do diod LED, a druga do czujników, wymagająca łącznie 32 pinów IO. Ponieważ twoje RPi nie ma tak wielu, będziesz musiał użyć demultipleksera od 1 do 8, aby wybrać pojedyncze wiersze i kolumny:
W przypadku diod LED możesz używać demultiplekserów zarówno dla rzędów, jak i kolumn, ponieważ potrzebujesz tylko jednej diody LED na raz. W przypadku czujników zalecam użycie demultipleksera dla wierszy i pojedynczych linii dla kolumn, aby móc wykryć wiele aktywnych czujników w jednym rzędzie. Spowoduje to, że wymagana liczba pinów wyniesie 17 pinów, które może obsłużyć RPi.
źródło
Tak, multipleksowanie zgodnie z opisem jest powszechnym sposobem radzenia sobie z tablicami rzeczy.
Najtrudniejsza część dotyczy analogicznej natury czujników światła. CdS LDR (oporniki zależne od światła) są prawdopodobnie najlepsze w tym przypadku, ponieważ są czułe, tanie i wytwarzają dużą, łatwo mierzalną odpowiedź w zakresie ludzkiego zakresu jasności. Elektrycznie są to oporniki, których rezystancja maleje w jaśniejszym świetle.
Uprościłoby to multipleksowanie, jeśli użyjesz mikro z 8 wejściami analogowymi. Oznacza to, że połowa twojego multipleksera jest wbudowana w mikro. Włączasz wiersz LDR i odczytujesz na przykład 8 sygnałów kolumnowych bezpośrednio za pomocą mikro.
Sekwencyjne skanowanie 64 wejść analogowych można w prosty sposób wykonać natychmiast po ludzku za pomocą zwykłych mikrometrów. Powiedzmy, że możesz zrobić nowy odczyt co 100 µs. To „długie”, nawet w przypadku małych i tanich mikrofonów. Oznacza to, że cała tablica byłaby skanowana co 6,4 ms, co jest znacznie szybsze niż opóźnienie.
Multipleksowanie diod LED jest jeszcze łatwiejsze, ponieważ odbywa się to za pomocą wyjść cyfrowych. Wiele mikrofonów ma ponad 16 wyjść cyfrowych, więc nie stanowi to problemu. Są inne rzeczy, które będą musiały się wydarzyć, a zużyjesz szpilki szybciej, niż możesz się teraz spodziewać, ale 64-pinowa mikro powinna naprawdę być wystarczająco dobra, jeśli nie 44-pinowa.
Prawdopodobnie poświęciłbym jedną mikro tylko obsłudze I / O płyty głównej. Jest to zoptymalizowane pod kątem wystarczającej liczby styków we / wy, wejść A / D i tym podobnych. Następnie łączy się z głównym silnikiem obliczeniowym za pośrednictwem UART. Protokół wyglądałby jak „light up square 3,2” lub „element usunięty z kwadratu 5,4”. Pozwala to również na zupełnie inny interfejs sprzętowy w przyszłości, pod warunkiem zachowania tego samego protokołu.
źródło
W przypadku diod LED oczywistym sposobem na osiągnięcie tego jest uzyskanie wyjścia dla każdego wiersza i każdej kolumny szachownicy: łącznie 8 + 8 = 16 pinów. Anody byłyby podłączone do drutów rzędowych, a katody do drutu kolumnowego. Dla diody LED, którą chcesz zapalić, ustaw jej przewód anodowy dodatni (logika 1), a drut katodowy ujemny (logika 0), utrzymując pozostałe w odwrotnym stanie (tak aby pozostałe diody LED miały neutralne lub odwrócone odchylenie).
Przyjmuję tutaj założenie, że mikrokontroler zapewnia wystarczająco wysokie / niskie napięcie, abyś mógł mostkować diody LED między sobą. Jeśli tak nie jest, będziesz potrzebował tranzystora lub bufora dla każdej linii. Przy zasilaniu 5 V jest szczelny, biorąc pod uwagę, że diody LED spadają o około 2 V i chcesz rozsądnego spadku napięcia na oporniku ograniczającym prąd (pamiętaj, że musisz je zainstalować tylko w liniach rzędowych lub kolumnowych, a nie w obu).
Jeśli Twoje wyjścia są w stanie tri (to znaczy, oprócz logiki 0 i logiki 1, można je ustawić na stan wysokiej impedancji, być może przez tymczasowe skonfigurowanie ich jako wejścia), możesz uzyskać sprytne i użyć siatki 4x8 z diodami LED połączone parami antyrównoległymi. Ważne jest, aby ustawić nieużywane wyjścia na wysoką impedancję w tym ustawieniu, w przeciwnym razie zapalą się niechciane diody LED.
W obu przypadkach będziesz musiał pomyśleć o bieżącym losowaniu i czy można zaryzykować ryzyko błędu programowego zapalającego wszystkie diody LED w jednym rzędzie (co, jeśli nie zostanie to uwzględnione, może spowodować przetężenie linii wiersza mikrokontrolera) .)
Sprawa czujników jest bardziej skomplikowana. Zakładam, że używasz czujników rezystancyjnych, chociaż fototranzystory niekoniecznie gwarantują, że będą przewodzić tylko w jednym kierunku.
Możesz użyć tych samych 8-rzędowych wyjść, których używasz do oświetlania diod LED, ale będziesz potrzebować 8 wejść kolumnowych przeznaczonych do wykrywania. Bez wątpienia zobaczysz obwody dla takich manipulatorów . Pamiętaj, że są one zaprojektowane tak, aby naciskać tylko jeden klawisz na raz . Jeśli użytkownik naciśnie 1,3,7 i 9 jednocześnie, klawiatura nie będzie w stanie wykryć, czy użytkownik zwolni jeden z tych czterech klawiszy, ponieważ nadal istnieje bieżąca ścieżka przez pozostałe trzy przełączniki.
Rozwiązaniem stosowanym w klawiaturach muzycznych (które są zaprojektowane tak, aby więcej niż jeden element matrycy przewodził w tym samym czasie) jest dioda połączona szeregowo z każdym przełącznikiem.
Innym rozwiązaniem byłoby kupienie czterech układów scalonych z dekoderem 4 do 16 z wyjściami z otwartym kolektorem (lub z otwartym odpływem, jeśli używane są układy MOSFET), takich jak: http://www.unicornelectronics.com/ftp/Data%20Sheets/74159.pdf Otwarty kolektor oznacza, że wyjścia układu scalonego będą jedynie pochłaniać prąd, a nie źródło. W ten sposób możesz podłączyć 16 czujników do 16 wyjść układu, a pozostałe końcówki połączyć razem z rezystorem podciągającym (tutaj również podłączymy ADC). Sprowadzasz jedno wyjście niskie (przewodzące), a pozostałe 15 pozostaje wysokie (nieprzewodzące). Jest to przeciwieństwo standardowego wyjścia logicznego, gdzie pozostałe 15 wyjść wylewałoby prąd do wspólnego punktu.
Wejście tych układów scalonych jest 4-bitowe binarnie, aby wybrać jedno z 16 wyjść, ale mają również dodatkowe wejście, aby włączyć / wyłączyć układ. W ten sposób możesz potencjalnie mieć szereg 64 zlewozmywaków z otwartym kolektorem, połączonych z 64 czujnikami, z innymi końcami czujników wspólnymi dla jednego rezystora podciągającego i przetwornika analogowo-cyfrowego. W tym celu potrzebujesz 8 wyjść na mikrokontrolerze: cztery, aby pobrać sygnały wyboru od 4 do 16 (wspólne dla wszystkich czterech układów) i cztery, aby pobrać sygnały aktywacji (po jednym dla każdego układu).
EDYCJA: od 3 do 8 dekoderów (zwanych również 1 z 8 = 1 linia z 8) wydaje się być bardziej dostępnych niż 4 do 16, ale 8 układów scalonych jest znacznie bardziej bałaganiarskich niż 4. Innym typem układów scalonych, które mogą być przydatne, jest licznik ósemkowy (i jego bardziej popularny kuzyn licznik dekady , który można skonfigurować jako licznik ósemkowy, podłączając jego dziewiąty sygnał wyjściowy do linii resetowania). Wymagają one szeregowego impulsu, aby przejść z jednego wyjścia do drugiego, więc potrzebowałby mniej Piny we / wy mikrokontrolera niż układy scalone dekodera. Zazwyczaj mają dodatkowe wejścia do resetowania i włączania. Istnieją również układy scalone zwane rejestrami przesuwnymi , które są dostępne w dwóch typach: jeden do konwersji serii na równoległy, a drugi do konwersji równoległej na szereg. Wreszcie sąbufory , które można umieścić między Rasberry Pi a szachownicą, aby Pi nie uległo zniszczeniu w przypadku przetężenia. Wszystkie te mogą być przydatne w obwodach multipleksujących.
źródło
Multipleksowanie jest rzeczywiście powszechną praktyką.
Istnieje kilka sposobów na lepsze wykorzystanie pinów Raspberry Pi
Jednym z nich jest użycie chipa do wykonania pewnego ciężkiego podnoszenia. Na przykład, jeśli masz 8 wejść i 8 wyjść do odczytu stanu płyty, możesz użyć licznika, aby podnieść 8 wejść jednocześnie. Do tego potrzebne będą 2 piny na Arduino - jeden, aby zresetować z powrotem do pierwszego pinu, a drugi, aby „przejść do następnego rzędu”. Właśnie zapisałeś 6 pinów!
Zapisanie 6 pinów może być niewystarczające - zobaczmy, gdzie możemy pójść stąd: jeśli ponownie ułożysz siatkę 8x8 w siatkę 16x4, możesz użyć czegoś takiego jak http://www.instructables.com/id/16-Stage -Decade-Counter-Chain-Using-two-4017-Chi /? ALLSTEPS (zignoruj górną połowę, dwie linie schodzące od góry do dołu to „reset”, wychodzący z lewego górnego rogu i „ przejdź do następnego wiersza ”, który nazywa się CLK, tutaj znajduje się zegar). Możesz teraz policzyć 8 w lewej połowie planszy, a następnie 8 w prawej połowie planszy; połączyć ze sobą kolumny A i E, B i F, C i G oraz D i H.
Gratulacje, masz teraz dwa piny wyjściowe (reset i zegar) oraz 4 piny wejściowe, co daje w sumie 6 - to oszczędza 10 pinów! Pamiętaj, że Raspberry Pi nie ma konwerterów analogowych na cyfrowe, więc będziesz potrzebować dodatkowej pracy.
Teraz diody LED. Masz już kontrolowany zasilacz (liczniki dwudziestolecia) - wykorzystajmy je ponownie. Umieść 64 diody LED z 16 pinów zasilających, poprzez rezystor (każda dioda MUSI mieć swój własny rezystor!), Do 4 innych szyn (taki sam układ jak powyżej: AE, BF, CG i DH). Podłącz te 4 szyny za pomocą 4 tranzystorów do 4 styków i ustaw wszystkie styki na „wysokie” - ponieważ obie strony diody LED mają teraz napięcie 5 woltów, diody LED zgasną. Następnie, gdy chcesz zapalić diodę LED, upewnij się, że dwie dekady są we właściwej pozycji (tak jakbyś czytał czujnik na tym kwadracie), ustaw jedną z 4 szyn na niską. Prąd powinien teraz płynąć od „wysokiego” z licznika dekady do „niskiego” w tej konkretnej szynie. Hej presto, zapala się światło! Odczekaj trochę czasu, a następnie wyłącz go, zanim ponownie zmienisz licznik dekady.
Jeśli chcesz mieć większą kontrolę, możesz użyć czegoś takiego jak układ TLC5940 - http://playground.arduino.cc/Learning/TLC5940 - każdy układ może ustawić 16 diod LED (więc potrzebujesz 4 z nich) na poziom jasności od 0 (wyłączone) do 1024 (pełne włączenie), dzięki czemu możesz gasnąć pojedyncze diody LED z doskonałą kontrolą. Z pamięci potrzebują one około 4 styków i mogą być połączone szeregowo, więc 4 cyfrowe styki (z których jeden musi być PWM - te mają symbol „~” obok styku) będą sterować dowolną liczbą diod LED.
Powodzenia!
źródło
Nie sądzę, że będziesz potrzebować diody LED w prawym górnym rogu. Wystarczyłby czujnik w środku, jak wspomniałeś. Podstępna część będzie kodem szachownicy. Wyobraź sobie, że masz szachownicę. Wiersz będzie oznaczony jako „alfabet”, a kolumna jako „liczba”.
Najpierw potrzebujesz programu do zaprogramowania rodzaju elementu w początkowej pozycji. Później, kiedy przenosisz swoje elementy, kod wygeneruje początkową lokalizację elementu do ostatecznej lokalizacji. To zmniejszy twój wkład o połowę.
źródło