Inhaltsverzeichnis
Raspberry Pi Pico
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 | |
0 | NOP [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 | |
0 | 0 | 0 | 0 | 0 | A==0 [SKIP0] | 0 | ret [RTR] | A=ADC.1 [BLDA] |
1 | 1 | 1 | 1 | 1 | A>B [AGTB] | 1 | Call 1 [CASB] | A=ADC.2 [BLDA] |
2 | 2 | 2 | 2 | 2 | A<B [ALTB] | 2 | 2 [CASB] | A=RCin.1 [BLDA] |
3 | 3 | 3 | 3 | 3 | A==B [AEQB] | 3 | 3 [CASB] | A=RCin.2 [BLDA] |
4 | 4 | 4 | 4 | 4 | Din.1==1 [DEQ1 1] | 4 | 4 [CASB] | PWM.1=A [BSTA] |
5 | 5 | 5 | 5 | 5 | Din.2==1 [DEQ1 2] | 5 | 5 [CASB] | PWM.2=A [BSTA] |
6 | 6 | 6 | 6 | 6 | Din.3==1 [DEQ1 3] | 6 | 6 [CASB] | Servo.1=A [BSTA] |
7 | 7 | 7 | 7 | 7 | Din.4==1 [DEQ1 4] | 7 | Servo.2=A [BSTA] | |
8 | 8 | 8 | 8 | 8 | Din.1==0 [DEQ0 1] | 8 | Def 1 [DFSB] | Tone=A [TONE] |
9 | 9 | 9 | 9 | 9 | Din.2==0 [DEQ0 2] | 9 | 2 [DFSB] | PWM.3=A [BSTA] |
a | 10 | 10 | 10 | 10 | Din.3==0 [DEQ0 3] | 10 | 3 [DFSB] | PWM.4=A [BSTA] |
b | 11 | 11 | 11 | 11 | Din.4==0 [DEQ0 4] | 11 | 4 [DFSB] | Servo.3=A [BSTA] |
c | 12 | 12 | 12 | 12 | S_PRG==0 [PRG0] | 12 | 5 [DFSB] | Servo.4=A [BSTA] |
d | 13 | 13 | 13 | 13 | S_SEL==0 [SEL0] | 13 | 6 [DFSB] | LED On [LED1] |
e | 14 | 14 | 14 | 14 | S_PRG==1 [PRG1] | 14 | LED off [LED0] | |
f | 15 | 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