Hallo,
ich hab mich mal wieder mit dem Thema beschäftigt und euch meinen aktuellen Schaltplan gezeichnet. Jetzt auch mit dem von Teichhermelin vorgeschlagenem INA333.
Wer will kann die Schaltung schon so wie sie ist verwenden um einen Stock zu wiegen. Der Nachteil man benötigt pro Stock einen Raspberry. Vielleicht kann man mit einigen Modifikationen am Programm auch bis zu 4 Beuten messen. Indem man alle GPIOs verwendet.
Will man jetzt aber noch Temperatur usw., muss vor jede Beute noch eine Adressierung. Mein Überlegung war das Zählregister 74HC 4024 zu verwenden. So könnte man alle Register mit einer Zählleitung verbinden. Nur wenn die Ausgabe am Register passt bekommt die Schaltung über angeschlossene PNP/NPN Transistoren Strom und kann dann über die verbundenen Leitungen an GPIO 18,23,24,25 ausgelesen werden. Man hätte dann einen BUS der alle Beuten verbindet und könnte theoretisch 128 Beuten über einen Raspi auslesen.
Der Praxisversuch bei dem ich oben beschriebenes Modell angefangen habe zu löten (ist nie fertig geworden, da zu aufwändig), hat gezeigt dass der Aufwand viel zu hoch ist und ich Tage mit Löten beschäftigt wäre um alle meine Beuten zu wiegen. Außerdem vermute ich das die Schaltung in der Praxis wahrscheinlich sehr Fehleranfällig und Wartungsintensiv ist (Wackelkontakte / Jedes Modul braucht eine individuelle Adressierung mit Transistoren ...).
Im folgenden seht Ihr meinen Schaltplan ohne Adressierung:
In der Schaltung ist nur ein DMS eingezeichnet. Es gibt hier zwei Möglichkeiten:
1. Ihr erweitert die Schaltung und verbaut 4 INA333 und messt jeden Sensor einzeln. Der MCP3204 hätte 4 Eingänge. (Ist wahrscheinlich genauer. Man kann dadurch auch noch die Gewichtsverteilung in der Beute auslesen.)
2. Ihr schaltet alle 4 Sensoren parallel und messt so alle 4 gleichzeitig. (Ich habe mich für diese Variante entschieden. Kostet weniger und ist weniger zu löten.)
Die Messbrücke muss dann noch über den Widerstand R1 eingestellt werden. R1 ist bei mir 100kOHM weil ich nichts anders hatte. Es ist wahrscheinlich einfacher die Messbrücke auf 0V zu kalibrieren wenn
hier ein kleineres Potentiometer verwendet wird.
Die DMS Sensoren habe ich mir aus einer Tristar [Anzeige] Personenwaage besorgt. Nachdem ich die Sensoren ausgebaut habe musste ich erst mal verstehen wie die Dinger funktionieren. Hier hat mir Wikipedia weiter geholfen: DMS.
Es handelt sich bei der Waage um einen doppelten DMS der übereinander geklappt ist. Er hat also 3 Anschlüsse (weiß, schwarz, rot). Das heißt ein Widerstand wird größer und einer kleiner wenn man Ihn verbiegt. Ein einzelner DMS hat bei mir genau 1kOHM. Mann kann durch messen feststellen welches die Mittlere Leitung ist (bei mir die rote). Jetzt aber nicht wundern wenn man beim verbiegen keine Widerstandsänderung feststellen kann. Die Änderung ist so gering, dass man sie mit dem Instrumentenverstärker INA333 um das 1000 fache verstärken muss um etwas messen zu können.
(Man kann auch für Versuche eine Messbrüche bauen. Wenn man sich auf die Waage stellt werden dann vom Multimeter 0,2 mV Änderung angezeigt.)
Und hier der passende Code für die Schaltung oben:
import time
import RPi.GPIO as GPIO
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 |= 0b00011000 # 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 # Ruecksetzten des gelesenen Wertes
for i in range(13):
GPIO.output(SCLKPin, HIGH)
GPIO.output(SCLKPin, LOW)
adcvalue <<= 1 # 1 Position nach links schieben
if(GPIO.input(MISOPin)):
adcvalue |= 0x01
time.sleep(0.5)
return adcvalue
# Variablendefinition
ADC_Channel = 0 # 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)
Alles anzeigen
Weil die Ergebnisse bei mir sehr schwankten habe ich immer 30 Messungen gemacht und dann den Mittelwert berechnet. Dazu muss man den Code wie folgt anpassen:
while True:
AnzMessung = 30
erg = 0
for i in range(AnzMessung):
e = readAnalogData(ADC_Channel, SCLK, MOSI, MISO, CS)
erg = erg + e
print e
print ""
print "Durchschnitt"
gewicht = erg/AnzMessung
print gewicht
print (gewicht - 123) * 0.0055
print ""
Alles anzeigen
Da der AD-Wandler ja nur einen Messwert ausgibt und kein wirkliches Gewicht muss man die Waage noch kalibrieren. Ein Beispiel gibt die Zeile "print (gewicht - 123) * 0.055" 123 ist der Wert der bei Nullbelastung angezeigt wir. Jetzt stellt man ein Gewicht z.B. 10kg auf die Waage und erhält z.B. 1941.
Daraus ergibt sich folgendes:
[code]
1941-123 = 1818
=> 10 kg entsprechen 1818 Schritten auf dem AD-Wandler
10 / 1818 = 0,55
=> Ein Schritt sind 0,0055 kg
[code]
Kleiner Tipp: Beim kalibrieren ist es am besten eine zweite Waage unter die erste zu stellen um dort immer genau das Gewicht zu sehen.
Wer sich mit dem Thema weiter beschäftigen will. Mir hat folgender Link sehr weiter geholfen:
PiMeUp_MCP3008.pdf
Für diejenigen unter euch die die Schaltung so wie sie ist einsetzen wollen:
Bei mir haben die Werte die der AD-Wandler geliefert hat sehr geschwankt. Ich weiß jetzt nicht ob das an den wackeligen Kontakten am Steckbrett liegt oder normal ist. Ich vermute auch, dass der Raspi nicht so eine richtig konstante Spannung liefert. Ich habe aber irgendwo gelesen, dass bei einem AD-Wandler ein Kondensator an V (Ref) das Ergebnis verbessern soll. Habe es allerdings noch nicht ausprobiert. Vielleicht kann das ja einer von euch testen und hier schreiben.
Anmerkung zum INA333: Funktioniert gut ist aber nicht wirklich toll zum Löten, da ich den Baustein nur als SMD gefunden habe. Die Füße haben gerade mal 0,5mm Abstand. Für die Versuche auf dem Steckbrett habe ich ihn mit einem Kupferlackdraht KL003 auf eine separate Platine gelötet.
Weiteres Vorgehen:
Nach erneuter Betrachtung unter anderem auch der Kosten und Arbeitszeit habe ich festgestellt, dass ich für die aktuell benötigten Teile (AD-Wandler, Zählregister, Transistoren ...) auch einen AVR bekomme. Dadurch ergeben sich viel mehr Möglichkeiten, weil der AVR z.B. einen AD-Wandler on Board hat. Auch die Kommunikation mit dem Raspberry kann dadurch vereinfacht werden. Und weil mir das irgendwie zu viele Leitungen an den Beuten sind habe ich mir überlegt die Kommunikation mit den Beuten per Funk zu machen.
Daher experimentiere ich zur Zeit mit dem ATMEGA 168 und dem Funkmodul RFM01.
Der Plan sieht vor ein Modul aus Atmega und RFM01 zu bauen, dass Batteriebetrieben wird. Dadurch habe ich ein schönes geschlossenes System an den Beuten, dass in den Boden eingebaut werden kann. Dar AVR sollte im Sleep Mode locker ein Jahr auf Batterie laufen und alle paar Stunden aufwachen um die Daten zu senden. Der Raspi wird dann verwendet um die Daten zu empfangen und ins Internet zu stellen. Ein weiterer Vorteil ist, dass der Raspi so an der Steckdose im Haus bleiben kann. Ich muss also nicht den ganzen Garten umgraben um Strom an meine Beuten zu bekommen.
Ich hoffe das hilft euch mal weiter.
Viel Spaß damit
Gruß Flo