Upgrade met nieuwe servo's

Hi,

Onlangs heb ik als testje voor mijn arduino zo'n pan&tilt constructie gemaakt met lowbudget servo's, de Hextronik HXT-900, allemaal draaiend op de 5V connectie van de arduino via de usb van mijn laptop.

Omdat dit naar behoren werkte wilde ik in mijn 2e versie wat betere (duurdere) servo's gaan gebruiken dus kocht ik 2 servo's type GWS-IQ-220B.

Alleen toen bleek dat ondanks dezelfde pinaansluitingen op de connector ik de nieuwe niet zomaar kon omwisselen op het shieldje welke ik had gemaakt, ze gaan een geheel eigen leven leiden en bewegen alle kanten op.

In eerste instantie dacht ik dan dat ze misschien meer stroom verbruikten als de arduino kon leveren en probeerde de servo's te voeden met een externe stroombron, maar dit was niet de oorzaak, probleem bleef.

Heeft iemand enig idee of suggestie waar de oorzaak van dit vreemde gedrag van die nieuwe servo's zou kunnen liggen?

Alvast B-dankt;

NokDoc

DEADBEEF
Shiptronic

Overleden

Even zoeken in het forum, er was pas iemand die hetzelfde voor had, probleem zat hem in de o-instelling ?

link gevonden: http://www.circuitsonline.net/forum/view/99369/1/servo

[Bericht gewijzigd door Shiptronic op dinsdag 1 november 2011 13:10:20 (26%)

Wie de vraag stelt, zal met het antwoord moeten leren leven.

Hi,

Bedankt voor de reactie, dus servo's hebben een 0-instelling.

Voor die kleintjes had ik niets hoeven te doen.

Heb ik in ieder geval al iets om uit te gaan zoeken...

TnX;

NokDoc

DEADBEEF

Ik kocht eens servo's bij Conrad. Deze werden niet aangestuurd door een pulsduur van 1ms-2ms, maar van 0.1ms-0.8ms. Kortom, misschien moet je voor je nieuwe servo's andere pulstijden hanteren.

"Verbringe nicht die Zeit mit der Suche nach ein Hindernis, vielleicht ist keines da." Franz Kafka

Hi,

Ik kon op de servo's nix mechanisch vinden wat duidt op een 0-instelling, zonder deze open te maken.

Maar Mr. Moitze heeft een goed punt denk ik, volgens de spec hebben deze servo's inderdaad een 'stellzeit' von etwas 0.10 / 0.08s bij 4.5-6V.

>> ...andere pulstijden hanteren...

Help me een beetje, ik ben (nog) een absolute n00b op C gebied.

Zit ik in de goede richting als ik hier iets mee moet?
(uit servo.cpp)

attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds default min is 544, max is 2400

Bedankt;

NokDoc

DEADBEEF

Wat gebeurt er precies als je een hoge puls van 1,5 ms geeft en dan 18,5 ms laag? Gaat de as draaien? Zo ja: waarheen, loopt hij vast? Als dit zo is kun je het volgende experiment overwegen.

Schrijf een programma dat hoge pulsen genereert die steeds langer gaan duren. Begin bijvoorbeeld bij 0,1 ms (100 microseconden). Laat dit in kleine stappen, bijvoorbeeld 0,1 ms, oplopen tot je servo zich naar wens begint te gedragen. Bij mijn servo's van Conrad heeft het op deze manier geholpen.

Is er een datasheet van die motoren? Daar staat misschien ook wel iets verhelderends in.

"Verbringe nicht die Zeit mit der Suche nach ein Hindernis, vielleicht ist keines da." Franz Kafka

Op 1 november 2011 16:44:44 schreef Moitzie:
...Deze werden niet aangestuurd door een pulsduur van 1ms-2ms, maar van 0.1ms-0.8ms. Kortom

Dat vindt ik toch wel erg vreemd. Dat zou betekenen dat je deze servos niet kunt gebruiken bij een standaard RC zender. Ik zou zeggen dat die pulstijden min of meer standaard moeten zijn.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Ik vond het ook vreemd, het duurde dan ook even voor ik het werkend had. Het kwam er op neer dat een puls van 1ms er voor zorgde dat de servo maximaal verdraaide en dan vastliep. Het was deze: http://www2.conrad.nl/goto.php?artikel=233751 .

"Verbringe nicht die Zeit mit der Suche nach ein Hindernis, vielleicht ist keines da." Franz Kafka
GJ_

Moderator

Servo-technologie: Analoge servo
Servo-type: Standaard servo

Dat kan alleen bij standaard timing, dus tussen de 1 en 2 ms. Anders kun je ze nooit op een willekeurige standaard ontvanger aansluiten.

Lijkt me haast een productiefout. Het is ook nog een "standaard servo", niks speciaals dus. De reviews laten ook niks in die richting zien. Anyway, TS, even proberen is altijd goed natuurlijk.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Hi,

Heb ik weer, wil leren zwemmen en moet gelijk het diepe in... :)

