efinf:blcks2017:tetristable:esp32

Differences

This shows you the differences between two versions of the page.

Link to this comparison view

Both sides previous revision Previous revision
Next revision
Previous revision
efinf:blcks2017:tetristable:esp32 [2018/03/13 14:56] – [Micropython on ESP32 (Windows)] Simon Knausefinf: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://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