Raspberry Pi Pico W: VSYS mit ADC messen

Beim Mikrocontroller-Board Raspberry Pi Pico ist der ADC 3 (GPIO 29) intern über einen Spannungsteiler mit VSYS (Pin 39) verbunden. Da bietet es sich regelrecht an, die Versorgungsspannung an VSYS zu messen.
Leider hat der GPIO 29 (ADC 3) beim Pico W und Pico 2W (mit WLAN) eine doppelte Funktion, wenn der WLAN-Chip aktiviert wurde. Ein korrektes Ergebnis zu bekommen ist dann nicht so ganz einfach, wie man sich das vielleicht denkt.
VSYS kann man nur dann mit dem ADC 3 lesen, wenn der GPIO 25 ein High führt. Das ist weiter kein Problem, wenn man nach der VSYS-Messung mit dem ADC 3 alles wieder in den ursprünglichen Zustand zurückversetzt.

Aufbau und Bauteile

Messaufbau mit Raspberry Pi Pico und Mini-Voltmeter zum Messen von VSYS

Der Messaufbau befindet sich auf einem Steckbrett, auf dem sich ein Raspberry Pi Pico und ein Mini-Voltmeter befinden. Mit dem Mini-Voltmeter misst man die Spannung an VSYS (Pin 39), und nicht die Spannung am USB!

  • Steckbrett
  • Raspberry Pi Pico W und Pico 2 W
  • Optional: Messgerät oder Mini-Voltmeter

Programmcode

Bei der Messung von VSYS sind unterschiedliche Vorgehensweise beim Raspberry Pi Pico und Pico W notwendig, weil der GPIO 29 (ADC 3) beim Pico W (mit WLAN-Chip) eine doppelte Funktion hat. Der folgende Programmcode berücksichtigt die Unterschiede und kann erkennen, ob ein WLAN-Chip vorhanden ist (durch „import network“).

Um den Programmcode verwenden zu können, sind die Parameter der WLAN-Zugangsdaten anzupassen.

# Bibliotheken laden
import machine
import time

# WLAN-Konfiguration
WLAN_SSID = 'wlan_name'
WLAN_PW = 'wlan_passwort'
WLAN_CC = 'DE'

# Funktion: WLAN-Verbindung
def wlanConnect():
    # Status-LED
    led_onboard = machine.Pin('LED', machine.Pin.OUT, value=0)
    # WLAN-Verbindung herstellen
    network.country(WLAN_CC)
    wlan = network.WLAN(network.STA_IF)
    if not wlan.isconnected():
        print('WLAN-Verbindung wird hergestellt:', WLAN_SSID)
        wlan.active(True)
        wlan.connect(WLAN_SSID, WLAN_PW)
        for i in range(10):
            if wlan.status() < 0 or wlan.status() >= 3: break
            led_onboard.toggle()
            print('.', end="\r")
            time.sleep(1)
    if wlan.isconnected():
        print()
        print('WLAN-Verbindung hergestellt')
        led_onboard.on()
        time.sleep(3)
        netConfig = wlan.ifconfig()
        print('WLAN-Status:', wlan.status(), 'IPv4-Adresse:', netConfig[0], '/', netConfig[1], 'Standard-Gateway:', netConfig[2], 'DNS-Server:', netConfig[3])
    else:
        print("\n", 'Keine WLAN-Verbindung')
        led_onboard.off()
        print('WLAN-Status:', wlan.status())
    print()
    return wlan

