Spisu treści:

Przełączniki Arduino i Thumbwheel: 9 kroków
Przełączniki Arduino i Thumbwheel: 9 kroków

Wideo: Przełączniki Arduino i Thumbwheel: 9 kroków

Wideo: Przełączniki Arduino i Thumbwheel: 9 kroków
Wideo: One Arduino 10 Thumbwheels binary escape room - Code and Diagram In Link Below 2024, Lipiec
Anonim
Przełączniki Arduino i kółka kciukowego
Przełączniki Arduino i kółka kciukowego

W tym artykule przeanalizujemy zastosowanie przełączników typu push-wheel/thumbwheel z naszymi systemami Arduino. Oto kilka przykładów pochodzących z PMD Way.

Krok 1:

Obraz
Obraz

Dla niewtajemniczonych każdy przełącznik jest jednym segmentem pionowym i można je ze sobą łączyć, tworząc różne rozmiary. Możesz użyć przycisków, aby wybrać cyfry od zera do dziewięciu. Dostępne są alternatywy, które mają kółko, które można przesuwać kciukiem zamiast przycisków zwiększania/zmniejszania.

Przed wymyślnymi interfejsami użytkownika przełączniki te były dość popularnymi metodami wprowadzania danych numerycznych. Są one jednak nadal dostępne, więc zobaczmy, jak działają i jak możemy z nich korzystać. Wartość przełącznika jest udostępniana za pomocą dziesiętnego kodowanego binarnie lub prostego dziesiętnego. Rozważ tylną część przełącznika w formie BCD.

Krok 2:

Obraz
Obraz

Z lewej strony mamy wspólne, potem styki na 1, 2, 4 i 8. Jeśli przyłożysz małe napięcie (powiedzmy 5V) do wspólnego, wartość przełącznika można zmierzyć dodając wartości styków, które są w Stan WYSOKI. Na przykład, jeśli wybierzesz 3 – styki 1 i 2 będą na wspólnym napięciu. Wartości od zera do dziewięciu mogą być przedstawione w tabeli jako takie.

Krok 3:

Obraz
Obraz

Do tej pory powinieneś zdać sobie sprawę, że łatwo byłoby odczytać wartość przełącznika – i masz rację. Możemy podłączyć 5V do wspólnego, wyjścia do cyfrowych pinów wejściowych naszych płyt Arduino, a następnie użyć digitalRead(), aby określić wartość każdego wyjścia. W szkicu używamy podstawowej matematyki do konwersji wartości BCD na liczbę dziesiętną. Więc zróbmy to teraz.

Z perspektywy sprzętowej musimy wziąć pod uwagę jeszcze jedną rzecz – przełącznik kołowy zachowuje się elektrycznie jak cztery normalnie otwarte przyciski. Oznacza to, że musimy użyć rezystorów pull-down, aby uzyskać wyraźną różnicę między stanami wysokimi i niskimi. Tak więc schemat dla jednego przełącznika jest taki, jak pokazano powyżej.

Krok 4:

Teraz wystarczy podłączyć wyjścia oznaczone 1, 2, 4 i 8 do (na przykład) pinów cyfrowych 8, 9, 10 i 11. Podłącz 5V do punktu „C” przełącznika, a GND do… GND. Następnie musimy mieć szkic, który może odczytać dane wejściowe i przekonwertować dane wyjściowe BCD na dziesiętne. Rozważ następujący szkic:

/* Używa tarczy wyświetlacza numerycznego SAA1064 https://www.gravitech.us/7segmentshield.html Używa monitora szeregowego, jeśli nie masz tarczy SAA1064 */ #include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup() { Serial.begin(9600); Wire.początek(); // dołącz do magistrali i2c (adres opcjonalny dla mastera) delay(500); pinMode(q1, WEJŚCIE); // pokrętło '1' pinMode(q2, INPUT); // pokrętło '2' pinMode(q4, INPUT); // pokrętło '4' pinMode(q8, INPUT); // pokrętło '8' } void dispSAA1064(int Count) // wysyła liczbę całkowitą 'Count' do tarczy Gravitech SAA1064 { const int lookup[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int Tysiące, Setki, Dziesiątki, Baza; Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); Wire.endTransmission(); Wire.beginTransmission(0x38); Drut.zapis(1); Tysiące = Liczba/1000; Setki = (Liczba-(Tysiące*1000))/100; Dziesiątki = (Liczba-((Tysiące*1000)+(Setki*100)))/10; Podstawa = Liczba-((Tysiące*1000)+(Setki*100)+(Dziesiątki*10)); Wire.write(lookup[Baza]); Wire.write(lookup[Dziesiątki]); Wire.write(lookup[setki]); Wire.write(lookup[Tysiące]); Wire.endTransmission(); opóźnienie(10); } int readSwitch() { int total=0; if (digitalRead(q1)==HIGH) { total+=1; } if (digitalRead(q2)==HIGH) { total+=2; } if (digitalRead(q4)==HIGH) { total+=4; } if (digitalRead(q8)==HIGH) { total+=8; } zwróć sumę; } void loop() { dispSAA1064(readSwitch()); // wysyła wartość przełącznika do wyświetlania tarczy Serial.println(readSwitch()); // wysyła wartość przełącznika do szeregowego monitora }

Kluczem jest funkcja readSwitch(). Oblicza wartość przełącznika, dodając numeryczną reprezentację każdego wyjścia przełącznika i jako wynik zwraca sumę. W tym przykładzie użyliśmy numerycznej tarczy wyświetlacza, która jest kontrolowana przez NXP SAA1064.

Krok 5:

Image
Image

Kluczem jest funkcja readSwitch(). Oblicza wartość przełącznika, dodając numeryczną reprezentację każdego wyjścia przełącznika i jako wynik zwraca sumę. W tym przykładzie użyliśmy numerycznej tarczy wyświetlacza, która jest kontrolowana przez NXP SAA1064.

Jeśli go nie masz, to w porządku – wyniki są również przesyłane do monitora szeregowego. Teraz zobaczmy, jak działa w filmie.

Krok 6:

Ok, nie wygląda to na dużo, ale jeśli potrzebujesz wpisu numerycznego, oszczędza dużo miejsca i oferuje precyzyjną metodę wprowadzania.

Więc masz to. Czy rzeczywiście użyłbyś ich w projekcie? Dla jednej cyfry – tak. Za cztery? Chyba nie – być może łatwiej byłoby skorzystać z 12-cyfrowej klawiatury. Jest pomysł…

Krok 7: Wiele przełączników

Obraz
Obraz

Teraz przyjrzymy się, jak odczytać cztery cyfry – i nie marnować tych wszystkich cyfrowych szpilek w tym procesie. Zamiast tego użyjemy 16-bitowego układu scalonego ekspandera portów Microchip MCP23017, który komunikuje się za pośrednictwem magistrali I2C. Posiada szesnaście cyfrowych pinów wejścia/wyjścia, które możemy wykorzystać do odczytania stanu każdego przełącznika.

Zanim przejdziemy dalej, zwróć uwagę, że do tego artykułu wymagana jest pewna zakładana wiedza – magistrala I2C (część pierwsza i druga) oraz MCP23017. Najpierw opiszemy połączenia sprzętowe, a następnie szkic Arduino. Przypomnij sobie schemat użyty w przykładzie z pojedynczym przełącznikiem.

Gdy przełącznik był bezpośrednio podłączony do Arduino, odczytujemy stan każdego pinu, aby określić wartość przełącznika. Zrobimy to ponownie, na większą skalę za pomocą MCP23017. Rozważ schemat pinów:

Krok 8:

Posiadamy 16 pinów, co pozwala na podłączenie czterech przełączników. Wspólne dla każdego przełącznika nadal są podłączone do 5 V, a każdy styk przełącznika nadal ma rezystor ściągający 10k do GND. Następnie podłączamy piny 1, 2, 4, 8 cyfry 1 do GPBA0~3; cyfry 2 1, 2, 4, 8 do GPA4~7; cyfra trzecia 1, 2, 4, 8 do GPB0~3 i cyfra czwarta 1, 2, 4, 8 do GPB4~7.

Jak teraz odczytujemy przełączniki? Wszystkie te przewody mogą sprawić, że pomyślisz, że jest to trudne, ale szkic jest dość prosty. Kiedy odczytujemy wartości GPBA i B, zwracany jest jeden bajt dla każdego banku, z najbardziej znaczącym bitem na początku. Każde cztery bity będą odpowiadać ustawieniu przełącznika podłączonego do pasujących pinów we/wy. Na przykład, jeśli żądamy danych dla obu banków IO i przełączniki są ustawione na 1 2 3 4 – bank A zwróci 0010 0001 a bank B zwróci 0100 0011.

