İçindekiler:

Arduino ve Thumbwheel Anahtarları: 9 Adım
Arduino ve Thumbwheel Anahtarları: 9 Adım

Video: Arduino ve Thumbwheel Anahtarları: 9 Adım

Video: Arduino ve Thumbwheel Anahtarları: 9 Adım
Video: Ayar Düğmesi Testi | Onaltılık - BCD Ayar Düğmesi Anahtarı İşlevi 2024, Kasım
Anonim
Arduino ve Thumbwheel Anahtarları
Arduino ve Thumbwheel Anahtarları

Bu yazıda, Arduino sistemlerimizle itme-tekerlek/parmak teker anahtarlarının kullanımını inceliyoruz. İşte PMD Way kaynaklı bazı örnekler.

Aşama 1:

resim
resim

Deneyimsizler için, her anahtar bir dikey segmenttir ve çeşitli boyutlar oluşturmak için birbirine bağlanabilirler. Sıfırdan dokuza kadar olan rakamlardan seçim yapmak için düğmeleri kullanabilirsiniz. Arttırma/azaltma düğmeleri yerine baş parmağınızla hareket ettirebileceğiniz tekerleği olan alternatifler mevcuttur.

Süslü kullanıcı arayüzleri günlerinden önce, bu anahtarlar sayısal veri girişini ayarlamak için oldukça popüler yöntemlerdi. Ancak bugün hala mevcutlar, o yüzden nasıl çalıştıklarını ve bunları nasıl kullanabileceğimizi görelim. Anahtarın değeri, ikili kodlu ondalık veya düz ondalık aracılığıyla sağlanır. Anahtarın arkasını BCD biçiminde düşünün.

Adım 2:

resim
resim

Sol tarafta ortak, sonra 1, 2, 4 ve 8 için kontaklarımız var. Ortak olana küçük bir voltaj uygularsanız (örneğin 5V), anahtarın değeri, anahtardaki kontakların değerleri toplanarak ölçülebilir. YÜKSEK durum. Örneğin 3 – kontak 1 ve 2'yi seçerseniz ortak voltajda olacaktır. Sıfır ile dokuz arasındaki değerler tabloda olduğu gibi gösterilebilir.

Aşama 3:

resim
resim

Şimdiye kadar, bir anahtarın değerini okumanın kolay olacağını anlamalısınız - ve haklısınız, öyle. 5V'yi ortak, çıkışları Arduino kartlarımızın dijital giriş pinlerine bağlayabilir, ardından her çıkışın değerini belirlemek için digitalRead() kullanabiliriz. Çizimde, BCD değerini ondalık sayıya dönüştürmek için bazı temel matematik kullanıyoruz. Şimdi bunu yapalım.

Donanım açısından bakıldığında, bir şeyi daha hesaba katmamız gerekiyor - itmeli tekerlek anahtarı, elektriksel olarak dört normalde açık buton gibi davranır. Bu, yüksek ve düşük durumlar arasında net bir fark elde etmek için aşağı çekme dirençleri kullanmamız gerektiği anlamına gelir. Yani bir anahtarın şeması yukarıda gösterildiği gibidir.

4. Adım:

Şimdi 1, 2, 4 ve 8 etiketli çıkışları (örneğin) 8, 9, 10 ve 11 dijital pinlerine bağlamak basit bir meseledir. Ardından, girdileri okuyabilen ve BCD çıktısını ondalık sayıya dönüştürebilen bir çizime ihtiyacımız var. Aşağıdaki taslağı düşünün:

