Daftar Isi:

Switch Arduino dan Thumbwheel: 9 Langkah
Switch Arduino dan Thumbwheel: 9 Langkah

Video: Switch Arduino dan Thumbwheel: 9 Langkah

Video: Switch Arduino dan Thumbwheel: 9 Langkah
Video: Thumb wheel switch program 2024, November
Anonim
Switch Arduino dan Thumbwheel
Switch Arduino dan Thumbwheel

Pada artikel ini kami memeriksa penggunaan sakelar push-wheel/thumbwheel dengan sistem Arduino kami. Berikut adalah beberapa contoh yang bersumber dari PMD Way.

Langkah 1:

Gambar
Gambar

Untuk yang belum tahu, setiap sakelar adalah satu segmen vertikal dan mereka dapat dihubungkan bersama untuk membentuk berbagai ukuran. Anda dapat menggunakan tombol untuk memilih dari angka nol hingga sembilan. Ada alternatif yang tersedia yang memiliki roda yang dapat Anda gerakkan dengan ibu jari alih-alih tombol naik/turun.

Sebelum zaman antarmuka pengguna yang mewah, sakelar ini adalah metode yang cukup populer untuk mengatur entri data numerik. Namun mereka masih tersedia hari ini, jadi mari kita lihat bagaimana mereka bekerja dan bagaimana kita dapat menggunakannya. Nilai sakelar tersedia melalui desimal berkode biner atau desimal lurus. Perhatikan bagian belakang sakelar dalam bentuk BCD.

Langkah 2:

Gambar
Gambar

Kami memiliki kesamaan di sebelah kiri, kemudian kontak untuk 1, 2, 4 dan 8. Jika Anda menerapkan tegangan kecil (katakanlah 5V) ke umum, nilai sakelar dapat diukur dengan menambahkan nilai kontak yang ada di keadaan TINGGI. Misalnya, jika Anda memilih 3 – kontak 1 dan 2 akan berada pada tegangan yang sama. Nilai antara nol dan sembilan dapat direpresentasikan seperti itu dalam tabel.

Langkah 3:

Gambar
Gambar

Sekarang Anda harus menyadari bahwa akan mudah untuk membaca nilai sakelar – dan Anda benar, memang demikian. Kita dapat menghubungkan 5V ke common, output ke pin input digital papan Arduino kita, kemudian menggunakan digitalRead() untuk menentukan nilai setiap output. Dalam sketsa kami menggunakan beberapa matematika dasar untuk mengubah nilai BCD menjadi angka desimal. Jadi mari lakukan itu sekarang.

Dari perspektif perangkat keras, kita perlu mempertimbangkan satu hal lagi – sakelar roda dorong berperilaku secara elektrik seperti empat tombol tekan yang biasanya terbuka. Ini berarti kita perlu menggunakan resistor pull-down untuk memiliki perbedaan yang jelas antara status tinggi dan rendah. Jadi skema untuk satu sakelar adalah seperti yang ditunjukkan di atas.

Langkah 4:

Sekarang mudah untuk menghubungkan output berlabel 1, 2, 4, dan 8 ke (misalnya) pin digital 8, 9, 10 dan 11. Hubungkan 5V ke titik sakelar 'C', dan GND ke … GND. Selanjutnya, kita perlu memiliki sketsa yang dapat membaca input dan mengubah output BCD menjadi desimal. Perhatikan sketsa berikut:

/* Menggunakan pelindung tampilan numerik SAA1064 https://www.gravitech.us/7segmentshield.html Menggunakan monitor serial jika Anda tidak memiliki pelindung SAA1064 */ #termasuk "Wire.h" #define q1 8 #define q2 9 # define q4 10 #define q8 11 void setup() { Serial.begin(9600); Kawat.mulai(); // bergabung dengan i2c bus (alamat opsional untuk master) delay(500); pinMode(q1, INPUT); // thumbwheel '1' pinMode(q2, INPUT); // thumbwheel '2' pinMode(q4, INPUT); // thumbwheel '4' pinMode(q8, INPUT); // thumbwheel '8' } void dispSAA1064(int Count) // mengirim integer 'Count' ke Gravitech SAA1064 shield { const int lookup[10] = { 0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F }; int Ribuan, Ratusan, Puluhan, Basis; Wire.beginTransmission (0x38); Kawat.tulis(0); Wire.write(B01000111); Kawat.endTransmisi(); Wire.beginTransmission (0x38); Kawat.tulis(1); Ribuan = Hitung/1000; Ratusan = (Hitung-(Ribuan*1000))/100; Puluhan = (Hitung-((Ribuan*1000)+(Ratusan*100)))/10; Basis = Hitung-((Ribuan*1000)+(Ratusan*100)+(Puluhan*10)); Wire.write(lookup[Base]); Wire.write(lookup[Puluhan]); Wire.write(lookup[Ratusan]); Wire.write(lookup[Ribuan]); Kawat.endTransmisi(); penundaan (10); } int readSwitch() { int total=0; if (DigitalBaca(q1)==TINGGI) { total+=1; } if (DigitalBaca(q2)==TINGGI) { total+=2; } if (DigitalBaca(q4)==TINGGI) { total+=4; } if (digitalRead(q8)==HIGH) { total+=8; } mengembalikan total; } void loop() { dispSAA1064(readSwitch()); // mengirimkan nilai switch untuk menampilkan shield Serial.println(readSwitch()); // mengirimkan nilai sakelar ke kotak monitor serial }

