Wie kompiliert man MicroPython vom Quellcode selbst?

Python auf Einplatinencomputer wie Raspberry Pi, Banana Pi / Python für Micro-Controller
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Ich habe während des drehens die Aufnahme des Oszi angehalten. Da konnte ich schön sehen wie die Signale versetzt steigen und fallen. Das sah schon mal wie auf dem Datenblatt aus 👍🏻

Ich brauche die Vorrichtung irgendwann zum testen sowieso und da ich morgen früh eh in der Werkstatt bin, mache ich das gleich.

Danke für deine Hilfe.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Ich habe nochmal genauer auf den Code des forks geschaut, und der ist nicht da, wo er sein muss. Also habe ich ihn überarbeitet:’

https://github.com/deets/micropython/tr ... nd-encoder

Einfach mit “git add remote deets https://github.com/deets/micropython.git“ hinzufügen, und dann “git checkout mcpwm-and-encoder” - dann hast du meine Änderungen. Das Beispiel in der Doku ist auch gefixt, und erklärt, wie es geht. Hauptsächlich ist es einfach nur die Unterstützung von bi-Direktion.

Den quadratur Decoder baue ich hoffentlich morgen ein.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Wow vielen Dank!

Die neue Version baue ich nachher gleich.
Ich verstehe leider deinen Satz nicht genau. 'Forks' sind Gabeln, aber das meintest du sicherlich nicht :D Was war denn da falsch bzw. was hat sich für mich geändert? Ich weis dass der Encoder noch gefehlt hat, aber den baust du ja morgen ein. Zumindest lieferte mir die Suchmaschine das Ergebnis das man quadratur Decoder verwendet um digitale Position-Signale auszuwerten.
Auch wenn ich nicht viel verstehe, ich bin schon interessiert darin zu erfahren, was da so gemacht werden muss. Vorausgesetzt man kann es relativ einfach erklären.

Ich war heute auch nicht ganz untätig. Wie angekündigt habe ich mir eine Vorrichtung gebaut und noch mal die Signale des Encoders bei voller Drehzahl gemessen:
https://www.dropbox.com/s/akddpe1xd9fyj ... 4.jpg?dl=0

Den Motor habe ich auch angeschlossen. Für den ersten Versuch habe ich Masse vom Motor an die Masse des gesamten Projekt gelegt und Plus an den Motor-Controller angeschlossen.
Ein PWM-Signal des ESP's an den Motor-Controller gesendet und der Motor drehte sich. Zur Drehzahlregelung habe ich dann ein Poti an den ADC des ESP's angeschlossen und abhängig von dessen Eingangssignal, 'duty' des PWM-Signals geändert und konnte so die Motordrehzahl schön regeln.

Ich will den Motor natürlich in beide Richtungen drehen lassen, also müssen meinem Verständnis nach beide Anschlusskabel des Motors an den Motor-Controller. Aber an der Ansteuerung bin ich dann gescheitert und hatte dann auch leider keine Zeit mehr weiter zu machen. Da muss ich morgen noch mal ran.


Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Man forkt (zweigt ab) ein github repo, um daran eine Änderung vorzunehmen. Das hat jemand gemacht & eine MCPWM Klasse eingeführt. Die ist aber nur einkanalig. Man braucht aber zwei, für beide Richtungen. Das habe ich hinzugefügt. Erst jetzt kannst du also beidseitig drehen. Dazu müssen die beiden Pins auf in1 und in2 (wenn ich das H-Brücken Datenblatt recht im Kopf habe)
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Und die Encoder Signale sehen gut aus.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

__deets__ hat geschrieben: Samstag 19. Februar 2022, 22:24 Das habe ich hinzugefügt. Erst jetzt kannst du also beidseitig drehen.
Ja wie genial! Auch noch vielen Dank für das anpassen der Doku. Ich habe mir schon den Kopf zerbrochen und jetzt habe ich vorhin die neue Version gebaut und auch die Doku erstellt und die Ansteuerung und der Richtungswechsel sieht ja echt super überschaubar aus.

Ich hatte das heute Mittag auch kurz versucht, ein Pin auf 0 zu setzen und den anderen negativ und habe gehofft so die Drehrichtung zu verändern und seit da habe ich mir den Kopf zerbrochen und dann wieder gesehen das es in dem C-Beispiel auch mit negativen Werten geht, aber bei mir wieder nicht :mrgreen:


Ich werde morgen wieder berichten ob es geklappt hat.

Viele Grüße
Dennis

Edit: Ja das mit IN1 und IN2 hast du noch richtig im Kopf. In der Doku des Motor-Controllers steht auch, dass man an die Eingänge direkt PWM-Signale anlegen kann.
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

So, ich habe jetzt den PCNT programmiert. Musst einfach nur ein git pull durchfuehren, da kommen eine Reihe commits. Es gibt auch ein Beispiel in der Dokumentation. Fuer mich funktioniert der ganz wunderbar, ich habe mir mit einem uController einen kleinen Encoder simuliert. Ausserdem habe ich ein wichtiges Rezept dazugepackt: wie man aus dem 16 Bit counter einen unbeschraenkten macht. Denn fuer deine angestrebte Regelung wirst du sonst ggf. in Probleme laufen. Da musst du ja die Geschwindigkeit basierend auf der Differenz zwei aufeinanderfolgender Zaehlerwerte zugrunde legen. Wie das geht, zeigt das Rezept.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Hallo __deets__,

tausend Dank für deine Arbeit! Wie um alles in der Welt kann ich das nur wieder gut machen?

Das Ändern der Drehrichtung funktioniert wunderbar und von Anfang an problemlos.

Der Encoder funktioniert auch. Ich habe gleich deine 'LagreCounter'-Klasse verwendet. Hier habe ich aber noch Verständnisprobleme.
Ich habe den Motor ganz langsam laufen lassen (der Encoder drehte sich mit ca. 5 min^-1) und ihn so gut es ging nach einer Umdrehung gestopp. Der Counter war dann bei ca -1500. Ich hatte da aber noch einen Aufruf von 0,3s Intervall drin. Den Intervall habe ich verkürzt und 0,01s eingetragen. Nach einer Umdrehung gab mir der Counter dann ca -2300 aus.
Der Filter war auf 100 eingestellt, da ich daraus auch noch nicht so schlau geworden bin.

Mein Encoder hat eine Auflösung 1000 PPR. Das verstehe ich so, dass der pro Umdrehung 1000 Impulse liefert und ich sagen kann 1000 Impulse == 360°.
Nur haut das mit meiner Ausgabe nicht so richtig hin.

Ich denke ich verstehe da irgendein Zusammenhang nicht richtig. Ich muss auch ehrlich zugeben, dass ich das mit den 16 Bit nicht wirklich verstehe.
Wieso geht eine Umdrehung von -32768 bis 32767?
Ich kann mit 16Bit 65536 Zustände darstellen. Okay deine beiden Zahlen ergeben die Zustände, aber das wars auch schon, was ich rausfinden konnte. Ich verstehe auch den Hintergrund nicht ganz, wieso dass dann wieder genau um die 16Bit zu groß ist?

Das würde ich gerne verstehen, vielleicht kann ich auch dann die Ausgaben besser interpretieren und richtig in °-Ausgaben umrechnen.

Ich muss mich nochmal recht herrzlich bei dir bedanken! Wirklich so klasse, dass du das für mich gemacht hast und mir immer weiterhilfst! Würde ich sehr gerne irgendwie wieder gut machen.

Viele Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Zu den 16 Bit: der Zähler im ESP hat keine Vorstellung davon, wieviele Pulse eine Umdrehung sind. Der zählt die einfach nur. Und das tut eben mit einem 16 Bit Wert, vorzeichenbehaftet. Dadurch zählt er also bis maximal 32767, und der nächste Puls bringt ihn auf das negative Maximum, -32768. Wenn du jetzt also die Differenz zwischen zwei Messvorgängen bestimmst, hast du plötzlich irgendwas um ~ -65000, statt um den erwarteten kleinen Wert. Und meine Arithmetik gleicht das einfach aus. Dadurch musst du dich da nicht drum kümmern, sondern bekommst immer “gute” Werte.

Dann zum Filter. Das kannst du auch in der Dokumentation des ESP https://docs.espressif.com/projects/esp ... ing-pulses nachlesen, aber im Grunde ist das nichts anderes als das debouncing, das man auch von GPIO pins kennt. Da du optisch + extra Elektronik unterwegs bist, kannst du den wahrscheinlich ziemlich niedrig ansetzten. Die Einheit sind Taktzyklen des ABP, 80MHz. Mit 100 hast du also 800KHz Impulse, mehr als genug.

Was jetzt die Zuordnung von Impulsen zu Umdrehungen angeht: ja, so verstehe ich die Angaben auch. Was passiert, wenn du den Encoder mal von Hand (ohne Motor dran) um etwa eine Umdrehung bewegst? Da sollten dann ja 1000 Pulse kommen. Wirklich was falsch machen bezüglich des counters kann man da eigentlich auch nicht. Höchstens das doch die Pegel zu niedrig sind, aber da würden Pulse verschluckt. Nicht zu viele erzeugt.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Erklärungen.

Da der Aufbau doch etwas umfangreicher geworden ist, habe ich alles in die Werkstatt verfrachtet und kann deshalb erst morgen Abend die Umdrehung von Hand ausprobieren.

Wobei bei dem was das TV-Programm zu bieten hat, kann es auch sein das ich nachher noch kurz hinfahre.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Ich war noch kurz dort und habe den Encoder eine Umdrehung von Hand gedreht.
Einmal mit einem 'sleep(0.1)' zwischen den Aufrufen. Dabei kamen folgende Ausgaben. Damit du die Zahlen nicht alle einzeln anschauen musst habe ich die in einem Diagramm dargestellt:
https://www.dropbox.com/s/ba1eeckmu3fl5 ... 2.png?dl=0
Von 0 bis -1400 sind die Ausgabewerte des Encoders. Man sieht dass der Wert nicht kontinuierlich ansteigt.

Code: Alles auswählen

0
-1
-2
-26
-48
-68
-117
-179
-269
-389
-484
-587
-664
-671
-699
-714
-721
-721
-721
-721
-721
-721
-786
-887
-900
-883
-833
-847
-861
-881
-935
-1009
-1029
-1094
-1018
-933
-948
-952
-957
-963
-977
-1019
-1055
-1074
-1106
-1133
-1165
-1131
-1174
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1201
-1152
-1050
-1036
-1079
-1091
-1063
Ich habe dann noch interessehalber die Zeit zwischen den Aufrufen verkürzt auf 0.01s, dabei ist das Diagramm entstanden:
https://www.dropbox.com/s/ntv2kazn9bddr ... 1.png?dl=0

Ich glaube das ist aussagekräftig genug und ich muss den Beitrag nicht mit weiteren Zahlen füllen.

Ich verwende den Pin 15 für die A-Leitung und Pin 2 für die B-Leitung. Die Masse liegt von jedem Bauteil auf dem gleichen Bezugspunkt. Die Leitung Z, die für die Drehrichtung ist habe ich nicht angeschlossen und die Leitung "Shield: F.G." liegt auf Masse. Zusätzlich habe ich auch eine Masseleitung an das Gehäuse des Encoders angebracht. Das steht so im Datenblatt

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Die Zeit sollte keine Rolle spielen. Der zaehlt ja in Hardware, und die muss nur kurz genug sein, dass nicht 2**15 Impulse zwischen zwei Aufrufen entstehen koennen. Was man sieht: der geht rueckwaerts. Wenn du also nicht total komisch gedreht hast, dann spricht das dafuer, dass der die Kontrol-Leitung nicht richtig sieht. Die bestimmt die Drehrichtung.

Vielleicht musst du doch nochmal an die Spannungswerte ran, der eine war ja recht niedrig. Dazu also entweder den 1500er vergroessern, oder den 10500er verkleinern.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Ich habe mir Mühe gegeben ordentlich zu drehen. Da man(n) da etwas Gefühl braucht und die eine Umdrehung so genau wie möglich sein sollte, habe ich meine Freundin gleich mit genommen und sie hat auch gedreht und die Ergebnisse waren ähnlich. Da der Motor mit sehr langsamer Drehzahl auch ein "falsches" Ergebnis lieferte, schließe ich das Drehen als Fehler aus.

Ja die Spannung von der B-Leitung lag bei 2,6V. Dann sorge ich morgen mal dafür das ich auf 3V komme und teste erneut.

Ich melde mich dann morgen Abend zurück.

Danke und einen schönen Abend noch,
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Statt Widerstaenden kannst du fuer sowas auch gut 10K Trimmpotis benutzen, die kann man ja genau fuer sowas dann einstellen.
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Gute Idee, leider etwas zu spät. Gestern Abend habe ich erst bei TME bestellt. Wegen so etwas kleinem starte ich keine Neubestellung. Aber es wird so oder so mal wieder eine Bestellung anstehen, dafür schreibe ich es gleich auf die Einkaufsliste 👍

Danke und Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Ich habe gerade den großen Widerstand an beiden Signalleitungen um 470 Ohm verringert. Das Ergebnis habe ich in einem Video festgehalten.
Der Spannungseinbruch ist beim wechsel der
Drehrichtung:
https://www.dropbox.com/s/pwuw5qobcmnpv ... 7.MOV?dl=0

Hm das Verhalten und auch die Spannungswerte verstehe ich nicht. Die verbauten Widerstände sind die gleichen, das habe ich abgeglichen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Na das ist kein Spannungseinbruch, sonder nur die erwartete Phasenverschiebung bei Drehrichtungswechsel. Du triggerst eben auf Blau, und der bleibt stabil, und der andere Kanal verschiebt sich um 90 Grad.

Das die Spannung so gering ist, das ist eher das doofe. Da musst du nochmal ran denke ich, wobei du das auch nur bei dem Kanal machen solltest, wo das Problem besteht. Keine Ahnung was genau da das Problem ist, aber der andere tut ja.
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Nachtrag: jetzt sehe ich natuerlich, was du da meinst mit Spannungseinbruch. Das ist aber nur die Durschnittsmessung, das kommt auch nur durch die Phase. Du musst an dieser Stelle nur auf das Maximum achten, und das sind ja nur 2V bei Gelb. Und laut Datenblatt ist ein High beim ESP32 0.75 * VDD, und das kommt auf 2.48 raus - also zu wenig bei deinem einen Kanal!
Benutzeravatar
Dennis89
User
Beiträge: 1506
Registriert: Freitag 11. Dezember 2020, 15:13

Danke für die Erklärung.

Ich habe alle Widerstände ausgetauscht, alle Verbindungen geprüft und die Spannungsversorgung gemessen, die ist überall konstant. Dann mal direkt an den Ausgängen des Encoders gemessen, vor den Widerständen. Die B-Leitung lag konstant auf 22V, aber die A-Leitung schwankt von 19 - 22V. Dann ist es schon mal klar, dass der Spannungsteiler so nicht gepasst hat. Jetzt gibt es zwei verschiedene Spannungsteiler einmal für 22V und einmal für 19V. Eine Umdrehung war jetzt auch so ca. die 1000 Impulse und die Werte verliefen linear, wie es sein sollte.

Das ist ja für den ersten Versuch es schön, aber wenn ich den Spannungsteiler auf 19V auslege, die Spannung aber bis 22V geht, dann ist das zum einen nicht sicher und zum anderen ist das Schwanken doch nicht normal?

Für die 19V besteht der Teiler aus 1500 Ohm und 8000 Ohm und für die 22V mit 1500 Ohm und 9500 Ohm, jeweils mit 2mA berechnet.

Wie würdest du diesen Fall behandeln?

Ich habe zum Beispiel in dem Projekt auch einen Step-Down, in der Beschreibung davon stand, dass der immer 5V liefert und manan ihn bis zu 36V (oder so) anlegen kann. Wäre es dann möglich meine Schwankende Spannung auch auf einen festen Wert zu bringen? Also ich meine jetzt nicht mit dem Step-Down, sondern im Allgemeinen.

Grüße
Dennis
"When I got the music, I got a place to go" [Rancid, 1993]
__deets__
User
Beiträge: 14545
Registriert: Mittwoch 14. Oktober 2015, 14:29

Das ist zwar weird, aber vielleicht normal in der 24V Welt. Keine Ahnung. Ein Weg damit umzugehen ist eine Zener-Diode zu benutzen. Die muss man in Sperrrichtung(!) verbauen. Das besondere an der ist, dass sie eine geringe & wohldefinierte Durchbruchsspannung hat. Und damit baut man sich faktisch einen veränderlichen Widerstand, der die 3V3 erzwingt. Ich habe das mal simuliert, da kannst du das sehen:

Bild

Die niedrige Spannung liegt genau bei 3V3, auch wenn die hohe Spannung nur einen 10K “Vorwiderstand” hat.

Hier ist ein Modell: https://www.reichelt.de/zenerdiode-3-3- ... 23126.html

Datenblatt: https://www.mouser.de/datasheet/2/916/BZX79-1320091.pdf

Damit sollte es eigentlich klappen.
Antworten