Forum: Mikrocontroller und Digitale Elektronik Python + Mikrosekunden auf einem Raspi


von Milli-Willy (Gast)


Lesenswert?

Ich bräuchte Impulse von 560us und Vielfache davon. Kann man die mittels 
Python auf die ein oder andere Art auf einem Raspberry Pi erzeugen?

von Conny G. (conny_g)


Lesenswert?

Ein Linux-basiertes System taugt nicht gut für solche 
Echtzeitanwendungen.
Zum einen gibt es keine Timer die so fein gehen, zum anderen entzieht 
das Betriebsystem wg Multitasking deinem Programm ständig die Kontrolle.
Von Millisekunden aufwärts und mit großer Toleranz im Timing könnte man 
was hinfriemeln, aber wirklich kontrollieren Va nicht auf 100us oder 
weniger kann man es nicht.

von Peter II (Gast)


Lesenswert?

Conny G. schrieb:
> Ein Linux-basiertes System taugt nicht gut für solche
> Echtzeitanwendungen.
> Zum einen gibt es keine Timer die so fein gehen, zum anderen entzieht

meines Wissens hat die CPU aber Timer die man Programmieren kann, damit 
kann man auch eine PWM erzeugen.

@Milli-Willy
Suche dir die Doku von der RaspiCPU und schau ob du den PWM-Timer dazu 
nutzen kannst.

von Milli-Willy (Gast)


Lesenswert?

Ich will keine Probleme, ich will Lösungen angeboten bekommen :-)

Wie zB. wird der noch viel schnellere Takt zB. für Grafik, Audio oder 
USB erzeugt? Für meine Anwendung sind ein paar us mehr oder weniger kein 
Problem.

von Milli-Willy (Gast)


Lesenswert?

Uups, Peter II war schneller.

von (prx) A. K. (prx)


Lesenswert?

Vielleicht hilft das hier: https://pythonhosted.org/RPIO/pwm_py.html

von R. W. (quakeman)


Lesenswert?

Schau dir mal http://pythonhosted.org/RPIO/ an. Damit kannst du mit 
Hilfe der Hardware-Timer PWM Signale mit einer Auflösung von bis zu 1µs 
realisieren. Habe die Python Lib selber mal für Servos verwendet und die 
Signaltimings sind ziemlich präzise.

Ciao,
     Rainer

von Milli-Willy (Gast)


Lesenswert?

>Vielleicht hilft das hier: https://pythonhosted.org/RPIO/pwm_py.html
Sieht vielversprechend aus. Danke.

von (prx) A. K. (prx)


Lesenswert?

Conny G. schrieb:
> Zum einen gibt es keine Timer die so fein gehen,

Doch:
http://linux.die.net/man/2/setitimer
http://linux.die.net/man/3/usleep
http://linux.die.net/man/2/nanosleep
http://linux.die.net/man/2/clock_nanosleep

Allerdings ist da natürlich allenfalls die Mindestzeit garantiert.

von Conny G. (conny_g)


Lesenswert?

A. K. schrieb:
> Conny G. schrieb:
>> Zum einen gibt es keine Timer die so fein gehen,
>
> Doch:
> http://linux.die.net/man/2/setitimer
> http://linux.die.net/man/3/usleep
> http://linux.die.net/man/2/nanosleep
> http://linux.die.net/man/2/clock_nanosleep
>
> Allerdings ist da natürlich allenfalls die Mindestzeit garantiert.

Das meine ich. Was am Ende genau dabei herauskommt weiss man nicht.
Es hängt also von der Anwendung ab, ob man damit hinkommt.

Und bzgl. PWM ist die Frage, ob man damit ein moduliertes Signal - wenns 
um ein Datenprotokoll geht - hinbekommt, das stabil genug ist.
Wenn man pro Bit die Zeit wechseln muss - die Frage klingt mir danach, 
dann muss man einen PWM-Interrupt bedienen. Da wäre mir gerade nicht 
bekannt, dass man das in Python könnte.
Mit C und auf OS-Ebene ist das schon was anderes, da könnte man es 
schaffen. Wenn der Raspi einen PWM-Interrupt hat.

von (prx) A. K. (prx)


Lesenswert?

Conny G. schrieb:
> Wenn man pro Bit die Zeit wechseln muss - die Frage klingt mir danach,
> dann muss man einen PWM-Interrupt bedienen. Da wäre mir gerade nicht
> bekannt, dass man das in Python könnte.

PWM habe ich selbst nicht verwendet, aber auf GPIO Interrupts zu 
reagieren ist problemlos möglich. Siehe WiringPi "gpio wfi". Taster am 
Pin führt bei mir zu Shutdown vom RasPi.

von Conny G. (conny_g)


Lesenswert?

A. K. schrieb:
> Conny G. schrieb:
>> Wenn man pro Bit die Zeit wechseln muss - die Frage klingt mir danach,
>> dann muss man einen PWM-Interrupt bedienen. Da wäre mir gerade nicht
>> bekannt, dass man das in Python könnte.
>
> PWM habe ich selbst nicht verwendet, aber auf GPIO Interrupts zu
> reagieren ist problemlos möglich. Siehe WiringPi "gpio wfi". Taster am
> Pin führt bei mir zu Shutdown vom RasPi.

Ja, GPIO-Ints habe ich auch gesehen, das wird von RPi.GPIO 
implementiert.
Wenn es PWM-Interrupts gibt, dann müsste man das dafür auch 
implementieren - ich würde vermuten, dass muss auf 
Hardware-/Treiber-Level in C geschehen.
Ich würde infrage stellen, ob das auf Python-Ebene in Echtzeit ankommt, 
der Verdacht läge nahe, dass auf Treiber-Ebene ein Flag gesetzt wird, 
das in Python ankommt, sobald der Thread aktiviert wird - ich habe also 
doch eine unbekannte Zeitspanne zwischen dem Ereignis und dem 
Python-Int.
Keine Ahnung, ob das mit 500us erfolgreich zusammenspielen kann, wenn 
das in wesentlich höherer Frequenz als Key-Press geschieht.

Genau das meine ich mit: Linux ist kein Echtzeit-Betriebssystem. Ich 
weiss nie, wann ich auf App-Ebene etwas mitbekomme.
Bei einem Mikrocontroller kann ich das auf den Taktzyklus genau 
ausrechnen / festlegen.

Ich habe gerade PWM+DMA-Geschichten gefunden, allerdings wird auch da 
nicht auf Zeitwechsel pro Bit/PWM-Cycle eingegangen, nur dass man auf 
ein PWM-Grundsignal Untersignale aufsatteln kann. Anwendung dort eher 
Servo-Steuerung:
http://www.raspberrypi.org/forums/viewtopic.php?f=44&t=36572
Kann dem aber nicht entnehmen, ob man das jeden Zyklus des Grundsignals 
steuern kann, sieht mir nicht so aus.
Wenn, dann wäre das aber der Weg.

von Conny G. (conny_g)


Lesenswert?

Milli-Willy schrieb:
> Ich bräuchte Impulse von 560us und Vielfache davon. Kann man die mittels
> Python auf die ein oder andere Art auf einem Raspberry Pi erzeugen?

Was genau hast Du vor zu tun? Ein Datenprotokoll implementieren?

von (prx) A. K. (prx)


Lesenswert?

Conny G. schrieb:
> Bei einem Mikrocontroller kann ich das auf den Taktzyklus genau
> ausrechnen / festlegen.

Weshalb ich bei harten Anforderungen auch keinen RPi verwenden würde, 
beispielsweise indem die entsprechend Funktion ein angekoppelter Zwerg 
übernimmt.

Aber hier ist nicht genug bekannt. Wen es wirklich nur im die Länge 
einzelner Impulse geht, nicht aber um genau definiertes Timing aus 
beliebigen Impulsen und Pausen, dass sollte sich das mit dem verlinkten 
Modul schon machen lassen.

: Bearbeitet durch User
von Peter II (Gast)


Lesenswert?

Es habe sogar schon Leute geschafft, mit dem PWM eine UKW Sender zu 
bauen. der RPI hat DMA, damit kann man auch die Daten sehr zeitgenau zum 
den IO-Pins umleiten. Damit kann man dann auch jedes Protokoll umsetzen 
wenn man will.

von Milli-Willy (Gast)


Lesenswert?

>Was genau hast Du vor zu tun? Ein Datenprotokoll implementieren?
Das NEC IR-Protokoll. Hab hier eine kleine Hifi-Anlage mit DLNA, was 
wiederum nicht vollständig implementiert zu sein scheint. Nun würd' ich 
gern direkt am Pin des Prozessors an dem der 38kHz IR-Empfänger hängt, 
die Bits reinschieben.

von Peter II (Gast)


Lesenswert?

Milli-Willy schrieb:
> Das NEC IR-Protokoll. Hab hier eine kleine Hifi-Anlage mit DLNA, was
> wiederum nicht vollständig implementiert zu sein scheint. Nun würd' ich
> gern direkt am Pin des Prozessors an dem der 38kHz IR-Empfänger hängt,
> die Bits reinschieben.

dann würde ich mal nach dem DMA zeug suchen, das sollte damit Problem 
los gehen.

http://www.icrobotics.co.uk/wiki/index.php/Turning_the_Raspberry_Pi_Into_an_FM_Transmitter

von 900ss (900ss)


Lesenswert?

Conny G. schrieb:
> Linux ist kein Echtzeit-Betriebssystem

Ist zwar etwas OT aber für das Thema Echtzeit ganz interessant.

"New Raspbian with real-time kernel [JAN-15]"
http://www.emlid.com/new-raspbian-with-real-time-kernel-jan-2015/

von Conny G. (conny_g)


Lesenswert?

Peter II schrieb:
> Es habe sogar schon Leute geschafft, mit dem PWM eine UKW Sender zu
> bauen. der RPI hat DMA, damit kann man auch die Daten sehr zeitgenau zum
> den IO-Pins umleiten. Damit kann man dann auch jedes Protokoll umsetzen
> wenn man will.

Wenn das so geht, dann hätte man - rein technisch gesehen - gewonnen.
Bleibt dann noch die Frage, ob das einfach genug zu realisieren ist im 
Vergleich zu einem Slave-uC, dem man per SPI die Daten schickt und der 
macht dann das Protokoll-Timing.
Ich habe sowas in Linux / mit Raspi noch nicht genauer angeschaut, was 
es dafür braucht.
Mit Python direkt eher nicht, es braucht sicher Unterstützung über C auf 
Hardwarelevel. Möglicherweise hat das schon jemand gelöst und 
veröffentlicht.

von 900ss (900ss)


Lesenswert?

Conny G. schrieb:
> Es habe sogar schon Leute geschafft, mit dem PWM eine UKW Sender zu
>> bauen

Ich habe das ausprobiert (mit deren Projekt). Es funktioniert mit 
erstaunlich guter Qualität. Ich war überrascht.

von Conny G. (conny_g)


Lesenswert?

900ss D. schrieb:
> Conny G. schrieb:
>> Es habe sogar schon Leute geschafft, mit dem PWM eine UKW Sender zu
>>> bauen
>
> Ich habe das ausprobiert (mit deren Projekt). Es funktioniert mit
> erstaunlich guter Qualität. Ich war überrascht.

Grade angeschaut, haha, die sind verrückt, die Jungs. Genial. Ich liebe 
das.

Ohne den Code gesehen zu haben müsste der Ansatz auch für 
niederfrequentere Dinge funktionieren.
Im Spiel ist dann die Modifikation des Treibers und die Ansteuerung 
desselben aus Python.

Eine Menge Software-Gefrickel, wenn man das mag.
Mir persönlich wäre der Hardwareansatz lieber, weil ich alles dafür da 
habe, sogar schon fertige Schaltungen:
Slave-Mikrocontroller per SPI oder sogar einfach nur UART, und der macht 
das Protokoll, ich schiebe vom RPi die Daten rüber.

von Milli-Willy (Gast)


Lesenswert?

Autor: A. K. (prx)
Datum: 20.02.2015 11:33
>Vielleicht hilft das hier: https://pythonhosted.org/RPIO/pwm_py.html

Hab's eben mal getestet. Das funktioniert ja richtig gut!
Ich kann die Mikrosekunden auf dem Oszi einzeln abzählen.




pi@raspberrypi ~/python_test $ sudo python blink1.py
Using hardware: PWM
PW increments:  10us
Initializing channel 0...
add_channel_pulse: channel=0, gpio=17, start=0, width=120
init_gpio 17
clear_channel_gpio: channel=0, gpio=17
add_channel_pulse: channel=0, gpio=17, start=0, width=200
clear_channel_gpio: channel=0, gpio=17
RELAY_1 blink (grosses Relais)
^Cshutting down dma channel 0
clear_channel: channel=0
pi@raspberrypi ~/python_test $


Danke nochmals für den Tip (und auch den anderen natürlich).

von c-hater (Gast)


Lesenswert?

Milli-Willy schrieb:

> Ich bräuchte Impulse von 560us und Vielfache davon. Kann man die mittels
> Python auf die ein oder andere Art auf einem Raspberry Pi erzeugen?

Nein. Schon das OS ist kein Echtzeit-OS und somit nicht in der Lage, 
verläßliche Timings zu erzeugen. Und eine Interpretersprache ist so 
ziemlich das Allerletzte, was bei so einer Anforderung sinnvoll ist.

Wenn du sowas willst oder brauchst, dann ist nicht der RasPi das 
Hindernis (die Hardware gibt es her), sondern Linux und Python. Wirf 
diesen ganzen Scheiß weg und es geht problemlos. "Bare Metal", am Besten 
noch in 100% Assembler (nicht unbedingt handoptimiert).
Nur damit wird das Zeitverhalten deterministisch auch für mehrere Builds 
des gleichen Codes...

von (prx) A. K. (prx)


Lesenswert?

Geht der Mist schon wieder los? Musst du wirklich jeden Thread mit 
dieser dummen Diskussion kapern wollen? Zudem offenbar nix kapiert von 
dem, was dahinter steht.

von Bernd K. (prof7bit)


Lesenswert?

c-hater schrieb:
> Wenn du sowas willst oder brauchst, dann ist nicht der RasPi das
> Hindernis (die Hardware gibt es her), sondern Linux und Python. Wirf
> diesen ganzen Scheiß weg und es geht problemlos. "Bare Metal", am Besten
> noch in 100% Assembler (nicht unbedingt handoptimiert).

Ja ne, is klar.

Bare-Metal auf dem Pi, alle Treiber samt der App in reinstem ASM von der 
ersten Instruktion beim Einschalten bis zur letzten Instruktion bei der 
Fertigstellung in 200 Jahren selbst implementiert.

Das nenn ich Effizienz.

Hast Du noch andere Hobbies?

von Bastler (Gast)


Lesenswert?

Naja, der glaubt auch daß so eine Kiste ein exaktes Timing hätte. Die 
hat Latenz und Durchsatz, aber keine immer gleichen x ns für den Befehl 
abc. Es gibt da draußen eben vieles, was der Hater noch nicht gesehen 
hat.
Für exaktes Timing hat Broadcom PWM-fähige Timer eingebaut, die man auch 
mit Scriptsprachen konfigurieren kann. Da kommt es nicht auf 
Geschwindigkeit an.

von rpi (Gast)


Lesenswert?

Schau dir mal http://abyz.co.uk/rpi/pigpio/index.html an. Das Python API 
verwendet einen C-Daemon in ND den erwähnten Timer um Signale im US 
Bereich zu lesen oder erzeugen.

von Rolf M. (rmagnus)


Lesenswert?

Conny G. schrieb:
> Ein Linux-basiertes System taugt nicht gut für solche
> Echtzeitanwendungen.
> Zum einen gibt es keine Timer die so fein gehen, zum anderen entzieht
> das Betriebsystem wg Multitasking deinem Programm ständig die Kontrolle.
> Von Millisekunden aufwärts und mit großer Toleranz im Timing könnte man
> was hinfriemeln, aber wirklich kontrollieren Va nicht auf 100us oder
> weniger kann man es nicht.

Siehe
https://www.osadl.org/Latency-plot-of-system-in-rack-b-slot.qa-latencyplot-rbs3.0.html

von Conny G. (conny_g)


Lesenswert?

Rolf Magnus schrieb:
> Conny G. schrieb:
>> Ein Linux-basiertes System taugt nicht gut für solche
>> Echtzeitanwendungen.
>> Zum einen gibt es keine Timer die so fein gehen, zum anderen entzieht
>> das Betriebsystem wg Multitasking deinem Programm ständig die Kontrolle.
>> Von Millisekunden aufwärts und mit großer Toleranz im Timing könnte man
>> was hinfriemeln, aber wirklich kontrollieren Va nicht auf 100us oder
>> weniger kann man es nicht.
>
> Siehe
> 
https://www.osadl.org/Latency-plot-of-system-in-rack-b-slot.qa-latencyplot-rbs3.0.html

Was bedeutet dieser Chart?

von Rolf M. (rmagnus)


Lesenswert?

Conny G. schrieb:
> Was bedeutet dieser Chart?

Er zeigt ein Histogramm der Latenzen des Raspberry Pi mit Raspian und 
einem PREEMPT_RT-gepatchten Kernel. Hier die Info über das getestete 
System:
https://www.osadl.org/Profile-of-system-in-rack-b-slot-3.qa-profile-rbs3.0.html
Da kann man erkennen, wieviel Zeit das Betriebssystem braucht, um einem 
Echtzeit-Thread die Kontrolle zu geben. Da sind wir beim RPi zwar nicht 
bei den "100us oder weniger", aber so arg weit weg davon ist man auch 
nicht.

von Warmer Bruder (Gast)


Lesenswert?

Milli-Willy schrieb:
> Das NEC IR-Protokoll. Hab hier eine kleine Hifi-Anlage mit DLNA, was
> wiederum nicht vollständig implementiert zu sein scheint. Nun würd' ich
> gern direkt am Pin des Prozessors an dem der 38kHz IR-Empfänger hängt,
> die Bits reinschieben.

http://manpages.ubuntu.com/manpages/hardy/man1/irsend.1.html ist Teil 
von http://www.lirc.org/

von Milli-Willy (Gast)


Lesenswert?

>http://manpages.ubuntu.com/manpages/hardy/man1/irsend.1.html ist Teil
>von http://www.lirc.org/

Mit lirc hab ich Damals(TM) als Motivationsmunition erste Gehversuche 
auf nem Linux-Rechner gemacht.
Ich möchte aber nicht die 38kHz-Impulse (27us Länge) erzeugen sondern 
gewissermaßen direkt mit dem Raspi den 38kHz TSOP-Empfänger 
simulieren. Das ganze lässt sich schön per wired-or verknubbeln.

Den Raspi möchte ich, wenn alles läuft, in oder hinter der Stereoanlage 
verstecken.

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.