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.
- Raspberry Pi Pico: Grundlagen zu ADC (Analog-Digital-Converter)
- Raspberry Pi Pico: Experimente mit ADC
Aufbau und Bauteile
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:
- Raspberry Pi Pico: Stromversorgung prüfen
- Raspberry Pi Pico: Grundlagen zu ADC
- Raspberry Pi Pico: Experimente mit ADC
- Raspberry Pi Pico: Grundlagen der Energieversorgung / Stromversorgung
- Raspberry Pi Pico im Stand-alone-Betrieb
Frag Elektronik-Kompendium.de
Hardware-nahes Programmieren mit dem Raspberry Pi Pico und MicroPython
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
Online-Workshop: 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.
Besuchen Sie unser fast monatlich stattfindendes Online-Meeting PicoTalk und lernen Sie uns kennen. Die Teilnahme ist kostenfrei.