# Funktion: VSYS messen (mit und ohne WLAN-Chip)
def get_vsys_voltage():
    try:
        import network
    except ImportError:
        machine.Pin(29, machine.Pin.IN, pull=None) # Pulldown-Widerstand abschalten!
        time.sleep(.1) # kurze Wartezeit
        adc_raw = machine.ADC(3).read_u16()
    else:
        # Konfiguration: GPIO 25 und 29
        machine.Pin(25, machine.Pin.OUT, pull=machine.Pin.PULL_DOWN, value=1)
        machine.Pin(29, machine.Pin.IN, pull=None)
        time.sleep(.1) # kurze Wartezeit
        # Messung: VSYS
        adc_raw = machine.ADC(3).read_u16()
        # Konfiguration: GPIO 25 und GPIO 29
        machine.Pin(25, machine.Pin.OUT, pull=machine.Pin.PULL_DOWN, value=0)
        # GPIO wiederherstellen und WLAN aktivieren
        machine.Pin(29, machine.Pin.ALT, pull=machine.Pin.PULL_DOWN, alt=7)
    # Spannung in Volt umrechnen
    return adc_raw * 3.3 / 65536 * 3

# WLAN-Verbindung herstellen, wenn verfügbar
try:
    import network
except ImportError:
    pass
else:
    wlan = wlanConnect()

# VSYS messen
vsys_voltage = get_vsys_voltage()

# Ausgeben
print('Spannung an VSYS (Pico-Pin 39):', "{:.2f}".format(vsys_voltage), 'V')

Das Ergebnis stimmt so ungefähr mit dem Ergebnis vom Messgerät überein. Der Wert vom ADC wird minimal größer sein, weil der interne ADC eine kürzere Leitung zum VSYS hat und weniger Leitungsverluste hat.

Erläuterung: Pico mit WLAN, oder ohne?

Es gibt unterschiedliche Meinungen darüber, wie man im Programmcode überprüfen kann, ob ein WLAN-Chip vorhanden ist oder nicht. Eine Möglichkeit wäre, die Board-Informationen auszulesen, was eine gute Lösung darstellt. Allerdings hat diese Methode den Nachteil, dass sie zukünftige Boards nicht berücksichtigt.
Ich habe mich daher für eine andere Lösung entschieden, die das Network-Modul importiert. Wenn dieses Modul vorhanden ist, geht der Programmcode davon aus, dass es sich um einen Pico mit WLAN-Chip handelt. In der MicroPython-Firmware ohne WLAN-Unterstützung ist das Modul nämlich nicht enthalten. Sollte auf einem Pico W eine falsche Firmware installiert sein, könnte man VSYS wie beim normalen Pico ohne WLAN-Chip messen.

Erweiterung

Der Raspberry Pi Pico ermöglicht die Überwachung des Batterie-Ladezustands über den ADC 3 (GPIO 29), der mit VSYS verbunden ist. Der Programmcode zur Messung berücksichtigt Unterschiede zwischen dem Pico und Pico W. Nutzer müssen Spannungsgrenzen für volle und leere Batterien festlegen.

Weitere verwandte Themen:

Frag Elektronik-Kompendium.de

Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython

Elektronik-Set Pico Edition

Das Elektronik-Set Pico Edition ist ein Bauteile-Sortiment mit Anleitung zum Experimentieren und Programmieren mit MicroPython.

  • LED: Einschalten, ausschalten, blinken und Helligkeit steuern
  • Taster: Entprellen und Zustände anzeigen
  • LED mit Taster einschalten und ausschalten
  • Ampel- und Lauflicht-Steuerung
  • Elektronischer Würfel
  • Eigene Steuerungen programmieren

Elektronik-Set jetzt bestellen Online-Workshop buchen

Online-Workshop: Programmieren mit dem Raspberry Pi Pico

Programmieren mit dem Raspberry Pi Pico

Gemeinsam mit anderen und unter Anleitung experimentieren? Wir bieten unterschiedliche Online-Workshops zum Raspberry Pi Pico und MicroPython an. Einführung in die Programmierung, Sensoren programmieren und kalibrieren, sowie Internet of Things und Smart Home über WLAN und MQTT.

Online-Workshop buchen

Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.

Termine und Newsletter-Anmeldung

 

Elektronik-Sets für das Hardware-nahe Programmieren