Go Down

Topic: 360 servo (Read 1 time) 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)
*/

Tijmen1307

daar ben ik weer..

ik ben helaas noodgedwongen weer bezig met 360 servo's
met een schoolproject heb ik een zonnenpaneel dat mee moet draaien met de zon.
ik ben nu dus bezig om de arduino die erin ligt te programeren, alleen ik loop tegen een aantal complimaties aan

dit is de code
Code: [Select]
/*

*/
#include <Servo.h>
Servo servo1;
Servo servo2;
int sensorPin = A0; // select the input pin for LDR
int sensorValue = 0; // variable to store the value coming from the sensor

void setup() { 
Serial.begin(9600); //sets serial port for communication
servo1.attach(9); // servo1 pin 9
servo2.attach(11); // servo2 pin 11
}

void loop() {
sensorValue = analogRead(sensorPin); // read the value from the sensor
Serial.println(sensorValue); //prints the values coming from the sensor on the screen


if(sensorValue <= 800)  //als de waarde kleiner is dan 800 draait de servo met de snelheid 95
servo1.writeMicroseconds(95);   // snelheid 95

if(sensorValue >= 900);         //waarde groter is dan 900 
servo1.writeMicroseconds(90);  //servo stopt

if(sensorValue <= 500);
servo1.writeMicroseconds(0);
}

zou dit kunnen werken, ik heb de code thuis geschreven en ik moet het nog gaan testen. de waardes die ik gebruik zijn gewoon even geschat ik weet nog niet precies welke waardes ik moet gaan gebruiken o.a. door wolken enzo.
maar zou het mogelijk zijn de tijd die de servo draait op te nemen en aan het eind van de dag weer de andere kant op draaien zodat hij weer klaar staat voor de volgende dag

alvast bedankt

MAS3

Hoi.

Onderstaande is niet om je te pesten of om je voor, ehhmm paal te zetten.
Maar wel om je te prikkelen.

Quote
zou dit kunnen werken
Ja, zou kunnen werken, maar ik denk niet dat het dat doet.

Quote
zou het mogelijk zijn de tijd die de servo draait op te nemen
Uiteraard is dat mogelijk, maar dat doe je nu nog niet.


Quote
en aan het eind van de dag weer de andere kant op draaien
Jazeker kun je dat doen

Quote
zodat hij weer klaar staat voor de volgende dag
Het is wel te hopen dat ie het die volgende dag nog zal doen.

Voor wat betreft de code:
Ik zie dat er commentaar bij staat.
Dat commentaar is de ene keer in het Engels, en de andere keer in het Nederlands.
Dat vind ik wat minder.
Maar zorg er vooral voor dat je commentaar ook klopt.

Code: [Select]
if(sensorValue <= 800)  //als de waarde kleiner is dan 800
Hier klopt het commentaar niet (wel bijna, maar als ie bijna klopt, dan klopt ie dus nog steeds niet).
Een stukje verderop gebeurt hetzelfde.

Code: [Select]
servo1.writeMicroseconds(95);   // snelheid 95
Snelheid 95 ?
Wat betekent dat ?

Quote
servo1.writeMicroseconds(0);
Ik ben benieuwd wat dit zou doen.
Maar ik weet het niet, want het commentaar ontbreekt.

Natuurlijk weet ik wel wat daar zou moeten gebeuren.
En ook wat er in werkelijkheid zal gaan gebeuren.
Daarom ook de opmerking hierboven (mijn antwoord op de 4e vraag), en dat is niet geheel wat jij ervan schijnt te denken.

Volgens mij wilde je de tijd bijhouden dat de servo gedraaid heeft, om vervolgens even lang terug te sturen.
Maar houd dan ook de snelheid waarmee gedraaid word in de gaten, wanneer die snelheid kan veranderen.
Want het lijkt er op dat je dat wil kunnen veranderen.

Ik heb nog wel een andere aanpak in gedachten.
Want je kunt voor zit ding ook een standaard servo toepassing gebruiken hoor.
Alleen moet je dan de servo hacken.
Zoals gezegd, heeft de continuous rotation servo geen potmeter meer.
Maar wie heeft gezegd dat die potmeter per se IN de servo zelf moet zitten ?
Als die aan je paneel zit, dan kun je daar ook prima je servo mee aansturen en heb je geen specifieke servo code meer nodig.
Moet je dat hacken wel zien zitten natuurlijk.

Maar ik ga nu eerst ff slapen als je het niet erg vind (en anders doe ik dat toch).
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

#9
Jun 02, 2018, 08:48 pm Last Edit: Jun 02, 2018, 09:09 pm by Tijmen1307
MAS3 bedankt voor je antwoord
ik heb zo links en rechts wat dingen veranderd zodat jij wat minder geprikkeld bent en mijn commetaar beter klopt dus bedankt

Code: [Select]
if(sensorWaarde <= 800)  //als de waarde kleiner/gelijk aan 800 draait de servo
servo1.writeMicroseconds(95);   // snelheid 95 langzaam draaiend naar rechts

