Isi kandungan:

Suis Arduino dan Thumbwheel: 9 Langkah
Suis Arduino dan Thumbwheel: 9 Langkah

Video: Suis Arduino dan Thumbwheel: 9 Langkah

Video: Suis Arduino dan Thumbwheel: 9 Langkah
Video: Тестовый регулировочный переключатель | Функция регулировочного переключателя BCD 2024, Julai
Anonim
Suis Arduino dan Thumbwheel
Suis Arduino dan Thumbwheel

Dalam artikel ini kami mengkaji penggunaan sakelar roda tolak / roda putar dengan sistem Arduino kami. Berikut adalah beberapa contoh yang diperoleh dari PMD Way.

Langkah 1:

Imej
Imej

Bagi yang belum tahu, setiap suis adalah satu segmen menegak dan mereka boleh dihubungkan bersama untuk membentuk pelbagai ukuran. Anda boleh menggunakan butang untuk memilih dari angka sifar hingga sembilan. Ada alternatif yang ada yang memiliki roda yang dapat anda gerakkan dengan ibu jari dan bukannya butang kenaikan / penurunan.

Sebelum hari-hari antara muka pengguna mewah, suis ini merupakan kaedah yang cukup popular untuk menetapkan kemasukan data berangka. Walau bagaimanapun, ia masih tersedia hari ini, jadi mari kita lihat bagaimana ia berfungsi dan bagaimana kita dapat menggunakannya. Nilai suis disediakan melalui perpuluhan berkod binari atau perpuluhan lurus. Perhatikan bahagian belakang suis dalam bentuk BCD.

Langkah 2:

Imej
Imej

Kita mempunyai persamaan di sebelah kiri, kemudian kenalan untuk 1, 2, 4 dan 8. Sekiranya anda menggunakan voltan kecil (katakanlah 5V) untuk umum, nilai suis dapat diukur dengan menambahkan nilai kenalan yang ada di Keadaan TINGGI. Sebagai contoh, jika anda memilih 3 - kenalan 1 dan 2 akan sama pada voltan. Nilai antara sifar dan sembilan dapat ditunjukkan seperti dalam jadual.

Langkah 3:

Imej
Imej

Sekarang anda harus sedar bahawa mudah untuk membaca nilai suis - dan anda betul, betul. Kita boleh menghubungkan 5V ke yang biasa, output ke pin input digital dari papan Arduino kami, kemudian menggunakan digitalRead () untuk menentukan nilai setiap output. Dalam lakaran kami menggunakan beberapa matematik asas untuk menukar nilai BCD menjadi nombor perpuluhan. Jadi mari kita buat sekarang.

Dari perspektif perkakasan, kita perlu mengambil kira satu perkara lagi - suis roda tolak berkelakuan elektrik seperti empat butang tekan yang biasanya terbuka. Ini bermaksud kita perlu menggunakan perintang tarik untuk mempunyai perbezaan yang jelas antara keadaan tinggi dan rendah. Jadi skema untuk satu suis adalah seperti yang ditunjukkan di atas.

Langkah 4:

Sekarang adalah perkara mudah untuk menyambungkan output yang berlabel 1, 2, 4, dan 8 ke (misalnya) pin digital 8, 9, 10 dan 11. Sambungkan 5V ke titik suis ‘C’, dan GND ke… GND. Seterusnya, kita perlu mempunyai lakaran yang dapat membaca input dan menukar output BCD menjadi perpuluhan. Pertimbangkan lakaran berikut:

/ * Menggunakan pelindung paparan berangka SAA1064 https://www.gravitech.us/7segmentshield.html Menggunakan monitor bersiri jika anda tidak mempunyai perisai SAA1064 * / #masuk "Wire.h" #define q1 8 #define q2 9 # tentukan q4 10 #tentukan q8 11 penyediaan tidak sah () {Serial.begin (9600); Wire.begin (); // sertai penundaan bas i2c (alamat pilihan untuk master) (500); pinMode (q1, INPUT); // thumbwheel '1' pinMode (q2, INPUT); // thumbwheel '2' pinMode (q4, INPUT); // thumbwheel '4' pinMode (q8, INPUT); // thumbwheel '8'} batal dispSAA1064 (int Count) // menghantar integer 'Count' ke perisai Gravitech SAA1064 {const int lookup [10] = {0x3F, 0x06, 0x5B, 0x4F, 0x66, 0x6D, 0x7D, 0x07, 0x7F, 0x6F}; int Ribuan, Ratusan, Puluhan, Pangkalan; Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); Wire.endTransmission (); Wire.beginTransmission (0x38); Wire.write (1); Ribuan = Kira / 1000; Ratusan = (Kiraan- (Ribuan * 1000)) / 100; Berpuluh = (Kira - ((Ribuan * 1000) + (Ratusan * 100))) / 10; Pangkalan = Kira - ((Ribuan * 1000) + (Ratusan * 100) + (Puluhan * 10)); Wire.write (lookup [Base]); Wire.write (carian [Berpuluh]); Wire.write (carian [Ratusan]); Wire.write (carian [Ribuan]); Wire.endTransmission (); kelewatan (10); } int readSwitch () {int total = 0; jika (digitalRead (q1) == TINGGI) {total + = 1; } jika (digitalRead (q2) == TINGGI) {total + = 2; } jika (digitalRead (q4) == TINGGI) {total + = 4; } jika (digitalRead (q8) == TINGGI) {jumlah + = 8; } jumlah pulangan; } gelung void () {dispSAA1064 (readSwitch ()); // menghantar nilai suis ke paparan perisai Serial.println (readSwitch ()); // menghantar nilai suis ke kotak monitor bersiri}

Fungsi readSwitch () adalah kuncinya. Ia menghitung nilai suis dengan menambahkan perwakilan numerik setiap output suis dan mengembalikan jumlah hasilnya. Untuk contoh ini, kami menggunakan perisai paparan berangka yang dikendalikan oleh NXP SAA1064.

Langkah 5:

Image
Image

Fungsi readSwitch () adalah kuncinya. Ia menghitung nilai suis dengan menambahkan perwakilan numerik setiap output suis dan mengembalikan jumlah hasilnya. Untuk contoh ini, kami menggunakan perisai paparan berangka yang dikendalikan oleh NXP SAA1064.

Sekiranya anda tidak memilikinya, tidak mengapa - hasilnya juga dihantar ke monitor bersiri. Sekarang, mari kita lihat dalam tindakan dalam video.

Langkah 6:

Baiklah, nampaknya tidak banyak, tetapi jika anda memerlukan entri berangka, ia akan menjimatkan banyak ruang fizikal dan menawarkan kaedah masuk yang tepat.

Jadi di sana anda memilikinya. Adakah anda benar-benar menggunakannya dalam projek? Untuk satu digit - ya. Untuk empat? Mungkin tidak - mungkin lebih senang menggunakan papan kekunci 12 digit. Ada idea …

Langkah 7: Suis Berganda

Imej
Imej

Sekarang kita akan mengkaji cara membaca empat digit - dan tidak membuang semua pin digital dalam prosesnya. Sebagai gantinya, kami akan menggunakan IC pengembang port Microchip MCP23017 16-bit yang berkomunikasi melalui bas I2C. Ia mempunyai enam belas pin input / output digital yang dapat kita gunakan untuk membaca status setiap suis.

Sebelum melangkah ke hadapan, harap maklum bahawa diperlukan beberapa pengetahuan yang diandaikan untuk artikel ini - bas I2C (bahagian satu dan dua) dan MCP23017. Kami pertama akan menerangkan sambungan perkakasan, dan kemudian lakaran Arduino. Ingat skema yang digunakan untuk contoh suis tunggal.

Apabila suis disambungkan secara langsung ke Arduino, kami membaca status setiap pin untuk menentukan nilai suis. Kami akan melakukan ini lagi, pada skala yang lebih besar menggunakan MCP23017. Pertimbangkan gambarajah pinout:

Langkah 8:

Kami mempunyai 16 pin, yang membolehkan empat suis disambungkan. Commons untuk setiap suis masih menyambung ke 5V, dan setiap kenalan suis masih mempunyai resistor pull-down 10k ke GND. Kemudian kita sambungkan 1, 2, 4, 8 pin digit satu ke GPBA0 ~ 3; digit dua 1, 2, 4, 8 hingga GPA4 ~ 7; digit tiga 1, 2, 4, 8 hingga GPB0 ~ 3 dan digit empat 1, 2, 4, 8 hingga GPB4 ~ 7.

Sekarang bagaimana kita membaca suis? Semua wayar itu boleh menyebabkan anda menganggapnya sukar, tetapi lakarannya agak mudah. Apabila kami membaca nilai GPBA dan B, satu bait dikembalikan untuk setiap bank, dengan bit yang paling penting terlebih dahulu. Setiap empat bit akan sesuai dengan tetapan suis yang disambungkan ke pin I / O yang sepadan. Sebagai contoh, jika kita meminta data untuk kedua-dua bank IO dan suis ditetapkan ke 1 2 3 4 - bank A akan mengembalikan 0010 0001 dan bank B akan mengembalikan 0100 0011.

