Slechts drie pinnen voor een 4x3-toetsenbord
Componenten en benodigdheden
![]() |
| × | 1 | |||
![]() |
| × | 3 | |||
| × | 1 | ||||
| × | 1 | ||||
![]() |
| × | 1 |
Benodigde gereedschappen en machines
![]() |
|
Apps en online services
![]() |
|
Over dit project
Inleiding
Het doel van dit project is om het aantal pinnen dat nodig is voor een numeriek toetsenbord aanzienlijk te verminderen. Dit komt omdat we vaak veel I/O-pinnen nodig hebben in vergelijking met de pinnen die beschikbaar zijn op de Arduino Uno of Nanoboards.
De gewone numerieke toetsenborden zijn gestructureerd in matrix:een 4x3 toetsenbord vereist 4+3 Arduino digitale pinnen. Er zijn talloze bibliotheken beschikbaar op het internet om het met Arduino te gebruiken.
Mijn oplossing
De oplossing die ik voorstel is veel beter omdat het slechts drie analoge ingangen gebruikt, met een circuit zoals dat in de volgende afbeelding wordt getoond.

Voor elke kolom zijn er slechts 4 spanningswaarden, overeenkomend met elk van de 4 toetsen, plus nul volt als er geen toets wordt ingedrukt. In het equivalente schema (b) geeft de R1e een van de vier weerstanden R1-R4 aan, terwijl R2e een van de drie weerstanden R5-R7 is.
Laten we nu eens kijken hoe we de vier breedst mogelijke intervallen kunnen maken. Allereerst kunnen de weerstanden R2e =R5 =R6 =R7 gelijk worden gemaakt, dan kunnen we R1 =0 instellen om de uitgangen die overeenkomen met de eerste lijn op 5V te hebben.
Met R2=330 ohm, R3=1 k ohm, R4=3 k ohm en R5, R6, R7=1 k ohm worden de volgende intervallen voor elke uitgang verkregen:

Zoals je kunt zien, zijn de intervallen op de drie uitgangen de grootst mogelijke en kun je zes standaardweerstanden gebruiken met een tolerantie van ±5%. Met een extra analoge ingang en een andere weerstand kan een 4x4 toetsenbord worden gebruikt enzovoort. De volgende afbeelding toont de verbindingen met Arduino.

In het diagram is de weerstand R1 verbonden met lijn 2 omdat degene op lijn 1 deze met een draad heeft getekend, dus de weerstandsreferenties zijn met één geschaald. Pintoewijzingen kunnen naar behoefte worden gewijzigd, zolang ze maar analoog kunnen worden geconfigureerd.
Als Arduino wordt gevoed met 3,3 V, verandert er natuurlijk niets, omdat de ADC-converter standaard de voedingsspanning gebruikt en de ADC-nummers niet veranderen.
Om het programma te testen, zonder een toetsenbord van dit type, heb ik het gebouwd met gerecyclede toetsen, de onderstaande afbeelding toont mijn prototype. De 5-pins rechter connector wordt gebruikt om het op Arduino aan te sluiten.

Code
- Analog4x3Keybf.ino
Analog4x3Keybf.inoArduino
Eenvoudig programma om KeyPad() functie te testen/* programma Analog4x3Keybf * test voor 4x3 toetsen toetsenbord met 3 analoge uitgangen * G. Carrera - 19/11/2018 */// limieten van toetsenbord output waarden:const int NADCm100[4 ] ={923.669.412.156};const int NADCp100[4] ={1123.869.612.356};const char key[13] ={'1','4','7','C','2','5' ,'8','0','3','6','9','E'};int keyval[3];int i,colp,val;void setup(){ Serial.begin(9600); // gebruikt met seriële monitor}void loop() {char k; k =KeyPad();// lees toetsenbord als (k !='N'){ // een toets is ingedrukt Serial.print("key ="); Serieel.println(k); vertraging (500); }}/******** Functies gebruikt door programma ********/char KeyPad(){// lees toetsenbord en retourneer de char key// key ='N' voor geen KeyScan();// lees analoog toetsenbord als (keyval[0]+keyval[1]+keyval[2] <40) { return 'N'; } else { // er is een toets ingedrukt delay(10);// antibounce KeyScan();// herlees analoog toetsenbord voor (i=0; i <3; i++){//identificeer tot welke kolom het behoort als (keyval [i]> 40){ colp=ik; val=keyval[i];// dit is de corresponderende waarde voor (int j=0; j <4; j++){// identificeer welke toets is ingedrukt in de kolom if (val>=NADCm100[j] &&keyval <=NADCp100[j]){ return key[colp*4+j]; pauze; } } } } }}void KeyScan(){// lees analoog toetsenbord keyval[0]=analogRead(A0); vertraging(1); keyval [1] =analoog lezen (A1); vertraging(1); keyval [2] =analoog lezen (A2); vertraging(1); }
Schema's

Productieproces