RP2040 mit Relais-Erweiterung (MEGA-IO)

z.B. WebServer, Docker, VirtualBox, VMware, Azure, etc.
Antworten
Benutzeravatar
asp
Site Admin
Beiträge: 64
Registriert: 22 Feb 2025, 19:44
Wohnort: Lohn-Ammannsegg
Kontaktdaten:

RP2040 mit Relais-Erweiterung (MEGA-IO)

Beitrag von asp »

Habe von früher noch mehrere Raspberry PI - Aufsätze mit Railais-Ausgängen (Mega-IO V3.1)
Mega-IO-kl.png
Mega-IO-kl.png (89.5 KiB) 13820 mal betrachtet
Damit dieses Board an einem RP2040 Mikrocontroller funktioniert müssen folgende Sachen beachtet werden.

1. Verbindungern vom 40-poligen Raspberry Pi - Steckers
PiGIPO.png
PiGIPO.png (63.47 KiB) 9788 mal betrachtet
Mega-IO-Verb.png
Mega-IO-Verb.png (24.59 KiB) 13814 mal betrachtet
RP2040 -> Mega-IO
SDA (1) I²C Datenleitung -> (3)
SCL (2) I²C Taktleitung -> (5)
3V3 Versorgungsspannung -> (1)
GND Masse -> (6)
5V -> (2)
PS. Das Board Mega-IO kann auch mit einem externen Speisegerät 5VDC versorgt werden, es ist sogar empfohlen, wenn mehrere Relais gleichzeitig geschaltet werden, da sonst der RP2040 überlastet würde, aber Achtung, nur eine 5V-Speisung, entweder vom RP2040-Board oder extern.
2. main-Programm für Board-Ansteuerung

Code: Alles auswählen

from machine import Pin, I2C
import time

class MEGAIO_V3:
    def __init__(self, i2c, address=0x31):
        self.i2c = i2c
        self.addr = address
        self._configure()
    
    def _configure(self):
        """Board konfigurieren"""
        try:
            self.i2c.writeto(self.addr, bytes([0x06, 0x00, 0x00]))  # Config
            self.i2c.writeto(self.addr, bytes([0x02, 0x00, 0x00]))  # Polarity
            time.sleep(0.1)
            print("MEGA-IO V3.1 erfolgreich konfiguriert")
        except Exception as e:
            print(f"Konfigurationsfehler: {e}")
    
    def set_relay(self, relay_num, state):
        """Setzt ein Relais (1-8)"""
        if 1 <= relay_num <= 8:
            register = 0x00  # Bank 0
            bit = relay_num - 1
        else:
            raise ValueError("Relais muss zwischen 1-8 sein")
        
        # Aktuellen Zustand lesen
        self.i2c.writeto(self.addr, bytes([register]))
        current = self.i2c.readfrom(self.addr, 1)[0]
        
        # Bit setzen/löschen
        if state:
            new_state = current | (1 << bit)
        else:
            new_state = current & ~(1 << bit)
            
        # Neuen Zustand schreiben
        self.i2c.writeto(self.addr, bytes([register, new_state]))
        print(f"Relais {relay_num} {'EIN' if state else 'AUS'}")
    
    def all_off(self):
        """Alle Relais ausschalten"""
        self.i2c.writeto(self.addr, bytes([0x00, 0x00]))  # Bank 0
        print("Alle Relais AUS")
    
    def pulse(self, relay_num, duration=1.0):
        """Relais für eine bestimmte Zeit einschalten"""
        self.set_relay(relay_num, True)
        time.sleep(duration)
        self.set_relay(relay_num, False)

# --- Globale Initialisierung ---
print("MEGA-IO V3.1 Initialisierung...")
i2c = I2C(0, scl=Pin(1), sda=Pin(0), freq=100000)
ADDR = 0x31

print("I2C Scan:", [hex(x) for x in i2c.scan()])

# Globales Board-Objekt erstellen
io_board = MEGAIO_V3(i2c)

print("Bereit! Verwende: io_board.set_relay(NUMMER, True/False)")
obiges Programm bitte mit Thonny als "main.py" auf RP2040 abspeichern

3. Jetzt kann das Board verwendet werden
exec(open('main.py').read())
io_board.set_relay(1, True) # Relais 1 EIN
io_board.set_relay(1, False) # Relais 1 AUS
io_board.all_off() # Alle Relais AUS
io_board.pulse(2, 2.5) # Relais 2 für 2.5 Sekunden einschalten
io_board.pulse(3) # Relais 3 default für 1 Sekunde einschalten

Blockdiagramm STM8L151C8:
blockdiagramm-kl.png
blockdiagramm-kl.png (108.07 KiB) 11644 mal betrachtet
https://www.st.com/en/microcontrollers- ... 151c8.html

Pinbelegung von zweitem Stecker von Erweiterung:
belegung.png
belegung.png (156.78 KiB) 11638 mal betrachtet
Antworten