Arduino als einfaches Messgerät


Eigentlich hatte ich einen anderen Text bereits fertig, aber der passte nicht mehr zu dem folgenden Inhalt.
Diesmal geht’s darum einen Arduino als Messgerät einzusetzen und den PC als Anzeigegerät. Natürlich mit dem Ziel eine größere Anwendung zu schreiben, mit welcher man die Messungen aufzeichnen kann.

 

Benötigt

  • Arduino
  • Breadboard
  • 2x 10kOhm Widerstände
  • 3x Jumper Kabel
  • Eine Anwendung, mit der man die Messungen loggen kann

 

Anforderung

Mit einem Arduino soll eine Spannung an einem Step-Down Modul gemessen werden, welches ich in meinem Crawler verwende. Da die Spannung auch höher als 5V sein kann, muss ein Spannungsteiler eingesetzt werden, der die zu erwartenden Spannung abdeckt. Um aktiv das Spannungsgeschehen zu beobachten, soll das Messergebnis auf dem PC wieder gegeben werden.

 

Arduino als Messgerät

Für ein einfaches Messgerät werden grundsätzlich zwei Widerstände benötigt. Zwar kann man auch direkt messen, aber das schränkt den Messbereich stark ein. In meinem Fall könnte die Spannung bei 7,4V hoch gehen und vielleicht auch drüber. Zudem soll mit den Widerständen auch der Strom begrenzt werden, dass zudem den Arduino vom Durchbrennen schützen soll.

 

Bevor eine Messung stattfindet, wird ein kleines Arduino Programm benötigt, mit dem wir auf dem Serial Monitor einen Wert ausgeben können.

 

 #define PIN_Input A0  
 void setup() {  
  Serial.begin(115200);  
  pinMode(PIN_Input, INPUT);  
 }  
 void loop() {  
  int16_t rawMeasurement = analogRead(PIN_Input);  
  byte ba[3];  
  ba[0] = (byte)((rawMeasurement >> 8) & 0xff);  
  ba[1] = (byte)(rawMeasurement & 0xff);  
  ba[2] = (byte)CountBits(rawMeasurement);  
  Serial.write(ba, 3);  
  delay(20);  
 }  
 int8_t CountBits(int16_t rawMeasurement) {  
  int8_t result = 0;  
  for(int i = 0; i < 16; i++) {  
   result += (int8_t)bitRead(rawMeasurement, i);  
  }  
  return result;  
 } 

 

Simple Consolen Anwendung

Der simple Aufbau ist zunächst ein Vorläufer zu meiner eigentlichen kleinen Anwendung. Die Auswahl des seriellen Port hätte man auch weg lassen können, aber auf den Komfort wollte ich dann doch nicht verzichten.

 

class Program  
 {  
   private static int _rawValue;  
   private static int _divisorValue = 511;  
   private static float _voltage;  
   static void Main(string[] args)  
   {  
     Console.WriteLine("Connect Serial with");  
     string[] ports = SerialPort.GetPortNames();  
     if(!ports.Any()) {  
       Console.WriteLine("No Arduino connected!");  
       return;  
     }  
     for (int index = 0; index < ports.Length; index++) {  
       Console.WriteLine($"Index:{index}, Port: {ports[index]}");  
     }  
     string selectindex = Console.ReadLine();  
     if (!int.TryParse(selectindex, out int indexResult)) {  
       Console.WriteLine("You can only typ the index number!");  
       return;  
     }  
     if(indexResult >= ports.Length) {  
       Console.WriteLine("You can only typ the index number!");  
       return;  
     }  
     var sp = new SerialPort(ports[indexResult], 115200);  
     sp.DataReceived += Sp_DataReceived;  
     sp.Open();  
     while (true) {  
       Console.Clear();  
       Console.WriteLine($"{_rawValue} / {_divisorValue} * 5.0 = {_voltage:N2} V");  
       Thread.Sleep(1000);  
     }  
   }  
   private static void Sp_DataReceived(object sender, SerialDataReceivedEventArgs e)  
   {  
     var sp = (SerialPort)sender;  
     byte[] buffer = new byte[3];  
     if (sp.Read(buffer, 0, 3) != 0) {  
       int result = (buffer[0] << 8) | buffer[1];  
       var b = new BitArray(new int[] { result });  
       bool[] bits = new bool[b.Count];  
       b.CopyTo(bits, 0);  
       if (bits.Sum(s => s ? 1 : 0) != buffer[2])  
       {  
         return;  
       }  
       _rawValue = result;  
       _voltage = result / (float)_divisorValue * 5.0f;  
     }  
   }  
 } 

 

Divisor festlegen

Man bekommt zunächst einen Rohwert, der zunächst nichts aussagt. Würde man direkt die 5V Pin vom Arduino abgreifen und am Eingangspin A0 anschließen, bekäme man einen Wert von 1024. Dieser Wert muss durch 1024 geteilt und dann mit 5,0 Volt multipliziert werden.

 

Spannung = Rohmesswert / Divisor * 5,0

5,0V = 1024 / 1024 * 5,0V

 

Durch den Spannungsteiler verschiebt sich der eigentliche Rohwert, der die 5 Volt darstellt. Statt durch 1024 zu teilen, fällt dieser Wert in meinem Beispiel auf 511.


2,5V = 511 / 1024 * 5,0V



Das bedeutet, der Divisor muss in meinem Fall auf den aktuellen Rohwert angepasst werden, denn die 5V sind jetzt bei einem Rohwert von 511.

 

5,0V = 511 / 511 * 5,0V

 

Zum testen kann nun vom 3,3V Pin die Spannung zum Messen verwendet werden. Hier sollte nun ein Rohwert bei ca. 345 ankommen. Folgendes Ergebnis ergab sich bei meinem Test:

 

3,39V = 346 / 511 * 5,0V


 

Kleiner Anfang

Natürlich sind die Ergebnisse nicht sehr genau, aber für eine einfache Lösung reicht die grobe Messung aus und ist besser als gar kein Messgerät.

Der Spannungsteiler, mit den zwei 10k Ohm Widerständen, kann eine Spannung von maximal 10V angelegt werden.

 

Warnung

Natürlich sollte man immer berücksichtigen, dass die Leistungsgrenzen nicht überschritten werden. Die zu verwendenden Widerständen sollten möglich hochohmig sein, so dass am Arduino Pin kein hoher Strom eingeht.

 

Zielmessung

Kommen wir zum Testaufbau, mit dem wir eine Messung an einem anderem Stromkreis vornehmen können. Wichtig ist, dass der Ground von der anderen Spannungsquelle mit am GND des Arduinos angeschlossen wird.


 

Was kommt als nächstes?

Eine Sache habe ich hier zunächst ausgelassen, und zwar das Aufzeichnen der Messungen. Eigentlich kann ein Mehrwert mit der Funktion gewonnen werden. Andernfalls hätte man auch ein kleines Display für den Arduino einsetzen können und auf das Spannungsergebnis ausgeben würde.

 

In der Solution befinden sich die Consolen Anwendung SimpleVoltageMeasurement und bereits mein neues Projekt VoltageMeasurementLogger, dass das Aufzeichnen der Daten ermöglicht.

GitHub - VoltageMeasurementLogger

Kommentare

Beliebte Posts aus diesem Blog

Arduino Control (Teil 5) - PWM Signal einlesen

Angular auf dem Raspberry Pi

RC Fahrtenregler für Lego Kettenfahrzeug