Arduino läsa av PWM och invertera den

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
UndCon
Inlägg: 79
Blev medlem: 15 januari 2010, 00:07:10

Arduino läsa av PWM och invertera den

Inlägg av UndCon »

Hej!

Jag tänkte försöka skapa en pryl till min Crawler så att jag kan skoja till det med styrningen på bakre hjulen.

Jag har en Arduino Pro Mini över som jag tänkte använda till detta projektet och koppla in 2 kanaler från min radio till den

Kanal1 är styrningen till framhjulen
Kanal2 är en kanal kopplad till en on/off switch (momentan)
UT blir en kanal till bakre styrningen

Nu tänkte jag loopa igenom 3 lägen efter en impuls från kanal2

MODE 1 Neutral (ingen styrning - håller bara bakre servot centrerat)
MODE 2 Inverterad(bakre styrning går då tvärt emot vad framhjulen gör)
MODE 3 Samma (bakre hjulen svänger åt samma håll som framhjulen)


Det jag funderar på är ett bra sätt att läsa av inkommande PWMsignal och invertera den vid behov.

Tillvägagångssättet kan jag tänka mig blir beroende på hur jag kan vända på PWMsignalen?

//UndCon
Användarvisningsbild
kankki
Inlägg: 3369
Blev medlem: 2 januari 2010, 15:05:12
Ort: Nykarleby, Finland

Re: Arduino läsa av PWM och invertera den

Inlägg av kankki »

Kan du inte bara köra PWM signalen genom en NOT-grind? Eller pwm_ut = !pwm_in
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 »

Tänker du inte fel nu ?.

Servon styrs med pulslängd på 1ms till 2ms (Fullt höger till fullt vänster).
Frekvensen som pulserna kommer med varierar en hel del mellan olika utrustningar.

För att reversera en puls måste altså en 1ms modifieras till 2ms linjärt, och tvärtom.

Att invertera kommer inte ge rätt resultat.
Användarvisningsbild
kankki
Inlägg: 3369
Blev medlem: 2 januari 2010, 15:05:12
Ort: Nykarleby, Finland

Re: Arduino läsa av PWM och invertera den

Inlägg av kankki »

Ah, jag läste nog inte tråden tillräckligt bra. Inte tänkte jag att det skulle till en servo :) Ja tänkte bara att målet var 25% pwm ->75% pwm.
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 »

med invertera menar jag att 1ms skall bli 2ms (och allt där mellan för alla utslag)

Jag har testat lite med Servo.h och där kan man enkelt begränsa utslagen vilket kan vara användbart.
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 »

Det går inte att göra under samma puls som man mäter eftersom man inte
kan veta hur lång ut-pulsen ska vara förrens in-pulsen är slut. Du får läsa
in en puls och mäta den och sedan generera motsvarande "spegelvänd"
puls med valfri RC-servo-kod som du kan hitta. D.v.s att utpulsen kommer
att ligga (minst) 20 ms sent rellativt inpulsen. Spelar kanske ingen roll...
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 »

Nu pratar vi om styrningen till de bakre hjulparet på en bil med max toppfart om 5km/h.
Då spelar det ingen roll om bakre styrningen ligger efter lite.

Pulsen för neutralt servo är väl oftast 1.5ms?
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 »

En RC-servo puls är 1.5 ms +/- 0.5 ms.
Så ja, 1.5 ms brukar vara "mitten" vad det nu är.
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 »

jag läser av inkommande PWM med denna kod:

int pin = 7;
unsigned long duration;

void setup()
{
pinMode(pin, INPUT);
Serial.begin(9600); // debugging serial console
}

void loop()
{
duration = pulseIn(pin, HIGH);
Serial.print("PWM = " );
Serial.println(duration);
}


den ger väden mellan ~970 och ~2000 (beroende på vad jag ställer in radion på)
och någonstans i mitten på spaken hamnar jag runt 1500 så det verkar stämma bra.

Nu till den matematiska delen...att vända på talen
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 »

Spegelpuls=(2000-SampladPuls)+1000

Edit:Kastade om i formeln
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 »

Jag testade lite och det verkade inte ge helt rätt resultat ;)

Skall testa med den mya formeln och se om det går bättre...

Jag tänkte att allt skulle rymmas i en gammal filmburk - problemet är att hitta dessa när man inte köpt film på flera år...
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 »

sodjan har delvist rätt men inte helt. Pulsen måste först komma i sin helhet innan men vet hur lång den är men sedan kan man skicka ut den önskade pulslängd direkt efter att den är mottagit klart. Då denna "trimmade" puls ju "bara" ska ersätta den inkommande puls behöver man inte att vara känslig med när den skickas ut, PRF blir ändå lika.
Användarvisningsbild
farbrorvattenmelon
Inlägg: 285
Blev medlem: 29 januari 2009, 21:38:21

Re: Arduino läsa av PWM och invertera den

Inlägg av farbrorvattenmelon »

Montera servon uppochner istället? :)
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 »

Lite svårt då man via en annan kontroll ska kunde välja om den ska vara inverterat, stationär eller vrida med.
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 »

Det är lite lustigt...

Jag får ett servo att röra sig som det skall beroende på in-signalen
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.

Kod: Markera allt

int rc_in_Pin = 8; //front steering in
int rc_out_Pin =10; // front steering out (only for visualisation)
int rc_out2_Pin =11; // rear steering out

unsigned long duration;

void setup()
{
  pinMode(rc_in_Pin, INPUT);
  pinMode(rc_out_Pin, OUTPUT);
  pinMode(rc_out2_Pin, OUTPUT);
  Serial.begin(9600); // debugging serial console
}

void loop()
{
  duration = pulseIn(rc_in_Pin, HIGH); // read front steering pwm
  analogWrite(rc_out_Pin, duration); // output same as above
  Serial.print("PWM input= ");
  Serial.println(duration);
  invertPWM(rc_out2_Pin, duration);
}

void invertPWM(int pin, int invValue)
{
  invValue=(2000-invValue)+1000;
  analogWrite(pin, invValue);
  delay (15);// to allow servo to gain position
  Serial.print("PWM inverted out= ");
  Serial.println(invValue);
}
Men de värden jag skriver ut är ok...
Skriv svar