Beim Eddy-2-Power Windrad verfolgen wir einen Niedrigtechnologie Ansatz. D.h. wir bevorzugen einfache robuste Mechanik und Technologien mit Materialien, die nicht nur in Industrieländern beschaffbar sind und bestenfalls recycelt wurden. Damit wir vergleichbare Messwerte erfassen können, verlassen wir den low tech Weg beim Messen.

Auch hier halten wir es so einfach und praktikabel wie möglich. Alle wichtigen Schritte, Knackpunkte und Fallstricke die uns begegnen werden dokumentiert. Allerdings ist hier etwas mehr Vorwissen und andere Hardware notwendig.

Messbereiche

Windgeschwindigkeit

Strom

Spannung

Geschwindigkeit des Windrads

Temperaturen

Sonnenlicht


Hardwaresetup für Messungen und Kommunikation

grundlegender Aufbau

Aufbau Messschaltung

Entweder ein Arduino/Genuino (z.B. uno) oder etwas abgespeckter ein Atmel328p, daran die Sensoren...

Atmega328p auf Breadboard

Im alltäglichen Betrieb ist die Arduino Umgebung nicht notwendig, der geflashte Atmega Microcontroller reicht.

Strom messen mit dem ACS714

Der Arduino hat einen 10Bit AD Wandler d.h. er unterscheidet analoge Spannungen zwischen 0 und 5 Volt in 1024 Schritten (von 0 bis 1023). In diesem Bereich werden die -30A bis +30A die der ACS714 messen kann abgebildet. Das sind 0,0586A pro Schritt (60/2^10 = 0,05859375). Kleinere Differenzen im Stromfluss sind unabhängig von allen anderen Einflüssen auf die Messung nicht darstellbar.

Laut Datenblatt hat der Sensor eine Genauigkeit von 66mV/A bei +-30A. Wer mit kleineren Strömen zu tun hat kann mit der +-5A Auslegung des Sensores mit einer Genauigkeit von 182mV/A messen.

Damit Messfehler klein bleiben sollten stromführende Leitungen mit ein wenig Abstand am Hall Sensor vorbei geführt werden. Die Analog Pins des Arduino bedanken für ein delay(1) mit genaueren Messwerten. Und es bietet sich an, über mehrere Messungen zu mitteln.

a = 0;
for(int i = 0; i < 100; i++) {
  delay(1);
  a = a + analogRead(A0);
}
ampere = a / 100;

Genauigkeitsbesprechung

Spannungen mit dem Arduino messen

Um Spannungen bis 15V (an den Akkus) am Arduino messen zu können muss der Bereich von 0-15V auf 0-5V runtergebracht werden. Das erledigt eine Spannungsteilerschaltung. Aus den 0 bis 5V Werten macht der A/D Wandler im Arduino Werte zwischen 0 und 1023. Wir können mit diesem Aufbau also nur Spannungsdifferenzen von mehr als 0,0117V (12V/1042) abbilden. Das reicht für unsere Zwecke und wird nicht weiter optimiert.

Am Generator werden Spannungen bis 60V erreicht. Selbst hier sind wir über den Spannungsteiler und 10Bit A/D Wandler mit 0,059V Spannungdifferenz noch hinreichend gut unterwegs. Der Spannungsteiler wird über eine einfache Widerstandsschaltung realisiert.

Spannungsteiler_Steckplatine.png

R_ges = R_1 + R_2 
V_2 = V_ges * R_2 / (R_1 + R_2)

Die Batteriespannung (von <15V ausgehend) fällt über R_1 und R_2 ab. Der Arduino misst die Spannung, die über R_2 abfällt also zwischen GND und R_1.

Parallel zu R_2 wird noch eine Zener-Diode (Z1) mit 5,1V in Sperrrichtung zu R_1 geschaltet. Damit wird verhindert, dass der Analogeingang des Arduino mehr als 5,1V sieht. Bei höheren Spannungen wird die Z-Diode entgegen der Sperrichtung leitend und der Arduino bleibt verschont. Wir verwenden hier 1N4733A Z-Dioden (5,1V 49mA).

Spannungen mit A/D Wandler am Pi messen

Raspi GPIO

Grundsätzlich, der Raspberry Pi wird mit 5 Volt gespeist. Allerdings arbeitet der System on Chip auf Basis von 3,3 Volt, was bedeutet, dass auch die GPIOs mit 3,3 Volt arbeiten. Sowohl eingangs- als auch ausgangsseitig. Desweiteren verträgt ein GPIO nur ein paar Milliampere (mA) Strom. Je nach Quelle ist von einem anderen Wert die Rede. Man spricht von maximal 16 mA. Wobei Ein- und Ausgänge bereits mit 0,5 mA sicher schalten. Wenn man es sich bei der Dimensionierung einfach haben will, dann kann man mit 1 oder 2 mA rechnen. Je nach Beschaltung sollte man aber nicht mehr als 8 mA aus einem GPIO ziehen.

Die GPIO-Pins mit festdefinierter Spannung eignen sich weniger gut zur Stromversorgung. Vor allem nicht die +3,3V-Pins und nur begrenzt die +5V-Pins. Diese spannungsführenden Pins eignen sich nur, um einen fest definierten Pegel bereitzustellen. Externe Schaltungsteile, insbesondere Relais und Motoren, sollten über ein eigenes Netzteil versorgt werden.

MCP3208

MCP3208 Pinbelegung

SPI am Pi

Der MCP3208 kommuniziert mittels SPI mit dem Pi.

MCP3008 an Pi mit Spannungsteiler

Python gpiozero MCP Bibliothek

Die Werte des MCP3208 lassen sich in Python unkompliziert mittels gpiozero Bibliothek auslesen.

Rotor Umdrehungen

Temperaturen

Die Temperaturerfassung dient hauptsächlich der Problemanalyse und wird auch für Schutzschaltungen genutzt. Anfällig für Überhitzung sind insbesondere die Akkus und die Lastwiderstände. Wir verwenden zur Messung DS18B20 Sensoren. Die sind zwar etwas teurer als temperaturabhängige Widerstände, dafür liefern sie relativ genaue Werte, müssen nicht erst geeicht werden und funktionieren über längere Datenleitungen ohne aufwändigen Schaltungsaufwand.

Sonnenlicht


Datenerfassung

In der einfachen Variante werden fast alle Messwerte durch einen Arduino kontinuierlich erfasst. Der Raspi liest sie via USB aus und schreibt die Daten zunächst in eine sqlite Datenbank.

Vorbereitung des Arduinos

Vom Raspi aus kann der Arduino per USB geflasht werden. Entweder über die Arduino IDE oder über die Konsole mittels ino.

Arduinocode flashen

Kommunikation zwischen Arduino & Raspi

Raspi und Arduino sprechen direkt über USB miteinander. Der Arduino bezieht somit auch seinen Strom aus dem USB Port des Raspis. Alternativ können beide per USB mit Strom versorgt werden und z.B. über I2C oder SPI Daten austauschen.

Hier werden Raspi und Arduino per USB verbinden. Letzteres bezieht dabei seinen Strom über den Raspi.

Es ginge auch separat (jeweils getrennt per USB mit Strom versorgen) und dann mittels I2C kommunizieren:

Zukünftig könnten die Messwerte auch direkt vom Pi am Arduino ausgelesen werden. Dafür gibt es z.B. die pyduino API.

Arduino Ausgabe

Der Arduino läuft in einer Dauerschleife, in der er die aktuellen Werte der Sensoren aufnimmt und ohne weitere Berechnungen ausgibt. Diese Werte werden sekündlich als csv Zeile über den USB Port ausgegeben. Der Arduino gibt beim Start eine Zeile mit Bezeichnung der csv Werte aus. Damit ist es möglich die Ausgabe auf jedem beliebigem Rechner zu empfangen und auszuwerten. Auf dem angeschlossenen Pi läuft ein Script, das die Werte in eine SQlite Datenbank überträgt und die Umrechnungen der Messwerte vornimmt.

arduino_hello_world.jpg

Messwerte in Datenbank speichern

Der Raspi liest die Messwerte des Arduinos aus und speichert sie in einer Datenbank.

SQLite Beispiele

Create

CREATE TABLE COMPANY(
   ID INT PRIMARY KEY NOT NULL,
   UNIXTIME INT NOT NULL,
   SENSOR1 INT,
   SENSOR2 INT,
)

sqlite3 <my_database_file.sqlite>

und darin:

.help
.tables
.schema test
SELECT * FROM test;

SELECT

SELECT v_bat, a_bat FROM test;
SELECT v_bat, a_bat FROM test WHERE ;
SELECT v_bat, a_bat FROM test WHERE unixtime LIKE '14839129%';
SELECT v_bat, a_bat FROM test WHERE unixtime BETWEEN 1483907574 AND 1483907595;
SELECT COUNT() as ENTRIES FROM test;
SELECT COUNT() as ENTRIES FROM test WHERE v_bat > 710;
SELECT AVG(random) FROM test WHERE random <=100;
SELECT p2rand, random FROM test GROUP BY random;
SELECT avg(p2rand), random FROM test GROUP BY random;
SELECT avg(p2rand), random FROM test GROUP BY random ORDER BY count(p2rand);
SELECT MAX(unixtime), A0, A1, A2, A3, A4, A5 FROM test;
SELECT * FROM test ORDER BY unixtime DESC LIMIT 10; 

DELETE

DELETE FROM test WHERE A5 > 1023;
DELETE FROM test WHERE A0 > 1023 OR A1 > 1023 OR A2 > 1023 OR A3 > 1023 OR A4 > 1023 OR A5 > 1023;

Datenkonvertierung

In der Datenbank liegen Rohdaten, also die Messwerte des Arduino A/D Wandlers. Diese werden entsprechend der Sensoren und Beschaltung in Spannungs- und Stromwerte umgerechnet. Dazu wird ein Bautagebuch geführt, in dem Änderungen am Aufbau des Windrads und der Elektronik festgehalten werden.

Script zur Umrechnung der Messwerte

Fehleranalyse

Datenanalyse & Visualisierung

Anzeige der Messwerte in Echtzeit

Während der Entwicklung werden die Daten per ssh ausgelesen. Das erfordert einen Computer und entsprechende Einarbeitung. Um sekundengenau aktuelle Messwerte, ohne weitere Hilfsmittel betrachten zu können, wird ein kleines Display angeschlossen werden (LCD oder altes Handydisplay). Ebenso ist eine einfache Akkuladestandsanzeige z.B. mit verschieden farbigen LEDs angedacht.

Monitoring mittles Munin

Im ersten Schritt werden die Messwerte in Echtzeitgraphen ohne weitere Analysen mittels munin dargestellt. Das hat den Vorteil, dass wir alle Messwerte im zeitlichen Verlauf betrachten können und auch relativ aktuelle Messwerte sehen (max. 5 Minuten alt). Außer einem Browser sind keine weiteren Hilfsmittel zum Ablesen notwendig. Munin generiert Grafiken aus den gesammelten Daten und stellt sie auf einer Webseite dar. Das sieht dann z.B. so aus:

munin_sensor-day.png munin_anemometer-month.png

Munin mit lighttpd

Die Munin Graphen liefert Pi mittels Webserver lighttpd aus. Im Prinzip diesen Schritten folgen:

lighty-enable-mod auth
vi /etc/lighttpd/conf-enabled/10-auth.conf
systemctl force-reload lighttpd
htpasswd -cm /var/www/html/.htpasswd <user>

Messwertdarstellung mit gnuplot

gnuplot_testmessung.png

set title "Arduino Sensorwerte"
set ylabel "A/D Eingangswert"
set xlabel "Datum"
set autoscale
## unix timestamp an X-Achse
set xdata time
set timefmt x "%s"

## print png image
set output "eddy2power.png"
set terminal png size 1440,900
plot \
    "eddy2power.csv" using 1:2 title 'A1' with dots , \ 
    "eddy2power.csv" using 1:3 title 'A2' with dots , \ 
    "eddy2power.csv" using 1:4 title 'A3' with dots , \ 
    "eddy2power.csv" using 1:5 title 'A4' with dots , \ 
    "eddy2power.csv" using 1:6 title 'A5' with dots , \ 
    "eddy2power.csv" using 1:7 title 'A6' with dots , \ 

feinere Analyse

Alle erfassten Daten werden für spätere Analysen in einer Datenbank gespeichert. So können bei dokumentierten Veränderungen und Umbauten am Windrad später entsprechende Schlussfolgerungen gezogen werden.


Tipps & Tricks

Arduino via Raspi resetten

Wenn Pi und Arduino an der selben Stromversorgung hängen kann ein Kabel direkt von einem GPIO Pin am Pi zum Arduino Reset Pin geführt werden. Achtung, bei unterschiedlichen Stromquellen sollte eine kleine Diodenschaltung den dann möglichen Stromfluss unterbinden, damit die gute Hardware nicht verbrutzelt wird.

arduino_reset_via_pi-gpio.png

Hier wird GPIO Pin 4 des Pis genutzt, mit dem Reset Pin am Ardunio verbunden und durch dieses Script (auf dem Pi) kurz auf HIGH gesetzt:

echo 4 > /sys/class/gpio/export
echo out > /sys/class/gpio/gpio26/direction
echo "0" > /sys/class/gpio/gpio4/value;
sleep 1;
echo "1" > /sys/class/gpio/gpio4/value
exit 0

Arduino soft reset verhindern

Jedes Mal, wenn mit pyserial eine Verbindung zum Arduino hergestellt wird, führt dieser ein reset durch (reset on serial connection). Es gibt mehrere Möglichkeiten das zu unterbinden. Die softwareseitig Einfachste ist wohl folgendes Kommando in der Raspberry Pi Konsole:

stty -F /dev/ttyACM0 -hupcl

Atmega an Raspi

genauere Messwerte

bessere Analog/Digital Wandler am Arduino

Wem der interne 10Bit A/D Wandler des Arduinos nicht fein genug auflöst, der/die schaltet einen höher bittigen davor (z.B. mcp3201 oder adc121c). Damit sind z.B. Amperemessungen in 0,0146A Schritten möglich (60/2^12 = 0,014648438).

https://www.raspiprojekt.de/machen/downloads/category/5-anleitungen.html?download=9:analog-digitalwandler-mcp3008

A/D Wandler am Pi

Der Rapsberry Pi kann nur digitale Werte aufnehmen. Der A/D Wandler lässt sich aber auch direkt an den Pi anschließen:

Multiplexer

Da die Wandler recht teuer sind und selten wirklich simultan gemessen werden muss bietet sich der Einsatz von Multiplexern an. Dabei werden mehrere Eingangsignale auf ein einzelnes gelegt. Im Programm lässt sich dann festlegen, welcher Eingang gerade gewählt wird.

Hall Sensor für Wechselstrommessungen

Arduino low power

Arduino Optimierung - don't use delay()

Eddy-2-Power/Messen (zuletzt geändert am 2017-03-06 20:30:36 durch anonym)


Creative Commons Lizenzvertrag
This page is licensed under a Creative Commons Attribution-ShareAlike 2.5 License.