PiPico Micropython

Gast #6595528
Lesenswert?

In diesem Thread will ich einige Code-Beispiele für den PiPico sammeln.
Der ESP32 unterstützt Micropython auch

Beitrag "ESP32 Micropython"

und es stellt sich die interessante Frage, ob der PiPico gegenüber dem 
ESP32 Vorzüge besitzt.

Welche GUI nutzt ihr für MicroPython?

Es wird Thonny vorgeschlagen

https://thonny.org/

Dessen Installation bei mir nicht geklappt hat und deshalb darauf 
verzichten möchte.
Gast #6595529
Lesenswert?

Für den ersten Erfolg: Blinky
1
import machine
2
l=machine.Pin(25,machine.Pin.OUT)
3

4
import utime as u
5
for i in range(100):
6
     l.value(1)
7
     u.sleep(1)
8
     l.value(0)
9
     u.sleep(1)

Als Programmierschnittstelle kann man bei Ubuntu auch einfach "minicom" 
verwenden. Aufruf mit
1
minicom -D /dev/ttyACM0

mit CTRL-E kommt man in den "paste mode" in den man den obigen LED-Code 
einfach kopieren kann. Dieser wird dann mit CTRL-D beendet und Voila .. 
die LED blinkt.
#6595551
Lesenswert?

chris_ schrieb:
> und es stellt sich die interessante Frage, ob der PiPico gegenüber dem
> ESP32 Vorzüge besitzt.

Insgesamt ist MicroPython so ausgelegt, dass es auf jeder Plattform 
möglichst gleich zu nutzen ist. Wenn deine Programme also nicht zu 
hardwarenah sind, solltest™ du keinen Unterschied zwischen den beiden 
Plattformen feststellen. Wenn’s allerdings näher an die Hardware geht, 
lassen sich mit Einem Dinge machen, die mit dem Anderen nicht gehen. Im 
Falle des Pico wären das etwa Statemachines/PIO¹ und die einfache 
Nutzung des zweiten Kerns, welche es beim ESP32 nicht geben dürfte. Da 
ich ESP32 nicht weiter kenne, kann ich kein Beispiel für die andere 
Richtung geben – aber da gibt’s ganz sicher auch Sachen, die nur dort zu 
nutzen sind, weil beim Pico nicht vorhanden.

Wenn du allerdings „nur“ Taster, Potis und irgendwelche z.B. 
I²C-Standardsensoren auslesen, und Informationen über LEDs oder 
irgendwelche Standarddisplays ausgeben willst, ist’s gehüpft wie 
gesprungen, welches Board du wählst.

chris_ schrieb:
> Es wird Thonny vorgeschlagen
> https://thonny.org/
> Dessen Installation bei mir nicht geklappt hat und deshalb darauf
> verzichten möchte.

Geht im Grunde mit allem: PyCharm, Eclipse, Atom, VS Code, Vim, Emacs, 
nano, ed, etc. – der Vorteil bei Thonny ist, dass ohne zusätzliche 
Konfiguration alles mit einem Klick geht: MicroPython auf die Platine 
packen, verschiedene Programme direkt vom Speicher des Pico in den 
Editor laden und andersrum, und solche Sachen. Die Installation war 
zumindest bei mir auch ganz einfach: ›yay thonny‹ (bei Debian und 
RaspberryOS ist’s im Repo zu finden, so dass es sich auch dort einfach 
via ›apt install thonny‹ installieren lassen sollte. Von diesen 
eingeschränkten Betriebssystemen, wie man sie manchmal auf fertigen 
Rechnern findet („Windows“ wird wohl viel verwendet), habe ich hingegen 
keine Ahnung.

---

¹) ein verhältnismäßig einfaches Beispiel findet sich unter 
https://core-electronics.com.au/tutorials/how-to-use-ws2812b-rgb-leds-with-raspberry-pi-pico.html 
– da wird die Ansteuerung von WS2812B darüber realisiert.
Gast #6595569
Lesenswert?

chris_ schrieb:
> und es stellt sich die interessante Frage,
> ob der PiPico gegenüber dem ESP32 Vorzüge besitzt.

