Differences
This shows you the differences between two versions of the page.
| Both sides previous revision Previous revision Next revision | Previous revision | ||
| efinf:blcks2017:tetristable:esp32 [2018/03/13 19:12] – Simon Knaus | efinf:blcks2017:tetristable:esp32 [2018/05/22 13:09] (current) – [SNES-Controller] fabio.ambrosi | ||
|---|---|---|---|
| Line 1: | Line 1: | ||
| + | ===== Micropython on ESP32 (Windows) ===== | ||
| + | Benötigte Software: | ||
| + | * Python 2.7 wenn nicht ohnehin schon installiert. | ||
| + | * ESP-Tools | ||
| + | * [[https:// | ||
| + | * ampy: Ein Tool, um Python-Dateien auf den den ESP zu " | ||
| + | < | ||
| + | Ablauf: | ||
| + | <!-- | ||
| + | - GIT-Client installieren | ||
| + | - ESP32 Libraries und Tools von https:// | ||
| + | - Gesammelte ESP-Tools als [[https:// | ||
| + | - Im gewählten/ | ||
| + | - Micropython auf ESP32 flashen: | ||
| + | - [[http:// | ||
| + | - ESP anschliessen und in Device Manager (Windows+R -> cmd -> devmgmt.msc) überprüfen, | ||
| + | - Aktuelle Firmware löschen. In Kommandozeile (Winodws+R -> cmd) zum Verzeichnis mit esptool.exe navigieren und dann: < | ||
| + | - Image flashen. | ||
| + | - 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 '' | ||
| + | - ampy installieren. Ampy kann mit '' | ||
| + | - Optional aber stark empfohlen: Den Ordner in dem ampy liegt (typischerweise C: | ||
| + | |||
| + | === Interaktion mit ESP32 === | ||
| + | * Konsole mit Putty: Siehe oben | ||
| + | * Datei '' | ||
| + | * Datei '' | ||
| + | |||
| + | Als Test kann die Datei {{efinf: | ||
| + | ===== Micropython on ESP32 (Linux) ===== | ||
| + | * https:// | ||
| + | * https:// | ||
| + | |||
| + | |||
| + | ==== screen ==== | ||
| + | screen / | ||
| + | | ||
| + | CTRL-a K (oder CTRL-a :quit) | ||
| + | |||
| + | ==== ampy ==== | ||
| + | ampy --port / | ||
| + | |||
| + | Anstatt run auch put, rm | ||
| + | |||
| + | ==== neopixel ==== | ||
| + | Easy peasy ;-) | ||
| + | <code python pixeltest.py> | ||
| + | import machine | ||
| + | import neopixel | ||
| + | np = neopixel.NeoPixel(machine.Pin(2), | ||
| + | |||
| + | i=0; | ||
| + | while True: | ||
| + | np[i] = (100,20,50) | ||
| + | np[(i+149)%150] = (0,0,0) | ||
| + | np.write() | ||
| + | i=(i+1)%150 | ||
| + | </ | ||
| + | |||
| + | ==== MCP23017 ==== | ||
| + | <code python mcp23017test.py> | ||
| + | |||
| + | import machine | ||
| + | import mcp | ||
| + | import time | ||
| + | from machine import I2C | ||
| + | |||
| + | i2c=I2C(sda=machine.Pin(23), | ||
| + | |||
| + | reg=bytearray(1) | ||
| + | |||
| + | a = 0x20 | ||
| + | |||
| + | reg[0]=0xff | ||
| + | i2c.writeto_mem(a, | ||
| + | i2c.writeto_mem(a, | ||
| + | |||
| + | # Note: Man könnte die Polarität ändern, und so die GPIO-Bits invertieren | ||
| + | # i2c.writeto_mem(a, | ||
| + | |||
| + | reg[0]=0x00 | ||
| + | i2c.writeto_mem(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, | ||
| + | i2c.readfrom_mem_into(a, | ||
| + | if (regb[0]!=old): | ||
| + | print(bin(regb[0])) | ||
| + | old=regb[0] | ||
| + | # time.sleep_ms(100) | ||
| + | | ||
| + | </ | ||
| + | |||
| + | |||
| + | ==== Web und so... ==== | ||
| + | |||
| + | Siehe https:// | ||
| + | |||
| + | <code python wificonnect.py> | ||
| + | import network | ||
| + | |||
| + | def connect(): | ||
| + | ssid = " | ||
| + | password = " | ||
| + | |||
| + | station = network.WLAN(network.STA_IF) | ||
| + | |||
| + | if station.isconnected() == True: | ||
| + | print(" | ||
| + | return | ||
| + | |||
| + | station.active(True) | ||
| + | station.connect(ssid, | ||
| + | |||
| + | while station.isconnected() == False: | ||
| + | pass | ||
| + | |||
| + | print(" | ||
| + | print(station.ifconfig()) | ||
| + | |||
| + | |||
| + | connect() | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== SNES-Controller ==== | ||
| + | 0b(R)(L)(X)(A)(-> | ||
| + | |||
| + | <code python nes.py> | ||
| + | import machine | ||
| + | import time | ||
| + | |||
| + | # Interfacing a SNES-Controller with Micropython on ESP32 | ||
| + | |||
| + | # Clock, Latch, Data, according to | ||
| + | # https:// | ||
| + | # | ||
| + | # 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, | ||
| + | clk.value(1) | ||
| + | lat = machine.Pin(14, | ||
| + | lat.value(0) | ||
| + | dat = machine.Pin(27, | ||
| + | |||
| + | 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) ==== | ||
| + | <code python ap.py> | ||
| + | # See https:// | ||
| + | |||
| + | import network | ||
| + | |||
| + | # Access-Point aktivieren und konfigurieren | ||
| + | ap = network.WLAN(network.AP_IF) | ||
| + | ap.active(True) | ||
| + | ap.config(essid=' | ||
| + | ap.ifconfig((' | ||
| + | |||
| + | |||
| + | |||
| + | # Auf Port 80 Verbindungen annehmen (hier auf Port 80, eigentlich für http reserviert) | ||
| + | |||
| + | import socket | ||
| + | addr = socket.getaddrinfo(' | ||
| + | s = socket.socket() | ||
| + | s.bind(addr) | ||
| + | s.listen(1) | ||
| + | |||
| + | # Auf eingehenden Verbindung warten, und Kommunikationskanal etablieren. | ||
| + | cl, addr = s.accept() | ||
| + | print(' | ||
| + | cl_file = cl.makefile(' | ||
| + | while True: | ||
| + | # Eingehende Zeile lesen | ||
| + | line = cl_file.readline() | ||
| + | print(line) | ||
| + | # Antwort senden | ||
| + | cl.send(b" | ||
| + | if not line or line == b' | ||
| + | break | ||
| + | |||
| + | # Verbindung wieder schliessen | ||
| + | cl.close() | ||
| + | |||
| + | </ | ||
| + | |||
| + | ==== Wifi-Client (Station) ==== | ||
| + | <code python sta.py> | ||
| + | # See https:// | ||
| + | |||
| + | import network | ||
| + | import utime | ||
| + | |||
| + | # Sich mit dem WLAN verbinden | ||
| + | |||
| + | wlan = network.WLAN(network.STA_IF) | ||
| + | wlan.active(True) | ||
| + | wlan.connect(' | ||
| + | |||
| + | 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(' | ||
| + | s = socket.socket() | ||
| + | s.connect(addr) | ||
| + | |||
| + | # Etwas senden | ||
| + | s.send(b' | ||
| + | |||
| + | # Antwort einlesen | ||
| + | data = s.recv(1000) | ||
| + | print(data) | ||
| + | |||
| + | # Verbindung beenden | ||
| + | s.close() | ||
| + | |||
| + | </ | ||
| + | |||
| + | |||
| + | UDP für " | ||