micropython Port mit drei zusätzlichen Modulen

  • Inspiriert von diesem Forum habe ich drei allgemein nützliche Module für den rpi_pico auf MicroPython portiert und als firmware zum Download auf github bereit gestellt. Beispielanwendungen und der Quellcode sind dort ebenfalls zum Download :)

    Das interessanteste ist wohl die i2c_slave Implementierung
    Ein ws2812-Led Modul das nur einen Strip steuert, aber schneller
    Ein buzzer Modul das drei Oktaven auf einem Passiv-Buzzer spielt

    siehe readme.md und viel Spass beim testen:thumbup:

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • momefilo April 14, 2025 at 2:34 PM

    Changed the title of the thread from “micropython Port mit drei zusätzlichen mudulen” to “micropython Port mit drei zusätzlichen Modulen”.
  • achim 9876 Einfach die passende *.uf2-Datei runter laden und wie gewohnt auf den Pico kopieren:

    GitHub - momefilo/micropython: micropython rp2-ports
    micropython rp2-ports. Contribute to momefilo/micropython development by creating an account on GitHub.
    github.com

    MicroPython ist in C geschrieben, da gibt es *.c und *.h Dateien. Erklärungen gibt's viele im Netz, zum Beispiel hier.
    Die *.py Dateien sind ja nur Beispiel-Programme, wie die Erweiterungen genutzt werden.


    Grüße
    Dennis


    Edit: Gerade mal die Beispiel angeschaut, da könnte man sich mal etwas über den Aufbau unterhalten, zum Beispiel `i2c_slave`.

    Auf Modulebene darf nur Code stehen der Konstanten, Klassen, Funktionen und den Einstieg in die `main`-Funktion definiert. Die `main`-Funktion fehlt, aus ihr wird normalerweise das Programm gesteuert, sprich Funktionen aufgerufen, Argumente übergeben und Rückgaben entgegen genommen.

    Wenn man sinnvolle Namen wählt dann spart man sich Kommentare. Man muss zum Beispiel nicht erklären was `data` sein soll und man muss `data` auch nicht irgendwo mal definieren. Man definiert Namen dort wo sie benötigt werden. Das gilt auch für `receive`. In keinem sauberen Programm verwendet man `global`. Wenn man sich einen Zustand merken will, dann benötigt man eine Klasse.
    Was bedeutet denn `rec`? Wenn man nach einer `if`-Abfrage gar nichts macht, dann kann man die auch weg lassen.

    Erste Überarbeitung:

    🎧 I'm strapped into my bed,
    I've got electrodes in my head.
    My nerves are really bad,
    it's the best time I've ever had. 🎧

    Edited once, last by Dennis89 (April 15, 2025 at 7:56 PM).

  • achim 9876 Alle module sind in c geschrieben und die .h-Dateien gehören zu c. Für das i2c_slave modul habe ich eigentlich nur die Parameterübergabe an den Organalcode schreiben müssen und die initialisierung der GPIOs. Zusätlich musste ich nur die im pico-sdk vorhanden i2c-schreib/lese Funktionen mit einfachen "wrapper"-Funktionen dem Modul bereitstellen; der callback erwies sich als einfach. Die ganze Arbeit an dem Modul liegt beim Autor des c-i2c_slave: "Copyright (c) 2021 Valentin Milea" und "Copyright (c) 2023 Raspberry Pi (Trading) Ltd." so stehts auch im Quelltext.

    Das bereitstellen von c- Usermodulen für MicroPython ist hauptsächlich, die von python übergeben Variablen mit Standartfünktionen in c-Variablen mit fester Größe zu wandeln und zurück. Mit dem ws2812-Modul habe ich Probleme mit dem Speicher wenn ich die Leseadresse dessen in c-Fuktionen verschiebe, geht die nach einer gewissen Zeit immer verloren so das ich nicht den vollen speed von c in dem Modul nutzen kann, um einfache move-Funktionen zu implementieren die den ganzen strip um eine led in "c-speed" verschieben. Das finde ich wirklich schade aber es ist viel schneller als NeoPixel doch kann nur einen Strip.

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

    Edited once, last by momefilo (April 16, 2025 at 12:40 AM).

  • Danke Dennis89

    Ich kann das jetzt nicht testen weil ich einen anderen versuchsaufbau habe, aber gehe davon aus das du es getan hast? Dann würd ich den Code gern unter deinem Namen oder Pseudo auf github laden, ändere das einfach im Code oben. Und die Requenz ist mit "400*1000" besser lesbar denke ich

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • Nein das ist von mir nicht getestet und dient dazu zu zeigen wie man so ein Skript ordentlicher schreibt. Welcher Namen da im Code steht ist mir letzendlich egal, ist dein Projekt und außer etwas Umstrukturierung ist von mir da keine Leistung erbracht worden.


    Grüße
    Dennis

    🎧 I'm strapped into my bed,
    I've got electrodes in my head.
    My nerves are really bad,
    it's the best time I've ever had. 🎧

  • Nein das ist von mir nicht getestet und dient dazu zu zeigen wie man so ein Skript ordentlicher schreibt. Welcher Namen da im Code steht ist mir letzendlich egal, ist dein Projekt und außer etwas Umstrukturierung ist von mir da keine Leistung erbracht worden.


    Grüße
    Dennis

    Achso:) trotzdem danke.

    Jeder macht was er will, keiner macht was er soll, aber alle machen mit :)

  • 4e5 ist als alter BASIC-Programmierer für mich lesbar, aber in Python ist das auch nicht 400*1000¹ sondern 400_000. Genau für so etwas wurde der _ in literalen Zahlwerten doch eingeführt. 🤓

    ¹ Der BASIC-Interpeter-geschädigte in mir ist entsetzt: 5 Bytes mehr und eine Multiplikation. 😲

    Code
    B*
         PC  IRQ  SR AC XR YR SP
    .;  0401 E455 32 04 5E 00 F8
    .█

Participate now!

Don’t have an account yet? Register yourself now and be a part of our community!