|
Das deutsche QBasic- und FreeBASIC-Forum Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
|
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen |
Autor |
Nachricht |
LinkedOut
Anmeldungsdatum: 31.08.2015 Beiträge: 3
|
Verfasst am: 31.08.2015, 15:11 Titel: Servos ansteuern, PWM |
|
|
Hallo, (hoffentlich im richtigen Forenbereich)
ich möchte 4-5 analoge Servomotoren mit einem Programm gleichzeitig ansteuern.
Habe bereits qbasic auf dem PC, da ich früher im Unterricht einmal LED angesteuert
habe und dieses Programm mir dafür geeignet erschien. Jedoch steht in einigen Foren,
es gäbe Probleme mit Windows XP!? (Ist auf meinen drauf)
Was gibt es für Alternativen? Kommt Raspberry oder ähnliches in Frage? Können diese
von XP aus programmiert werden oder wie läuft das ab? Habe damit keine Erfahrung.
Wie könnte der Befehl für einen Servo lauten, wenn dieser in einer mäßigen Bewegung
einen bestimmten Winkel/Wert anfahren soll?
Wie kombiniert man die Befehle, damit sie zeitgleich ausgeführt werden und nicht
nacheinander? Oder passiert dies automatisch?
Welche Informationen benötigt Ihr?
PC mit XP, Prozessor und Druckerport!?!
Servo 4,8/6V, 0,10-0,08s für 60°
Signalfrequenz 50Hz , t=20ms, ti=1,0-2,0ms, tp=19-18ms
Mittel-/Nullstellung bei 1,5ms
Werde auf jeden Fall eine Platine mit Transistoren bauen, um die Servos vom PC
anzusteuern. Ist dies bei Raspberry auch nötig?
erste Vorstellung:
Servo S1-4
S1: Von 0° auf +30° //1,5ms > 1,68ms/1683us
S2: Von 0° auf +90° //1,5ms > 2,05ms/2050us
S3: Von 0° auf -15° //1,5ms > 1,41ms/1408us
S4: Von 0° auf -90° //1,5ms > 0,95ms/950us
Wie ist es möglich, die ersten/letzten 10-20% des Weges die Geschwindigkeit zu
verlangsamen, um die Bewegung auslaufen zu lassen? |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 955 Wohnort: Austria
|
Verfasst am: 31.08.2015, 16:34 Titel: |
|
|
Das Problem bei Windows (oder irgend einem anderen modernen Betriebssystem) ist der direkte / exklusive Hardwarezugriff, der unter DOS selbstverständlich war, aber den du jetzt nicht mehr hast weil sich das Programm die Ressourcen ja mit anderen Programmen teilen muss (Multitasking) und deswegen das Betriebssystem diese verwaltet (-> kein direkter Zugriff, sondern über das Betriebssystem soweit es dieses erlaubt).
Beim Raspberry sind die Probleme diesselben, mit dem Unterschied dass es fertige Bibliotheken gibt, mit denen man diese Hardwarezugriffe machen kann. Solche gibts jedoch für Windows auch (nur halt nicht so schön in einem Gesamtpaket, wie beim Raspberry). Beachte jedoch dass der Raspberry ein System mit ARM Architektur ist (also kein x86) und dort auch kein Windows läuft (ausgenommen Embedded/IoT).
Die große Frage ist zuerst einmal über welche Schnittstelle und wie genau die die Servos ansteuern willst - also wie du dir das Interface PC <--> Servos vorstellst.
Beim Raspberry hättest du den Vorteil dass du vermutlich die vorhandenen GPIO Pins nutzen kannst, bei einem normalen PC musst du wohl über COM/LPT gehen.
Vielleicht schaut noch ein Elektronik-Experte rein, diesbezüglich kann ich nicht wirklich helfen; und einen Raspberry hab ich auch nicht. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
LinkedOut
Anmeldungsdatum: 31.08.2015 Beiträge: 3
|
Verfasst am: 31.08.2015, 20:36 Titel: |
|
|
Das klingt für mich so, als ob ich mir am besten einen PC mit Windows 98
zulege Über welches Programm wird denn ein Raspberry mit Daten versorgt?
Gibt es noch Alternativen?
Von der LPT-Schnittstelle sollen die Signale je Servo über einen Transistor
lediglich verstärkt werden. Die Servos haben ihre eigene (Arbeits-)Stromversorgung.
An den Pins benötige ich die (über qbasic generierte) Frequenz von 50Hz mit
gewünschtem ti/tp-Verhältnis (zwischen 1,0-2,0ms Einschaltzeit).
Wie ist ein Code, um in gewünschter Zeitspanne (anstatt so schnell wie möglich)
das Verhältnis beim pwm-Signal zu ändern, aufgebaut?
Doch nicht etwa im us-Bereich schrittweise den nächsten anzusteuernden
Winkel anzufahren?!?! |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1243 Wohnort: Ruhrpott
|
Verfasst am: 01.09.2015, 01:36 Titel: |
|
|
Hach, bei so einem Thema bin ich doch gleich wieder in meinem Element!
Zunächst einmal willkommen im Forum.
Zuerst die schlechte Nachricht: Schnittstellenzugriff unter XP kannst du mit QBasic vergessen, das geht nicht.
Und jetzt die gute Nachricht: Stattdessen gibt es FreeBasic. Das ist sowas ähnliches (zumindest von der Syntax her), nur viel, viel leistungsfähiger. Zwar kann auch FreeBasic nicht so ohne weiteres auf die Schnittstellen zugreifen, aber es lässt sich problemlos mit den notwendigen Treibern nachrüsten. Siehe dazu auch
https://forum.qbasic.at/viewtopic.php?t=943&highlight=out32
https://forum.qbasic.at/viewtopic.php?p=102466&highlight=#102466
https://forum.qbasic.at/viewtopic.php?t=8436&highlight=inpout32+dll
Die Erzeugung von bis zu 8 passenden PWM - Signalen ist kein Problem, der Programmcode dafür könnte ungefähr so aussehen:
Code: | Dim As Double zeiten(5) 'array für 5 servos definieren
Dim As Double zeitmerken = Timer
'...
Declare Sub ansteuerung(zeiten() As Double)
Do 'PWM - Sub alle 20ms aufrufen
'...
'hier kommt der programmcode zum setzen PWM - zeiten hin
'...
If Timer >= zeitmerken Then
zeitmerken = Timer + .02 'zeit für nächsten aufruf setzen
Sleep 1 'sicherstellen, dass die sub eine 'frische' zeitscheibe bekommt
ansteuerung(zeiten()) 'PWM - signale erzeugen
EndIf
Loop
Sub ansteuerung(zeiten() As Double)
Dim As Byte ausgang = 0
Dim As Double startzeit = Timer
Dim As Any Ptr port = &h378
Dim As Integer x
For x = 0 To UBound(zeiten) 'ausgänge für alle angeschlossenen servos auf '1' setzen
ausgang = BitSet(ausgang,x)
Next
Out32(port,ausgang) 'auf druckerport ausgeben
Do 'PWM - signale erzeugen
For x = 0 To UBound(zeiten)
If Timer >= startzeit + zeiten(x) Then 'wenn ti abgelaufen...
ausgang = BitReset(ausgang,x) '...entsprechendes bit auf '0' setzen
EndIf
Next
Out32(port,ausgang) 'auf druckerport schreiben
Loop While ausgang 'solange, bis alle bits '0' sind
End Sub |
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 955 Wohnort: Austria
|
Verfasst am: 01.09.2015, 16:08 Titel: |
|
|
Direkter Zugriff auf COM/LPT geht unter Windows NT nur mit einem Treiber (unter 9x weiß ich es nicht, womöglich auch nur mit VxDs?). Glücklicherweise hat FreeBasic - wie von grindstone schon erwähnt - so einen Treiber bereits integriert und verwendet ihn bei Bedarf.
Soweit sogut.
Was jedoch meines Erachtens ein Problem sein wird ist das Generieren des PWM Signals. Das Grundproblem ist, dass die COM/LPT Schnittstellen einfach nicht dafür ausgelegt ist PWM Signale auszugeben, was bedeutet dass das PWM Signal von einer Software erzeugt werden muss. Das größte Problem hierbei ist das Timing. Ich schätze dass du auf einige Millisekunden Genauigkeit kommen wirst, und das auch nicht mit FreeBasic Mitteln, sondern mit höher auflösenden Timern des jeweiligen Betriebssystems.
Der Raspberry hat laut diesem Text einen Pin mit Hardware PWM (also das Signal wird von der Hardware erzeugt) und es gibt auch eine Möglichkeit ein PWM Signal mit hoher Timing-Genauigkeit auf den anderen Ports zu erzeugen (wie das genau funktioniert müsste man sich anschauen).
Als Alternative zu PC und Raspberry Pi möchte ich auch noch die Möglichkeit aufzeigen einen µC zu verwenden, um das PWM Signal zu erzeugen. Diese haben meist PWM Generatoren in Hardware integriert (8 sind allerdings schon ziemlich viele denke ich). Die Kommunikation zwischen µC und PC könnte man am einfachsten über den seriellen Port machen - für µc und PC ist dann ein entsprechendes Programm zu schreiben, dass die Kommunikation zwischen den beiden realisiert und µC seitig den Hardware PWM Generator entsprechend initialisiert.
Mit einem Atmel AtMega(16? - weiß nicht mehr so genau) hab ich letzteres schon einmal vor längerer Zeit realisiert. Allerdings nur mit einem PWM output.
Aber wie ich bereits sagte, bezüglich hardwareseitiger Realisierung kenne ich mich zu wenig aus um da Tipps geben zu können. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
grindstone
Anmeldungsdatum: 03.10.2010 Beiträge: 1243 Wohnort: Ruhrpott
|
Verfasst am: 01.09.2015, 17:14 Titel: |
|
|
Das Steuersignal für ein Servo sieht etwas anders aus als etwa ein Audio - PWM - Signal. Es besteht aus Impulsen mit einer (unkritischen) Wiederholrate von ca. 50 Hz, die eine Länge zwischen 1,0 und 2,0 ms haben. Diese Impulslänge bestimmt die Stellung des Servos. Bei 1 ms geht es auf Linksanschlag, bei 2 ms auf Rechtsanschlag und bei 1,5 ms in Mittelstellung. Es reicht also, wenn der Programmteil, der die Impulse erzeugt, in den ersten 2 ms nicht gestört wird. Dazu müsste es eigentlich genügen, direkt vorher einen SLEEP 1 - Befehl zu setzen, notfalls könnte man auch noch die Priorität erhöhen.
Ein PC mit XP ist sicher nicht das ideale Gerät, solche Steuerimpulse zu erzeugen, andererseits dürfte die Ansteuerung z. B. in einem Flugmodell auch nicht immer ganz störungsfrei sein, so daß einzelne Ausreißer bei den Steuerimpulsen sicher kein ernstes Problem darstellen. Ob das in der Praxis wirklich so ist, käme auf einen Versuch an. Das (gleichmäßige) Ansteuern von Schrittmotoren mit dem Parallelport ist jedenfalls problemlos möglich.
Gruß
grindstone _________________ For ein halbes Jahr wuste ich nich mahl wie man Proggramira schreibt. Jetzt bin ich einen! |
|
Nach oben |
|
|
St_W
Anmeldungsdatum: 22.07.2007 Beiträge: 955 Wohnort: Austria
|
Verfasst am: 01.09.2015, 18:04 Titel: |
|
|
grindstone hat Folgendes geschrieben: | Das Steuersignal für ein Servo sieht etwas anders aus als etwa ein Audio - PWM - Signal. |
OK, ich hatte ein PWM Signal für einen "normalen" Elektromotor im Kopf, wie ich es bereits einmal realisiert habe. Servos hab ich auch schon einmal angesteuert mit einem µC, allerdings ist das mindestens genausolange her. Wie das funktioniert hat hab ich inzwischen offensichtlich vergessen.
Auch wenn das Intervall zwischen den Impulsen dann nicht kritisch ist, die genaue Dauer von den Impulsen zu realisieren könnte trotzdem ein Problem sein. Zumal es ja, wenn ich deine Beschreibung richtig verstanden hab, Bruchteile einer Millisekunde sind, die die Position verändern (also die Zwischenschritte zwischen 1 und 2 ms). Aber man müsste es einfach ausprobieren welche Genauigkeit man schafft.
//edit:
Ich habe ganz kurz ein paar Codenzeilen auf meinem System ausgeführt um die Auflösung von der Timer Funktion zu schätzen und revidiere meine obige Meinung
Eine Auflösung von im µs Bereich scheint sogar realistisch. _________________ Aktuelle FreeBasic Builds, Projekte, Code-Snippets unter http://users.freebasic-portal.de/stw/
http://www.mv-lacken.at Musikverein Lacken (MV Lacken) |
|
Nach oben |
|
|
LinkedOut
Anmeldungsdatum: 31.08.2015 Beiträge: 3
|
Verfasst am: 03.09.2015, 15:41 Titel: |
|
|
Vielen Dank schonmal bis hierhin, das sind sehr brauchbare Informationen. Ich schaue mal, wie ich das jetzt am besten umsetzen werde. MfG |
|
Nach oben |
|
|
arduno
Anmeldungsdatum: 12.05.2011 Beiträge: 252
|
Verfasst am: 28.01.2016, 22:02 Titel: |
|
|
Kauf dir für 8 Euro ein Arduino. Und du ersparst dir Ärger , wenn du dich mit dem Anschlüssen am PC verhaust > Brandgefahr |
|
Nach oben |
|
|
|
|
Du kannst keine Beiträge in dieses Forum schreiben. Du kannst auf Beiträge in diesem Forum nicht antworten. Du kannst deine Beiträge in diesem Forum nicht bearbeiten. Du kannst deine Beiträge in diesem Forum nicht löschen. Du kannst an Umfragen in diesem Forum nicht mitmachen.
|
|