RFID-Modul UND TTGO-Display betreiben
Verfasst: Di 3. Mai 2022, 09:42
Neben dem Display des "TTGO T-Display" soll auch ein RFID-RC522-Modul betrieben werden. Eigentlich stellt es kein Problem dar, mehrere SPI-Module über SPI anzusteuern. Üblicherweise schließt man hierzu mehrere SPI-Slaves wie in Abb. 1 dargestellt an: Dabei benutzen alle Slaves jeweils einen gemeinsamen Anschluss für MOSI, MISO und SCK am Master; mit welchem Slave der Master gerade kommuniziert, wird durch die unterschiedlichen Chip-Select-Leitungen (CS1 und CS2) festgelegt. Ein Slave wird nur solange angesprochen, wie an seinem CS-Eingang ein Low-Signal anliegt.
Bei dem Modul TTGO T-Display lässt sich die in Abb. 1 dargestellte Methode leider nicht anwenden. Der Grund ist: Die zur Steuerung des Displays benutzten GPIOs des ESP32 sind mit dem Display fest verdrahtet und stehen nicht zum Anschluss an weitere Module zur Verfügung.
Um neben dem Display ein weiteres SPI-Modul zu betreiben, benötigt man zwei SPI-Master. Nun hat ein ESP32 hardwaremäßig tatsächlich auch zwei Hardware-SPI-Interfaces, nämlich HSPI (id = 1) und VSPI (id=2). Leider funktioniert bei der von mir benutzten Firmware für das TTGO-T-Display-Modul nur eines dieser beiden SPI-Interfaces (vgl. Neue Firmware für den TTGO T-Display (Version 1.18)).
Allerdings kann Micropython auch softwaremäßig einen SPI-Master emulieren; er arbeitet zwar nicht so rasch wie ein Hardware-SPI, zum Betrieb des RFID-Moduls reicht es aber allemal. Die Software-SPI-Klasse befindet sich (wie auch die Hardware-SPI-Klasse) in dem Modul machine; Informationen dazu findet man hier. Eine Initialisierung der beiden benutzten SPI-Interfaces kann dann z. B. so aussehen:
Ein Programm, welches den UID einer RFID-Karte auf dem Display ausgibt, finden Sie in der Anlage; es handelt sich um eine erweiterte Version des Programms mfrc_read_uip.py von dem Beitrag RFID RC522 - Eine Einführung. Wenn Sie nun noch den Abbruch des Programms nicht durch ein Keyboard-Interrupt, sondern durch ein Tasten-Interrupt (z. B. über den Taster S0 an GPIO0 des TTGO-Moduls) vornehmen, ist unsere UID-Anzeige auch stand-alone einsatzfähig.
.
Bei dem Modul TTGO T-Display lässt sich die in Abb. 1 dargestellte Methode leider nicht anwenden. Der Grund ist: Die zur Steuerung des Displays benutzten GPIOs des ESP32 sind mit dem Display fest verdrahtet und stehen nicht zum Anschluss an weitere Module zur Verfügung.
Um neben dem Display ein weiteres SPI-Modul zu betreiben, benötigt man zwei SPI-Master. Nun hat ein ESP32 hardwaremäßig tatsächlich auch zwei Hardware-SPI-Interfaces, nämlich HSPI (id = 1) und VSPI (id=2). Leider funktioniert bei der von mir benutzten Firmware für das TTGO-T-Display-Modul nur eines dieser beiden SPI-Interfaces (vgl. Neue Firmware für den TTGO T-Display (Version 1.18)).
Allerdings kann Micropython auch softwaremäßig einen SPI-Master emulieren; er arbeitet zwar nicht so rasch wie ein Hardware-SPI, zum Betrieb des RFID-Moduls reicht es aber allemal. Die Software-SPI-Klasse befindet sich (wie auch die Hardware-SPI-Klasse) in dem Modul machine; Informationen dazu findet man hier. Eine Initialisierung der beiden benutzten SPI-Interfaces kann dann z. B. so aussehen:
Code: Alles auswählen
from machine import Pin, SPI, SoftSPI
import st7789
import vga2_16x16 as font1 # Mit Umlauten
import vga2_8x16 as font2
from os import uname
release = uname().release[0:4]
id = 2 # z. B. für V 1.12 und V 1.14 # Je nach Version wird HSPI oder VSPI benutzt.
if release == '1.18':
id = 1
spi = SPI(id, baudrate=20000000, polarity=1, sck=Pin(18), mosi=Pin(19)) # 1. Parameter = 1 für Firmware v1.18
display = st7789.ST7789(spi, 135, 240, reset=Pin(23, Pin.OUT), cs=Pin(5, Pin.OUT), dc=Pin(16, Pin.OUT), backlight=Pin(4, Pin.OUT), rotation=3)
display.init()
from time import sleep_ms
from mfrc522 import MFRC522
sck = Pin(17, Pin.OUT)
mosi = Pin(15, Pin.OUT)
miso = Pin(12, Pin.OUT)
softspi = SoftSPI(baudrate=100000, polarity=0, phase=0, sck=sck, mosi=mosi, miso=miso)
sda = Pin(25, Pin.OUT) # (SDA = ChipSelect)
.