Kami menggunakan beberapa operasi pertukaran bit untuk memisahkan setiap empat bit menjadi pemboleh ubah yang berasingan - yang menjadikan kami nilai setiap digit. Sebagai contoh, untuk memisahkan nilai suis empat, kita mengalihkan bit dari bank B >> 4. Ini mendorong nilai suis tiga keluar, dan bit kosong di sebelah kiri menjadi sifar.

Untuk memisahkan nilai bagi suis tiga, kami menggunakan sebatian bitwise & - yang meninggalkan nilai beralih tiga. Gambar menunjukkan perincian nilai suis binari - ia menunjukkan nilai baku GPIOA dan B, kemudian nilai binari setiap digit, dan nilai perpuluhan.

Langkah 9:

Oleh itu, mari kita lihat lakaran demonstrasi:

/ * Contoh 40a - Baca empat suis BCD tekan roda melalui MCP23017, paparan pada paparan LED SAA1064 / 4-digit 7-segmen * / // pin MCP23017 15 ~ 17 hingga GND, alamat bas I2C adalah 0x20 // alamat bas SAA1064 I2C 0x38 # sertakan "Wire.h" // untuk definisi digit LED int digit [16] = {63, 6, 91, 79, 102, 109, 125, 7, 127, 111, 119, 124, 57, 94, 121, 113 }; bait GPIOA, GPIOB, dig1, dig2, dig3, dig4; batal initSAA1064 () {// persediaan 0x38 Wire.beginTransmission (0x38); Wire.write (0); Wire.write (B01000111); // Output 12mA, tiada digit yang mengosongkan Wire.endTransmission (); } batal persediaan () {Serial.begin (9600); Wire.begin (); // memulakan bas I2C initSAA1064 (); } gelung kosong () {// baca input bank A Wire.beginTransmission (0x20); Wire.write (0x12); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOA = Wire.read (); // bait ini mengandungi pertukaran data untuk digit 1 dan 2 // baca input bank B Wire.beginTransmission (0x20); Wire.write (0x13); Wire.endTransmission (); Wire.requestFrom (0x20, 1); GPIOB = Wire.read (); // bait ini mengandungi data suis untuk digit 3 dan 4 // nilai ekstrak untuk setiap suis // dig1 LHS, dig4 RHS dig4 = GPIOB >> 4; dig3 = GPIOB & B00001111; dig2 = GPIOA >> 4; dig1 = GPIOA & B00001111; // hantar semua data pertukaran GPIO dan individu ke monitor bersiri // untuk debug dan kepentingan Serial.print ("GPIOA ="); Serial.println (GPIOA, BIN); Serial.print ("GPIOB ="); Serial.println (GPIOB, BIN); Bersiri.println (); Serial.print ("digit 1 ="); Serial.println (dig1, BIN); Serial.print ("digit 2 ="); Serial.println (dig2, BIN); Serial.print ("digit 3 ="); Serial.println (dig3, BIN); Serial.print ("digit 4 ="); Serial.println (dig4, BIN); Bersiri.println (); Serial.print ("digit 1 ="); Serial.println (dig1, DEC); Serial.print ("digit 2 ="); Serial.println (dig2, DEC); Serial.print ("digit 3 ="); Serial.println (dig3, DEC); Serial.print ("digit 4 ="); Serial.println (dig4, DEC); Bersiri.println (); // hantar nilai suis ke paparan LED melalui SAA1064 Wire.beginTransmission (0x38); Wire.write (1); Wire.write (digit [dig4]); Wire.write (digit [dig3]); Wire.write (digit [dig2]); Wire.write (digit [dig1]); Wire.endTransmission (); kelewatan (10); kelewatan (1000); }

Dan untuk orang yang tidak beriman … demonstrasi video.

Jadi di sana anda memilikinya. Empat digit bukannya satu, dan di atas bas I2C memelihara pin I / O digital Arduino. Dengan menggunakan lapan MCP23017, anda dapat membaca 32 digit sekaligus. Bersenang-senang dengan melakukan itu!

Anda boleh memesan suis BCD dan perpuluhan dalam pelbagai saiz dari PMD Way, dengan penghantaran percuma ke seluruh dunia.

Catatan ini disampaikan kepada anda oleh pmdway.com - semuanya untuk pembuat dan peminat elektronik, dengan penghantaran percuma ke seluruh dunia.

Disyorkan: