PWM Signal M-Link auf uController (mit 3V Eingang) einlesen

-Bob-

User
Hallo zusammen,

gerne möchte ich auf einen uController (Trinket M0, oder ItsyBitsy M0/4) das Steuersignal vom Multiplex M-Link Empfänger einlesen verarbeiten und einem Servo weitergeben (somit kann ich das Steuersignal vom Sender anpassen).
Ich habe schon Einiges mit Hilfe der Suchmaschine gefunden, sehr viel scheint aber auf Arduino Basis/ 5V Eingang gemacht zu werden. Bis jetzt noch nichts mit 3V basierte uController wie Trinket M0/ItsyBitsy M0/4 und Co.

Zuerst habe ich ein Frage ob jemand mich informieren kann wie man am Besten die Hardware koppelt?
Die Trinket M0 und anderen haben einen max. Eingang von 3V. Wie transformiere ich den M-Link Signalausgang am Einfachsten und sichersten runter auf 3V? Reicht hier eine Spannungsteilung über Widerstände?
Der M-Link Empfänger wird über ein BEC, sprich 5V gespeist. Leider steht mir kein Oscilloscope zur Verfügung und kann das Ausgangsignal nicht anschauen.

Hat jemand schon mal mit (Circuit-) Python ein PWM Signal eingelesen?
Ich habe gute Erfahrungen gemacht mit dem uController ein geeignetes PWM Signal raus zu geben an z.B. Servos, aber über das einlesen findet man nicht viel Erfahrungsberichte.
Das hatte ich gefunden: https://circuitpython.readthedocs.io/en/2.x/shared-bindings/pulseio/PulseIn.html
Da könnte man mit ein wenig Mathematik das Steuersignal rausrechnen.

Da ich die Hardware noch nicht angeschlossen habe (siehe erste Frage) konnte ich dies noch nicht versuchen :rolleyes:

Ich würde mich freuen wenn sich hier jemand meldet, der dies schon mal umgesetzt hat.

Gruss,

Bob
 

rkopka

User
Die Trinket M0 und anderen haben einen max. Eingang von 3V. Wie transformiere ich den M-Link Signalausgang am Einfachsten und sichersten runter auf 3V? Reicht hier eine Spannungsteilung über Widerstände?
Ja. Wenn man ganz sicher gehen will, kann man ja noch eine Zenerdiode parallel schalten. Das mache ich bei KfZ Elektronik für die 12V Eingänge, falls dort mal eine unerwartet hohe Spannung daherkommt.

Der M-Link Empfänger wird über ein BEC, sprich 5V gespeist. Leider steht mir kein Oscilloscope zur Verfügung und kann das Ausgangsignal nicht anschauen.
Aus China (amazon, ebay, Banggood...) gibts so kleine Taschenoszis. Mit 1 Kanal und begrenzter Frequenz, aber dafür ab €25. Für solche Zwecke reicht das allemal. Alternativ USB Oszis mit größeren Steckern, aber dafür braucht man einen PC. Die Fähigkeiten eines €300+ Oszis (besonders rund um die Triggerung) darf man sich nicht erwarten, aber zur Kontrolle von seriellen oder RC Signalen ist es ausreichend.

RK
 

ingo_s

User
Die MPX M-Link Empfänger arbeiten intern mit 3,3V, das Servosignal hat daher auch max. 3,3V.
Einen Vorwiderstand z.B. 1k sollte man zum Schutz bei Verpolung vorsehen.

Gruß Ingo
 

-Bob-

User
Danke!

Danke!

Hallo rkopka & ingo!

Danke! Ich hatte am WE die erste Versuche mit der Spannungsteiler über Widerstände… ;)
Ich konnte dafür sorgen, dass wenn es 5V gewesen wäre, max. 3V ankommen....
@rkopka. ich glaube, da werde ich doch mal ein 1K Oscilloscope zulegen irgendwann… macht ja schon sin.
@Ingo danke für den Hinweis, dann werde ich evtl. in einer nächste Schaltung direkt bzw. nur mit Vorschaltwiderstand arbeiten.

Interessant genug, konnte das Trinket das auf 2/3 geteilte Signal auch noch verarbeiten.

Ich habe auch in Circuitpython schon ein Programm gestestet, dass zumindest das Eingangsignal zeigen konnte! Nicht viel Code, aber es funktioniert :cool:

Pulseio.png

LG,

Bob
 

k_wimmer

User
Du kannst auch eine Diode vom Eingang auf Vdd legen.
Dann kann der Eingeng des Micro nie über Vdd+Vfwd gehen, also ca. 3,6V.
 

k_wimmer

User
Außer das externe Signal ist stark genug und du hast dann überall eine zu hohe Spannung.

RK

Ok, aber ein 100ohm Vorwiderstand hilft dann.
Das ist auch eigentlich nur gedacht um Spikes zu unterdrücken!
 

-Bob-

User
Hallo Zusammen,

herzlichen Dank für das Feedback! Auf der Hardware Seite klappt das alles hervorragend (1Kanal Oszi. kommt trotzdem für zukünftige Projekte ;))

Das Programm funktioniert jetzt auch gut. Ich lese die Pulse am Eingang vom uController ein. Diese misst Pulse in beide Richtungen sprich der 'hohe' Puls mit 1-2ms und die niedrige Pulslänge.
Dann Filter ich auf der 'Kürzere' und es bleibt der Steuerpuls übrig…


PulseIio_fertig.JPG


Code:
import time
import board
import pulseio

pulsein = pulseio.PulseIn(board.A1)

while True:
    while len(pulsein) == 0:
         pass
    pulseRC = (pulsein.popleft())
    if pulseRC < 2500:
        print((pulseRC,))
 
Ansicht hell / dunkel umschalten
Oben Unten