Das Open-Control-Projekt - Die Alternative zur C-Control-I


Das Forum zur C-Control-1
Welche C-Control-Varianten existieren?
Übersicht - Suchen - Neueste 50 Beiträge - Neuer Beitrag - Login - Registrieren
INFO - FAQ - CC2-Forum - CCPro-Forum 

 Servo an Main-UNIT - HowTow zusammenarbeit - Kategorie: Verschiedenes (von Christian W. - 20.06.2008 15:36)
 Als Antwort auf Anfänger Projekt - HowTow zusammenarbeit - von Hardy - 13.06.2008 0:51
Christian W. nutzt:  CC1-Unit V1.1
Hallo....

Keine ahnung ob es was bringt, bin auch nicht so der "Auskenner" aber ich habe eine ansatzweise passable lösung gefunden.... sicherlich geht es demnach noch besser..... aber zunächst möchte ich mal so erklären wie das so geht mit servos zum mindest wie ich das verstanden habe, und was ich aus dem Wissen dann draus gemacht habe

wie ja bekannt ist kann man an der alten C-Control Main-unit keine Servos an die DA ausgänge anschließen... bei neueren Versionen soll dies ja möglich sein, durch umschaltung eines Control Flags.

Aber damit wollte ich mich trotzdem nicht so zu frieden geben.

Eigentlich habe ich ja keine Ahnung wie servos anzusteuern sind, also habe ich mich etwas genauer Informiert.

puh der servo bekommt also für die Dauer von 1-2 ms (millisekunden) ein High und danach ein LOW für 20 ms....

also so sollte es bei den meisten Servos sein.. einige reagieren ab 0,5 ms bis 2,5 ms....

Die differenz zwischen den von bis werten entspricht dann eigentlich die Position

Bleiben wir mal bei den 1-2 ms als Grundlage.

Dann entspricht 1,5 ms High Signal die mittelstellung (rein rechnerich).. ok.... super wissen haben wir jetzt... doch wie kann man das nun umsetzen????

da ich ausschließlich nur mit CCBAsic programmiere ist das noch schwieriger... da basic ja doch recht langsam ist.

und ein genaues High signal von 1,5 ms oder 1,2 ms oder oder oder damit hinzubekommen ist doch recht schwer....

aber das wissen das jeder befehl letztlich auch zeit braucht... hat mich auf eine nunja recht blöde idee gebracht.

ICh weiß nicht wielange die CC benötigt um einen Digitalport ausgang zu schalten....

ich habe einfach bissel experimentiert.

Da

Pause 1 ca. 20 ms sind haben wir die Lowphase ja schon recht genau....

Warum nur recht genau???

Nun wir schalten ja zuerst den port auf LOW sprich dieser Befehl benötigt seine zeit dann der Befehl Pause 1, der auch seine Zeit braucht.... und dann macht er ja die pause erst... somit wind wird mit sicherheit über den 20 ms, aber das soll uns zunächst nicht weiter stören....
und werden das trotzdem so in unserem Programm so verwenden.


doch bevor wir loslegen können.... bzw. der servo was macht müssen wir ihn natürlich auch ein Definiertes High geben, und das wird schwieriger....


define servo port[1]
Servo=1


ein
waitms 1,5
gibt es ja leider nicht
deswegen habe ich getrickst
indem ich Servo=1 mehrfach hintereinander verwendet habe


servo=1
servo=1
servo=1
servo=1

danach habe ich den Port auf LOW gesetzt

servo=0

und die 20 ms pause wie oben gesagt....
pause 1


das ganze lässt den servo von rechts nach links "Steppen".... also er macht noch keine ganze umdrehung

nach rechts geht es auch nur etwas "Anders"

ich habe herausgefunden das man hier ganz gut mit

servo=1
servo=1
servo=0
servo=0
servo=1


Jetzt auf aus und die 20ms warten
servo=0

pause 1

vorwärts kommt...

ok... aber auch hier wird nur wieder ein schritt getan.... um den servo wirklich zu positionieren

brauchen wir noch bissel drum rum im Programm.


da man ja gern mit Runden zahlen arbeitet 0-100 statt 0-255 habe ich also eine "Prozentuale" angabe gemacht...


und eine kleine Routine dazu geschrieben die den Servo dann auch an die Position fährt...
da diese seteuerung an sich sehr träge ist, kann man leider nur mit ca. 40 Steps wirklich arbeiten

darum habe ich die 40 Steps * die gewünschte ProzentPosition durch 100 gerechnet.

Somit habe ich dann einen wert von 0-40
da ich mir zuvor merken muß wo der Servo sich befindet, kann ich nun vergleichen ob das Ziel links oderrechts von der Position ist

'NServPos = Neue Servo Position
'OServPos = Alte Servo Position
'move= Errechnette schritte von Alter position zur neuen....


