Skocz do zawartości
czarny8322

Łączenie za sobą pinów Arduino - odczyt

Pomocna odpowiedź

Witam,

Czy ktoś z Was wie jak w Arduino mogę jednoznacznie stwierdzić czy dany pin A połączył się z pinem B?

Problem polega na tym, że przykładowo:

- mam 3(lub więcej) cyfry: 12, 15, 17

- dwa mnożniki: x1, x10, x100

- jest wyświetlacz który pokazuje wynik działania,
- są kable za pomocą których mogę połączyć dany mnożnik z daną liczbą (czyli pin z pinem)

załóżmy że dany pin Arduino jest reprezentowany przez daną cyfrę lub mnożnik.

Pytanie jak mogę sprawdzić czy dany pin reprezentowany np przez mnożnik x10

został połączony z pinem reprezentującym cyfrę 12, w wyniku czego będę mógł wyświetlić wynik 120 na wyświetlaczu?

dodam tylko, że chce żeby można było jednocześnie połączyć kilka mnożników z cyframi... np. x1 i cyfrę 12 oraz x10 i cyfrę 15

Jak wyglądałby przykładowy kod.

Udostępnij ten post


Link to post
Share on other sites

To co chcesz zrobić to standardowe podłączenie kilku(nastu) przycisków/zworek czy co tam masz do procesora w formie tzw. klawiatury matrycowej:

https://www.baldengineer.com/arduino-keyboard-matrix-tutorial.html

https://playground.arduino.cc/Main/KeypadTutorial

http://www.instructables.com/id/Arduino-Keypad-4x4-Tutorial/

Wszystko jedno jak nazwiesz "przyciski", to może być klawiatura jak na powyższych obrazkach a mogą być na sztywno pozwierane kable, ale z Twojego punktu widzenia ważne jest, że funkcja to obsługująca wykrywa zwarcia poszczególnych węzłów matrycy. Oczywiście matryca może być taka mała jak tu: 4x4 a może być np. 8x8 i masz wtedy możliwość zwierania 8 drutów z innymi 8 drutami w 64 punktach. W celach edukacyjnych prześledź jak działa gotowa funkcja skanowania takiej matrycy a od razu wszystko stanie się jasne. Jakiś kalkulator robisz czy przelicznik czegoś?

Udostępnij ten post


Link to post
Share on other sites

Cześć,

Wydaje mi się że problem jest bardziej złożony niż zwykły matrix, ponieważ muszę rozrużnić, do której masy(mnożnika) dany przycisk został zwarty. Jeśli się mylę, to proszę mnie naprostować🙂

Ogólnie chciałbym zrobić coś na wzór kalkulatora, jak na poniższym obrazku. Będą tam otwory z przypisanymi numerami i mnożniki na kablach. Po włożeniu kabli w otwory ma się wyświetlić wynik działania.

Udostępnij ten post


Link to post
Share on other sites

Problem nie jest ani złożony ani bardziej ani mniej niż klawiatura matrycowa ani nawet obiektywnie też. Po zastanowieniu mogę powiedzieć, że jest nawet prostszy, bo odpada cała masa problemów związanych z niestabilnościami zestyków mechanicznych. W normalnej klawiaturze wykrywasz "zbocza" a więc moment wciśnięcia, musisz zatem bezustannie skanować całe pole by wykrywać zmiany. Tutaj możesz pozowlić sobie na komfort jednokrotnego przejrzenia matrycy tylko wtedy gdy program potrzebuje informacji o tym co jest akurat zwarte.

Masz kilka sygnałów wyjściowych z procesora i kilka wejściowych. Spełniając wymogi Twojego rysunku wystarczyłoby 3x3, ale uwzględniając przyszłe pomysły niech będzie typowe 4x4. Mam nadzieję, że przeczytałeś to co podlinkowałem bo tam było opisane jak taki algorytm skanowania działa. Niczego nie zwierasz do masy, natomiast "przyciski" - niech tak nazywają się te Twoje zworki umieszczone są w węzłach (przecięciach) siatki jaką tworzą przewody sygnałowe. Zwierasz jakiś przewód z grupy wyjściowych z jakimś przewodem z grupy wejściowych. W przypadku prostych klawiatur wystarczy wykrycie jednego/pierwszego zwarcia bo program wtedy zakłada, że jest to jedyne zwarcie w całej matrycy. Jeżeli ktoś kładzie całą łapę na wszystkich przyciskach, to sam jest sobie winien zgłupienia algorytmów. U Ciebie jednak - jak rozumiem - z definicji może być włożonych kilka kołków na raz a to wymaga wyposażenia każdego węzła (każdego kołka) w dodatkową, małą diodę. To wszystko. Piszesz prostą funkcję skanowania, która oddaje listę zwartych węzłów po czym korzystasz z tej listy w programie wyświetlającym wyniki. Co tu jest złożonego?