Hat ein Trekker gegenüber einem Laster Vorzüge?

Da es sich um zwei völlig unterschiedliche Produkte handelt, kommt es 
doch sehr darauf an, was du damit machen willst.

OK, du will MicroPython ausführen. Das ist aber keine Anwendung, sondern 
eine Programmiersprache. Du musst musst schon konkreter werden.
Gast #6595589
Lesenswert?

Jack V. schrieb:
> Das allerdings ist ’ne Definitionssache: das MicroPython auf dem μC ist
> sehr wohl ein Programm, welches die Scripte ausführt.

Man kauft sich aber weder einen ESP32 noch einen Raspberry Pi, um Python 
Scripte auszuführen. Sondern man führt Python Scripte aus, um etwas 
bestimmtes zu erreichen. Auf dieses "etwas" kommt es an.
#6595598
Lesenswert?

Stefan ⛄ F. schrieb:
> Man kauft sich aber weder einen ESP32 noch einen Raspberry Pi, um Python
> Scripte auszuführen. Sondern man führt Python Scripte aus, um etwas
> bestimmtes zu erreichen. Auf dieses "etwas" kommt es an.

Hm. Wortklaubereien. Für mich kommt es auf das „wie“ genauso an: man 
nutzt die meisten Programme ja auch nicht, um Programme zu benutzen, 
sondern um etwas Bestimmtes zu erreichen. MicroPython ist ein Programm, 
das auf dem Pico oder ESP-Board (oder einer anderen Plattform) läuft, 
dort RAM und Rechenzeit beansprucht, und dafür sorgt, dass die Eingaben 
(Scripte) entsprechend umgesetzt werden.

BTT?
Beitrag #6595875 wurde von einem Moderator gelöscht.
Beitrag #6595881 wurde von einem Moderator gelöscht.
Gast #6595883
Lesenswert?

Mittlerweil läuft bei mir Thonny:
Das Problem war meine Python Installation.
Ich hatte es mehrfach mit

pip3 install thonny

versucht. Aber scheinbar liegt da eine zu alte Python Version dahinter.

Mit

pip3.7 install thonny

hat es funktioniert.

In "thonny" selbst muss man dann noch bei "run" "select interpreter" 
auswählen und dort den PiPico Microphython Interpreter selektieren.

Hier gibt es ein interessantes Repository mit dem PiPico als 
Waveform-Generator:

https://github.com/romilly/pico-code/tree/master/src/pico_code/pico/experiments

( den ich noch nicht ausprobiert habe )
Gast #6595886
Lesenswert?

chris_ schrieb im Beitrag #6595875:
> Deine Klugscheisserei geht mir langsam ernsthaft auf die Nerven.

Ich habe diesen Beitrag geschrieben, weil ich dir eine zur Anwendung 
passende Antwort geben wollte.

Wenn du keine konkrete Anwendung im Sinn hast, sondern einfach nur ein 
bisschen Python ausprobieren willst, dann kannst du das einfach 
mitteilen und gut ist.

Wer hier die Helfer beschimpft, muss damit rechnen, bald keine Hilfe 
mehr zu bekommen. Oder gar verarscht zu werden - hatten wir alles schon 
oft genug.
Beitrag #6595933 wurde von einem Moderator gelöscht.
#6597236
Lesenswert?

jaaaaa, sein "Oszi" hat aber nur 1 Aufnahme gemacht und deinem Oszi ein 
paar mehr die übereinander liegen. Guck dir die PWM signal an ob es 
evtl. "sauber" aussieht. Leider habe ich jede Menge Platinen aber keine 
PiPicos :/.
Aber uPython geht auch mit dem ESP32... wäre ein versuch Wert...
#6597300
Lesenswert?

Stefan ⛄ F. schrieb:
> Jack V. schrieb:
>> Naja, es fehlt eine Frage.
>
> chris_ schrieb:
>> und es stellt sich die interessante Frage, ob der PiPico gegenüber dem
>> ESP32 Vorzüge besitzt.

Ich denke, dazu bereits etwas geschrieben zu haben.