if(sensorWaarde >= 900);         //waarde groter/gelijk aan 900 
servo1.writeMicroseconds(90);  //servo stopt

if(sensorWaarde < 500);       //waar kleiner dan 500
servo1.writeMicroseconds(0);

ik ben bang dat dit niet gaat werken waarschijnlijk moet ik een manier zien te vinden, als de waarde niet meer boven de 800 te krijgen is dat hij automatisch weer in de juiste beginpositie staat, ik ben bang dat dat niet gaat werken met 3 if blokjes achter elkaar :smiley-confuse: .

Code: [Select]
if(sensorWaarde < 500);       //waar kleiner dan 500
servo1.writeMicroseconds(0);

dit stukje code is nog in ontwikkeling maar ben nu bezig met een writeMicrosecondswaarde te ontwikkelen, dus met een ingebouwde timer, maar ik alleen geen idee hoe dat te realiseren.
vandaar mijn post op het forum.
nog ff over dat hacken van die servo, heb meer bedrading nodig voor het bouwen van de hack, want ik zit op 10 draden die door een pvcbuis gaan maar er is geen ruimte meer voor extra bedrading(of ik moet het er langsheen laten lopen, waardoor het minder mooi wordt) ik hoop dat je nu wel iets voor me hebt waarmee ik verder kan met het project(niet dat de vorige post niet nuttig was ofzo....)

bye for now

Jobi-Wan

Je hebt te veel punt-comma's in je code.

Daarnaast zou je moeten bedenken wat er gebeurt als meerdere van die 3 condities waar zijn, en wanneer dat voorkomt.

Tijmen1307

mn frustratie zit hem een beetje in, waardoor ik ook vastloop in de tijd, doordat het bijhouden in seconden gaat, en dus een soort ingebouwde timer moet hebben en aan de hand daarvan kun je seconden/miliseconden bijhouden.

MAS3

Hoi Thijmen.

Is dit alle code die je hebt voor je solar tracker ?
Lijkt me niet voldoende om te doen wat je wil.

Je hebt het over "doordat het bijhouden in seconden gaat, en dus een soort ingebouwde timer moet hebben".
Ik heb geen idee waar dat ineens vandaan komt, want ik zie het niet in de door jou gedeelde code staan.
Maar ik kan je wel wat meer vertellen over de zaken waar ik me eerder zorgen over maakte en wat nu nog steeds zo is:

Je hebt geen grenzen ingesteld.
Wanneer je servo blijft draaien terwijl deze al aan een mechanisch eindpunt is aangekomen, ontstaan er problemen.

Ik vermoed dat je nu je eindpunten wil bereiken door een aantal seconden te draaien.
Maar je weet helemaal niet waar je bent gebleven want dat houd je niet bij.
En als je het bijhoudt door secondes te tellen, dan ben je dusdanig onnauwkeurig bezig dat dat ook fout zal gaan.
Vandaar dus de opmerkingen over of het wel zal blijven werken.

Zie de opmerkingen onder elk van mijn posts als je de tijd een enigszins betrouwbaar in de gaten wil houden.
Maar daar zit de oplossing naar mijn mening niet.

Voor het "hacken":
Je moet zelf weten hoe je een en ander zal maken.
Als je het anders wil doen dan moet je dat vooral zo doen.
Het is interessant en heel leerzaam om dat uit te zoeken.
Ik snap het heel goed dat de leiding vol kan zijn en je er niets meer aan toe kan voegen.
Dan moet je dus iets anders bedenken.

En het maakt voor de code niet uit hoeveel "if blokjes" je achter elkaar zet.
Voor jou is dat op een gegeven moment moeilijker te overzien, maar de code en de compiler malen daar niet om hoor.
Zoek ook eens op waar die {curly braces} voor zijn, zou ik zeggen.

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

hier ff snel wat plaatjes

MAS3



Ik zie maar 1 plaatje, maar dat maakt niet zoveel uit.
Ik zie een rood tandwieltje en een grijs tandwiel.
Dat grijze tandwiel is redelijk groot.
Daar kun je iets aan bevestigen, zodat je kunt zien waar je bent met draaien.
Zien mag je zelfs letterlijk nemen, als je een van de tanden een andere kleur geeft en daar naar gaat kijken, dan kom je al een heel eind.
Ik ga er niet meer over zeggen, om de sfeer goed te houden, maar ik zou de tandwielen dusdanig opstellen dat de tanden over het gehele vlak contact maken, dat is dus nu niet zo.

Beehalve met kleurtjes spelen, kun je ook een gaatje boren in het grote tandwiel, en je kunt er ok een stukje metaal in schroeven.
Als je dan met de passende sensor gaat kijken of je het gaatje of het stukje metaal kan zien, dan ban je ook alweer een stuk verder.
Alleen levert dat alles wel meer draden op, terwijl je gezegd had dat dat niet meer zal passen.
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

Go Up