Fungsi readSwitch() adalah kuncinya. Ini menghitung nilai sakelar dengan menambahkan representasi numerik dari setiap keluaran sakelar dan mengembalikan total sebagai hasilnya. Untuk contoh ini kami menggunakan pelindung tampilan numerik yang dikendalikan oleh NXP SAA1064.

Langkah 5:

Image
Image

Fungsi readSwitch() adalah kuncinya. Ini menghitung nilai sakelar dengan menambahkan representasi numerik dari setiap keluaran sakelar dan mengembalikan total sebagai hasilnya. Untuk contoh ini kami menggunakan pelindung tampilan numerik yang dikendalikan oleh NXP SAA1064.

Jika Anda tidak memilikinya, tidak apa-apa – hasilnya juga dikirim ke monitor serial. Sekarang, mari kita lihat aksinya di video.

Langkah 6:

Oke itu tidak terlihat banyak, tetapi jika Anda memerlukan entri numerik, ini menghemat banyak ruang fisik dan menawarkan metode entri yang tepat.

Jadi di sana Anda memilikinya. Apakah Anda benar-benar akan menggunakan ini dalam sebuah proyek? Untuk satu digit – ya. Untuk empat? Mungkin tidak – mungkin akan lebih mudah menggunakan keypad 12 digit. Ada ide…

Langkah 7: Beberapa Sakelar

Gambar
Gambar

Sekarang kita akan memeriksa cara membaca empat digit – dan tidak menyia-nyiakan semua pin digital itu dalam prosesnya. Sebagai gantinya, kami akan menggunakan IC port expander 16-bit Microchip MCP23017 yang berkomunikasi melalui bus I2C. Ini memiliki enam belas pin input/output digital yang dapat kita gunakan untuk membaca status setiap sakelar.

Sebelum melanjutkan, harap perhatikan bahwa beberapa asumsi pengetahuan diperlukan untuk artikel ini – bus I2C (bagian satu dan dua) dan MCP23017. Kami pertama-tama akan menjelaskan koneksi perangkat keras, dan kemudian sketsa Arduino. Ingat skema yang digunakan untuk contoh sakelar tunggal.

Ketika sakelar terhubung langsung ke Arduino, kami membaca status setiap pin untuk menentukan nilai sakelar. Kami akan melakukan ini lagi, dalam skala yang lebih besar menggunakan MCP23017. Perhatikan diagram pinout:

Langkah 8:

Kami memiliki 16 pin, yang memungkinkan empat sakelar dihubungkan. Commons untuk setiap sakelar masih terhubung ke 5V, dan setiap kontak sakelar masih memiliki resistor pull-down 10k ke GND. Kemudian kita hubungkan 1, 2, 4, 8 pin digit satu ke GPBA0~3; angka dua 1, 2, 4, 8 hingga IPK4~7; angka tiga 1, 2, 4, 8 ke GPB0~3 dan angka empat 1, 2, 4, 8 ke GPB4~7.

Sekarang bagaimana kita membaca sakelar? Semua kabel itu mungkin membuat Anda berpikir itu sulit, tetapi sketsanya cukup sederhana. Ketika kita membaca nilai GPBA dan B, satu byte dikembalikan untuk setiap bank, dengan bit yang paling signifikan terlebih dahulu. Setiap empat bit akan cocok dengan pengaturan sakelar yang terhubung ke pin I/O yang cocok. Misalnya, jika kami meminta data untuk kedua bank IO dan sakelar disetel ke 1 2 3 4 – bank A akan mengembalikan 0010 0001 dan bank B akan mengembalikan 0100 0011.

