efinf:blcks2017:tetristable:esp32

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:

  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

  • 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.

screen /dev/ttyUSB5 115200

CTRL-a K (oder CTRL-a :quit)

ampy --port /dev/ttyUSB0 run blink.py

Anstatt run auch put, rm

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

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()

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)

Idee: Einer bietet einen Accesspoint an, der andere verbindet sich darauf. Danach können beide via TCP kommunizieren. Das ginge auch mit mehreren Teilnehmern.

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()
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

  • efinf/blcks2017/tetristable/esp32.txt
  • Last modified: 2018/05/22 15:09
  • by fabio.ambrosi