Forum: Mikrocontroller und Digitale Elektronik ESP32 Micropython


von chris (Gast)


Lesenswert?

Hat jemand schon mal Micropython auf dem ESP32 ausprobiert?

Beim ESP8266 gibt es die NodeMCU. Beim ESP32 habe ich eines auf dem 
"WROOM" drauf steht und so aussieht:

https://cdn.instructables.com/ORIG/FQM/7X6B/J7GGGD9O/FQM7X6BJ7GGGD9O.png

Ich würde gerne wissen, ob das ESP32 zusammen mit Micropython geeignet 
ist, einen HC05 US-Sensor zu nutzen.

LED-Blinken schalten klappt schon mal:
1
import machine
2
pin = machine.Pin(2,machine.Pin.OUT)
3
pin.value(0)
4
pin.value(1)

von chris (Gast)


Lesenswert?

Hier ist schon mal die Installation beschrieben:
Beitrag "Re: ESP über Webinterface programmieren?"

Wichtig: ESP32 Firmware ab Adresse 0x1000 flaschen.

von chris (Gast)


Lesenswert?

Das Blinkbeispiel:
1
import machine
2
import time
3
4
pin = machine.Pin(2,machine.Pin.OUT)
5
6
def toggle(p):
7
 p.value(not p.value())
8
9
while True:
10
 toggle(pin)
11
 time.sleep_ms(100)

simpler HTTP-Server für ESP8266 ( könnte vielleicht auf dem ESP32 laufen 
):
https://docs.micropython.org/en/latest/esp8266/esp8266/tutorial/network_tcp.html

Vielleicht weiß jemand, wie man den ADC oder den DAC anspricht.

von stefan (Gast)


Lesenswert?

Hier ein Beispiel für die Ansteuerung eines HC-SR04
https://github.com/stefanhoelzl/alarm-clock/blob/master/src/apps/alarm_clock/hal.py
weiß nicht wie groß er Unterschied ist zum HC05

ADC ansteuern:
https://docs.micropython.org/en/latest/esp8266/esp8266/quickref.html#adc-analog-to-digital-conversion
Sollte beim ESP32 genau so funktionieren

Zur eigentlichen Frage:
Ja ich habe micropython auf nem ESP32 (China Nachbau des WROOM) am 
laufen.
Klar gibt es Einschränkungen zum normalen Python aber bin doch sehr 
überrascht was alles geht.
Aber für den Bastler der schnell mal was ausprobieren will und es am 
besten dann auch noch über WLan ansteuern will finde ich es perfekt. Und 
es sollten natürlich keine Timing kritischen Sachen sein.

von chris (Gast)


Lesenswert?

Danke für die Antworten.

Was den ADC betrifft, scheint die ESP32 Version ein Problem mit den 
Pin-Definitionen zu haben:
1
MicroPython v1.9.2-445-g84035f0f on 2017-12-05; ESP32 module with ESP32
2
Type "help()" for more information.
3
>>> from machine import ADC
4
>>>
5
>>> adc = ADC(0)            # create ADC object on ADC pin
6
Traceback (most recent call last):
7
  File "<stdin>", line 1, in <module>
8
ValueError: expecting a pin
9
>>>

von mIstA (Gast)


Lesenswert?

Gut zu wissen, daß es µPython auch für den ESP32 gibt; hab hier auch so 
ein Modul rumliegen, daß endlich mal ausprobiert werden will.


chris schrieb:
> ValueError: expecting a pin

Also die Fehlermeldung klingt für mich so, als ob Python ein pin-Objekt 
als Argument erwarten würde, da der ESP32 offenbar (anders als der 
ESP8266) keinen eigenen ADC-Pin hat.

von chris (Gast)


Lesenswert?

>Also die Fehlermeldung klingt für mich so, als ob Python ein pin-Objekt
>als Argument erwarten würde,
Daran habe ich auch gedacht, konnte aber den passenden Syntax und eine 
gute Doku finden.

Wenn man es dann weiß, ist es einfach:
1
from machine import ADC
2
from machine import Pin
3
adc=ADC(Pin(36))
4
adc.read()

angeregt von hier:
https://forum.micropython.org/viewtopic.php?t=3769

Vielleicht findest Du ja auch noch ein paar Sachen, die nicht 
dokumentiert sind.

von chris (Gast)


Lesenswert?

Sehr schön am ESP32 ist, dass er zwei 8 Bit DACs besitzt.

Im Datenblatt finde ich nichts zur Geschwindigkeit:
http://espressif.com/sites/default/files/documentation/esp32_datasheet_en.pdf
1
from machine import DAC
2
from machine import Pin
3
dac1 = DAC(Pin(25))
4
dac2 = DAC(Pin(26))
5
dac1.write(100)
6
dac2.write(255)

Interessant wären ein paar Beispiele zur Tonerzeugung.

von chris (Gast)


Lesenswert?

Wenn man Files vom PC zum ESP übertrage will, braucht man wohl eines der 
folgenden Tools:
rshell, Adafruits ampy, mpfshell

Hier ist "Ampy":
https://learn.adafruit.com/micropython-basics-load-files-and-run-code/install-ampy

von stefan (Gast)


Lesenswert?

zum Thema files auf das board übertragen
https://github.com/stefanhoelzl/mpy-dev-tools

Damit kann man eine uPython-Gerät per FUSE als Filesystem mounten.
(getestet nur mit ESP8266 und ESP32)
Sind auch Skripte dabei um einen bestimmten Ordner mit dem Gerät zu 
synchronisieren und dann ein Skript auf dem Board auszuführen und die 
Ausgabe erscheint dann in der Konsole

von chris (Gast)


Lesenswert?

Wenn man auf dem ESP32 "print" verwenden will, geht das scheinbar nur 
mit Klammer:
1
for n in range(10):                                                         
2
  print(n)

von chris (Gast)


Lesenswert?

Die zweite UART scheint rudimentär zu funktionieren:

>>> import machine
>>> u2=machine.UART(2, baudrate=9600, rx=16, tx=17, timeout=10)
I (1576441) uart: ALREADY NULL
I (1576441) uart: queue free spaces: 10
>>> u2.write("Hello, World!\n")

Ich weiß zwar nicht, was die "I" Kommentare bedeuten, aber am Pin17 
kommt das Signal raus.

von avr (Gast)


Lesenswert?

chris schrieb:
> Wenn man auf dem ESP32 "print" verwenden will, geht das scheinbar nur
> mit Klammer:

Das ist normal ab Python 3

von chris (Gast)


Angehängte Dateien:

Lesenswert?

Um mal die Geschwindigkeit die DAC-Geschwindigkeit zu testen ..

Das folgende Programm toogled den DAC Ausgang ( im Bild der Anschluss 
mit der Bezeichnung D26)
1
from machine import DAC
2
from machine import Pin
3
dac1 = DAC(Pin(25))
4
dac2 = DAC(Pin(26))
5
6
while 1:
7
     dac2.write(0)
8
     dac2.write(255)

Die DAC-Samplingrate ist ~75kHz mit leichtem Jitter.

In der Quick-Referenz für das Pyboard findet man einige Hinweise für die 
Peripheriebefehle:
http://docs.micropython.org/en/latest/pyboard/pyboard/quickref.html

von chris (Gast)


Lesenswert?

Folgender Code erzeugt eine Sinusschwingung am DAC im Hörbereich:
1
import math
2
from machine import DAC
3
from machine import Pin
4
5
dac1 = DAC(Pin(25))
6
dac2 = DAC(Pin(26))
7
8
# create a buffer containing a sine-wave
9
buf = bytearray(100)
10
for i in range(len(buf)):
11
 buf[i] = 128 + int(127 * math.sin(2 * math.pi * i / len(buf)))
12
13
while 1:
14
 for i in range(len(buf)):
15
  dac2.write(buf[i])

Die Frequenz beträgt 329Hz, also bei 100 Abtastwerten eine DAC Fs von 
32,900kHz .

von chris (Gast)


Lesenswert?

Scheinbar gibt es ESP32 mit 4MB serial Ram Speichererweiterung:

https://github.com/loboris/MicroPython_ESP32_psRAM_LoBo

Bleibt die Frage, wie schnell das Python damit läuft.

von John Doe (Gast)


Lesenswert?

chris schrieb:
> Scheinbar gibt es ESP32 mit 4MB serial Ram Speichererweiterung:


Scheinbar?
Also meine hier sind real... ;)


> Bleibt die Frage, wie schnell das Python damit läuft.


Nicht schneller, aber vieles geht damit erst. Hängt halt von der 
Software ab.
Ohne ist aber kaum RAM übrig für aufwendigere Programme.

von chris (Gast)


Lesenswert?

>Nicht schneller, aber vieles geht damit erst. Hängt halt von der
>Software ab.
Ich habe jetzt eher an langsamer gedacht, weil ja die Daten seriell in 
den Prozessor übertragen werden müssen.

>Ohne ist aber kaum RAM übrig für aufwendigere Programme.

Wenn ich richtig gelesen habe, sollte der ESP 440kB Ram haben. Die 
aktuelle Implementierung nutzt aber nur 100kB, es sind also 3/4 des Rams 
ungenutzt.
Kann man nur hoffen, dass es in irgend einer Version geändert wird.

von John Doe (Gast)


Lesenswert?

chris schrieb:
> Ich habe jetzt eher an langsamer gedacht, weil ja die Daten seriell in
> den Prozessor übertragen werden müssen.


Ja, das ist richtig, die Daten werden ja per SPI übertragen. Es werden 
aber 32KB gecachet.


>>Ohne ist aber kaum RAM übrig für aufwendigere Programme.
>
> Wenn ich richtig gelesen habe, sollte der ESP 440kB Ram haben. Die
> aktuelle Implementierung nutzt aber nur 100kB, es sind also 3/4 des Rams
> ungenutzt.
> Kann man nur hoffen, dass es in irgend einer Version geändert wird.


Wenn mal auch sowas wie z.B. Bluetooth vollständig implementiert sind, 
bleibt vom internen RAM nicht mehr viel übrig.
Daher ist PSRAM für Micropython auf dem ESP32 leider Pflicht, wenn es 
denn überhaupt mal vollständig migriert wird.

von chris (Gast)


Lesenswert?

Kannst Du den Speicher auf Deinen Modulen mit folgenden Befehlen 
überprüfen?:
1
import micropython 
2
micropython.mem_info()

Bei meinen dem oben abgebildeten erhalte ich:

stack: 736 out of 15360
GC: total: 111168, used: 5360, free: 105808
 No. of 1-blocks: 32, 2-blocks: 9, max blk sz: 264, max free sz: 6604

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.