Go Down

Topic: 360 servo (Read 282 times) previous topic - next topic

Tijmen1307

ik ben nu een week of 2 bezig met arduino (dus de nodige ervaring opgedaan) en ben toen begonnen aan een 360 graden servo motor maar ik kan dat ding maar niet onder controle houden. ik wil dat de 360 servo naar een bepaalde positie draai en daar stopt, en daarna niet verder draait.
Kan iemand mij helpen?

Mvg
Tijmen

MAS3

Hoi Tijmen1307, welkom.

Het antwoord op jouw vraag is nee (sorry).

Niet omdat men niet wil helpen, want dit forum is er juist zodat men elkaar kan helpen.
Maar
Quote
ik kan dat ding maar niet onder controle houden. ik wil dat de 360 servo naar een bepaalde positie draai en daar stopt, en daarna niet verder draait
is nou niet bepaald iets waar men wat mee kan.
Je probleem blijft met die beschrijving onbekend.

Ik heb wel een tip voor je hoor:

Weet je eigenlijk wat een 360 graden servo is, en eigenlijk ook wat een gewone servo is.
En hoe het ongeveer werkt.
Ik heb het vermoeden dat daar de oorzaak van je probleem in kan zitten.
Weten waar je mee werkt is wel van belang, anders word het controleren van dat ding toch wel een uitdaging.

Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Tijmen1307


Allereerst bedankt dat je een antwoord hebt gegeven.

Quote
Weet je eigenlijk wat een 360 graden servo is, en eigenlijk ook wat een gewone servo is
ik ken het principe van een 180 graden servomotor die kun je door middel van een waarde in een hoek van 0-180 graden zetten. Maar over 360 graden servo's kon ik maar erg weinig vinden, ik heb wel uit een eerder forum wat gevonden over 360 servo met een code erbij. 
Code: [Select]
// zoomkat 10-22-11 serial servo test
// type servo position 0 to 180 in serial monitor
// or for writeMicroseconds, use a value like 1500
// for IDE 0022 and later
// Powering a servo from the arduino usually *DOES NOT WORK*.

String readString;
#include <Servo.h>
Servo myservo;  // create servo object to control a servo

void setup() {
  Serial.begin(9600);
  myservo.writeMicroseconds(1500); //set initial servo position if desired
  myservo.attach(7);  //the pin for the servo control
  Serial.println("servo-test-22-dual-input"); // so I can keep track of what is loaded
}

void loop() {
  while (Serial.available()) {
    char c = Serial.read();  //gets one byte from serial buffer
    readString += c; //makes the string readString
    delay(2);  //slow looping to allow buffer to fill with next character
  }

  if (readString.length() >0) {
    Serial.println(readString);  //so you can see the captured string
    int n = readString.toInt();  //convert readString into a number

    // auto select appropriate value, copied from someone elses code.
    if(n >= 500)
    {
      Serial.print("writing Microseconds: ");
      Serial.println(n);
      myservo.writeMicroseconds(n);
    }
    else
    {   
      Serial.print("writing Angle: ");
      Serial.println(n);
      myservo.write(n);
    }

    readString=""; //empty for next input
  }
}


met deze code kan ik de servo een bepaalde kant op laten draaien met een bepaalde snelheid. maar ik kan er niet helemaal uitkomen wat nu alles betekent, in de grote lijn snap ik hoe het werkt maar een aantal dingen snap ik niet, en kan ik doormiddel van de reference pagina ook niet uitkomen 
wat is een char en wat wordt er bedoeld met writeMicrosecond, zou het mogelijk zijn om in deze code een soort stop in te bouwen zodat de servo stopt met draaien?

ik hoor het graag 
Tijmen



MAS3

Hoi Tijmen.

Mijn vermoeden bleek juist; je kent het verschil tussen een servo en een 360 graden servo niet (-voldoende), en ook hoe een servo kan doen wat ie doen moet is onbekend.

De servo krijgt een commando over de plaats waar 'ie heen moet.
Dat is een signaal waarbij de tijd die een puls duurt de waarde doorgeeft.
Daarbij kan een gewenste waarde tot 90 graden linksom of rechtsom worden doorgegeven.
Om te weten waar de servo op elk moment is, word een potmeter in de servo gebouwd die door meedraaien met de as kan doorgeven waar die as is.
En dat is de truc.
In de servo zit ook nog een stukje aansturing dat, als de gewenste waarde bijna bereikt is, de as langzamer zal laten draaien tot ie op z'n doel is.

Een 360 graden servo heeft die weerstand niet, die is er uit gehaald en in plaats daarvoor op een vaste waarde (midden stand) ingesteld met vaste weerstanden.
Daarom kan ie nooit de gewenste waarde bereiken, maar natuurlijk kan ie wel draaien.
De servo dient daarvoor normaal aangestuurd te worden.
Wanneer de servo langzamer moet gaan draaien, dan kun je een commando doorgeven dat dichter bij het midden punt zit.
Hierdoor weet je dus nooit waar de servo ergens is.
Maar daar vraag je nu wel om.

Omdat de servo dat niet meer controleert, moet jij dat dus zelf gaan doen.
Daarvoor zijn verschillende oplossingen te bedenken.

De writeMicroseconds is een onderdeel van de servo library.
Daarmee geef je dus de pulsduur door die ik eerder noemde, in dit geval een getal dat werkelijk de duur van de puls moet zijn, en niet een getal dat de hoekverdraaiing van de servo moet zijn.

Een char is een karakter (character), en die staat in de code omdat dat is wat binnenkomt van de seriƫle verbinding.
Daar zijn (bijna) 256 verschillende waardes mee over te brengen.

Het antwoord op je laatste vraag is wel ja, maar toch niet wat je wilde weten.
Want je stelt volgens mij niet de vraag die je wilde stellen.

De "ja" geldt er voor dat je met die code de servo kunt laten stoppen.
Maar je wilde ook de servo op een bepaald punt laten stoppen.
En dat kan dus pas als je zelf gaat kijken waar die servo ergens is, want al denkt het ding van wel, hij houdt zelf niet meer bij waar 'ie was gebleven.
Have a look at "blink without delay".
Did you connect the grounds ?
Je kunt hier ook in het Nederlands terecht: http://arduino.cc/forum/index.php/board,77.0.html

Tijmen1307

Hi MAS3, bedankt voor je antwoord,

ik denk dat ik hier later even op terugkom en dit project even in de kast ga zetten voor een later moment. in ieder geval bedankt voor je antwoorden

Tijmen

shooter

een 360 servo is eigenlijk een snelheidgestuurde motor, en kan wel stoppen, maar weet de positie niet, dat is dus anders dan een normale servo waar wel een positie in zit.

gewoon lekker spelen en proberen, koop ook een goedkope 9G dan wordt het wel duidelijk.
paul deelen
shooter@home.nl
making controls with codesys PLC and arduino

SuperNinja2

Probeer eens wat te experimenteren met volgende codes, ben ook nog redelijk nieuw maar de servo doet toch ongeveer wat ik wil, heb zelf dus ook 2 servos van 360 graden continious, kijk vooral naar de commentaar beneden :

//
//  bestand skittle-jef.ino
//  skittle sorteer-machine
//


# include <Servo.h>
/* # include "functions.h" */


// toewijzen servo pins
int servoPin1 = 12;  // feedwheel servo
int servoPin2 = 13;  // carousel servo


// maken servo objects
Servo topservo, bottomservo;

 
void setup()
{
  topservo.attach(servoPin1);
  bottomservo.attach(servoPin2);
}

void loop()
{
  /* topservo.write(0);
   delay(2000);
  topservo.write(180);
  bottomservo.write(180);
  */
 
   topservo.writeMicroseconds(1500);  / motor draait niet / 1500ms = 90 graden
  // bottomservo.write(180);
}

/*
   topservo.write(180);
   snelheid : 0 = counterclockwise draaien / 180 = clockwise draaien / 90 =  niks

   servo.writeMicroseconds(waarde in ms);
   1ms = 1000 milliseconden / 100ms = 1 seconde
   1ms (1000) = 0 graden (counterclockwise) / 1.5ms (1500) = 90 graden (stop motor) / 2ms (2000) = 180 graden (clockwise)
*/

Go Up