Neben den digitalen Leitungen bietet der Arduino mehrere analoge Ein- und Ausgänge.
Die Ausgänge sind mit PWM bezeichnet. Weil dort natürlich kein echtes analoger Pegel anliegt, das kann der Arduino nicht, sondern ein pulsweitenmoduliertes Signal (Näheres findet man hier). Für viele Anwendungen ist das Signal schon so verwendbar. Beispielsweise um die Helligkeit einer LED zu verändern. Oder einen Motor zu steuern. Die Frequenz vom Arduino liegt bei ca. 500Hz. Aber das PWM Signal läßt sich auch leicht in eine echte Spannung umwandeln. Dazu reicht ein Kondensator und ein Widerstand, der dann einen sog. Tiefpass bildet. Hier die Schaltung, die ich gerne verwende:
Für weiterführendes zum Thema PWM würd ich mal hier schauen.
Ausgabe auf den Pin geht einfach mit
analogWrite(PIN,Wert);
Wert darf zwischen 0 (aus) und 255 (komplett ein) liegen. Analoge Ausgänge braucht man nicht über pinMode als Ausgang kennzeichnen. Das passiert intern automatisch.
Ausprobieren kann man das ganz einfach. Einfach mal eine LED an den Ausgang hängen und dann verschiedene Werte geben. Sieht toll aus, gell?
Die funktionieren wie erwartet. Eine Spannung am Eingang wird in eine Zahl von 0..1023 umgewandelt. (10-Bit Auflösung). Dabei ist 0V = 0 und 5V=1023.
int wert = analogRead(PIN);
Pin geht von 0..5. (Oder je nach Boardmehr oder weniger.)
Man kann die obere Schranke (5V) auch anders einstellen (jedoch nicht höher als 5V) Dafür gibt es die Funktion
analogReference(Modus);
Modus kann einen der folgenden Werte annehmen:
Eine Wandlung dauert ca. 100msec. D.h. man kann maximal theoretisch 10.000 Wandlungen pro Sekunde vornehmen.
Wichtig bei der internen Referenz: Wenn man Probleme hat mit zus. Rauschen, d.h. wenn die Werte stark wechseln, sollte man zwischen dem AREF Pin und GND einen Kondensator schalten. Ich benutze einen 220nF Keramikkondensator.
Beispiel gefällig, aber gerne doch:
Zunächst eine Testschaltung
und hier mal eine Anwendung für eine analoge Tastatur.
Und nun das dazugehörige Programm:
/* Introduction The keypad consists of 5 keys: select, up, right, down and left. To save the digital IO pins, the keypad interface uses only one ADC channel. The key value is read through a 5 stage voltage divider. Pin Allocation Pin Function Analog 0 Button (select, up, right, down and left) */ // //Key message char msgs[5][15] = { "Right Key OK ", "Up Key OK ", "Down Key OK ", "Left Key OK ", "Select Key OK" }; int adc_key_val[5] ={ 30, 150, 360, 535, 760 }; int NUM_KEYS = 5; int adc_key_in; int key=-1; int oldkey=-1; void setup() { // Serielle Schnittstelle einstellen Serial.begin(19200); Serial.flush(); pinMode(13, OUTPUT); //we'll use the debug LED to output a heartbeat } unsigned long RcValue = 0; void loop() { adc_key_in = analogRead(0); // read the value from the sensor digitalWrite(13, HIGH); key = get_key(adc_key_in); // convert into key press if (key != oldkey) // if keypress is detected { delay(50); // wait for debounce time adc_key_in = analogRead(0); // read the value from the sensor key = get_key(adc_key_in); // convert into key press if (key != oldkey) { oldkey = key; if (key >=0){ Serial.println(msgs[key]); } } } digitalWrite(13, LOW); } // Convert ADC value to key number int get_key(unsigned int input) { int k; for (k = 0; k < NUM_KEYS; k++) { if (input < adc_key_val[k]) { return k; } } if (k >= NUM_KEYS) k = -1; // No valid key pressed return k; }
Statt 5 digitale Leitungen für die 5 Taster zu „verschwenden“ nehmen wir einfach einen analogen Eingang. Je nach Spannung wissen wir, welche Taste gedrückt worden ist.Das kann zwar noch erweitern, jedoch wird es dann immer schwieriger die Tatse einwandfrei zu identifizieren. Denn sowohl die Widerstände haben Toleranzen wie auch der A/D Wandler wie auch die Spannungsversorgung. Das alles addiert sich und deswegen ist bei dem einen die Taste für DOWN bei 350, beim anderen schon bei 300. Wenn man das für sich selber macht, kann man ja die Werte entsprechend anpassen. Bei der veröffentlichung würde ich zumindest drauf hinweisen, wie man das kalibriert. Bei 5 Tasten sollte das aber bei jedem funktionieren.
(Quelle: diverse Quellen, wurde mit in dem „Arduino LCD Keypad shield schematic“ veröffentlicht)