In unserem vorherigen Blogbeitrag haben wir gezeigt wie man unser AZ-Delivery Keypad in Betrieb nimmt und die 16 Keys richtig zuweist. In unserem nächsten Beispiel wollen wir einen kreativen Einsatz des Keypads zusammen mit einem passiven Buzzer vorstellen. Wir orientieren uns am Beispiel Keypad_Piano auf arduino.cc. Die Pinbelegung können wir in diesem Beispiel vernachlässigen da diese beliebig gemapt werden können, dafür zeigen wir einen interessanten weg, zwischen hinterlegten PWM-Frequenzen mithilfe von zwei, als timer genutzen 8-bit Schieberegistern im 328P zu wechseln.
Dieses Projekt ist für Fortgeschrittene Benutzer gedacht, da tiefer Kenntnisse über den 328P erforderlich sind (Timer & Register)
Dazu brauchen wir:
Zuerst verbinden wir folgende Pins:
- Keypad Pin 1 - 8 an Uno Pin 2 - 9
- den Buzzer versorgen wir mit 5V und GND vom Uno und den mit "S" markierten Pin auf Pin 11
Und so sieht unser Code aus:
//Pinbelegung für das Keypad #define c3 9 #define c2 8 #define c1 7 #define c0 6 #define r3 5 #define r2 4 #define r1 3 #define r0 2 void setup() { Serial.begin(9600); pinMode(c0,INPUT_PULLUP); pinMode(c1,INPUT_PULLUP); pinMode(c2,INPUT_PULLUP); pinMode(c3,INPUT_PULLUP); pinMode(r0,OUTPUT); pinMode(r1,OUTPUT); pinMode(r2,OUTPUT); pinMode(r3,OUTPUT); pinMode(11,OUTPUT); //für unser Buzzer Modul } void loop(){ digitalWrite(r0,LOW); digitalWrite(r1,HIGH); digitalWrite(r2,HIGH); digitalWrite(r3,HIGH); if(digitalRead(c0)==LOW){ TCCR2A = B01000011; //Frequenzzuweisung TCCR2B = B00001110; //erfolgt hier OCR2A=119; //mithilfe des Register und der Taktfrequenz delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c1)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=106; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c2)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=94; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c3)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=89; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} digitalWrite(r0,HIGH); digitalWrite(r1,LOW); digitalWrite(r2,HIGH); digitalWrite(r3,HIGH); if(digitalRead(c0)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=79; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c1)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=71; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c2)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=63; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c3)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=59; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} digitalWrite(r0,HIGH); digitalWrite(r1,HIGH); digitalWrite(r2,LOW); digitalWrite(r3,HIGH); if(digitalRead(c0)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=25; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c1)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=20; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if (digitalRead(c2)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=10; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c3)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=50; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} digitalWrite(r0,HIGH); digitalWrite(r1,HIGH); digitalWrite(r2,HIGH); digitalWrite(r3,LOW); if(digitalRead(c0)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=50; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c1)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=50; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c2)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=50; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} else if(digitalRead(c3)==LOW){ TCCR2A = B01000011; TCCR2B = B00001110; OCR2A=50; delay(100); TCCR2B=B00001000; TCCR2A = B00000000; digitalWrite(11,LOW);} } //Mithilfe der Formel: Hz = 16MHz/prescalar/(OCRA+1)/2
//lassen sich so PWM Frequenzen von bis zu 8MHz erzeugen
Viel Spass beim Basteln und bis zum nächsten mal :-)