Ik kon niet veel vinden van de fabrikant, maar op het doosje stond:

GWS IQ-220BB (www.gws-rc.de)
• RechtEck-Impuls, Amplitude 3-5V
• Impulslange 0.9ms(900) tot 2.1ms (2100)
• Neutrale ‘lage’ 1.5ms (1500)
• Impuls Frequency 50Hz (20ms)
• Spannung 4.8V – 6.0V

>> ...dat de servo maximaal verdraaide en dan vastliep...

Precies die symptomen, een paar keer (supersnel) heen & weer, en dan op het maximale punt loopt ie vast.

Vanavond ga ik even wat spelen met andere pwm waardes.

Alvast bedankt voor het meedenken;

NokDoc

DEADBEEF

ik had zelf de de neutraal 1.5ms stand niet goed ingesteld daardoor begonnen mijn servo,s te flippen!
wat jij hebt is een heel ander verhaal denk ik!
heb je niet een zenderset liggen?kun je ze even testen als ze het dan wel goed doen

Op 2 november 2011 16:07:04 schreef NokDoc:
• Impulslange 0.9ms(900) tot 2.1ms (2100)

Dit is dus de normale, "standaard" pulslengte zoals hierboven genoemd. Die afwijkende pulslengte die Moitzie noemt zou hier dus niet aan de hand moeten zijn.
Ben je in staat om een eenvoudig pulsje te maken met (1) een herhalingsfrequentie van 50Hz (20ms) en (2) een pulslengte van 1.5ms? Gewoon vast, niks variabel. Je servo zou dan netjes stabiel in het midden moeten staan. Daarna kun je eens proberen met een pulslengte van (bv) 1.1ms, etc. Maak je software even zo simpel mogelijk en bouw van daaruit verder naar iets wat je echt wilt.

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Hi,

Inderdaad, die waardes lijken op een normale standaard pulslengte in de arduino libraries bij default 544ms tot 2100ms.

int iMin = 900; //default = 544;
int iMax = 2100; //default = 2400;
myservo.attach(9,iMin,iMax);
myservo.writeMicroseconds(iMin);
delay(500);
myservo.writeMicroseconds(iMax);

Op de simpele servo's kan ik, zoals verwacht, door met de iMin&iMax te spelen de maximale uitslagen bepalen, de reactie is ook als verwacht.

Maar welke waardes ik ook probeer met die GWS servo's, de reacties zijn gewoon random.

Wat me wel opvalt is dat net na het zenden van mijn programma, de 1e verdraaing naar links of rechts wel goed lijkt te werken, maar bij het bereiken van de nMin of nMax, de servo dan ineens weer een eigen leven gaat leiden, stopt, of juist snel heen en weer beweegt waarbij dan ook de nMin/nMax waardes fysiek overschreden worden en de arduino zelfs vastloopt.

>> ...Ben je in staat om een eenvoudig...

Eerlijkheid gebied mij te zeggen dat ik eigenlijk van electronica, arduino en programmeren niet echt veel kennis heb, juist om die reden ben ik ermee begonnen.

Ik heb al wel eens gespeeld met een 555 timer chippie, ik denk dat ik daarmee wel een vaste en/of variabele pulserende bron kan maken om e.e.a. mee te testen.

Arduino gaat me, behoudens bovenstaand voorbeeld, nog even boven mijn pet.

>> ...begonnen mijn servo,s te flippen!...

Yep, we hebben een tegengesteld probleem, de servo's doen waarchijnlijk alleen maar wat ze opgedragen krijgen, alleen ikzelf begin ervan te flippen...;)

>> ...Lijkt me haast een productiefout...

Ik heb 2 van die vreemde servo's, beiden hebben dit gedrag, neigt dan meer naar een ontwerpfout. :)

>> ...standaard RC zender...

Sorry, ik heb dat soort dingen niet, vandaar dat ik ze juist zelf wil leren te maken.

Ik hoop na het weekend meer nieuws te hebben...

NokDoc

DEADBEEF

en hoe staat het met je servo's?al wat duidelijkheid!

mischien kun je een simpel servo tester proberen

http://www1.conrad.nl/fas6/fh.php?fh_host=http://www1.conrad.nl&fh_ses…

altijd makkelijk bij toekomstige projecten