Kami menggunakan beberapa operasi bitshift untuk memisahkan setiap empat bit menjadi variabel terpisah – yang meninggalkan kami dengan nilai setiap digit. Misalnya, untuk memisahkan nilai sakelar empat, kita menggeser bit dari bank B >> 4. Ini mendorong nilai sakelar tiga keluar, dan bit kosong di sebelah kiri menjadi nol.

Untuk memisahkan nilai sakelar tiga, kami menggunakan gabungan bitwise & – yang meninggalkan nilai sakelar tiga. Gambar menunjukkan perincian nilai sakelar biner - ini menunjukkan nilai byte GPIOA dan B mentah, kemudian nilai biner setiap digit, dan nilai desimal.

Langkah 9:

Jadi mari kita lihat sketsa demonstrasi:

/* Contoh 40a - Membaca empat sakelar BCD pushwheel melalui MCP23017, ditampilkan pada layar LED 7-segmen SAA1064/4-digit */ // MCP23017 pin 15~17 ke GND, alamat bus I2C adalah 0x20 // Alamat bus SAA1064 I2C 0x38 # sertakan "Wire.h" // untuk definisi digit LED int digits[16]={ 63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; byte GPIOA, GPIOB, dig1, dig2, dig3, dig4; void initSAA1064() { //setup 0x38 Wire.beginTransmission(0x38); Kawat.tulis(0); Wire.write(B01000111); // Output 12mA, tidak ada digit yang kosong Wire.endTransmission(); } batalkan pengaturan() { Serial.begin(9600); Kawat.mulai(); // mulai bus I2C initSAA1064(); } void loop() { // membaca input dari bank A Wire.beginTransmission(0x20); Kawat.tulis (0x12); Kawat.endTransmisi(); Wire.requestFrom(0x20, 1); GPIOA=Kabel.baca(); // byte ini berisi data switch untuk digit 1 dan 2 // membaca input dari bank B Wire.beginTransmission(0x20); Kawat.tulis (0x13); Kawat.endTransmisi(); Wire.requestFrom(0x20, 1); GPIOB=Kabel.baca(); // byte ini berisi data sakelar untuk digit 3 dan 4 // ekstrak nilai untuk setiap sakelar // dig1 LHS, dig4 RHS dig4=GPIOB >> 4; dig3=GPIOB & B00001111; dig2=GPIOA >> 4; dig1=GPIOA & B00001111; // kirim semua GPIO dan data switch individual ke monitor serial // untuk debug dan kepentingan Serial.print("GPIOA = "); Serial.println(GPIOA, BIN); Serial.print("GPIOB = "); Serial.println(GPIOB, BIN); Serial.println(); Serial.print("angka 1 = "); Serial.println(dig1, BIN); Serial.print("angka 2 = "); Serial.println(dig2, BIN); Serial.print("angka 3 = "); Serial.println(dig3, BIN); Serial.print("angka 4 = "); Serial.println(dig4, BIN); Serial.println(); Serial.print("angka 1 = "); Serial.println(dig1, DES); Serial.print("angka 2 = "); Serial.println(dig2, DEC); Serial.print("angka 3 = "); Serial.println(dig3, DEC); Serial.print("angka 4 = "); Serial.println(dig4, DEC); Serial.println(); // kirim nilai sakelar ke tampilan LED melalui SAA1064 Wire.beginTransmission(0x38); Kawat.tulis(1); Wire.write(digit[dig4]); Wire.write(digit[dig3]); Wire.write(digit[dig2]); Wire.write(digit[dig1]); Kawat.endTransmisi(); penundaan (10); penundaan (1000); }

Dan untuk orang-orang yang tidak percaya … demonstrasi video.

Jadi di sana Anda memilikinya. Empat digit, bukan satu, dan melalui bus I2C menghemat pin I/O digital Arduino. Menggunakan delapan MCP23017 Anda bisa membaca 32 digit sekaligus. Bersenang-senang dengan melakukan itu!

Anda dapat memesan sakelar BCD dan desimal dalam berbagai ukuran dari PMD Way, dengan pengiriman gratis ke seluruh dunia.

Posting ini dipersembahkan oleh pmdway.com – semuanya untuk pembuat dan penggemar elektronik, dengan pengiriman gratis ke seluruh dunia.

Direkomendasikan: