Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht Das deutsche QBasic- und FreeBASIC-Forum
Für euch erreichbar unter qb-forum.de, fb-forum.de und freebasic-forum.de!
 
FAQFAQ   SuchenSuchen   MitgliederlisteMitgliederliste   BenutzergruppenBenutzergruppen  RegistrierenRegistrieren
ProfilProfil   Einloggen, um private Nachrichten zu lesenEinloggen, um private Nachrichten zu lesen   LoginLogin
Zur Begleitseite des Forums / Chat / Impressum
Aktueller Forenpartner:

Servos ansteuern, PWM

 
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum
Vorheriges Thema anzeigen :: Nächstes Thema anzeigen  
Autor Nachricht
LinkedOut



Anmeldungsdatum: 31.08.2015
Beiträge: 3

BeitragVerfasst am: 31.08.2015, 16:11    Titel: Servos ansteuern, PWM Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 31.08.2015, 17:34    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
LinkedOut



Anmeldungsdatum: 31.08.2015
Beiträge: 3

BeitragVerfasst am: 31.08.2015, 21:36    Titel: Antworten mit Zitat

Das klingt für mich so, als ob ich mir am besten einen PC mit Windows 98
zulege neutral Ü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?!?! verlegen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 01.09.2015, 02:36    Titel: Antworten mit Zitat

Hach, bei so einem Thema bin ich doch gleich wieder in meinem Element! grinsen

Zunächst einmal willkommen im Forum. lächeln

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 01.09.2015, 17:08    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
grindstone



Anmeldungsdatum: 03.10.2010
Beiträge: 860
Wohnort: Ruhrpott

BeitragVerfasst am: 01.09.2015, 18:14    Titel: Antworten mit Zitat

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
Benutzer-Profile anzeigen Private Nachricht senden
St_W



Anmeldungsdatum: 22.07.2007
Beiträge: 925
Wohnort: Austria

BeitragVerfasst am: 01.09.2015, 19:04    Titel: Antworten mit Zitat

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 lächeln
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
Benutzer-Profile anzeigen Private Nachricht senden
LinkedOut



Anmeldungsdatum: 31.08.2015
Beiträge: 3

BeitragVerfasst am: 03.09.2015, 16:41    Titel: Antworten mit Zitat

Vielen Dank schonmal bis hierhin, das sind sehr brauchbare Informationen. Ich schaue mal, wie ich das jetzt am besten umsetzen werde. MfG
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
arduno



Anmeldungsdatum: 12.05.2011
Beiträge: 236

BeitragVerfasst am: 28.01.2016, 23:02    Titel: Antworten mit Zitat

Kauf dir für 8 Euro ein Arduino. Und du ersparst dir Ärger , wenn du dich mit dem Anschlüssen am PC verhaust > Brandgefahr weinen
Nach oben
Benutzer-Profile anzeigen Private Nachricht senden
Beiträge der letzten Zeit anzeigen:   
Neues Thema eröffnen   Neue Antwort erstellen    Das deutsche QBasic- und FreeBASIC-Forum Foren-Übersicht -> Profi-Forum Alle Zeiten sind GMT + 1 Stunde
Seite 1 von 1

 
Gehe zu:  
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.

 Impressum :: Datenschutz