analoge Ein- und Ausgänge

Neben den digitalen Leitungen bietet der Arduino mehrere analoge Ein- und Ausgänge.

analoge 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?

analoge Eingänge

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:

  • DEFAULT: die voreingestellte analoge Referenzspannung von 5V (bei 5V Arduinos) oder 3.3V (bei 3.3V Arduinos). Liegt dann auch am AREF Anschluss an.
  • INTERNAL: die eingebaute Referenzspannungsquelle. Normalerweise 1,1V beim ATmega328. (nicht beim Arduino Mega) Liegt dann auch am AREF Anschluss an.
  • INTERNAL1V1: die eingebaute 1,1V Referenzspannungsquelle. (nur beim Arduino Mega) Liegt dann auch am AREF Anschluss an.
  • INTERNAL2V56: die eingebaute 2,56V Referenzspannungsquelle. (nur Arduino Mega) Liegt dann auch am AREF Anschluss an.
  • EXTERNAL: Referenz eine externe Spannung, die am AREF pin eingespeist. (ACHTUNG nur von 0 bis 5V)

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)

arduino/tutorial/sprechen-sie-arduino/fertige-funktionen/analoge-ein--und-ausgaenge.txt · Zuletzt geändert: 2018/11/04 10:51 von 127.0.0.1
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0