IR-INFO-Schnittstelle eines Stromzählers auslesen

themanfrommoon:
Da is nu auch kein Hexenwerk drin. Den Schaltplan gibts da auch. Nimmst eben die TTL Variante

Tja, ich habe mir jetzt gerade eine OSRAM-Phototransistor bestellt. Mal sehen. Problem ist, dass ich das meiste auf der Seite nicht verstehe. Egal, irgendwas wird schon dabei herauskommen! Ich melde mich, wenn ich mehr weiß.

Danke soweit auf jeden Fall,

Gruß, kuahmelcher

kuahmelcher:
Tja, ich habe mir jetzt gerade eine OSRAM-Phototransistor bestellt. Mal sehen. Problem ist, dass ich das meiste auf der Seite nicht verstehe. Egal, irgendwas wird schon dabei herauskommen! Ich melde mich, wenn ich mehr weiß.

Wenn Du Fragen hast, weißt Du ja schon einmal, wo sich hilfreiches Volk herumtreibt.

Und selbst wenn am Ende nicht das ursprünglich Gewünschte herauskommt, mit dem „klassischen Hacking“ bist Du IMO auf dem richtigen Weg. Spaß hast Du ja wohl hoffentlich.

Gruß

Gregor

PS: Meiner Meinung nach sollte man zuerst einmal die genaue Datenrate ermitteln. Dann kann man mit einer genauen Baud-Einstellung evtl. ein komplettes Datentelegramm aufzeichnen und analysieren.
Dazu müsste man eine Aufzeichnung anfertigen, an der man die Länge eines vollständigen Pulses ablesen kann. Man könnte z. B. mit sehr hoher Geschwindigkeit direkt ins RAM loggen und die Aufzeichnung erst über die serielle Schnittstelle ausgeben, wenn ein paar Werte zusammengekommen sind. Evtl. hilft pulseIn()?

gregorss:
Wenn Du Fragen hast, weißt Du ja schon einmal, wo sich hilfreiches Volk herumtreibt.
Und selbst wenn am Ende nicht das ursprünglich Gewünschte herauskommt, mit dem „klassischen Hacking“ bist Du IMO auf dem richtigen Weg. Spaß hast Du ja wohl hoffentlich.

Ja, auch wenn der blöde Zähler sich hartnäckig weigert mit mir zu sprechen, dann habe ich schon viel gelernt. Das ist cool.

gregorss:
PS: Meiner Meinung nach sollte man zuerst einmal die genaue Datenrate ermitteln. Dann kann man mit einer genauen Baud-Einstellung evtl. ein komplettes Datentelegramm aufzeichnen und analysieren.

Du hast sicherlich Recht, da insbesonder dieses Bild:

zeigt, dass da nicht einfach nur Quatsch rauskommt. Da ist ja ein System drin, was zu den 1-4 Sekunden passen würde, die in der ANleitung für die Schnittstelle erwähnt werden. Allerdings sind die 22 Bytes viel zu wenig, da kann man ja fast nichts übertragen, wenn allein für den SML-Start 8 Bytes verschwendet werden. DAS wiederum spricht für eine zu geringe Baudrate. Evtl. gehen mir durch die niedrige Datenrate einfach Bits verloren.

Falsch - nicht eventuell, sondern ganz bestimmt! Der Vergleich 9600 zu 115200 Baud zeigt ja, dass plötzlich viel mehr Bits da sind. Ich muss also so weit erhöhen, bis ich eine “Auflösungsgrenze” überschreite, also mindestens zweimal gemessen wird, solange die Zähler-IR-Diode an oder aus ist. Ich baue morgen mal meinen Rechner unten auf!

Danke und GRuß, kuahmelcher

kuahmelcher:
Ich baue morgen mal meinen Rechner unten auf!

Viel Spaß beim Schleppen :-)))) Wo ich's doch grad erst vom Spaß hatte ...

Guck' Dir vorher mal pulseIn() an - vielleicht kannst Du Dir die Freuden der Schlepperei dann sparen.

Gruß

Gregor

gregorss:
Guck' Dir vorher mal pulseIn() an - vielleicht kannst Du Dir die Freuden der Schlepperei dann sparen.

Ja, also pulsein() ist super, allerdings bin ich damit auch nicht so wirklich weiter gekommen. Es könnte allerdings sein, dass ich das bei einem anderen Projekt verwenden kann. Ich wollte mal aus meinem Fahrrad-Nabendynamo die Geschwindigkeit auslesen. Dazu müsste pulseIn() nützlich sein.

Jedenfalls habe ich mir einen Laptop mit ordentlich Power ausgeliehen und habe eine kurze Aufzeichnung eines Telegramms gemacht:
Datenaufzeichnung mit 2.000.000 Bauds


Hier kann man sehen, dass …

  • bei hoher Auflösung auch genug Bits und Bytes auftauchen
  • die kritische Auflösungsschwelle, bei der ein einzelnes Bit mehrfach abgetastet wird, IMMER noch nicht erreicht ist,
  • immer noch jede Menge Bits uneindeutig sind
    Ich vergleiche das ganze immer mit den Infos aus einer IR-Fernbedienung, aber das scheint gar nicht zu stimmen. Die SML-Daten scheinen einfach rasend schnell geflimmert zu werden. Jednefalls führt kein Weg an einem "anständigen" Lesekopf vorbei. Einer, der die Flanken ordentlich steil macht und mit Magnet haftet und sowas.