Op 3 november 2011 12:10:23 schreef NokDoc:
Wat me wel opvalt is dat net na het zenden van mijn programma, de 1e verdraaing naar links of rechts wel goed lijkt te werken, maar bij het bereiken van de nMin of nMax, de servo dan ineens weer een eigen leven gaat leiden... en de arduino zelfs vastloopt.

Met die laatste opmerking reduceer je je probleem tot je software! Hoe kan je Arduino vastlopen doordat je servo zich raar gedraagt? Kan dus niet, want er is geen terugkoppeling van je servo naar de uC. Ik zou nog eens goed naar je code kijken. Misschien gaan de pulslengtes wat buiten bereik, waar de servo niet tegen kan. Of gaan je uC plat en daardoor geeft ie vreemde pulslengtes.
Ps, waardoor trek je de conclusie dat de software crashed?

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Hiho,

Ik heb de oorzaak, hoop ik:

c code:

//Test PWM on GWS Servo's,   NokDoc 2011
//All units in MicroSeconds (uSec)

int pos = 0; 
int tMin = 900;       //Min Pulse Width, Default = 544 uSec
int tMax = 2100;      //Max Pulse Width, Default = 2400 uSec
int tPeriod = 21000;  //Pulse Frequency (Period) 50Hz -> 20mSec = 20000 uSec
int tOn = 0;          //Duty Cycle HIGH state, at 900uSec -> 4.5%, at 2100uSec -> 10.5%
int tOff = 0;         //Duty Cycle LOW state 

void setup() { 
  pinMode(8, OUTPUT); //pin 8 is NOT a pwm pin!
} 
 
void loop() { 

  delay(2000);
  for(pos = 0; pos < (tMax - tMin); pos += 5)
  {
    tOn = tMin + pos;
    tOff = tPeriod - tOn;
    digitalWrite(8, HIGH);
    delayMicroseconds(tOn);
    digitalWrite(8, LOW);
    delayMicroseconds(tOff);
  }
  delay(2000);

  for(pos = (tMax - tMin); pos >= 0; pos -= 5)
  {
    tOn = tMin + pos;
    tOff = tPeriod - tOn;
    digitalWrite(8, HIGH);
    delayMicroseconds(tOn);
    digitalWrite(8, LOW);
    delayMicroseconds(tOff);
  }
} 

Arduino heeft een alternatief voor het genereren van een pwm signaal op niet pwm poorten als pin 8.
(geringe afwijkingen t.g.v. o.a. interrupts voor lief nemend uiteraard)

Ik vermoed nu dat het probleem niet in de pulslengtes zit maar juist in de pulsfrequentie, de totale (ON plus OFF) periode.

Als ik de pulsfrequentie (tPeriod) wat lager maak als de opgegeven 50Hz (20ms) dan loopt ie ineens wel lekker, vanaf 21ms tot 23ms doet ie het, zij het ietwat stribbelig, best goed.

Hoe kan ik in arduino uitlezen en/ of instellen met welke pulsfrequenties (periode) gewerkt wordt op de reguliere pwm pins?

>> Met die laatste opmerking reduceer je je probleem tot je software!
>> Ik zou nog eens goed naar je code kijken.

Ik denk niet dat de code fouten heeft, ik gebruikte gewoon de 'example' code uit de example directory van het arduino pakket.

Maar nogmaals, vergeef me mijn onwetendheid altsublieft, ik snap (nog!) niet veel van C of processors.

Na arm & asm leek me dat wel een leuke uitdaging. ;)

NokDoc

DEADBEEF

Loopt je CPU niet toevallig op een 2x te hoge klokfrequentie? Er zal wel ergens een define staan met de clk frequentie. Als die niet gelijk aan de werkelijkheid is, dan krijg je ook dit effect.
Met een scoop zie je gelijk wat er aan de hand is. Onmisbaar eigenlijk.

[Bericht gewijzigd door flipflop op dinsdag 8 november 2011 21:33:25 (16%)

"We cannot solve our problems with the same thinking we used when we created them" - Albert Einstein

Hiho,

Ik heb het werkelijke probleem ontdekt, nix arduino, nix servo...

>> ...op het shieldje welke ik had gemaakt...

Maar een dom klein sluitinkje t.g.v. slecht soldeerwerk!

(Weet nu wel dat als je de 3 & 5V van je arduino kortsluit deze niet kapot gaat.;))

>> ...Met een scoop zie je gelijk...

Heb er wel een, maar weet helaas ook nog niet wat ik daar allemaal mee kan doen.

Komt allemaal wel te zijner tijd.

In ieder geval veel dank voor jullie tips hier;

NokDoc

DEADBEEF