Ansonsten hat so’n netter Schweizer das Thema mal aufgegriffen (und dazu 
noch den STM32 von den BlackPill-Boards in den Vergleich aufgenommen): 
https://www.youtube.com/watch?v=cVHCllbN3bQ
Gast #6597653
Lesenswert?

chris_
>und es stellt sich die interessante Frage, ob der PiPico gegenüber dem
>ESP32 Vorzüge besitzt.
Jack V. (jackv)
>Ansonsten hat so’n netter Schweizer das Thema mal aufgegriffen (und dazu
>noch den STM32 von den BlackPill-Boards in den Vergleich aufgenommen):
>https://www.youtube.com/watch?v=cVHCllbN3bQ

Eine sehr schöne Analyse meiner Eingangsfrage, welche das ganze auf den 
Punkt bringt. Das Video sollte man vielleicht im Hautpthread posten:

https://www.mikrocontroller.net/topic/raspberry-pi-pico-mikrocontroller-board-mit-cortex

Die Ansichten von Andreas Spiess ( "the guy with the swiss accent" ) 
sind aber ein wenig "biased".
Ich weiß, er hat den ULP des ESP32 ziemlich genau analysiert und die PIO 
des RP2040 damit verglichen. Die PIO ist, was den Befehlssatz angeht, 
weniger leistungsfähig. Allerdings wird man mit dem ULP kein DVI-Signal 
erzeugen können.
Im Vergleich wird auch gezeigt, dass der RP2040 keine I2S Schnittstelle 
hat. Aber genau die dürfte man mit der PIO gut realisieren können.
Von Pimoroni gibt's bereits ein Shield dazu:

https://shop.pimoroni.com/products/pico-audio-pack

Insofern: In einigen Aspekten ist der RP2040 deutlich weniger 
leistungsfähig als der ESP32, aber bei bestimmten Anwendungen wird der 
ESP32 nicht mithalten können, wenn die speziellen Hardwareeinheiten SIO 
und PIO benötigt werden.
Angehängte Dateien:
Gast #6603873
Lesenswert?

Ich möchte einen I2C Peripherie Baustein an den PiPico anschließen.
Um den Baustein einfach testen zu können, will ich die Register auslesen 
und über Tastatureingaben direkt verändern können.

Es wird also eine Hexadezimal Aus- und Eingabe gebraucht.

Der Python Syntax scheint stark bezüglich der Versionsn 2.x und 3.x sehr 
unterschiedlich zu sein.

Eine HEX-Ausgabe habe ich auf diese Weise geschafft:
1
ar=[1,2,10,127,255,0xB,0xAA]
2

3
for b in ar:
4
    print("0x%02x"%b)
1
>>> %Run -c $EDITOR_CONTENT
2
0x01
3
0x02
4
0x0a
5
0x7f
6
0xff
7
0x0b
8
0xaa
3 Zeilen Code und eine halbe Stunde rumprobieren, deshalb poste ich die 
Zeilen hier.

Hat jemand einen einfachen Editor für HEX-Eingaben?
Gast #6603879
Lesenswert?

Das Board mit der MPU6050 scheint die I2C-PullUps schon integriert zu 
haben.

Ein I2C-Scan mit
1
import machine
2
sda=machine.Pin(0)
3
scl=machine.Pin(1)
4
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
5
print(i2c.scan())

ergibt die Adresse 104:
1
MicroPython v1.14 on 2021-02-05; Raspberry Pi Pico with RP2040
2
Type "help()" for more information.
3
>>> %Run -c $EDITOR_CONTENT
4
[104]
Angehängte Dateien:
Gast #6604038
Lesenswert?

Hier eine Funktion für ein Registerdump einer MPU6050 über die 
I2C-Schnittstelle:
1
# read chip registers of a MPU6050
2
# and display contents as hex values
3

4
import machine
5

6
sda=machine.Pin(0)
7
scl=machine.Pin(1)
8
i2c=machine.I2C(0,sda=sda, scl=scl, freq=400000)
9

10
i2cAdr=104
11

12
# write power managment register
13
i2c.writeto(i2cAdr, bytearray([107, 0]))
14

15
for chipRegister in range(0,118):
16

17
    ar = i2c.readfrom_mem(i2cAdr, chipRegister, 1)
18
    for b in ar:
19
        print("register %2d : 0x%02x"%(chipRegister,b)),

Output:
1
>>> %Run -c $EDITOR_CONTENT
2
register  0 : 0x81
3
register  1 : 0x01
4
register  2 : 0x7e
5
register  3 : 0xb0
6
register  4 : 0xd2
7
register  5 : 0xce
8
register  6 : 0xf6
9
register  7 : 0xc0
10
...
#6604276
Lesenswert?

chris_ schrieb:
> Der Python Syntax scheint stark bezüglich der Versionsn 2.x und 3.x sehr
> unterschiedlich zu sein.

Ist nicht vornehmlich die Syntax und man kann es kaum übersehen, da 
(fast) alle Tutorien streng zwischen den Versionen unterscheiden. 
Trotzdem gibt es für den Anfänger viele unerwartete Fallstricke. So habe 
ich z.B. nicht geschnallt, dass die Vers. 3.6 kein Upgrade von 3.4 ist! 
Da hilft nur hartnäckiges Forschen. Ich wünsche viel Erfolg.
Gruß Rainer
Gast #6604633
Lesenswert?

Uwe D. (monkye)
28.02.2021 13:30
>Hier noch eine ähnliche Lösung:
>https://www.instructables.com/Arbitrary-Wave-Generator-With-the-Raspberry-Pi-Pic/

Nicht schlecht ... 125MSPs mit Python.
OK, es wird nur die DMA zusammmen mit der PIO konfiguriert, aber das 
Projekt ist ziemlich gut gemacht.
Wahrscheinlich lässt sich der Transistortester mit dem RP2040 auf eine 
ganz neue Stufe stellen.
Gast #6638253
Lesenswert?

Weiter geht's mit der PiPico Python-Sammlung:

ein SPI Test
1
import machine
2

3
#led
4
led=machine.Pin(25,machine.Pin.OUT)
5

6
#spi interface
7
ssn=machine.Pin(5,machine.Pin.OUT)
8
spi_sck=machine.Pin(2,machine.Pin.OUT)
9
spi_tx=machine.Pin(3,machine.Pin.OUT)
10
spi_rx=machine.Pin(4,machine.Pin.OUT)
11

12
# 100Hz SPI
13
spi=machine.SPI(0,baudrate=100,sck=spi_sck, mosi=spi_tx, miso=spi_rx)
14

15
import utime as u
16

17
tog=1
18

19
def outpx(data):
20
    global tog
21
    tog=not tog
22
    led.value(tog)
23

24
    ssn.low()
25
    spi.write(data)
26
    ssn.high()
27

28
for i in range(10000):
29
    outpx(bytes([i]))
30
    u.sleep(0.1)
Gast #6642935
Lesenswert?

Bei Python scheint mir die Byteverarbeitung deutlich komplizierter als 
in C.

Ich habe eine Funktion zum Schreiben von 3 Bytes an einen externen 
SPI-Baustein erstellt. Der Code funktioniert, gefällt mir aber nicht. Es 
muss eine elegantere Möglichkeit in MicroPython geben.

Hat jemand einen Tipp?

Hier der aktuelle Code:
1
import struct
2

3
tog=1
4

5
def spiWrite(data):
6
    global tog
7
    tog=not tog
8
    led.value(tog)
9

10
    ssn.low()
11
    spi.write(data)
12
    ssn.high()
13

14
def sendCommand(command,param):
15
    data=bytearray(3)
16
    d=struct.pack( "<H", param)
17
    data[0]=d[1]
18
    data[1]=d[0]
19
    dd=struct.pack( "b", command)
20
    data[2]=dd[0]
21
    print(data)
22
    spiWrite(data)

Antwort schreiben

Bitte melde dich an, um einen Beitrag zu schreiben.

oder

Mit Google-Account einloggen

Die Registrierung ist kostenlos und dauert nur eine Minute.

Jetzt registrieren