
|
INFO - FAQ - CC2-Forum - CCPro-Forum |
|
||
|
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 ' 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 |