Windrichtungssensor für Raspi 4 Wetterstation

  • Hallo Raspi-Freunde,


    Ich habe folgendes Problem und finde dazu einfach keine Lösung.

    Vielleicht könnt ihr mir ja helfen?


    Ich möchte mit meinem Raspi die Windrichtung feststellen.

    Dazu habe ich mir diesen Sensor gekauft:



    Laut Beschreibung gibt er seine Daten über eine RS485-Schnittstelle aus. Daher habe ich für meinen Raspi 4 noch diesen RS485-CAN-HAT gekauft:



    Wie an der Leitung des Sensors beschrieben, haben ich dann die gelbe Leitung (RS485-A) mit dem Stift A der gelben Stiftleiste des RS485-HATs verbunden. Entsprechendes dann noch für die blaue Leitung (RS485-B). Zusätzlich habe ich den Sensor dann noch mit der erforderlichen externen Spannungsquelle verbunden.



    Auf dem Raspi habe ich dann folgendes Python-Script geschrieben (Ähm, hust, räusper… aus dem Netz kopiert.)


    #!/usr/bin/python3

    # -*- coding:utf-8 -*-


    # Import Bibliotheken

    import RPi.GPIO as GPIO

    import serial

    import time


    # GPIO konfigurieren

    EN_485 = 4 <= Wozu dient diese Zeile?

    GPIO.setmode(GPIO.BCM)

    GPIO.setup(EN_485,GPIO.IN)

    GPIO.input(EN_485)


    # Daten Auslesen

    ser = serial.Serial("/dev/ttyAMA0",9600,timeout=1) <= Welches Device muss ich hier auswählen?

    Value1 = str(ser.readall())


    #Ausgabe

    print(time.strftime("%d.%m.%Y %H:%M:%S"))

    print(Value1)



    Unglücklicher Weise bekomme ich aber nur die folgende „leere“ Ausgabe:



    Python 3.7.3 (default, Jul 25 2020, 13:03:44) [GCC 8.3.0] on linux Type "help", "copyright", "credits" or "license()" for more information.

    >>>

    ================ RESTART: /media/pi/USB-STICK/receive V1-5.py ================

    23.03.2021 21:20:51

    b''

    >>>



    Zwei Fragen die mir selbst schon gekommen sind, sind:

    • Wozu dient die Zeile „EN_485 = 4“ ?
    • Welches Device muss ich bei der Konfiguration der seriellen Schnittstelle angeben?

    Und wie ich mich selbst kenne, habe ich bestimmt noch ein Mosaik-Baustein vergessen, oder?


    Kann mir jemand einen Tipp geben, was ich falsch mache?


    Vielen Dank und beste Grüße

    U32

  • Go to Best Answer
  • Hallo,


    Wozu dient die Zeile „EN_485 = 4“ ?

    hier wird eine Konstante mit dem Namen 'EN_485' erstellt und zwar mit dem "Inhalt" '4'. Bei der '4' handelt es sich um den GPIO Pin mit der Bezeichnung '4'. Wenn du weiters im Code schaust, erkennst du das 'EN_485' noch öfters auftaucht. Und zwar um dem Programm zu sagen, was der GPIO4 Pin für eine Aufgabe hat und zwar wird er als Eingangs-Pin festgelegt mit GPIO.setup(EN_485,GPIO.IN). Mit der nachfolgenden Zeile wird der Status des Pins abgefragt, True oder False. Wie das im Zusammenhang des Progamms steht, verstehe ich nicht, da weiters nicht mehr darauf zugegriffen wird.


    Der Vorteil ist, wenn sich der Pin ändert, weil du aus irgendeinem Grund, einen anderen nutzen willst, musst du die '4' nur ein mal austauschen und nicht über all im Programm wo sie verwendet wird.


    Hast du mal den Link zu deiner Anleitung?


    Mehr kann ich dir leider nicht beantworten.


    Grüße

    Denns

    ... ob's hinterm Horizont wirklich so weit runter geht oder ob die Welt vielleicht doch gar keine Scheibe ist?

  • Hallo Dennis,

    Vielen Dank für die schnelle Antwort!

    Ich muss zugeben, dass ich mich gerade ein wenig über mich selbst ärgere, da ich das eigentlich hätte sehen müssen.


    Das zeigt mir aber, dass ich ein viel grundlegenderes Problem habe.

    Wie spreche ich eigentlich in meinem Python-Code den RS485-HAT an, bzw. wie greife ich auf die beiden PINS A und B zu?


    Wenn ich in dem Code, den ich gepostet habe den Wert für EN_485 auf 15 setzen würde, dann würde ich ja lediglich auf die RS232 Schnittstelle des Pis zugreifen. Und das ist nicht das, was ich wollte.


    Kannst du mir sagen, wie man HATs für den Pi im allgemeinen anspricht, oder noch besser speziell den von mir verwendeten?


    Grüße

    U32

  • + Nachtrag +

    Müsste ich nicht eigentlich - wenn man logisch schlussfolgert - auch eine Library importieren, wie bei der seriellen Schnittst. um dann mit einer ähnlichen Codezeile auf die Stifte A und B zuzugreifen?

  • RS485_CAN_HAT_Code.7z


    Der Code ist aber ...



    Wenn du geschrieben hättest, was das für ein Sensor ist, inklusive Datenblatt usw. könnte man besser helfen.

    So muss man halt raten. Die Antwort könnte Binär oder ASCII sein.


    Klar ist jedenfalls, dass der HAT vom RPI den Seriellen Port auf Pin 6 und 8 (GPIO 14, 15) nutzt.
    Zusätzlich muss der GPIO4 auf High gesetzt werden.


    Oftmals unterscheiden sich die Namen der seriellen Schnitstellen. Wenn man Raspberry PI OS einsetzt, sollte /dev/serial0 vorhanden sein.

    Je nach Konfiguration ist serial0 ein symlink auf ttyama0.


    Bei archarm ohne Modifikation ist der Port z.B. /dev/ttyS0.


    Um die Installation des CAN-Bus muss man sich nicht kümmern, da der Sensor ja RS485 nutzen soll.


    PS: Hab den Schaltplan vergessen: https://www.waveshare.com/w/up…485_CAN_HAT_Schematic.pdf

    Dort mal einfach nach P4 suchen. Ist auf GPIO4 und am Widerstand R3.

  • Quote

    Wenn du geschrieben hättest, was das für ein Sensor ist, inklusive Datenblatt usw. könnte man besser helfen.

    So muss man halt raten. Die Antwort könnte Binär oder ASCII sein.

    Das mit dem Sensor tut mir leid, ein aussagekräftiges Datenblatt war leider nicht dabei. Das sind war scheinlich die Abstriche, die man hinnehmen muss, wenn man billige Hardware aus China kauft :rolleyes: Ich habe leider nicht mehr Informationen als ersichtlich. Zwei Drähte für Strom, zwei Drähte für RS485.


    Quote

    Klar ist jedenfalls, dass der HAT vom RPI den Seriellen Port auf Pin 6 und 8 (GPIO 14, 15) nutzt.

    Zusätzlich muss der GPIO4 auf High gesetzt werden.

    OK, GPIO4 ist also so eine Art "Entriegelung". Setzt man diesen auf HIGH wird die Funktion "freigeschaltet", richtig?

    Pin 6 ist aber doch Masse und Pin 8 Transmit. Ich möchte aber doch "receiven". Bist du dir sicher bei den Pins?

    Ich verstehe die Stifte auf dem HAT noch nicht...
    Ich war bisher der Meinung der Draht "RS485-A" vom Sensor müsse auch auf dem HAT auf die gelbe Stiftleiste an Position A.

    Wenn ich deine Erklärung aber jetzt richtig verstehe, könnte ich den Draht auch auf die schwarze, 40 polig Stiftleiste auf Stift 6 oder 8 stecken, richtig?

  • Hallo Dead_Eye,


    Vielen Dank für die Antwort, ich habe aber noch eine Frage zum 7z-Paket:

    Ich finde darin keine Library, sondern nur das Beispielprogramm...

    Suche ich im falschen Ordner?


    Danke und Gruß

    U32

  • Moin,

    ein Datenblatt ist ja leider nicht im Netz zu finden.

    Es sieht aber so aus als wenn diese Anzeiger mit dem Modbus-Protokoll arbeiten.

    Die Daten beim Modbus werden im Gerät in Registern gespeichert.

    Zum auslesen der Daten benötigt man die Adressen der Register, die weiß wiederum nur der Hersteller.

    Ein Datenblatt ist dazu unbedingt nötigt.

    Im folgenden Link versucht jemand ein ähnliches/eventuell gleiches Gerät auszulesen, dort allerdings mit einem Arduino.

    https://forum.arduino.cc/index.php?topic=636373.0

    NACHTRAG: Eventuell passt diese Anleitung ja zu Deinem Gerät.

    Hierdrin sind Registeradressen aufgeführt.

    Wind_Transmitter_UG_485Type_v1.0.pdf

    Edited 3 times, last by ait: Anhang beigefügt ().

  • Hallo ait !


    Vielen Dank für den Hinweis!

    Die Anleitung sieht auch sehr brauchbar aus.

    Ich verstehe zwar nicht ganz warum zwei RS485 Komponenten nicht direkt miteinander kommunizieren können, dass ist jetzt aber auch unwichtig.

    Ich nehme also erstmal hin, dass ich dieses "MODBUS-Protokoll" nutzen muss.


    Aus diesem Fakt stellen sich mir aber noch weitere Fragen:

    1. Brauche ich für "MODBUS" noch weitere Hardware?

    2. Wie bekomme ich die MODBUS-Software auf meinen Raspi?

    3. Wie spreche ich mein HAT oder Shield (Wo ist da eigentlich der unterschied?) an?

    Ich meine, bisher habe ich nur eine Platine auf die GPIO-Steckerleiste gesteckt, auf dem die Kontakte "durchgeschleift" sind.

    Ich muss dem Raspi doch...
    a. ...mitteilen, dass er jetzt einen Hut auf hat (Sorry für das Wortspiel, ich konnte nicht widerstehen!).

    b. ...irgendwie anweisen darauf zuzugreifen. Insbesondere der Zugriff auf die beiden Stifte A und B (gelbe Stiftleiste auf dem HAT (siehe Bild oben) ist
    mir noch unklar. Wenn mir das jemand erklären könnte, wäre ich mehr als happy!


    Vielen Dank schon mal!

    U32

  • Moin,

    mit den Raspberrypi und Modbus hab ich noch nicht gearbeitet nur mit Arduino/ESP8266.

    Eigentlich müßte es mit Deiner Hardware aber funktionieren.

    Fertige Modbussoftware für deinen Windanzeiger wird es für den Raspberrypi wahrscheinlich nicht geben.

    Du könntest mit Python3 Dir aber selber etwas programmieren.

    Dazu bräuchtest Du noch Python3-modbus (sudo apt install python3-pymodbus) und müßtest Dich

    einlesen. Zu Python-modbus und Raspberrypi /Modbus findet man im Internet viele Artikel.

    Helfen kann ich Dir dabei auch nicht, müßte mich auch erst einlesen.

  • Modbus ist von 1979 und wird immer noch in der Automatisierungstechnik eingesetzt.

    Zwischendurch gab es mal eine Modernisierung, damit man auch Modbus via TCP und UDP nutzen kann.


    RS485 ist die Spezifikation wie Daten übertragen worden. Bei RS485 ist es differentiell, wodurch es Störungssucher ist.

    Der Raspberry PI hat einen UART, was dann mit dem Modul dann in RS485 umgewandelt wird.


    Modbus ist nur ein Protokoll, dass obendrauf gesetzt wird, da die Verwaltung dann einfacher ist.

    Ansonsten müssten die Entwickler ihr eigenes Protokoll schreiben und das möchte man meist verhindern.

    Ein weiterer Vorteil ist, dass die Implementierung von pymodbus mit synchron und asynchron arbeitet.


    Du wirst den client benötigen.


    Mit input_registers und holding_registers vertue ich mich immer. Eins von beiden wird vom Slave (Windsensor) beschrieben.

    Du darfst natürlich nicht vergessen den GPIO4 vorher auf HIgh zu ziehen.

  • Moin DeaD_EyE!


    Vielen Dank für die Info! :)

    Wieder ein Schritt weiter...

    Ich bekomme aber folgende Fehlermeldung:
    Modbus Error: [Input/Output] [Errno 25] Inappropriate ioctl for device


    Ist mein Raspi in diesem Konstrukt denn Master oder Slave?
    (Der windsensor LIEFERT doch Daten...)


    Beste Grüße

    U32

  • Der RPI ist der Master, der Sensor ist der Slave.


    Der Master ist der pymodbus.client, und der der Slave ist der pymodbus.server.
    (Ist etwas verwirrend)


    Besser verständlich ist es, wenn man sich die TCP-Version ansieht.

    Dort öffnet der Slave einen Port und lauscht auf dem Port.


    Der Master verbindet sich mit dem Slave.



    Modbus Error: [Input/Output] [Errno 25] Inappropriate ioctl for device

    IOCTL wird verwendet, um unter anderem die Baudrate einzustellen.


    Probiere mal 9600 Baud aus. /dev/serial0 sollte ein Symlink auf den ersten freien verfügbaren Seriellen Port sein.

    ggf. einfach mal ein ls -l /dev machen und die Ausgabe posten. Dann sehen wir Modus, Besitzer, Gruppe und Name.


    Schau auch mal nach, ob du den Port mit minicom öffnen kannst. Falls der Port bereits von einem anderen Programm geöffnet ist, sollte normalerweise eine andere Fehlermeldung kommen. In der Regel ist die Linux-Konsole auf dem ersten seriellen Port. Das kann man mit raspi-config abschalten. Aber wie gesagt, normal hätte es die Meldung gegeben, dass der Port bereits offen ist.

  • Ich bekomme aber folgende Fehlermeldung:
    Modbus Error: [Input/Output] [Errno 25] Inappropriate ioctl for device

    Was bedeutet diese Fehlermeldung und wie kann ich sie beheben?

  • Hier zunächst der output von ls -l /dev :

    Das ist eine sehr lange Liste, daher habe ich die "uninteressanten" Passagen rausgekürzt...

  • Hallo DeaD_EyE


    Mit ...

    ... port='/dev/minicom' ... hat es leider nicht funktioniert.

    Ebensowenig wie mit port='/dev/serial0'.


    Nur mit port='/dev/serial1' bzw. port='/dev/ttyAMA0' bekomme ich folgenden output:


    Code
    Modbus Error: [Input/Output] [Errno 25] Inappropriate ioctl for device

    Edited once, last by U32 ().

  • Hallo DeaD_EyE !


    Kannst du mir noch mal "auf die Sprünge" helfen?

    Ich komme an der Modbus-Stelle nicht weiter.


    Vielen Dank und beste Grüße

    U32

    • Best Answer

    Um mal ein bisschen Klarheit zu schaffen. Die Bezeichnungen der Seriellen Ports folgen diesem Schema:

    • /dev/ttyS0
      Klassische serielle Schnittstelle beim PC.
      Ist beim RPI der miniUART, der PL011 hat einen anderen Namen
    • /dev/AMA0
      Serieller Port auf der ARM-Architektur
      der PL011 meldet sich mit dem Namen
    • /dev/ttyUSB0 und /dev/ttyACM0
      tty2usb-Adapter
    • /dev/serial0 und /dev/serial1
      Das ist Raspberry Pi spezifisch.
      serial0 und serial1 sind symlinks auf Port 0 und 1 oder umgekehrt.
      Es hängt von der Konfiguration ab. Man kann den miniUART mit dem UART z.B. tauschen.



    Wenn der miniUART aktiviert ist, muss noch die Serielle Konsole deaktiviert werden:

    Quote

    Disable Linux serial console

    By default, the primary UART is assigned to the Linux console. If you wish to use the primary UART for other purposes, you must reconfigure Raspberry Pi OS. This can be done by using raspi-config:

    1. Start raspi-config: sudo raspi-config.
    2. Select option 3 - Interface Options.
    3. Select option P6 - Serial Port.
    4. At the prompt Would you like a login shell to be accessible over serial? answer 'No'
    5. At the prompt Would you like the serial port hardware to be enabled? answer 'Yes'
    6. Exit raspi-config and reboot the Pi for changes to take effect.



    Dann nochmal probieren und falls das dann immer noch nicht geht, mal mit root testen.

    Kannst auch den Befehl screen verwenden:

    Code
    screen /dev/ttyS0 115200

    Und falls du einen leeren Bildschirm siehst, dann hat es geklappt. Um aus dem Screen wieder raus zu kommen: STRG+a und danach K.
    Du kannst auch mal andere Baudraten probieren. 4800 sollte ja verwendet werden.


    Quote

    To end the session, press Ctrl+a followed by K. Alternatively, press Ctrl+a, type :quit and confirm it by pressing Enter.


    Mit minicom war übrigens ein Programm gemeint, um eine Verbindung über die serielle Schnittstelle aufbauen zu können.

    Unter Linux gibt es viele.