Używamy kilku operacji przesunięcia bitowego, aby oddzielić każde cztery bity do osobnej zmiennej – co pozostawia nam wartość każdej cyfry. Na przykład, aby oddzielić wartość przełącznika czwartego, przesuwamy bity z banku B >> 4. To wypycha wartość przełącznika trzy na zewnątrz, a puste bity po lewej stają się zerami.

Aby oddzielić wartość przełącznika trzy, używamy złożonego bitowego & – co pozostawia wartość przełącznika trzy. Obraz przedstawia podział wartości przełączników binarnych – pokazuje surowe wartości bajtów GPIOA i B, a następnie wartość binarną każdej cyfry i wartość dziesiętną.

Krok 9:

Zobaczmy więc szkic demonstracyjny:

/* Przykład 40a - Odczyt czterech przełączników BCD z kółkiem przez MCP23017, wyświetlanie na SAA1064/4-cyfrowym 7-segmentowym wyświetlaczu LED */ // MCP23017 piny 15~17 do GND, adres magistrali I2C to 0x20 // Adres magistrali I2C SAA1064 0x38 # w tym "Wire.h" // dla definicji cyfr LED cyfry int[16]={ 63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; bajt GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064() { //setup 0x38 Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); // wyjście 12mA, brak wygaszania cyfr Wire.endTransmission(); } void setup() { Serial.begin(9600); Wire.początek(); // uruchom magistralę I2C initSAA1064(); } void loop() { // odczyt danych wejściowych z banku A Wire.beginTransmission(0x20); Wire.write(0x12); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOA=Przewód.odczyt(); // ten bajt zawiera dane przełączające dla cyfr 1 i 2 // odczyt wejść banku B Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOB=Przewód.odczyt(); // ten bajt zawiera dane przełącznika dla cyfr 3 i 4 // wyodrębnienie wartości dla każdego przełącznika // dig1 LHS, dig4 RHS dig4=GPIOB >> 4; dig3=GPIOB & B00001111; dig2=GPIOA >> 4; dig1=GPIOA & B00001111; // wyślij wszystkie dane GPIO i poszczególne przełączniki do monitora szeregowego // w celu debugowania i zainteresowania Serial.print("GPIOA = "); Serial.println(GPIOA, BIN); Serial.print("GPIOB = "); Serial.println(GPIOB, BIN); Serial.println(); Serial.print("cyfra 1 = "); Serial.println(dig1, BIN); Serial.print("cyfra 2 = "); Serial.println(dig2, BIN); Serial.print("cyfra 3 = "); Serial.println(dig3, BIN); Serial.print("cyfra 4 = "); Serial.println(dig4, BIN); Serial.println(); Serial.print("cyfra 1 = "); Serial.println(dig1, DEC); Serial.print("cyfra 2 = "); Serial.println(dig2, DEC); Serial.print("cyfra 3 = "); Serial.println(dig3, DEC); Serial.print("cyfra 4 = "); Serial.println(dig4, DEC); Serial.println(); // wyślij wartość przełącznika do wyświetlacza LED przez SAA1064 Wire.beginTransmission(0x38); Drut.zapis(1); Wire.write(cyfry[cyfra4]); Wire.write(cyfry[cyfra3]); Wire.write(cyfry[cyfra2]); Wire.write(cyfry[cyfra1]); Wire.endTransmission(); opóźnienie(10); opóźnienie (1000); }

A dla niewierzących… pokaz wideo.

Więc masz to. Cztery cyfry zamiast jednej, nad magistralą I2C z zachowaniem cyfrowych pinów we/wy Arduino. Za pomocą ośmiu MCP23017 można odczytać jednocześnie 32 cyfry. Baw się z tym!

W PMD Way można zamówić zarówno BCD, jak i przełączniki dziesiętne w różnych rozmiarach, z bezpłatną dostawą na całym świecie.

Ten post został dostarczony przez pmdway.com – wszystko dla producentów i entuzjastów elektroniki, z darmową dostawą na całym świecie.

Zalecana: