Raspberry Pi Pico

Ein neuer interessanter Controller ist da und schon habe ich die TPS auf diesem implementiert.

Einleitung

Der Pico ist nur wenig größer als ein Arduino Nano und hat eine MicroUSB Schnittstelle zur Kommunikation mit dem Host. Interessant an dem Controller:

  • Dual-core Arm Cortex-M0+ Prozessor, flexibler Takt mit bis zu 133 MHz (250MHz overclocking ist möglich)
  • 264KB on-chip SRAM
  • 2MB on-board QSPI Flash
  • 26 multifunktionale GPIO Pins
  • 3 analoge Eingänge
  • 2 × UART, 2 × SPI Controller, 2 × I2C Controller, 16 × PWM Kanäle
  • 1 × USB 1.1 Controller
  • 8 × Programmierbare I/O (PIO) benutzerdefinierte Zustandsmaschinen

Vor allem aber der Preis ist auch ein wichtiger Grund. Während der Arduino Nano derzeit mit 8€ gehandelt wird, gibt es den RPI Pico bereits ab 4€.

Zur Programmierung gibt es mehrere Optionen, einerseits kann man den Pico natürlich mit einer Toolchain in C++ programmieren. Auch für den Boardmanager der Arduino IDE ist bereits eine Variante da.

Andererseits gibt es eine MicroPython Implmentierung auf dem Pico.

Für die TPS habe ich mich zu einer MicroPython Implementierung entschlossen, da ich bereits Implementierungen für Caliope und Microbit 1/2 in MicroPython gemacht habe. Und es dort bereits eine funktionierende Filesystemanbindung gibt. Da der Pico deutlich mehr Pins zur freien Verfügung stellt, habe ich den Befehlssatz noch etwas erweitert. Zusätzlich gibt es nun 2 analoge Ausgänge mehr, die auch als Servoausgänge benutzt werden können. (Nur im 8-Bit Modus)

Die aktuelle Entwicklungsversion ist in meinem Python-TPS Github Repo zu finden: https://github.com/willie68/PythonTPS_SPS

Command Implementation Chart

Die Befehl Implementierungsliste für den Raspberry PI Pico:

0 1 2 3 4 5 6 7
n.n. Port [DOUT]Delay [WAIT]Jump back relative [RJMP]A=# [LDA]=A A= A=Ausdruck
0NOP [NOP] aus 1ms 0 0 A↔B [SWAP]
1 1 2ms 1 1 B=A [MOV] A=B [MOV] A=A + 1 [INC]
2 2 5ms 2 2 C=A [MOV] A=C [MOV] A=A - 1 [DEC]
3 3 10ms 3 3 D=A [MOV] A=D [MOV] A=A + B [ADD]
4 4 20ms 4 4 Dout=A [STA] Din [LDA] A=A - B [SUB]
5 5 50ms 5 5 Dout.1=A.1 [STA]Din.1 [LDA] A=A * B [MUL]
6 6 100ms 6 6 Dout.2=A.1 [STA]Din.2 [LDA] A=A / B [DIV]
7 7 200ms 7 7 Dout.3=A.1 [STA]Din.3 [LDA] A=A and B [AND]
8 8 500ms 8 8 Dout.4=A.1 [STA]Din.4 [LDA] A=A or B [OR]
9 9 1s 9 9 PWM.1=A [STA] ADC.1 [LDA] A=A xor B [XOR]
a 10 2s 10 10 PWM.2=A [STA] ADC.2 [LDA] A= not A [NOT]
b 11 5s 11 11 Servo.1=A [STA] RCin.1 [LDA]A= A % B (Rest) [MOD]
c 12 10s 12 12 Servo.2=A [STA] RCin.2 [LDA]A= A + 16 * B [BYTE]
d 13 20s 13 13 E=A [MOV] A=E [MOV] A= B - A[BSUBA]
e 14 30s 14 14 F=A [MOV] A=F [MOV] A=A SHR 1 [SHR]
f 15 60s 15 15 Push A [PUSH] Pop A [POP] A=A SHL 1 [SHL]
8 9 a b c d e f
Page [PAGE]Jump absolut (#+16*page) [JMP]C* C>0: C=C-1; Jump # + (16*page) [LOOPC]D* D>0:D=D-1; Jump # + (16*page) [LOOPD]Skip if Call # + (16*Page) [Call]Callsub/Ret Byte Befehle
00 0 0 0 A==0 [SKIP0] 0 ret [RTR] A=ADC.1 [BLDA]
11 1 1 1 A>B [AGTB] 1 Call 1 [CASB] A=ADC.2 [BLDA]
22 2 2 2 A<B [ALTB] 2 2 [CASB] A=RCin.1 [BLDA]
33 3 3 3 A==B [AEQB] 3 3 [CASB] A=RCin.2 [BLDA]
44 4 4 4 Din.1==1 [DEQ1 1]4 4 [CASB] PWM.1=A [BSTA]
55 5 5 5 Din.2==1 [DEQ1 2]5 5 [CASB] PWM.2=A [BSTA]
66 6 6 6 Din.3==1 [DEQ1 3]6 6 [CASB] Servo.1=A [BSTA]
77 7 7 7 Din.4==1 [DEQ1 4]7 Servo.2=A [BSTA]
88 8 8 8 Din.1==0 [DEQ0 1]8 Def 1 [DFSB] Tone=A [TONE]
99 9 9 9 Din.2==0 [DEQ0 2]9 2 [DFSB] PWM.3=A [BSTA]
a10 10 10 10 Din.3==0 [DEQ0 3]10 3 [DFSB] PWM.4=A [BSTA]
b11 11 11 11 Din.4==0 [DEQ0 4]11 4 [DFSB] Servo.3=A [BSTA]
c12 12 12 12 S_PRG==0 [PRG0] 12 5 [DFSB] Servo.4=A [BSTA]
d13 13 13 13 S_SEL==0 [SEL0] 13 6 [DFSB] LED On [LED1]
e14 14 14 14 S_PRG==1 [PRG1] 14 LED off [LED0]
f15 15 15 15 S_SEL==1 [SEL1] 15 restart [REST]PrgEnd [PEND]

Hardware assignments

pin mapping table

pin number pico function TPS function pin pico function TPS function
———- ————– ———— —- ————- —————
1 GP0 40 VBUS
2 GP1 39 VSYS
3 GND 38 GND
4 GP2 Dout.1 37 3V3_EN
5 GP3 Dout.2 36 3V3
6 GP4 Dout.3 35 ADC_VREF
7 GP5 Dout.4 34 ADC2
8 GND 33 GND
9 GP6 Din.1 32 ADC1 ADC.1
10 GP7 Din.2 31 ADC0 ADC.0
11 GP8 Din.3 30 RUN Reset
12 GP9 Din.4 29 GP22
13 GND 28 GND
14 GP10 SEL 27 GP21 PWM.4 (Servo.4)
15 GP11 PRG 26 GP20 PWM.3 (Servo.3)
16 GP12, UART0 TX 25 GP19
17 GP13, UART0 RX 24 GP18 Tone output
18 GND 23 GND
19 GP14 RC.1 22 GP17 PWM.2 (Servo.2)
20 GP15 RC.2 21 GP16 PWM.1 (Servo.1)

Installation

Derzeit ist die Installation noch etwas komplexer. Aber ich arbeite daran. Deswegen muss derzeit noch die Thonny IDE auf dem Host installiert sein. (https://thonny.org/)

  • Zunächst laden Sie sich das Github Repo (https://github.com/willie68/PythonTPS_SPS) als ZIP herrunter und entpacken das ganze in ein Unterverzeichniss ihrer Wahl.
  • dann gehen Sie in das UNterverzeichniss picoTPS und dort in der Verzeichniss Firmware. Hier liegen die verschiedenen RPI Pico Firmwares.
  • Schliessen Sie nun den Pico an während Sie die BOTSSEL Taste gedrückt halten. Es wird ein neues Laufwerk im Explorer erscheinen.
  • Auf dieses Laufwerk kopieren Sie nun die Datei: rp2-pico-###########.uf2, warten Sie auf den Neustart
  • Jetzt können Sie ihre Thonny IDE starten und mit dem RPI Pico verbinden.
  • Danach öffnen Sie die main.py aus dem PicoTPS Verzeichniss und laden diese auf den Pico.
  • Fertig

Apendix

arduino/arduinosps/rpi2040.txt · Zuletzt geändert: 2022/06/17 06:45 von admin
CC Attribution-Share Alike 4.0 International
Driven by DokuWiki Recent changes RSS feed Valid CSS Valid XHTML 1.0