Mit Raspberry Strom ( Ampere ) messen ACS712

Mit Raspberry Strom ( Ampere ) messen ACS712

Beitragvon DL3NDD » Fr 27. Feb 2015, 17:17

Aufgabenstellung war, den von einem Solarpanel gelieferten Strom zu messen.

1. Hardware

Die zur Verfügung stehenden Hall Elemente mit dem ACS712 (3.50€ China) ermöglichen das preiswert.

acs712.jpg


acs712-1.jpg
acs712-1.jpg (16.39 KiB) 43012-mal betrachtet


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.
Ampere_Steckplatine.jpg


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/

amp1.jpg
Versuche am "offenen Herzen"
Synology DS213+ als Web-FTP-und VPN Server, FT2000 SteppIr, homemade PA LDMOS
Benutzeravatar
DL3NDD
 
Beiträge: 905
Registriert: Sa 10. Nov 2012, 21:34

Zurück zu Tutorials

Wer ist online?

Mitglieder in diesem Forum: 0 Mitglieder und 3 Gäste

cron