/* SAA1064 sayısal ekran kalkanı kullanır https://www.gravitech.us/7segmentshield.html SAA1064 kalkanınız yoksa seri monitör kullanır */ #include "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup() { Serial.begin(9600); Wire.begin(); // i2c veriyoluna katıl (master için isteğe bağlı adres) gecikme(500); pinMode(q1, GİRİŞ); // parmak tekeri '1' pinMode(q2, INPUT); // parmak tekeri '2' pinMode(q4, INPUT); // parmak tekeri '4' pinMode(q8, INPUT); // parmak tekerleği '8' } void dispSAA1064(int Count) // Gravitech SAA1064 shield'e 'Count' tamsayısını gönderir { const int lookup[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int Binler, Yüzler, Onlarca, Taban; Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); Wire.endTransmission(); Wire.beginTransmission(0x38); Wire.write(1); Binler = Sayı/1000; Yüzlerce = (Sayı-(Binler*1000))/100; Onlarca = (Sayı-((Binler*1000)+(Yüzler*100)))/10; Taban = Say-((Binler*1000)+(Yüzler*100)+(Onlar*10)); Wire.write(arama[Temel]); Wire.write(arama[Onlar]); Wire.write(arama[Yüzlerce]); Wire.write(arama[Binler]); Wire.endTransmission(); gecikme(10); } int readSwitch() { int toplam=0; if (digitalRead(q1)==HIGH) { toplam+=1; } if (digitalRead(q2)==HIGH) { toplam+=2; } if (digitalRead(q4)==HIGH) { toplam+=4; } if (digitalRead(q8)==HIGH) { toplam+=8; } toplam dönüş; } geçersiz döngü() { dispSAA1064(readSwitch()); // kalkanı görüntülemek için anahtar değeri gönderir Serial.println(readSwitch()); // anahtar değerini seri monitör kutusuna gönderir }

readSwitch() işlevi anahtardır. Her bir anahtar çıkışının sayısal gösterimini ekleyerek anahtarın değerini hesaplar ve sonucu olarak toplamı döndürür. Bu örnek için NXP SAA1064 tarafından kontrol edilen sayısal bir ekran kalkanı kullandık.

Adım 5:

Image
Image

readSwitch() işlevi anahtardır. Her bir anahtar çıkışının sayısal gösterimini ekleyerek anahtarın değerini hesaplar ve sonucu olarak toplamı döndürür. Bu örnek için NXP SAA1064 tarafından kontrol edilen sayısal bir ekran kalkanı kullandık.

Eğer yoksa, sorun değil – sonuçlar seri monitöre de gönderilir. Şimdi videoda eylem halinde görelim.

6. Adım:

Tamam, pek görünmüyor, ancak sayısal girişe ihtiyacınız varsa, çok fazla fiziksel alan tasarrufu sağlar ve kesin bir giriş yöntemi sunar.

İşte orada. Bunları gerçekten bir projede kullanır mıydınız? Bir basamak için - evet. Dört için? Muhtemelen hayır – belki 12 haneli bir tuş takımı kullanmak daha kolay olurdu. Bir fikir var…

7. Adım: Çoklu Anahtarlar

resim
resim

Şimdi dört hanenin nasıl okunacağını inceleyeceğiz ve bu süreçte tüm dijital pinleri boşa harcamayacağız. Bunun yerine, I2C veri yolu üzerinden iletişim kuran Microchip MCP23017 16 bit bağlantı noktası genişletici IC'yi kullanacağız. Her bir anahtarın durumunu okumak için kullanabileceğimiz on altı adet dijital giriş/çıkış pinine sahiptir.

İlerlemeden önce, bu makale için bazı varsayılan bilgilerin gerekli olduğunu lütfen unutmayın - I2C veri yolu (bir ve iki kısım) ve MCP23017. Önce donanım bağlantılarını, ardından Arduino taslağını anlatacağız. Tek anahtar örneği için kullanılan şemayı hatırlayın.

Anahtar doğrudan Arduino'ya bağlandığında, anahtarın değerini belirlemek için her bir pinin durumunu okuruz. Bunu MCP23017'yi kullanarak daha büyük ölçekte tekrar yapacağız. Pinout şemasını düşünün:

Adım 8:

Dört anahtarın bağlanmasına izin veren 16 pinimiz var. Her anahtarın ortak noktası hala 5V'a bağlanır ve her anahtar kontağının hala GND'ye 10k aşağı çekme direnci vardır. Daha sonra hane 1'in 1, 2, 4, 8 pinlerini GPBA0~3'e bağlarız; hane ikinin 1, 2, 4, 8'den GPA4~7'ye; hane üçün 1, 2, 4, 8 ila GPB0~3 ve hane dördün 1, 2, 4, 8 ila GPB4~7.

Şimdi anahtarları nasıl okuyacağız? Tüm bu teller zor olduğunu düşünmenize neden olabilir, ancak taslak oldukça basittir. GPBA ve B'nin değerini okuduğumuzda, en anlamlı bit başta olmak üzere her banka için bir bayt döndürülür. Her dört bit, eşleşen G/Ç pinlerine bağlı anahtarın ayarıyla eşleşecektir. Örneğin, her iki IO bankası için veri talep edersek ve anahtarlar 1 2 3 4 olarak ayarlanırsa – sıra A 0010 0001 ve sıra B 0100 0011 döndürür.