A jeśli zakładasz tylko jeden kołek (a dwa i więcej to już błąd), sprawa robi się jeszcze prostsza.

EDIT: A może przy 9 pozycjach wystarczy zwykły, 9-pozycyjny przełącznik obrotowy? Na pewno możesz kupić 10-pozycyjne i wtedy ostatnia pozycja mogłaby oznaczać wyłączenie urządzenia. Wystarczyłoby czytelnie opisać wokół pokrętła odpowiednie pozycje i z głowy.

https://www.tme.eu/pl/details/sr26111015fn/przelaczniki-obrotowe/ninigi/

Hm, a jaki w ogóle jest sens pokazywać wynik mnożenia 76x100? Przecież każdy wie ile to jest bez żadnego kalkulatora..

Udostępnij ten post


Link to post
Share on other sites

Dzięki:) załapałem. Materiały przeczytałem, dzięki za to.

Co do pytania o zasadność, ma być to prosta zagadka logiczna dla kogoś... typu mam podaną liczbe 8019

i za pomocą odpowiedniego połączenia przewodów z otworami, muszę uzyskać tą liczbe na ekranie...czyli:

wkładam kabel(mnożnik):

x100 do 76

x10 do 32

x1 do 99

w wyniku sumy mam 8019.

A więc, zbuduję schemat jak poniżej i pobawie się softem. Dzięki jeszcze raz.

Wiec schemat będzie wyglądał mniej więcej tak jak ponizej:

Udostępnij ten post


Link to post
Share on other sites

Dokładnie tak.

Zauważ, że opłaca się budować matryce jak najbardziej kwadratowe, bo to minimalizuje liczbę potrzebnych linii sygnałowych. Dla procesora nie ma znaczenia który klawisz wstawisz w który węzeł. To wszystko może być wymieszane tak by jak najłatwiej było pociągnąć przewody po panelu czołowym. Potem w programie i tak posługujesz się numerami przycisków zamienionymi na jakieś czytelne nazwy.

Z punktu widzenia programu warto też, by nie dzielić całych grup (wejściowe, wyjściowe) między portami procesora, tj. jeśli masz np. 3 takie i 4 takie to wstaw je na ten sam port (bo zwykle porty są 8-bitowe), ale gdy większa matryca ma powiedzmy 5x7 to warto te 5 wyciągnąć z jednego portu a pozostałe 7 wcisnąć w całości na jakiś inny. Czasem gdy obsługujesz sporo takich przycisków i projekt urasta do np. 10x12 warto jest użyć zewnętrznych układów cyfrowych, tzw. dekoderów i/lub multiplekserów do rozszerzenia matrycy przy zachowaniu minimalnej liczby zużytych pinów procesora. Scalaki tego typu są tanie (1-2zł) i łatwe w użyciu a dzięki nim możesz do małego procesorka podłączyć setki przełączników i jeszcze zostaje miejsce na wyświetlacz czy jakieś czujniki.

Może przemyśl sobie jak taka zabawka będzie używana prze ludzi. Czy warto dać jakiś rządek diodek ("pasek postępu"?) pokazujący upływ czasu pozostałego na odpowiedź, jakieś przyciski typu "Start", "Wiem" lub "Nie wiem, poddaję się" żeby zabawa nie musiała czekać na jakieś tajemnicze międlenie czasu w procesorze. Jakiś sygnał dźwiękowy radosny i smutny? Jakieś zliczanie sumarycznego lub średniego czasu odpowiedzi w serii? Jakieś podsumowanie typu spore pole z matowego plexi podświetlane zieloną/żółtą/czerwoną diodą jako nagroda? Jakaś odporność programu na wtykanie kołka po kolei w każdą dziurę? No takie rzeczy..

