Är detta rätt tänkt för att styra två servon samtidigt?

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Är detta rätt tänkt för att styra två servon samtidigt?

Inlägg av PopUnoNkoK »

Paralellt med att jag försöker få rätsida på Mplab så strukturerar jag mina ideer för att styra två st rc-servon från en pic.

Är det så här jag ska tänka om jag vill styra två servon sammtidigt? Eller egentligen är det bara ett servo i taget som rör sig men jag måste väl ändå skicka signal till det servot som ska stå still.
Så här har jag tänkt.

Kod: Markera allt

Sekvens 1

Start1
Servo1 = 1
Servo2 = 1
Wait 1,5 Millisec
Servo1 = 0
Wait 0,5 Millisec
Servo2 = 0
Wait 18
Goto Start1

;Servo1 står still i mitten och servo två står still i ett ändläge.



Sekvens 2

Start2
Servo1 = 1
Servo2 = 1
Wait 1,5 Millisec
Servo1 = 0
Servo2 = 0
Wait 18,5
Goto Start2

;Båda servona står still i mitten.




Sekvens 3

Start3
Servo1 = 1
Servo2 = 1
Wait 1,5 Millisec
Servo2 = 0
Wait 0,2 Millisec
Servo1 = 0
Wait 18,3
Goto Start3

;Servo2 står still i mitten och Servo1 står still halvägs till ett ändläge.
Detta är som sagt bara en "Tankekarta" och ingenting jag tror kommer att fungera som riktig kod.
I mitt huvud fungerar detta sätt att styra styra servon sammtidigt helt ok om det bara är 2 st men blir det fler käns det som ett dåligt sätt.

Så min fråga är alltså om detta är rätt sätt att tänka? Eller om jag är helt ute och cyklar...

//MVH Peter F
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

Ett grundläggande problem är att Servo2 inte kan stanna innan Servo1. :)
Alltså, Servo2 har alltid samma vinkel som Servo1, eller mer...
Användarvisningsbild
Stinrew
Inlägg: 954
Blev medlem: 20 augusti 2006, 03:14:41
Ort: Motala
Kontakt:

Inlägg av Stinrew »

Det där ser lite bökigt ut. Jag föreslår att du delar upp en hel sekvens på 10-20ms(50-100Hz). I sekvensen har du små 2ms sekvenser(en sådan för varje servo), och avslutar med tomma servo frames för att komma upp i 10-20ms.

Kod: Markera allt


sekvens:

start

//frame för servo1:
servo1 = 1
wait 1,5ms
servo1 = 0
wait 0,5ms     //2ms - föregående wait


//frame för servo2:
servo2 = 1
wait..
.
.
.
.


//frame för servo3:
wait 2ms       //servo3 finns inte ännu
.
.
.
.
//frame för servo5:
wait 2ms       //servo5 finns inte ännu

goto start
syltkaka
Inlägg: 188
Blev medlem: 9 december 2006, 18:55:09
Ort: Göteborg

Inlägg av syltkaka »

Det ser ut att fungera för att styra två servon. Det osmidiga med din tanke är att du måste lägga till en ny funktion/metod/subrutin för varje läge som du önskar att servot ska kunna ställas in i.

Lite beroende på vad du ska göra med dina servon och vad i övrigt din PIC ska göra samt vad din PIC kan så finns det andra sätt.

1. Använda inbyggda timers för att generera en PWM-signal.
2. Skriva någon form av generellare programvaru-PWM antingen med hjälp av timers eller utan.


Hade du tänkt att styra fler servon eller det ska bara vara två?
Ska PICen göra något annat?
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Enklast/snyggast :

S1 = servo 1's utgång
S1t = servo 1's pulslängd ("läge").
S2 = servo 2's utgånf
S2t = servo 2's pulslängd ("läge").

Använd en (lämplig) timer.

I timerns interrupt rutin :

Gör antingen (styrs av "flagga") :

a. timer = S1t. S1 = hög. Flagga = "b". RETFIE.
b. timer = S2t. S1 = låg. S2 = hög. flagga = "c". RETFIE.
c. timer = 17 ms. S2 = låg. flagga = "a". RETFIE.

Sedan får annan ("överliggande"/"main") kod styra/ända S1t och S2t så att du får önskad "rörelse".
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Inlägg av PopUnoNkoK »

3 svar på dryga halvtimmen, inte illa... =)


Speakman: Hmmm jag inte säker på att jag förstår hur du menar. Sekvens3 här ovanför borde enligt mig ge Servo2 en mindre vinkel än Servo1?


Stingrew: Det där gillade jag. Jag har varit helt inställd på att pulsen måste börja sammtidigt till bägge servona men det är totalt onödigt.

Syltkaka: Inbyggd timer måste jag försöka få koll på. Eftersom jag precis har börjat med picprogrammering så är min tanke med "Wait" kommandot en räknare och en gotoloop som fördröjning.Det skulle vara riktigt skönt att lära sig ett sätt så att jag kan använda konkreta tidsbegrepp som "µ-sec" eller liknande.




Hur exakt måste intervallen mellan de "höga" pulserna vara? Såg att Stingrew skrev 10-20 millisec. Det kan spela roll för mig eftersom jag även ska lägga in lite annan kod undertiden som dessa pulser skickas. Tex Hålla koll på ett värde om det är 1 eller 0 och även en räknare som möjliggör att dessa sekvenser kan upprepas ett specifikt antal ggr innan de avbryts.



Sodjan: Du skrev ditt svar samtidigt som mig, får försöka få klämm på det du skrivit innan jag kommenterar det, men det ser verkligen ut som ett "rent" alternativ.