Her dört biti ayrı bir değişkene ayırmak için bazı bit kaydırma işlemleri kullanırız - bu da bize her basamağın değerini verir. Örneğin, dördüncü anahtarın değerini ayırmak için, B kümesinden >> 4'teki bitleri kaydırıyoruz. Bu, üçüncü anahtarın değerini dışarı itiyor ve soldaki boş bitler sıfır oluyor.

Üçüncü anahtarın değerini ayırmak için, üçüncü anahtarın değerini bırakan bir bitsel & - bileşimi kullanırız. Görüntü, ikili anahtar değerlerinin bir dökümünü gösterir - ham GPIOA ve B bayt değerlerini, ardından her basamağın ikili değerini ve ondalık değeri gösterir.

9. Adım:

Öyleyse gösteri taslağını görelim:

/* Örnek 40a - MCP23017 aracılığıyla dört itmeli BCD anahtarını okuyun, SAA1064/4-haneli 7-segment LED ekranda görüntüleyin */ // MCP23017 pinleri 15~17 - GND, I2C bus adresi 0x20 // SAA1064 I2C bus adresi 0x38 # "Wire.h" içerir // LED basamak tanımları için int basamak[16]={ 63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; bayt GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064() { //kurulum 0x38 Wire.beginTransmission(0x38); Wire.write(0); Wire.write(B01000111); // 12mA çıkış, basamak boşluğu yok Wire.endTransmission(); } geçersiz kurulum() { Serial.begin(9600); Wire.begin(); // I2C veri yolunu başlat initSAA1064(); } void loop() { // A bankasının girişlerini oku Wire.beginTransmission(0x20); Wire.write(0x12); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOA=Tel.read(); // bu bayt, basamak 1 ve 2 için anahtar verilerini içerir // banka B'nin girişlerini oku Wire.beginTransmission(0x20); Wire.write(0x13); Wire.endTransmission(); Wire.requestFrom(0x20, 1); GPIOB=Tel.read(); // bu bayt 3. ve 4. basamaklar için anahtar verilerini içerir // her anahtar için değer çıkar // dig1 LHS, dig4 RHS dig4=GPIOB >> 4; dig3=GPIOB & B00001111; dig2=GPIOA >> 4; dig1=GPIOA & B00001111; // tüm GPIO ve bireysel anahtar verilerini seri monitöre gönder // hata ayıklama ve ilgi için Serial.print("GPIOA = "); Serial.println(GPIOA, BIN); Serial.print("GPIOB = "); Serial.println(GPIOB, BIN); Seri.println(); Serial.print("hane 1 = "); Serial.println(dig1, BIN); Serial.print("hane 2 = "); Serial.println(dig2, BIN); Serial.print("hane 3 = "); Serial.println(dig3, BIN); Serial.print("hane 4 = "); Serial.println(dig4, BIN); Seri.println(); Serial.print("hane 1 = "); Seri.println(dig1, Aralık); Serial.print("hane 2 = "); Seri.println(dig2, Aralık); Serial.print("hane 3 = "); Seri.println(dig3, Aralık); Serial.print("hane 4 = "); Seri.println(dig4, Aralık); Seri.println(); // SAA1064 Wire.beginTransmission(0x38) aracılığıyla anahtar değerini LED ekrana gönder; Wire.write(1); Wire.write(rakam[dig4]); Wire.write(rakamlar[dig3]); Wire.write(rakam[dig2]); Wire.write(rakamlar[dig1]); Wire.endTransmission(); gecikme(10); gecikme(1000); }

Ve inanmayanlar için… bir video gösterimi.

İşte orada. Bir yerine dört basamak ve Arduino dijital G/Ç pinlerini koruyan I2C veriyolu üzerinden. Sekiz MCP23017'yi kullanarak aynı anda 32 rakamı okuyabilirsiniz. Bunu yaparken iyi eğlenceler!

Dünya çapında ücretsiz teslimat ile PMD Way'den çeşitli boyutlarda hem BCD hem de ondalık anahtarları sipariş edebilirsiniz.

Bu gönderi size pmdway.com tarafından getirildi - dünya çapında ücretsiz teslimat ile üreticiler ve elektronik meraklıları için her şey.

Önerilen: