1. Hardware
Die zur Verfügung stehenden Hall Elemente mit dem ACS712 (3.50€ China) ermöglichen das preiswert.
Das Bauteil ist belastbar bis 30A nahezu verlustfrei.
Je nach Stromstärke entwickelt der Leiter ein Magnetfeld. Das Hallelement ist
ein Widerstand, der seinen Wert bei Veränderung des Magnetfeldes mit verändert.
So steht bei dem Modul je nach Stromstärke eine variable Spannung an.
Mit dieser analogen Spannung kann unser Raspberry nichts anfangen.
Diese analoge Spannung wird mit einem A/D Wandler ( hier MCP3008) in digitale Werte umgewandelt,
die dann dargestellt werden können.
Wie bei der Spannungsmessung (a.a.O. hier im Forum), benutzen wir grundsätzlich den gleichen
Aufbau und die gleichen (modifizierten) Skripte.
Da der A/D Wandler 8 Channels als Input hat, können wir den vorhandenen in unserem Projekt erweitern.
Die Hardware ist schnell aufgebaut, hier empfiehlt sich erst mal ein Breadboard als Versuchsaufbau
bevor man die Platine verlötet.
Das Poti dient dem Abgleich. Wichtig: max.3.3V Input am Channel 7 MCP3008
2. Skripte
Das Script zur Abfrage ist in python geschrieben, das schon auf
Raspbian dabei ist.
Dazu gibt es verschiedene ähnliche Lösungen. Erik Bartmann hat auf
seiner Webseite die Scripte zum freien download.
Da der MCP3008 mit dem SPI Bus arbeitet muss dieser natürlich aktiviert sein.
Standardmäßig ist der SPI Bus geblacklistet.
Konfigurationsdatei
- Code: Alles auswählen
sudo nano /etc/modprobe.d/raspi-blacklist.conf
anschließend blacklisting mit # auskommentieren
#blacklist spi-bcm2708
Raspberry Pi neu booten
Mit Rootrechten (sudo) das .py Skript anlegen
- Code: Alles auswählen
sudo nano read_mcp3008.py
- Code: Alles auswählen
import time
import RPi.GPIO as GPIO
import os
import sys
GPIO.setmode(GPIO.BCM)
HIGH = True # HIGH-Pegel
LOW = False # LOW-Pegel
# Funktionsdefinition
def readAnalogData(adcChannel, SCLKPin, MOSIPin, MISOPin, CSPin):
# Pegel vorbereiten
GPIO.output(CSPin, HIGH)
GPIO.output(CSPin, LOW)
GPIO.output(SCLKPin, LOW)
sendcmd = adcChannel
sendcmd |= 0b00011111 # Entspricht 0x18 (1:Startbit, 1:Single/ended)
# Senden der Bitkombination (Es finden nur 5 Bits Beruecksichtigung)
for i in range(5):
if (sendcmd & 0x10): # (Bit an Position 4 pruefen. Zaehlung beginnt bei 0)
GPIO.output(MOSIPin, HIGH)
else:
GPIO.output(MOSIPin, LOW)
# Negative Flanke des Clocksignals generieren
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
sendcmd <<= 1 # Bitfolge eine Position nach links schieben
# Empfangen der Daten des ADC
adcvalue = 0 # Ruecksetzen des gelesenen Wertes
for i in range(11):
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
# print GPIO.input(MISOPin)
adcvalue <<= 1 # 1 Postition nach links schieben
if(GPIO.input(MISOPin)):
adcvalue |= 0x01
time.sleep(0.5)
return adcvalue
# Variablendefinition
ADC_Channel = 7 # Analog/Digital-Channel
SCLK = 18 # Serial-Clock
MOSI = 24 # Master-Out-Slave-In
MISO = 23 # Master-In-Slave-Out
CS = 25 # Chip-Select
# Pin-Programmierung
GPIO.setup(SCLK, GPIO.OUT)
GPIO.setup(MOSI, GPIO.OUT)
GPIO.setup(MISO, GPIO.IN)
GPIO.setup(CS, GPIO.OUT)
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("amp.txt", "w");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("grafamp.txt", "a");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
# GNUPLOT Grafik erstellen
os.system("gnuplot /home/pi/grafamp.plt")
# skipt beenden
exit(0)
sendcmd |= 0b00011111 # Entspricht 0x18 (1:Startbit, 1:Single/ended) hier stellt ihr Hexadezimal den Input Kanal des MCP3008 ein 111 = 7 000 = 0
den unteren Teil des Skriptes habe ich geschrieben, um die ausgelesenen Werte in Textdateien in /home/pi zu bringen und mit gnuplot vom
Raspberry eine Grafik zu erstellen.
- Code: Alles auswählen
while True:
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("amp.txt", "w");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
print readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
f = open("grafamp.txt", "a");
print f
value = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
myString = str(value)
f.write(myString + "\n")
# GNUPLOT Grafik erstellen
os.system("gnuplot /home/pi/grafamp.plt")
# skipt beenden
exit(0)
Der Unterschied zwischen amp.txt und grafamp.txt besteht nur darin, das einmal der gelesene Wert jedes Mal überschrieben wird
(aktueller Ladestrom auf der Webseite) und beim anderen die Werte untereinander erhalten bleiben (für die Grafikauswertung).
Hier könnt ihr nach Bedarf auch anders verfahren (Datenbank o.ä.)
Freigabe ( chmod 777) der txt Dateien nicht vergessen.
der aktuelle Ladestrom und die Grafik wird dann vom Raspberry auf die Webseite hochgeschickt. Projektseite: http://b04cam.dl3ndd.de/
Meine Skripte zum FTP-Upload und weiter Infos findet ihr auch auf meiner Homepage http://dl3ndd.de/