===== Micropython on ESP32 (Windows) =====
Benötigte Software:
* Python 2.7 wenn nicht ohnehin schon installiert.
* ESP-Tools
* [[https://www.chiark.greenend.org.uk/~sgtatham/putty/latest.html|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 [[https://github.com/espressif/arduino-esp32/archive/master.zip|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:
- [[http://micropython.org/resources/firmware/esp32-20180313-v1.9.3-453-gbdc875e6.bin|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 [[https://www.silabs.com/products/development-tools/software/usb-to-uart-bridge-vcp-drivers|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%) [[http://techfrage.de/question/11483/windows-10-umgebungsvariablen-offnen-andern/|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 Datei ''pip.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 [[http://techfrage.de/question/11483/windows-10-umgebungsvariablen-offnen-andern/| 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 {{efinf:blcks2017:tetristable:main.py|main.py}} hochgeladen werden. Diese testet die LED-Streifen. ''main.py'' ist die Datei, die immer automatisch ausgeführt wird.
===== Micropython on ESP32 (Linux) =====
* https://www.cnx-software.com/2017/10/16/esp32-micropython-tutorials/
* https://micropython.org/download/#esp32
==== 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 ;-)
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 ====
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/
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)
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) ====
# 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) ====
# 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