Messwerterfassung

Um zu kontrollieren, welche Messwerte unser Roboter hat und wie er diese verarbeitet protokollieren wir dies Messwerte in Abhängigkeit der Zeit in einer Datei mit. Diese können wir dann unter Excel betrachten.

In nebenstehendem Beispiel wurden in 1000ms 139 Messung gemacht. Macht im Schnitt alle 7 ms eine Messung. Wobei es auch einen Abstand  von 135 ms gab. 110 der Messungen waren allerdings im Abstand zwischen 4 und 6 ms.

Geht man von einer Geschwindigkeit von 20 cm pro Sekunde aus, so misst der EV3 nach jedem Millimeter neu.

Die Datei mit den abgespeicherten Messwerten kann man über das EV3Controll-Center herunterladen. Neben den Messwerten sollte man die Zeit und / oder einen Zähler mitprotokollieren. Die Auswertung geschieht dann mit Hilfe von Excel.

Quelltext

Das folgende Beispiel bezieht sich auf die Aufgabe, dass der Roboter nach einer bestimmten Anzahl von schwarzen Streifen stoppen soll.

Stoppt nach einer bestimmten Anzahl von hell-dunkel Wechseln

import java.io.DataOutputStream;
import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import lejos.hardware.lcd.LCD;
import lejos.hardware.motor.UnregulatedMotor;
import lejos.hardware.port.MotorPort;
import lejos.hardware.port.SensorPort;
import lejos.hardware.sensor.EV3ColorSensor;
import lejos.robotics.EncoderMotor;
import lejos.utility.Delay;
import lejos.utility.Stopwatch;

public class LinienZaehler1 {

	// Eigenschaften des Roboter
	EV3ColorSensor lichtSensor;
	float[] farbe;

	EncoderMotor MotorL;
	EncoderMotor MotorR;
	
	Stopwatch stopUhr;
	 

	// Der Konstruktor
	LinienZaehler1() {
		// Lichtsensor
		lichtSensor = new EV3ColorSensor(SensorPort.S1);
		lichtSensor.setCurrentMode("Red");
		farbe = new float[lichtSensor.sampleSize()];
		// Motoren
		MotorL = new UnregulatedMotor(MotorPort.B);
		MotorR = new UnregulatedMotor(MotorPort.C);
		
		// Uhr bereitstellen
		 stopUhr = new Stopwatch();
	     stopUhr.reset();
	}

	// Hauptprogramm
	public static void main(String[] args) {
		// Datei bereitstellen
			FileOutputStream fileStream = null;
			try {
				fileStream = new FileOutputStream(new File("Daten.txt"));
					} catch (Exception e) {
				LCD.drawString("Can't make a file", 0, 0);
				System.exit(1);
				}
		
		// Variablen deklarieren und initialisieren	
		boolean hell = true;
		boolean hell_alt = true;
		int wechsel = 0;
		int v = 100;
		String daten="";
		int zeit = 0; 
		
		// Konstruktor aufrufen
		LinienZaehler1 m = new LinienZaehler1();
		m.MotorL.forward();
		m.MotorR.forward();
		m.lichtSensor.fetchSample(m.farbe, 0);
		
		//while (Button.ESCAPE.isUp()) {
		while (zeit <1000) {  // Schleife läuft 1 Sekunde lang
			
			//Zeit abfragen
			zeit = m.stopUhr.elapsed();
			
			// Messvorgang starten --> Messwert in farbe[0] gespeichert
			m.lichtSensor.fetchSample(m.farbe, 0);
			
			// entscheiden ob hell oder dunkel
			if (m.farbe[0] < 0.5) {
				hell = false;
			}
			if (m.farbe[0] > 0.6) {
				hell = true;
			}
			// jetz nachschauen, ob sich was geändert hat
			if (hell != hell_alt) { 
				wechsel = wechsel + 1;
			}
			// aktuellen Wert merken für den nächsten Vergleich
			hell_alt = hell;

			if (wechsel < 6) {
				v = 100;
			} else {
				v = 0;
			} // ende if
			m.MotorL.setPower(v);
			m.MotorR.setPower(v);
			
			// Datenstring schreiben   Zeit | Messwert | Anzahl der Wechsel | Zustand(hell oder dunkel)
			daten = daten + 
					String.valueOf(zeit) + ";" + 
					String.valueOf(m.farbe[0]) + ";" + 
					String.valueOf(wechsel)+ ";" + 
					String.valueOf(hell) + ";\r\n";
		} // ende while
		// jetzt die Werte in die Datei schreiben
		try {
			DataOutputStream dataStream = new DataOutputStream(fileStream);
			dataStream.writeChars(daten);
			fileStream.flush();

		} catch (IOException e) {
		LCD.drawString("Can't write to the file", 0, 1);
		System.exit(1);
		}

		// zum Schluss nochmal die Variable für 3 Sekunden anschauen
		LCD.drawInt(wechsel, 0, 0);
		Delay.msDelay(3000);
		System.exit(1);
	} // ende main
}// ende class

Datenimport nach Excel

Die Datei hat die Endung .txt und kann nur mit Excel geöffnet werden, wenn man zur Auswahl alle Dateien angibt. Im folgenden findet man den Import einer Datei, die allerdings mit einem Mikrocontroller aufgezeichnet wurde. 

Mittelwert, Maximum und Minimum einer Messreihe berechnen

Die Messwerte müssen in einer Liste (man dies Array) mit einer fest vorgegebenen Länge abgespeichert werden. Im folgenden Beispiel wäre die Länge 10.

Das Array wird durch float[] Messwert =  new float[10]; erzeugt

Index 0 1 2 3 4 5 6 7 8 9
Messwert 0.32 0.36 0.73 0.81 0.65 0.42 0.34 0.03 0.01 0.5

Ein Element in der Liste wird über seinen Index (Position im Array) angesprochen.

z.B. Messwert[2] = 0.73

Umsetzung mit Java

Man erzeugt sich zuerst eine Liste, in die man die Messwerte hineinschreiben kann. Man schreibt nun als ersten Wert überall den ersten Messwert hinein (sonst wäre die Liste leer und wir hätten als Minimum 0).

m.lichtSensor.fetchSample(m.farbe, 0);
		wert = m.farbe[0];

float alleWerte[] = new float[10];
		for (int i = 0; i < alleWerte.length; i++) {  
			alleWerte[i]=wert;
}

Die Messwerte werden nun in die Liste geschrieben. Dazu berechnet man zunächst die Stelle innerhal der Liste AlleWerte[count%AlleWerte.length].

count=count +1;
m.lichtSensor.fetchSample(m.farbe, 0);
wert = m.farbe[0];
			
alleWerte[count%alleWerte.length]=wert;

Minimum berechnen

double min = alleWerte[0];
 for(int i=0 ; i<alleWerte.length ; i++){
        if (min>alleWerte[i]){
		        min = alleWerte[i] ;
		    }
}