Arduino läsa av PWM och invertera den

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino läsa av PWM och invertera den

Inlägg av sodjan »

> Men de värden jag skriver ut är ok...

Vilka värden, skriver vardå och hur vet du att det är "OK" ?

Har du kollat servosignalen på t.ex ett oscilloskop ?

Sen så förstår jag inte koden alls och vad "analogWrite" har med
servostyrning att göra. Men det kanske är uppenbart för de som
kan Arduino... :-)
Användarvisningsbild
jesse
Inlägg: 9240
Blev medlem: 10 september 2007, 12:03:55
Ort: Alingsås

Re: Arduino läsa av PWM och invertera den

Inlägg av jesse »

Kan du skriva ut siffror rätt så har du antagligen läst in PWM-data riktigt.
För felsökningens skull borde du skicka ut test-data och se hur din servo reagerar. Kör från 0% till 100% på 10 sekunder och tillbaks igen... (skapa dessa data i processorn). Då har du kontroll på vad borde ske.... då ser du om själva genereringen av pulsen fungerar som den skall, innan du lägger dit data från insignalen.
Användarvisningsbild
BEEP
EF Sponsor
Inlägg: 1593
Blev medlem: 21 januari 2006, 16:57:56
Ort: Mölndal

Re: Arduino läsa av PWM och invertera den

Inlägg av BEEP »

Edit
Senast redigerad av BEEP 18 juli 2011, 01:57:54, redigerad totalt 1 gång.
ToPNoTCH
Inlägg: 5157
Blev medlem: 21 december 2009, 17:59:48

Re: Arduino läsa av PWM och invertera den

Inlägg av ToPNoTCH »

Jag tror det är lite mäktigt för servona att få pulsen i 490Hz eller något.

Jag modifierade lite och använde Servo libraryt i stället.

Detta funkar för mig.
OBS ! Möjligt att du behöver justera map värdena för dina servon men jag tror inte det.

Kod: Markera allt

#include <Servo.h>
Servo myservo[2];
int rc_in_Pin = 8; //front steering in

unsigned int duration;

void setup()
{
  pinMode(rc_in_Pin, INPUT);
  myservo[0].attach(10);
  myservo[1].attach(11);
  Serial.begin(9600); // debugging serial console
}

void loop()
{
  duration = pulseIn(rc_in_Pin, HIGH); // read front steering pwm
  duration = constrain(duration,1000,2000);
  myservo[0].write(map(duration,1000,2000,44,141));
  Serial.print("PWM input= ");
  Serial.println(duration);
  invertPWM(duration);
}

void invertPWM(int invValue)
{
  invValue=(2000-invValue)+1000;
  myservo[1].write(map(invValue,1000,2000,44,141));
  delay (15);// to allow servo to gain position
  Serial.print("PWM inverted out= ");
  Serial.println(invValue);
}
Edit: Ändrade "Duration" från long till INT. Det behövs ingen long här inte.
UndCon
Inlägg: 79
Blev medlem: 15 januari 2010, 00:07:10

Re: Arduino läsa av PWM och invertera den

Inlägg av UndCon »

HEj!

Med Rätt signal menar jag om jag skriver in ett värde manuellt och om jag testar med inkopplad radio/mottagare
Anledningen till att jag testar så här är för att veta om servot går åt rätt håll när jag svängde höger.

Jag har mer kod som använder Servo.h men det var inte klart. Skall testa detta under dagen.
Att 490Hz är för snabbt för servot är det ingen tvekan om :)

Ser att du lagt in en begränsare också (constrain)

//UndCon
Kaggen
Inlägg: 432
Blev medlem: 29 januari 2005, 03:06:02

Re: Arduino läsa av PWM och invertera den

Inlägg av Kaggen »

UndCon> Om jag inverterar signalen och skickar den till ett annat servo blir den helt ryckig och följer inte alls med 1a servots mjuka fina rörelser.

Vissa servon måste ha mer än 10ms periodtid för att funka. Har i mina egna projekt upptäckt att vissa servon klarar kortare periodtider än andra. Fenomenet på dom som inte klarar korta perioder är att det blir jittrigt/ryckigt.

Vet sedan inte heller vad du menar med "invertera" menar du att hög blir låg och låg blir hög? Då blir ju dutycykeln inverterad och inget stämmer väl längre?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Arduino läsa av PWM och invertera den

Inlägg av sodjan »

> Vet sedan inte heller vad du menar med "invertera"

Det beskrevs/förklarades i början av tråden.

1.0-2.0 ms ==>> 2.0-1.0 ms.
Användarvisningsbild
Synesthesia
Inlägg: 663
Blev medlem: 22 januari 2010, 19:14:10
Ort: Mellan Göteborg och Kungsbacka

Re: Arduino läsa av PWM och invertera den

Inlägg av Synesthesia »

Annars borde man kunna göra ungefär så här, med en 4538 och en nor grind:
servo inverter.png
Du har inte behörighet att öppna de filer som bifogats till detta inlägg.
Användarvisningsbild
Icecap
Inlägg: 26654
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Arduino läsa av PWM och invertera den

Inlägg av Icecap »

Det löser knappast problemet med att välja om servon ska röra sig med styrningen, stå stil eller röra sig motsatt av styrningen och det är ju det essentiella efter vad jag förstår.

Och om tiden på inkommande puls mäts korrekt måste det vara ett programmeringsfel om man inte kan skapa en annan puls baserat på detta värde. Om det sedan skyllas att det ska ske på en Arduino ska jag låta vara osagt, jag hade enkelt klarat detta på en PIC.
UndCon
Inlägg: 79
Blev medlem: 15 januari 2010, 00:07:10

Re: Arduino läsa av PWM och invertera den

Inlägg av UndCon »

När jag kör koden ToPNoTCH postade ovan fungerar det utmärkt - det var min kod som var knas

Nu håller jag på att läsa av den inkommande signalen som skall styra stegen som skall gås igenom
Den har bara MIN/MAX värden , PWM 1000 eller 2000 och jag monterade en momentan switch för att förenkla handhavandet.
UndCon
Inlägg: 79
Blev medlem: 15 januari 2010, 00:07:10

Re: Arduino läsa av PWM och invertera den

Inlägg av UndCon »

Om någon undrar så är projektet klart.

En lyssnare på 3e kanalen ökar en räknare ett steg och en case-switch med 3 alternativ kör koden

Tack för all hjälp

//UndCon
Skriv svar