Table of Contents

Micropython on ESP32 (Windows)

Benötigte Software:

Ablauf:

  1. Gesammelte ESP-Tools als ZIP-Datei herunterladen und entpacken.
  2. Im gewählten/entpackten Verzeichnis die Datei get.exe ausführen. Nachher finden sich im Verzeichnis die Dateien “esptool.exe” und “esptool.py”
  3. Micropython auf ESP32 flashen:
    1. MicroPython-Image herunterladen und die “bin”-Datei in Verzeichnis abspeichern (e.g., Downloads)
    2. 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.
    3. 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.)

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

  4. 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.
  5. 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 Datei pip.exe liegt.
  6. 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

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