Micropython on ESP32 (Windows)
Benötigte Software:
- Python 2.7 wenn nicht ohnehin schon installiert.
- ESP-Tools
- Putty. Putty ist Kommunikationstool, das diverse Protokolle anbietet, die sonst in Windows nicht vorhanden sind. Wir benötigen davon Serial. Putty dient einzig dazu, die Python-Konsole (analog TigerJython Konsole) auf dem ESP zu benutzen.
- ampy: Ein Tool, um Python-Dateien auf den den ESP zu “speichern”/“herunterzuladen”, welches Python nutzt.
Ablauf:
- Gesammelte ESP-Tools als ZIP-Datei herunterladen und entpacken.
- Im gewählten/entpackten Verzeichnis die Datei
get.exe
ausführen. Nachher finden sich im Verzeichnis die Dateien “esptool.exe” und “esptool.py” - Micropython auf ESP32 flashen:
- MicroPython-Image herunterladen und die “bin”-Datei in Verzeichnis abspeichern (e.g., Downloads)
- ESP anschliessen und in Device Manager (Windows+R → cmd → devmgmt.msc) überprüfen, ob ESP als COM-Port gelistet ist. Falls nicht, Treiber von dieser Seite für die entsprechende Windows Version herunterladen und installieren.
- Aktuelle Firmware löschen. In Kommandozeile (Winodws+R → cmd) zum Verzeichnis mit esptool.exe navigieren und dann:
esptool --port COM4 erase_flash
(COM4 durch Port an dem ESP hängt ersetzen). Der COM Port kann im Device Manager gefunden werden: Windows+R → devmgmt.msc und Enter um dann zu Ports (COM und LPT) runterzuscrollen und Portnummer ablesen. Achtung: esptool ist nicht im Pfad, das heisst, es kann nur im Verzeichnis ausgeführt werden, in welchem es liegt. Alternativ kann das Verzeichnis in welchem die Datei esptool liegt dem Pfad (%PATH%) hinzugefügt werden.)
- Image flashen. In Kommandozeile (Winodws+R → cmd) zum Verzeichnis mit esptool.exe navigieren und dann:
esptool --chip esp32 --port COM4 write_flash -z 0x1000 C:\Users\username\Downloads\esp32-20180313-v1.9.3-453-gbdc875e6.bin
(idem Port ersetzen, Pfad ersetzen zum heruntergeladenen Ort)
- Putty öffnen und Connection Type Serial anwählen, bei Serial Line den Port oben angeben, bei Speed 115200 eigeben und dann Open. Man hat nun eine Python-Konsole und kann mit
print(“Hello World”)
die Welt begrüssen. Putty wieder schliessen, wenn anderweitig auf den ESP (z.B. mit ampy) zugegriffen werden soll. - ampy installieren. Ampy kann mit
pip
installiert werden. Am einfachsten:pip install adafruit-ampy
im Ordner (typischerweise C:\python27\scripts) aus der Kommandozeile (Windows+R → cmd) aufrufen, in dem die Dateipip.exe
liegt. - Optional aber stark empfohlen: Den Ordner in dem ampy liegt (typischerweise C:\python27\scripts) dem Pfad-Umgebungsvariable hinzufügen. Siehe oben oder eben diese Anleitung befolgen.
Interaktion mit ESP32
- Konsole mit Putty: Siehe oben
- Datei
main.py
auf ESP32 (an COM4) hochladen:ampy --port COM4 put main.py
- Datei
main.py
von ESP32 (an COM4) runterladen:ampy --port COM4 get main.py
Als Test kann die Datei main.py hochgeladen werden. Diese testet die LED-Streifen. main.py
ist die Datei, die immer automatisch ausgeführt wird.
Micropython on ESP32 (Linux)
screen
screen /dev/ttyUSB5 115200
CTRL-a K (oder CTRL-a :quit)
ampy
ampy --port /dev/ttyUSB0 run blink.py
Anstatt run auch put, rm
neopixel
Easy peasy
- pixeltest.py
import machine import neopixel np = neopixel.NeoPixel(machine.Pin(2), 150) i=0; while True: np[i] = (100,20,50) np[(i+149)%150] = (0,0,0) np.write() i=(i+1)%150
MCP23017
- mcp23017test.py
import machine import mcp import time from machine import I2C i2c=I2C(sda=machine.Pin(23), scl=machine.Pin(22)) reg=bytearray(1) a = 0x20 reg[0]=0xff i2c.writeto_mem(a, 0x01, reg) # All Input Register B i2c.writeto_mem(a, 0x0d, reg) # All Pullups Register B # Note: Man könnte die Polarität ändern, und so die GPIO-Bits invertieren # i2c.writeto_mem(a, 0x03, reg) reg[0]=0x00 i2c.writeto_mem(a, 0x00, reg) # All Output Register A # GPIO 0x12 (A), 0x13 (B) rega=bytearray(1) regb=bytearray(1) old = 0 while True: rega[0]=(rega[0]+1)%256 i2c.writeto_mem(a, 0x12, rega) # Write to GPIOA i2c.readfrom_mem_into(a, 0x13,regb) # Read from GPIOB if (regb[0]!=old): print(bin(regb[0])) old=regb[0] # time.sleep_ms(100)
Web und so...
Siehe https://techtutorialsx.com/2017/09/01/esp32-micropython-http-webserver-with-picoweb/
- wificonnect.py
import network def connect(): ssid = "stopbupf" password = "stopbuepf" station = network.WLAN(network.STA_IF) if station.isconnected() == True: print("Already connected") return station.active(True) station.connect(ssid, password) while station.isconnected() == False: pass print("Connection successful") print(station.ifconfig()) connect()
SNES-Controller
0b(R)(L)(X)(A)(→)(←)(V)(^)(Start)(Select)(Y)(B)
- nes.py
import machine import time # Interfacing a SNES-Controller with Micropython on ESP32 # Clock, Latch, Data, according to # https://gamefaqs.gamespot.com/snes/916396-super-nintendo/faqs/5395 # # Some colors do not match. Mine where # white : 5V # blue : Clock (in website yellow) # yellow : Latch (in webseite orange) # red : Data # brown : GND # # # Wiring: Clock and Latch can be directly connected to the ESP32 # Do not use Pin 12 (used to determine voltage at boot, it seems) # # To connect Data, you must use a level-converter (or a voltage divider # might do the trick # clk = machine.Pin(13, machine.Pin.OUT) clk.value(1) lat = machine.Pin(14, machine.Pin.OUT) lat.value(0) dat = machine.Pin(27, machine.Pin.IN) while True: # Init: Lat for 12us high lat.value(1) time.sleep_us(12) lat.value(0) # Get values time.sleep_us(12) buttons = 0 for b in range(16): clk.value(0) buttons |= ((1-dat.value()) << b) time.sleep_us(6) clk.value(1) time.sleep_us(6) print(bin(buttons)) time.sleep_ms(100)
2 ESPs via WLAN verbinden
Idee: Einer bietet einen Accesspoint an, der andere verbindet sich darauf. Danach können beide via TCP kommunizieren. Das ginge auch mit mehreren Teilnehmern.
Access Point (AP)
- ap.py
# See https://docs.micropython.org/en/latest/esp8266/library/network.html import network # Access-Point aktivieren und konfigurieren ap = network.WLAN(network.AP_IF) ap.active(True) ap.config(essid='esp32', authmode=0) ap.ifconfig(('10.42.42.1', '255.255.255.0', '10.42.42.1', '10.42.42.1')) # Auf Port 80 Verbindungen annehmen (hier auf Port 80, eigentlich für http reserviert) import socket addr = socket.getaddrinfo('0.0.0.0', 80)[0][-1] s = socket.socket() s.bind(addr) s.listen(1) # Auf eingehenden Verbindung warten, und Kommunikationskanal etablieren. cl, addr = s.accept() print('client connected from', addr) cl_file = cl.makefile('rwb', 0) while True: # Eingehende Zeile lesen line = cl_file.readline() print(line) # Antwort senden cl.send(b"OK! Recieved "+line) if not line or line == b'\r\n': break # Verbindung wieder schliessen cl.close()
Wifi-Client (Station)
- sta.py
# See https://docs.micropython.org/en/latest/esp8266/library/network.html import network import utime # Sich mit dem WLAN verbinden wlan = network.WLAN(network.STA_IF) wlan.active(True) wlan.connect('esp32') while not wlan.isconnected(): print(wlan.status()) utime.sleep(1) # 1 second sleep import usocket as socket # Auf diese IP und Port verbinden addr = socket.getaddrinfo('10.42.42.1', 80)[0][-1] s = socket.socket() s.connect(addr) # Etwas senden s.send(b'Hello from '+wlan.ifconfig()[0]+b"\r\n") # Antwort einlesen data = s.recv(1000) print(data) # Verbindung beenden s.close()
UDP für “Bildübertragung”: https://www.dfrobot.com/blog-608.html