Jaki planujesz wyświetlacz? Być może kilka (4-8) cyfr dużego, 7-segmentowego LED dałby wygląd vintage'owego komputera pokładowego z Apollo? itd.. Zwykłe, typowe, zielone LCD 2x16 są dzisiaj już banalne.

Napisz jak to widzisz.

Udostępnij ten post


Link to post
Share on other sites

Co do wyświetlacza, będą to lampy NIXIE. Po podłączeniu odpowiednich kabli i wyświetleniu numeru na wyświetlaczu zagra jakieś mp3.

Niestety nadal mam problem z obsługą klawiatury ponieważ troszkę skomplikowałem sobie projekt. Do obsługi klawiatury mam do dyspozycji dwa expandery pcf8574.

pierwszy - 0x20 - mam 4ry wolne piny

drugi 0x21 - mam 8 wolnych pinów

łącznie mam 12 wolnych pinów za pomocą których potrzebuje zbudować klawiaturę, która da mi 27 kombinacji podłączeń kabli, czyli 3mnożniki razy 9 cyfr.

Zamysł był taki aby wykorzystać fajną bibliotekę do obsługi klawiatury i pcf8574:

https://github.com/joeyoung/arduino_keypads/tree/master/Keypad_I2C

tutaj przykład użycia dwóch pcf8574:

https://github.com/joeyoung/arduino_keypads/tree/master/Keypad_I2C/examples/HelloKeypadTwo_I2C

Chciałem stworzyć 3 klawiatury 1x9 używając 3pinów z pierwszego expandera(jako mnożniki) i reszty pinów jako "cyfry". Problem w tym że nie mogę zdefiniować pinu 1 z pierwszego expandera jako "row/mnożnik" i reszty 9ciu pinów z obu expanderów jako "col/cyfry". Powyższa biblioteka nie daje mi możliwości "współpracy" dwóch expanderów do stworzenia jednego matrixu.

Problem rozwiązałby się gdybym mógł zdefiniować piny expandera, czyli np pokazując na poniższym przykładzie zamiast pinu 11, użyłbym czegoś takiego jak: expander.digitalRead(4):

zamiast pinu 11:

byte rowPins[ROWS] = { 11} , chciałbym wskazać np pin 4 na expanderze:

byte rowPins[ROWS] = expander.digitalRead(4)

Tutaj wklejam przykład na pinach arduino. Chciałbym zrobić identyczne 3klawiatury używając wolnych pinów z expandera.

const byte ROWS = 1;

const byte COLS = 9;

char keys[ROWS][COLS] = {

{'1','2','3','4','5','6','7','8','9'},

};

byte rowPins[ROWS] = { 11};

byte colPins[COLS] = { 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Keypad kpd = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );

const byte ROWS1 = 1;

const byte COLS1 = 9;

char keys1[ROWS1][COLS1] = {

{'a','b','c','d','e','f','g','h','i'},

};

byte rowPins1[ROWS1] = { 12};

