Show pageOld revisionsBacklinksBack to top This page is read only. You can view the source, but not change it. Ask your administrator if you think this is wrong. ===== 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. <!-- * Optional: [[https://git-scm.com/download/win|GIT-Client]]. GIT ist eine Versionskontrolle --> Ablauf: <!-- - GIT-Client installieren - ESP32 Libraries und Tools von https://github.com/espressif/arduino-esp32.git klonen: ''git clone https://github.com/espressif/arduino-esp32.git'' in der Kommandozeile (Windows+R -> cmd) in einem Verzeichnis deiner Wahl ausführen. Verzeichnisse können mit (''cd Verzeichnisname'' resp. ''cd ..'' um ins übergeordnete Verzeichnis zu gelangen navigiert werden--> - 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: <code>esptool --port COM4 erase_flash</code> (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: <code>esptool --chip esp32 --port COM4 write_flash -z 0x1000 C:\Users\username\Downloads\esp32-20180313-v1.9.3-453-gbdc875e6.bin</code> (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: <code>ampy --port COM4 put main.py</code> * Datei ''main.py'' von ESP32 (an COM4) runterladen: <code>ampy --port COM4 get main.py</code> 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 ;-) <code python 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 </code> ==== MCP23017 ==== <code python 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) </code> ==== Web und so... ==== Siehe https://techtutorialsx.com/2017/09/01/esp32-micropython-http-webserver-with-picoweb/ <code python 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() </code> ==== SNES-Controller ==== 0b(R)(L)(X)(A)(->)(<-)(V)(^)(Start)(Select)(Y)(B) <code python 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) </code> ===== 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) ==== <code python 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() </code> ==== Wifi-Client (Station) ==== <code python 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() </code> UDP für "Bildübertragung": https://www.dfrobot.com/blog-608.html efinf/blcks2017/tetristable/esp32.txt Last modified: 2018/05/22 15:09by fabio.ambrosi