#set_Servo
NServPos=40*NServPos/100
beep 20,1,0
                'wenn Alte Position Größer (also rechts) von Neuer position ist dann berechne
                ' und setze ein Flagbit (128) für Links rum
                ' ggf. kann man das noch tewas optimieren die -2 ist leider notwendig
                ' um so halbwegs auf den punkt zu kommen

if OServPos>NServPos then move = OServPos-NServPos-2 +128
                'das ganze natürlich auch für rechts rum ohne das Flagbit
                'auch hier ist die +1 leider notwendig.. aber man sollte schauen ob nicht auch -1 oder +2
                ' bessere ergebnisse bringen.. hier git einfach testen
if OServPos if OServPos=NServPos then move = 0
                ' wäre ja blödsin den servo anzufahren wenn er sich nicht bewegen soll
                if move=0 then goto weiter
if move and 128 then gosub Links_rum else gosub Rechts_rum
#weiter
OServPos=NServPos
pause 10
Return

aufgerufen wird das ganze mit
NServoPos=50             '50
gosub set_Servo

natürlich fehlen noch die Routinen Links_rum und Rechts_rum


aber diese kommen hier ja schon


#links_rum
                'Zuerst entfernen wir das LINKSRUM-FLAGBIT
move=move and 127
for n=0 to move 'max 40
gosub links
next n
return


#rechts_rum
for n=0 to move 'max 40
gosub rechts
next n
return


und was jetzt noch fehlt unsere zwei routine für rechts und links





#links
servo=1
servo=1
servo=1
servo=1
servo=0
pause 1
return

#rechts
servo=1
servo=1
servo=0
servo=0

servo=1
servo=0

pause 1
return

tschia das war es dann schon eigentlich wenn da nicht noch die define vorweg wären...

und hier mal das ganze lisiting.. mit kleinem demo



define servo port[1]
define NServPos word
define OServPos byte
define move byte
define n byte
define steps byte
servo = 1
servo = 0


gosub set_null
OServPos=0

NServPos=0
gosub set_Servo
pause 90
for steps=0 to 10

NServPos=75
gosub set_Servo

NServPos=50
gosub set_Servo

NServPos=25
gosub set_Servo

NServPos=50
gosub set_Servo

next
NServPos=100
gosub set_Servo
pause 90

NServPos=0
gosub set_Servo
pause 90

NServPos=50
gosub set_Servo

end


#set_Servo
PRINT "-------------------------"
PRINT " SCHRITT"
NServPos=40*NServPos/100
beep 20,1,0
if OServPos>NServPos then move = OServPos-NServPos-2 +128
if OServPos<NServPos then move = NServPos-OServPos+1
if OServPos=NServPos then move = 0
if move=0 then Print "Position beibehalten"
if move=0 then goto weiter
if move and 128 then gosub Links_rum else gosub Rechts_rum
'gosub bewege
#weiter
OServPos=NServPos
pause 10
Return






#links
servo=1
servo=1
servo=1
servo=1
servo=0
pause 1
return

#rechts
servo=1
servo=1
servo=0
servo=0

servo=1
servo=0

pause 1
return


#bewege

for n=0 to (move and 127) '40
if move and 128 then gosub links else gosub rechts
next n
return


#links_rum
move=move and 127
print "Links ->";move
print "OLD: ";OServPos;" NACH: ";NServPos
for n=0 to move '40
gosub links
next n
return


#rechts_rum
print "Rechts ->";move
print "OLD: ";OServPos;" NACH: ";NServPos
for n=0 to move '40
gosub rechts
next n
return




#Set_null
OServPos=40
NServPos=5
for n=1 to 40
Gosub links
next n
return





ich weiß es ist nicht 100%ig aber für erste "Gehversuche" genügte mir das natürlich werde ich mir zu gegebener zeit dann einen anderen ServoControler zulegen.... womit dann alles was besser wird...

aber für anfänger um mal zu sehen was da so passiert....


bei C gibt es sservos ab 5 Euro und sollten für erste versuche genügen...

ich hab das ganze auch für 2 Servos gemacht und auf den servos kleine Spiegel drauf...

Nun eigentlich sollte es für nen Laserpointer werden....doch dazu sind die Bewegungen dann doch zu ungenau und zu langsam.... aber es macht trotzdem spaß dem kleinen Ding zu zusehen wie es sich da Abstrampelt


ich hoffe das gefällt euch und hilft den einen oder anderen weiter...

ggf. kann mir ja mal eienr erklären wie man das in Maschinen code umsetzt bzw.

ob man da ggf. sogar die 1-2 ms besser hinbekommt... das wär doch auch mal ne Aufgabe...


LG Christian aus dem schönen NRW

 Antwort schreiben

Bisherige Antworten:

Re: Servo an Main-UNIT - HowTow zusammenarbeit - (von ManfredW - 20.06.2008 21:17)
    Re: Servo an Main-UNIT - HowTow zusammenarbeit - (von Christian W. - 21.06.2008 19:47)