Posts by DeaD_EyE

    meinst du ich schreibe hier Blödsinn!?


    Nein, du hast nur die falschen Angaben wiedergegeben, ohne darüber nachzudenken.

    Vor falschen Werten kann dich selbst Linux nicht schützen. Schonmal von Betrug bei USB-Datenträgern gehört?


    Der RP2040 kann nur 16 MB adressieren und das steht im Datenblatt. Das, was man präsentiert bekommt, ist ein Dummy-Dateisystem, welches nicht existiert.

    Jetzt könnte man noch behaupten, dass die mit 16 MB nicht Megabyte meinen, sondern Megabit.

    Wenn man 16 MBit in MiB umrechnet, kommt man auf 1,9 MiB. Also das kann schon mal gar nicht stimmen,
    da es Module mit bis zu 16 MiB Flash Speicher gibt.



    Mach mal folgendes:

    1. 120 MiB große Datei erstellen
    2. md5sum aus der Datei erstellen
    3. Datei auf den RP2040 hochladen
    4. Dann Windows einmal neu starten, um die Nutzung des Cache zu verhindern.
    5. Datei vom RP2040 herunterladen und dann mittels md5sum den Hashwert vergleichen

    Willst du den RPI Pico als USB-Stick missbrauchen?

    Wenn ich meinen anstecke dann habe ich nur 134MB frei.

    Die Angabe kann nur falsch sein.


    Der RP Pico (RP2040) hat 2 MiB Flash und der Chip kann bis zu 16 MiB QSPI-Flash adressieren.


    Vorteilhaft ist, dass Micropython für den RP2040 nur ~570 KiB groß ist. D.h. es müssten noch ~1.5 MiB frei sein, sofern es sich um den RP Pico handelt.

    Beim ESP32 ist das Image 1,5 MiB groß und bei den Standard-Dev-Boards sind immer 4 MiB Flash dabei. Nicht auf dem Chip selbst, sondern via SPI angebunden.


    Einige RP2040-Dev-Boards von anderen Herstellern haben auch 4, 8 und 16 MiB Flash.

    Wenn man nach den NOR Flash Chips sucht, wird die größe meist in MBit angegeben und nicht in Megabyte.

    Schon einmal überlegt, diese Partition nur zum schreiben als r/w zu mounten, um sie dann wieder auf ro zu stellen oder zu entmouten?

    Etwas Ähnliches mache ich mit dem rootfs. Der Anwender möchte ja auch den Hostnamen ändern, WLAN-SSID und Password vergeben.


    Aber solange die DB geöffnet ist, kann man das Dateisystem nicht ReadOnly remounten.

    Ich müsste dann erst die Datenbank schließen, dann den Mount-Befehl absetzen und
    vor dem nächsten Schreibvorgang den Mount-Befehl erneut absetzen, dann wieder die DB öffnen.


    Oder, wenn z.B. nur die SQLite-Datenbank beschrieben wird, das Dateisystem nach dem Beschreiben zu sync-en.

    Das wäre die "billigere" Methode, die die Wahrscheinlichkeit reduzieren würde, dass genau bei einem Schreibvorgang der RPI ausgeschaltet wird.

    Das journaling habe ich bis jetzt auch nicht deaktiviert.

    Ich bin davon ausgegangen, dass du selbst WebIOpi einsetzt und weißt, wie die Software sich steuern lässt.

    Hier ist ein Fork von dem Projekt auf GitHub: https://github.com/Freenove/WebIOPi


    Dort ist auch eine Python-Bibliothek enthalten, die sich aber leider nicht mehr mit Python 3.7 nutzen lässt, da async als Argument in einer Funktion vorkommt. Kann man zwar ändern, aber dann hat man gleich das nächste Problem: fehlende Methode ...


    Das ist so ein Projekt, dass nur zur Hälfte funktioniert und nicht mehr weiter entwickelt wird.


    Man kann z.B. mit pigpiod die GPIOs eines RPi fernsteuern und muss dafür die Methoden nicht selbst implementieren.


    Wenn du schon eine funktionierende WebIOpi-Instanz am Laufen hast, einfach mit dem Webbrowser öffnen, F12 drücken, auf Netzwerkanalyse wechseln und dann z.B. den GPIO-Status anzeigen lassen. Unten kannst du dann die ganzen Requests sehen. Bei mir kommt ein Request, der http://SERVER_IP/map öffnen will. Die Datei existiert nicht und wird wahrscheinlich vom Webserver bereitgestellt. Bei dir müssten weitere Abfragen angezeigt werden.


    Das ist die normale Vorgehensweise, wenn man sich z.B. mit Webscraping beschäftigt.

    Im Read-Only-Modus sind die SD-Karten geschützt und diese Aussage basiert auf Erfahrungswerten.


    Bei einem Projekt bin ich ähnlich vorgegangen. Die Boot-Partition und Root-Partition sind beide nur lesend gemountet und eine dritte Partition dient zum Abspeichern statistischer Daten. Die Module (RPI0) werden oftmals ohne sie herunterzufahren abgeschaltet. Das einzige korrumpierbare ist dann die SQLite-DB auf der Datenpartition, die ggf. neu erstellt wird, wenn die alte korrupt ist. Von den Modulen sind so ca. 360 im Umlauf und bis jetzt hatte ich nur ca. 4 Rückmeldungen wegen defekter SD-Karten. Alle Module sind im Dauereinsatz und es werden im unbeobachteten Betrieb jede Minute Daten geschrieben. Wie oft die Module einfach vom Strom getrennt worden sind, kann ich leider nicht herausfinden.

    ESP32 ist ein Mikrocontroller.




    Dieser hat auch WLAN und Bluetooth.

    Die Controller kann man mit C/C++ und Arduino programmieren oder z.B. mit NodeMCU, Micropython oder Espruino.

    Der Unterschied zum RPI (SytemOnChip) ist, dass es sich um einen Mikrocontroller handelt, der kein vollwertiges Betriebssystem zur Verfügung hat.


    Im Gegensatz zum RPI sind die ESP32 und ESP8266 (Vorgänger) günstiger und einfacher zu beschaffen.



    Zusammenfassung bezüglich Distanz, Inkremente usw.:

    • Radumfang und Inkremente des Inkrementalgeber legen fest, wie "grobkörnig" die Berechnung der zurückgelegten Distanz ist.
      Selbst wenn eine unendlich lange Distanz zurückgelegt werden würde, ist die maximale Abweichung zur realen Distanz maximal ein Inkrement.
      Rad: 50 cm ⌀
      Inkremente: 24
      Distanz pro Inkrement: 6.54 cm
      Zurückgelegte Distanz: 80 m (8000 cm)
      Berechnete Distanz: 8000 - 8000 % (math.pi * 50 / 24)
      Ergebnis: 7997.97 cm
    • Gleichbleibender Radumfang (Anmerkung von Franjo G)
    • Genügend Reibung (wenn die Räder durchrutschen, stimmt die Messung nicht mehr)
    • Wenn Kurven gefahren werden, erhöht sich die gefahrene Distanz, aber die Distanz vom Anfangspunkt zum Endpunkt ist dann kürzer als die gemessene.


    Zum Probieren würde ich erst mal einen günstigen Inkrementalgeber verwenden.
    Die werden aber nicht lange halten, wenn man damit hohe Geschwindigkeiten fährt.

    Es gibt auch gelagerte, teure Inkrementalgeber.

    Entspricht ja im Grunde dem Fahrradtacho. meine Bedenken liegen in der Abweichung. Die maximale Strecke, die es anzuzeigen gilt beträgt ca. 80m habe ich dann in dem Beispiel pro Meter die Abweichung von ca. 6,5cm, so ist dann die Gesamtabweichung doch recht hoch?!

    Ich meinte die akkumulierte Gesamtabweichung, die nicht größer als ein Inkrement sein kann, sofern keine Schritte "verschluckt" werden.

    Wenn das Rad 50 cm groß ist und eine Strecke von 80 cm gefahren wird, hat man eine Abweichung von 1,52 cm bei 24 Schritten.


    Python
    from decimal import Decimal
    
    abweichung = Decimal(80) % Decimal("6.54")

    Wenn er 80 cm gefahren ist, würde er dann nur 78,48 cm anzeigen. Passen würde dann z.B. wieder 85,02 cm. Das wären dann 13 Inkremente.

    Der RPi oder Mikrocontroller muss nur die Impulse von einem Inkrementalgeber zählen.


    Code
    def schrittweite(durchmesser, schritte_pro_umdrehung):
        return math.pi * durchmesser / schritte_pro_umdrehung


    Bei 50 cm Durchmesser und 24 Inkrementen pro Umdrehung kommt man pro Schritt auf 6,54 cm.

    Der Fehler kann maximal bis zu +/- 6,54 cm betragen, sofern keine Schritte "verschluckt" werden.


    Bei den kleinen billigen Inkrementalgeber wird sicherlich das Problem mit der Abnutzung aufkommen.

    Wir nutzen z.B. welche mit 24 Impulsen für unsere 3-Achs-Modelle, die mit einer SPS angesteuert werden.

    Für die Positionierung, um ein paar Klötze von A nach B zu bewegen, ist das genau genug.

    Dort ist aber auch die Winkelgeschwindigkeit niedriger, als z.B. bei einem Rad von einem Fahrzeug.


    PS: Die Inkrementalgeber haben meist einen A- und B-Ausgang, die um 90° versetzt sind. Damit kann man dann auch die Drehrichtung unterscheiden, erfordert aber auch die Auswertung beider Signale, fallende und steigende Flanken.

    Edit: Aufgabe missverstanden. Die Antwort bezieht sich darauf, wie man Zahlen zwischen min und max limitiert.


    Es gibt keine min_max-Funktion in Python, aber man kann min und max kombinieren.

    Das mit den negativen Zahlen kannst du komplett ignorieren, solange der Wert für val_min positiv oder == 0 ist.


    Das ist eine Zeile Code.


    • minimum von val und max_val
    • maximum von vorherigem Wert und min_val


    Negative Zahlen könnten mit dem Trick auch ausgeschlossen werden, in dem man noch einen Schritt hinzufügt:

    • maximum von vorherigem Wert und 0

    Auflösung:

    Code
    def limit(value, val_min, val_max):
        return max(min(value, val_max), val_min)

    ----------------------



    Hier nun die eigentliche Aufgabe (mit set).


    Im Grunde ist es wie mit any und all. Bei der Funktion any muss nur ein Wert True sein, was dann zum vorzeitigen Abbruch führt und ein True zurückgibt. Für ein False muss any alle Elemente durchgehen. Die Funktion all bricht ab, sobald ein Element False ist. Die Funktion muss aber alle Elemente prüfen, um ein True zurückliefern zu können. Das gleiche gilt für logische Verknüpfungen.

    Quote

    2 MAX350 x 16 MCP3208 bei 50 kS/s -> 9.28 ms


    Ich weiß nicht, ob irgendwo noch einen Fehler drin habe, aber 10 ms klingt ja schonmal gut.

    Natürlich geht auch MQTT, Sockets oder alles mögliche andere - aber ESP-NOW wäre hier sicher eine recht einfache Lösung.

    Der OP möchte gerne MicroPython verwenden und das sollte man akzeptieren.

    MicroPython unterstützt noch kein ESPNow. Ich hoffe, dass der Pull-Request demnächst integriert wird.

    Das wäre ziemlich cool.


    Andere Features wie eine SD-Karte nutze ich auch.

    Hinweis: Kann man sich selbst preiswert mit einem MicroSD-Karten-Adapter zusammenlöten.


    Für MQTT benötigt man eine veränderte Version für Micropython.

    Die beiden Frameworks paho.mqtt (für Computer) und micropython-umqtt.simple2 / micropython-umqtt.robust2 (für Micropython) unterscheiden sich in der Handhabung etwas. umqtt.robust2 benötigt umqtt.simple2.


    Sofern man schon eine WLAN-Verbindung eingerichtet hat, kann man mittels upip die Pakete auf dem Mikrocontroller direkt installieren.


    Ich nutze sehr gerne das Pythontool rshell.

    Mit Thonny kann man das auch über ein Menü machen.


    Dann sollte man sich noch folgende Tastenkombinationen merken, da sie wichtig sind:

    • STRG + C
      Unterbricht den Code. Befindet sich das Programm z.B. in einer Schleife, so unterbricht STRG + C die Schleife und man hat dann wieder Zugriff auf die REPL (Read-Evaluate-Print-Loop / Lesen-Ausführen-Ausgeben-Schleife)
    • STRG + D
      Hard-Reset des Mikrocontrollers. Die Datei boot.py wird dann auch ausgeführt.
    • STRG + E -> Einfügen-Modus
      So kann man Code in die REPL kopieren. Zu beachten ist, dass der Arbeitsspeicher des Controllers ausreichend sein muss. Man kann nicht beliebig lange Code-Blöcke einfügen, da der Speicher dann irgendwann zuende ist.
      • STRG + C -> Einfügen-Modus abbrechen
      • STRG + D -> Einrügen-Modus beenden (Code wird übersetzt und dann ausgeführt)
    • STRG + A -> raw Repl
      Das ist eher interessant für Tools wie z.B. rshell, die Daten binär übertragen können, in denen auch noch Steuerzeichen drin vorkommen. Der RAW-Modus schützt es vor falscher Interpretation.
      • STRG + B -> raw Repl verlassen


    Und hier das Beispiel, wie man die beiden Module installiert und eine Nachricht an den Broker sendet.

    Als Broker verwenden die meisten mosquitto.


    Meinen Fehler habe ich mal drin gelassen. Die Dokumentation von umqtt ist nicht so gut. Um mir jetzt Zeit zu sparen, habe ich mir einfach den Quellcode angesehen.


    Die Module werden in /lib untergebracht.



    PS: Der Broker mosquitto sollte auch problemlos auf einem Pentium 100 laufen. Einfach mal auf eBay schauen, ob noch alte Thin Clients verfügbar sind. Die sind meist noch günstiger als die Raspberry Pi angeboten. Wenn das so ist, dass man dir vorschreibt, was du für Hardware zu nutzen hast, muss derjenige auch die Kosten akzeptieren.

    Muss der Sprachassistent wie ein Mensch klingen?


    Ich habe das mal in Verbindung mit espeak-ng, mqtt, mosquitto und Python gemacht.

    Bei der SPS (Siemens) habe ich den offiziellen MQTT Client verwendet.


    Ginge aber auch mit OPCUA. Die Siemens SPS (1200/1500) können ab einer bestimmten Firmware einen OPCUA-Server betreiben.

    Mittlerweile müsse die SPS aber als OPC UA Client agieren können. D.h. du könntest den OPC UA Server auch auf dem PC/RPi betreiben.


    Es gibt noch weitere Möglichkeiten zur Kommunikation: TCP/UDP