Diplomand | Aufgabenbereich | Betreuer |
---|---|---|
Emil Berger | Software | DI Manfred Steiner |
Julian Ehmann | Elektronik | DI Werner Harkam |
Daniel Sammer | Mechanik | DI Dr. Gerhard Pretterhofer |
Dieses Repository beinhaltet die Software für einen Arduino UNO, an den die Sensoren des Prüfstands angeschlossen sind und das PC-Interface, das die vom Arduino empfangenen Daten auswertet und grafisch darstellt.
Um das PC-Interface ausführen zu können, muss die Java JRE installiert werden. Wenn dies geschehen ist, kann das Programm einfach über BESDyno.jar gestartet werden, es sind keine weiteren Installationsschritte erforderlich.
Um den Arduino Code zu programmieren wird die Arduino-IDE benötigt und die im Header inkludierten Bibliotheken müssen in der IDE installiert werden. Der Arduino muss ein originaler (italienischer) sein, oder den Arduino-Bootloader besitzen.
/BESDyno: Das PC-Interface wurde in NetBeans geschrieben, es wird die IDE benötigt, sowie Java JDK.
/BESMeasurement: Programm für einen Arduino (UNO-, NANO- & MEGA-kompatibel), der die Sensoren ausliest und über UART die Daten an das Java-Programm sendet.
- Einlesen der Sensordaten
- Übertragung der Daten per UART
- Auswertung der Daten
- Live-Ansicht von Drehzahl und Geschwindigkeit
- Berechnung von Leistung und Drehmoment über die Drehzahlen
- Umgebungstemperatur und -luftdruck: BMP180 (I2C)
- Motor- und Abgastemperatur: Thermoelemente (OPV-Verstärker, AnalogIn)
- Walzendrehzahl: Induktiver Näherungsschalter (InterruptPin)
- Motordrehzahl: Strommesszange am Zündkabel (Schmitt-Trigger, InterruptPin)
Das Protokoll ist verbindungslos und Request-Response- (Master-Slave) -orientiert. Die Datenübertragung erfolgt textuell, die CRC32-Prüfsumme wird mit einer im Arduino gespeicherte Tabelle realisiert und nur über die Daten berechnet (nicht über :
, ;
, >
), der Hash #
wird aber berücksichtigt und sieht sich als Teil der Daten.
Doppelpunkt : |
Daten, bei mehreren Werten mit Hash # getrennt |
Bigger than > |
CRC32-Prüfsumme | Semicolon ; |
---|
Request | Request-String Rx | Response | Response-String Tx |
---|---|---|---|
INIT | i |
Initialisierungs-Antwort | :BESDyno>CRC; |
VERSION | p |
Version der Arduino-Software | :Version>CRC; |
START | s |
Umweltdaten (Temperatur, Luftdruck, Seehöhe) | :Temperatur#Luftdruck#Seehöhe>CRC; oder :BMP-ERROR>CRC; |
ENGINE | e |
Motor- & Abgastemperatur | :Motortemp.#Abgastemp.>CRC; |
KILL | k |
setzt RPM-Counter auf 0 | :KILL>CRC; |
ALL | a |
Motor- & Walzendrehzahl + Motor- & Abgastemperatur | :Motor-Zeit#Walzen-Zeit#Motortemp.#Abgastemp.#Zeit>CRC; |
MEASURE | m |
Motor- & Walzendrehzahl | :Motor-Zeit#Walzen-Zeit#Zeit>CRC; |
MEASURENO | n |
Nur Walzendrehzahl | :Walzen-Zeit#Zeit>CRC; |
FINE | f |
setzt grüne LED | :FINE>CRC; |
WARNING | w |
setzt gelbe LED | :WARNING>CRC; |
SEVERE | v |
setzt rote LED | :SEVERE>CRC; |
MAXPROBLEMS | x |
setzt gelbe & rote LED | :MAXPROBLEMS>CRC; |
DEBUG (nicht Teil des Protokolls) | d |
gibt am Terminal eine Übersicht über alle aktuellen Messwerte | nur zum Debuggen, für den Menschen lesbar |
DEBUG gibt am Terminal bzw. Monitor eine Liste mit den aktuellen Messwerten aus. Diese Response ist nicht vom Java-Programm decodierbar und wird deshalb auch nicht von jenem angefordert. Das d
wird in die Eingabezeile des Monitors eingegeben, ein spezielles Zeilenende ist wie auch für die anderen Requests nicht erforderlich.
Seit der Firmware Version BESMeasurement v3.0 werden nicht mehr Impulse pro Zeiteinheit gezählt, sondern die Periodendauer des ankommenden Rechtecksignals gemessen. Dadurch sind viel höhere Abtastraten möglich und die Messung wird genauer. Dabei muss beachtet werden, dass das Intervall zwischen den Messpunkten nicht beliebig klein werden darf, da sonst der Computer überlastet wird (ab 15ms (66,67Hz) dürften auf modernen Rechnern keine Probleme auftreten, getestet am MacBook Pro 2016). Die gemessene Zeit zwischen den Messpunkten dient nun nur mehr zur Ermittlung der Winkelbeschleunigung alpha.
Das Protokoll verzichtet auf weitere Sicherungsvorkehrungen, wie zum Beispiel Idle-RQ, neben der CRC-Prüfsumme.
Die Datenübertragung würde mit so einem System viel langsamer vonstattengehen, es wird aber vorausgesetzt, dass so viele Messwerte wie möglich eingelesen werden. Im Endeffekt würde Idle-RQ auch keinen Sinn machen, weil fehlerhafte/fehlende Daten - deren Chance aufzutreten im unteren Prozentbereich liegen - verworfen, bzw nicht auffallen würden, da das Diagramm am Ende über die erhaltenen Daten interpoliert wird.
Im Entwicklunsmodus wird beim Schließen des Hauptfensters die gesamte Kommunikation als .log-Datei in das Verzeichnis User/Bike-Files/Service_Files
gespeichert - wie auch das Logging-Protokoll.
Diese Datei ist so zu lesen:
Zeitstempel : Name des Requests
Zeitstempel : Response CRC: *empfangener CRC* <-> *berechneter CRC*
Im Einstellungs-Dialogfenster werden u.A. folgende Parameter eingegeben:
- Intervall zwischen den Messpunkten (period)
- Hysterese Zeitspanne (hysteresisTime)
- Geschwindigkeit wenn bereit (idleVelocity)
- Hysterese Geschwindigkeit ± (hysteresisVelocity)
- Startgeschwindigkeit (startVelocity)
- Stoppgeschwindigkeit (stopVelocity)
- Motordrehzahl wenn bereit (idleRPM)
- Hysterese Motordrehzahl ± (hysteresisRPM)
- Start-Motordrehazhl (startRPM)
- Stop-Motordrehzahl (stopRPM)
- Max. Motortemperatur (warnignEngTemp)
- Max. Abgastemperatur (warningExhTemp)
Es gibt zwei Modi:
- DROP-RPM: Messen bis zur Höchstdrehzahl, Abfallen lassen und Messung bei Erreichen der Startdrehzahl stoppen
- Diese Methode bietet die Möglichkeit um mit Hilfe der Schleppleistung - die beim Abfallen der Drehzahl gemessen wird - auf die reale Motorleistung zurückschließen zu können.
- Start-Stop: Messen bis zu einer eingegeben Enddrehzahl
- Mit dieser Methode kann nur die Hinterradleistung gemessen werden, sie ist aber für den Motor schonender (für Zweitaktmotoren wird diese Methode ausdrücklich empfohlen!).
Der Messvorgang besteht aus folgenden Zuständen:
SHIFT_UP | WAIT | READY | MEASURE | FINISH |
---|
Zustand | Wechsel wenn: | User-Eingabe | Programmmodus | Messmethodik |
---|---|---|---|---|
SHIFT_UP | Bei einmaligem Erreichen (≤) von startRPM | Hochschalten in den letzten Gang und Abfallen lassen bis zur Startgeschwindigkeit | x | beide |
WAIT | Wenn sich die Drehzahl innerhalb der Hysterese Zeitspanne bei idleRPM ± hysteresisRPM eingependelt hat | Warten... | x | beide |
READY | Bei einmaligem Erreichen (≥) von startRPM | Gas geben! | x | beide |
MEASURE | Bei einmaligem Erreichen (≤) von startRPM | Bei der Höchstdrehzahl abfallen lassen | MESSEN | DROP-RPM |
MEASURE | Bei einmaligem Erreichen (≥) von stopRPM | Nach eigenem Ermessen (schonend) runterschalten | MESSEN | Start-Stop |
FINISH | Nach dem Ende der Berechnung -> Ende des Messvorgangs | Warten... | BERECHNEN | beide |
Anmerkungen: Wenn die Motordrehzahl nicht gemessen wird, erfolgt das Switchen der States sowie das Einpendeln über die Geschwindigkeit der Walze. Wenn ein Zweirad mit Automatik-Getriebe gemessen wird, ist der erste State SHIFT_UP nicht notwendig und wird übersprungen.
Variablen und Einheiten:
- Leistung P (W)
- Moment M (Nm)
- Trägheitsmoment I (kgm^2)
- Drehzahl n (U/min)
- Winkelgeschwindigkeit ω (rad/s)
- Winkelbeschleunigung α (rad/s^2)
- Bahngeschwindigkeit v (m/s)
- Zeit t (µs)
- Periodendauer t_motor & t_walze (µs)
- Radius r (m)
- Luftdruck p (hPa)
- Umgebungstemperatur T (°C)
Wert | Formel |
---|---|
n_motor = | 60,000,000 / t_motor |
n_walze = | 60,000,000 / (26 * t_walze) |
ω_motor = | (2π/60) * n_motor |
ω_walze = | (2π/60) * n_walze |
v_walze = | ω_walze * r_walze |
Δω = | ω_walze(i) - ω_walze(i-1) |
α_walze = | Δω / t(i) |
P_Rad = | I_Walze * α_walze * ω_walze |
P_Motor = | P_Rad + P_Schlepp |
P_Norm = | (1013 / p_Luft) * sqrt((T_Luft+273.15)/293.15) * P_Motor |
M_Motor = | P_Norm / ω_motor |