byte colPins1[COLS1] = { 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Keypad kpd1 = Keypad( makeKeymap(keys1), rowPins1, colPins1, ROWS1, COLS1 );

const byte ROWS2 = 1;

const byte COLS2 = 9;

char keys2[ROWS2][COLS2] = {

{'j','k','l','m','n','o','u','p','r'},

};

byte rowPins2[ROWS2] = { 13};

byte colPins2[COLS2] = { 2, 3, 4, 5, 6, 7, 8, 9, 10 };

Keypad kpd2 = Keypad( makeKeymap(keys2), rowPins2, colPins2, ROWS2, COLS2 );

Jak ktoś ma jakiś pomysł albo rozwiązanie, będe całował po stopach:D

Udostępnij ten post


Link to post
Share on other sites

Proste rzeczy urastają do rangi problemów gdy nie bardzo rozmiesz co się dzieje "pod podszewką". Jeżeli biblioteka klawiaturowa jest napisana na piny cyfrowe Arduino, to nie możesz do tablicy gdzie mają być ich numery wstawiać jakichś funkcji (wskaźników na funkcję?) współpracujących z ekspanderem.

Z kolei gdy inna bilblioteka korzysta z jednego portu jednego ekspandera nie zmusisz jej do obsługi dwóch scalaków o różnych adresach.

Na Twoim miejscu, jeżeli znalazłeś bibliotekę obsługującą jedną klawiaturę na jednym ekspanderze to powiel to i zrób trzy klawiatury na trzech ekspanderach. Trudno, jak nie umiesz zrobić tego samodzielnie prościej, musisz korzystać z gotowców a te są jakie są. PCF8574 ma 3 linie adresowe więc na jednej szynie I2C może być tych chipów aż 8. Każdemu z trzech jakie weźmiesz podłącz matrycę 3x3 lub 2x5, odpowiednio podefiniuj w kodzie piny portu, numery klawiszy i z głowy. Miejmy tylko nadzieję, że kod biblioteki jest tak napisany, że kolejne instancje klawiatur będą ze sobą współżyć w jednym systemie.

Dlaczego tak zmieniłeś projekt, że musisz zaprzęgać ekspandery?

Kiepsko Ci ta płytka wyszła. Małe cyfry daleko od siebie nie sprawiają wrażenia liczby i odczyt wartości będzie utrudniony. Nasze oczy są przywyczajone do pewnej wielkości odstępów między znakami. Większe światło między cyframi to spacja czyli separator. Cyfry muszą być blisko siebie, bo 1 4 1 0 nie oznacza roku bitwy pod Grunwaldem, a 1410 już tak. Kiedy będziesz zaaferowny grą w odgadywanie współczynników nie możesz się zmuszać do prób zrozumienia tego co widzisz na wyświetlaczu. To musi być naturalne. W projektach płytek nie tylko połączenia elektryczne się liczą.

EDIT: Poprawiłem literówki i zadaję pytanie: czy nie miałbyś ochoty napisać tego samemu, nawet na ekspanderach? Nie kusi Cię zrobienie tego tak byś dokładnie wiedział jak to działa? Przecież to nie jest jakaś magia tylko kilka operacji zapisu/odczytu portów.

  • Pomogłeś! 1

Udostępnij ten post


Link to post
Share on other sites

Cześć,

Dziękuje za przydatne linki z pierwszej odpowiedzi:) Bardzo pomocne. Ostatecznie zrobiłem to samemu, już nie na ekspanderach tylko dodałem drugie arduino, z którego wykorzystałem zwykłe piny do obsługi "klawiatury", dodatkowym atutem jak się okazało później...była obsługa modułu mp3... który w tym przypadku komunikował się z arduino za pomocą TX/RX i nie dało się tego obsłużyć na Arduino który odpowiedzialny był za lampy, ponieważ kiedy wysyłana była komenda do modułu mp3, loop blokował się na ułamek sekundy, co skutkowało gaszeniem lamp.

Odpowiadając na Twoje pytania:

Dlaczego tak zmieniłeś projekt, że musisz zaprzęgać ekspandery? -- ponieważ obsługa 4lamp zabiera mi 15pinów z arduino.

Co do płytki... rozmiary pomiędzy cyframi są takie ponieważ takie miały być:) to jest zamierzone działanie.

Temat jest do zamknięcia:) jeszcze raz dzięki:)

Udostępnij ten post


Link to post
Share on other sites
Gość es2
(edytowany)
Dnia 30.07.2018 o 22:26, marek1707 napisał:

PCF8574 ma 3 linie adresowe więc na jednej szynie I2C może być tych chipów aż 8

PCF8574 może być 16.

Nie warto używać (poza nielicznymi wyjątkami) przestarzałego PCF8574. Są lepsze rozwiązania (np PCA9535) szybsze, więcej IO, większe możliwości (np "silne" wyjścia PP, lepsze przerwania).

Edytowano przez es2

Udostępnij ten post


Link to post
Share on other sites

Dołącz do dyskusji, napisz odpowiedź!

Jeśli masz już konto to zaloguj się teraz, aby opublikować wiadomość jako Ty. Możesz też napisać teraz i zarejestrować się później.
Uwaga: wgrywanie zdjęć i załączników dostępne jest po zalogowaniu!

Gość
Napisz odpowiedź...

×   Wklejony jako tekst z formatowaniem.   Przywróć formatowanie

  Dozwolonych jest tylko 75 emoji.

×   Twój link będzie automatycznie osadzony.   Wyświetlać jako link

×   Twoja poprzednia zawartość została przywrócona.   Wyczyść edytor

×   Nie możesz wkleić zdjęć bezpośrednio. Prześlij lub wstaw obrazy z adresu URL.


×
×
  • Utwórz nowe...