Ich gebe Laut, wenn's soweit ist!

Danke und Gruß, kuahmelcher

Könntest du mal deinen Sketch zeigen? Mit 2.000.000 Baud läuft doch nur die serielle Ausgabe ab, nicht das Einlesen eines analogen Eingangs - das dauert nämlich auch eine gewisse Zeit. An der Stelle bezweifle ich sowie die Aussagekraft der geposteten Ergebnisse.

sth77:
Könntest du mal deinen Sketch zeigen?
An der Stelle bezweifle ich sowie die Aussagekraft der geposteten Ergebnisse.

Ja, ganz harmlos:

int sensorPin = A6;
int sensorValue = 0;

void setup() {
   Serial.begin(2000000);
   pinMode(sensorPin, INPUT); 
}
 
void loop() {
   sensorValue = analogRead(sensorPin);
   Serial.println(sensorValue);   
}

Ich denke auch - 2.000.000 heißt hier: "ganz, ganz oft" und nicht unbedingt 2.000.000 :slight_smile:

Gruß, kuahmelcher

kuahmelcher:
Ich denke auch - 2.000.000 heißt hier: "ganz, ganz oft" und nicht unbedingt 2.000.000 :slight_smile:

Problematisch ist, dass Du in loop() eine serielle Ausgabe hast. Egal, wie hoch die Baudrate ist, sie bremst IMO zu sehr. Mein Vorschlag: Leg' ein Array an, in das Du erst ein paar hundert oder mehr Werte schreibst, bevor Du dann das Array „am Stück“ über Serial ausgibst. Da Du ja jeweils einen eher großen Zeitstempel und einen booleschen Wert speichern möchtest, wäre ein Array von Strukturen vermutlich das Beste (?). Ungefähr so:

struct Messwert
{
  unsigned long t;
  bool l;
}: foo[500];

Das ist nur so „daher-gehackt“, nicht unbedingt syntaktisch korrekt.

Du hast dann ein Array „foo“ mit 500 Zeit/Level-Paaren. Das füllst Du in einer Schleife und überträgst es erst, wenn es „voll“ ist. Vermutlich musst Du in der Schleife mit delayMicroseconds() experimentieren, bis Du mal einen vollständigen Puls erwischt hast.

Gruß

Gregor

Hallo !

Vorweg: Das ist mein erster Versuch hier zu einer Lösung beizutragen. Also auch mein erster Post. Daher bitte ich um Nachsicht für den Fall, dass es nicht optimal rüberkommt.

Zu Deinem “Ausgangsproblem”: Du erhältst serielle Daten, allerdings NICHT im SML Format.

Ich hatte das gleiche Problem - und konnte es lösen, indem ich meine Schaltung modifiziert habe.

Ich habe die hier (eHZy / Wiki / Hardware) gezeigte Schaltung nachgebaut, aber die erhaltenen seriellen Daten sahen NICHT wie ein SML Protokoll aus. Insbesondere der Header (1b 1b 1b 1b …) war nicht da.

In der gezeigten Schaltung habe ich den “linken” 15 kOhm Widerstand zwischen Kollektor Transistor und VCC durch einen 22 kOhm ersetzt und den “rechten” 15 kOhm Widerstand durch einen 1 MOhm Widerstand (mit 470 kOhm hats auch funktioniert).

Ich vermute, dass mit den angegebenen Widerständen (15 kOhm / 15 kOhm) die Spannungsverhältnisse so waren, dass der Transistor nicht voll/schnell genug durchgeschaltet/geöffnet hat und damit dann die Signalpegel der eingehenden seriellen Signale nicht eindeutig HIGH bzw. LOW zugeordnet werden konnten… Aber das ist nur eine Vermutung.

Was auch WICHTIG war: möglichst gute Positionierung der Empfänger-Diode des Lesekopfes vor der Sender-Diode des eHz.

  • Der axiale Abstand soll lt. Norm iec62056-21 nach meinem Verständnis 10 mm betragen. Nach meinem Eindruck ist das recht optimistisch. Ich musste eher so auf 5 mm Abstand zwischen Sende- und Empfangs-Diode gehen, damit am Arduino ein ausreichendes Signal ankam.
  • Zur Ermittlung richtigen in-plane Position habe ich ein kleines Sketch* geschrieben (siehe Anhang), das mir die “Rückmeldung” von der IR-Empfangsdiode an einem analogen Eingang (z.B. A0) einliest und mir dann dieses Signal auf dem Seriellen Plotter der Arduino IDE angeschaut. Dann eben die IR-Empfangsdiode so lange verschoben, bis das Signal maximal wird.

*Zum Sketch: A0 ist das Signal, was in der verlinkten Schaltung auf D7 geht (also das zu maximierende Signal, abgegriffen zwischen Widerstand und npn-Transistor BC337); A1 wird zwischen Widerstand und Phototransistor SFH309FA abgegriffen.

In Kürze zusammengefasst: “Optimierte” Schaltung und gute Position haben bei mir geholfen.

Noch Fragen ? Dann fragen !

In diesem Sinne,
LeBuisson

UPDATE 24.04.2020:
Mittlerweile habe ich mein Projekt zum Auslesen von 2 Stromzählern Typ eHZ mit einem Arduino Nano Every realisiert. Details gibts hier:

IR-Diode-Schaltung_Test.ino (319 Bytes)