//MVH Peter F
Användarvisningsbild
RasmusB
Inlägg: 1006
Blev medlem: 24 augusti 2006, 23:32:13
Ort: Södertälje

Inlägg av RasmusB »

Använde en metod liknande den sodjan beskriver, fast med två timers. En som genererar interrupt 100 ggr/s, den andra timern håller reda på pulslängden, sen justeras varje servo varannat interrupt. Fast jag måste ju säga att det är snyggare att göra som sodjan och använda samma timer till allt... uppdateringsfrekvensen kommer iofs att variera lite beroende på vilket läge servona befinner sig i, men de servon jag har använt har inte varit speciellt känsliga för variationer där.
Användarvisningsbild
speakman
Inlägg: 4838
Blev medlem: 18 augusti 2004, 23:03:32
Ort: Ånge

Inlägg av speakman »

PopUnoNkoK: Det har du rätt i. Noterade aldrig den omvända ordningen.
Men koden i sig är så grötig att det inte är ett normalt tillvägagångssätt.
Läs på om timers så ska du nog få en smidig lösning.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Jag satte 17 ms som tid för "vilopulsen" (!) för att det motsvarar
20 - 2x1.5 ms, d.v.s mittläget på servona.

Om man vill (men det behövs inte) så kan man naturligtvis istället
sätta den till 20 - S1t - S2t, så att det alltid blir närmare 20 ms totalt.
Men det har inte den minsta påverkan på funktionen. Jag skulle
sätta en fast vilopunkt bara för att det är lite enklare...

Fast, å andra sidan... :-)

Beräkningen av "vilopulsen" behöver ju inte göras i ISR'en varje gång,
det räcker att göra det i överliggande kod när S1t och/eller S2t ändras.
ISR'en behöver bara hämta det från ett register.

Men, som sagt, det har bara betydelse om det börjar bli 4, 5 eller fler
servon ska ska styras.
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Inlägg av PopUnoNkoK »

Någon som har ett bra tips på var jag kan hitta bra text om hur man använder Timer?
Har sökt på internet i en timme nu utan att egentligen hittat något att läsa överhuvudtaget.

Sodjan: Ditt förslag verkar perfekt, men vad jag inte riktigt förstår är hur jag ska kunna utföra mina andra kommandon? Kan den ("överliggande"/"main") koden köras parallellt med "pulskoden"? Alltså en kod där jag bla kan ändra s1t & s2t och köra en räknare för att hålla koll på antalet ggr som en sekvens är körd?

Ps. lästips är som sagt välkommna Ds.

//Peter F
Användarvisningsbild
Icecap
Inlägg: 26655
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Inlägg av Icecap »

På min hemsida har jag ett projekt med schema och program (i C) som styr ett antal servon via serieporten. Själva programmet kan ganska lätt anpassas efter behov.

Det "rätta" är ju, precis som sodjan skriver, att en timer-interrupt sköter pulsandet och hämtar värden från minnet, då kan "main-loop" beräkna vad som ska göras och jobba på utan att "störas" vilket just är grejen med interrupt.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Se t.ex "Lesson #13" här : http://www.amqrp.org/elmer160/lessons/index.html

Notera att de använder den gamla PIC16F84A, så ha ett datablad tillgängligt
till den (moderna) processor du tänker använda och jämför med den.
Men texten i själva PDF'en är bra och rejält skriven.

Angående interrupt så (förrutom databladet naturligtsvis) kolla
"Lesson #20" på samma sida. Den handlar bl.a om interrupt och även
en del andra saker som kanske inte är rellevant för dig.

Sen, vad du snart behöver göra är att komma igång och programmera.
Mycket som verkar luddigt brukar klarna när man skriver egen kod...
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Inlägg av PopUnoNkoK »

Sodjan: Du det där var fina grejjer att läsa... =) Jag tror att jag sett den där sidan tidigare i veckan när jag letat info men hoppat över den för att den kändes för "tung" då. :oops:

Nu när jag letar efter lite mer specifik infration känns det där som en toppensida.


Speakman: Jo jag hade väl aningar innan om att det inte var konventionell kod, jag är bara glad att ni inte sågade koden vid fotknölarna. :D

Nu ska vi se om jag får nån rätsida på timer och interrupt. :)

//Peter F
PopUnoNkoK
Inlägg: 789
Blev medlem: 10 december 2007, 12:40:08
Ort: Piteå

Inlägg av PopUnoNkoK »

Hade börjat att skriva en fråga när jag fick en snilleblixt, så jag gick tillbaka till min kod och fixade problemet...

Stå alltid i rätt Bank! :oops:

Så istället passar jag på i min egen tråd här att försöka få kontakt med Sodjan.

Sodjan: Har du sett mina mail angående betalning av Wisp? Att det är betalt och att meddelandet för betalningen är mitt namn.

//MVH Peter F
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Inlägg av sodjan »

Forumet är komplett värdelöst för personlig kontakt.
Använd mail eller telefon om det är akut.
För övrigt är ärendet redan löst, så jag vet inte varför du tar upp det här.

Jag skickade detta till dig för ca 1 1/2 timme sedan :

> Så!
> Nu är det packat och klart, postas tisdag.
> Jag skickade med en extra 16F648A för framtida
> uppgraderingar av programvaran på Wisp648.
>
> Mvh
> Janne Söderholm
>
> Peter Finnberg wrote:
>> Jag börjar bli lite orolig att du inte får mina mail?
>> Har du sett att jag betalat in för Wispen?
>>
>> //Peter F


OK ??
Skriv svar