RFID-Modul UND TTGO-Display betreiben

Hier werden einzelne Projekte mit MicroPython vorgestellt
Antworten
Heinrichs
Beiträge: 151
Registriert: Do 21. Okt 2010, 18:31

RFID-Modul UND TTGO-Display betreiben

Beitrag von Heinrichs » 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.

Zwei_SPI_Slaves.jpg
Abb. 1: Zwei SPI-Slaves an einem Master
Zwei_SPI_Slaves.jpg (31.27 KiB) 245 mal betrachtet

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)
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.

rfid_und_display.jpg
Abb. 2: UID-Anzeige auf dem Display des TTGO
rfid_und_display.jpg (141.75 KiB) 238 mal betrachtet
.
Dateianhänge
rfid2.zip
mfrc_read_uid_display_1.py und mfrc255.py
(3.11 KiB) 42-mal heruntergeladen

Antworten