Styra ett RC-servo.

PIC, AVR, Arduino, Raspberry Pi, Basic Stamp, PLC mm.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Styra ett RC-servo.

Inlägg av jojje »

Fick helt plötsligt lust att styra ett RC-servo med hjälp av en ATmega88 och Basic.
Har letat lite och kommit fram till nedanstående kod, men den ser inte ut att funka.
Servot rör sig inte nånting, det surrar lite i det bara. Har även kopplat in en lysdiod,
och den blinkar (lyser :D) iaf med pulserna. Kan det vara fel på servot kanske?

Kan nån titta å rätta upp, eller länka till där jag kan hitta fungerande kod?

Tror jag har listat ut att vid 0° så ska pulsen vara i 0.388ms (388us),
vid 90° ska den vara 1.264ms (1264us) och vid 180° 2.140ms (2140us).
Sen ska det vara 20ms mellan pulserna.

Så med nedanstående kod ska servot stå still i mittläget. Stämmer det?

Kod: Markera allt

program Servo
main:
  DDRB = 0xFF           ' Set PORTB as output
  PORTB = 0             ' Ingen puls

  while TRUE            ' Endless loop
      PORTB.2 = 1       ' Start puls
      Delay_us(1264)    ' Puls i 1264 us = 1,264 ms
      PORTB.2 = 0       ' Stopp puls
      Delay_ms(20)      ' Vänta 20 ms
  wend

end.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Kan lika bra ta bort hela tråden, för nu funkar det pöfect.
Jag testade med tre gammla Futaba-servon, och alla var trasiga.

Nu hittade jag några Hitec som jag köpte för några år sen.
Dom funkade på första försöket.

Kan kanske ha kvar tråden, om nån vill se hur jag gjort. :D
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Nu har jag petat dit lite flera roliga saker. :D

Kod: Markera allt

program Servo
  dim I as word
      J as word
      Jmin as byte
      Jmax as byte
      Jstep as byte

main:
  DDB0_bit = 0                            ' Set PORTB pin 0 as input
  DDB1_bit = 0                            ' Set PORTB pin 1 as input
  DDB2_bit = 1                            ' Set PORTB pin 2 as output
  PORTB = 0                               ' Ingen puls
  Jmin = 65
  Jmax = 85
  Jstep = 5

  while TRUE                              ' Endless loop
    J = Jmin
    if (PINB0_bit = 1) then               ' Detect if PORTB pin 0 is pressed
      PORTB.2 = 1
      J = J + Jstep
      if J > Jmax then J = Jmax end if
      for I = 1 to J                      ' Kör till ena ändläget
        Delay_us(1)
      next I
      PORTB.2 = 0
      Delay_ms(20)
    end if
    if (PINB1_bit = 1) then               ' Detect if PORTB pin 1 is pressed
      PORTB.2 = 1
      J = J - Jstep
      if J < Jmin then J = Jmin end if
      for I = J to Jmax                   ' Kör till andra ändläget
        Delay_us(1)
      next I
      PORTB.2 = 0
      Delay_ms(20)
    end if
  wend
end.
Användarvisningsbild
netrunner
Inlägg: 5510
Blev medlem: 4 februari 2005, 12:26:05
Ort: 127.0.0.1

Re: Styra ett RC-servo.

Inlägg av netrunner »

Bra jobbat då vill vi se hur du styr med RS232. :D

Vad har du för editor och kompilator?
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Tackar för det. :D

Som ni kanske vet, så testade jag lite med PIC först, men att t ex (nästan) alla PIC'ar har olika kommandon för att utföra samma sak på blev lite irriterande. Att vår vän Lizerdboy, här på forumet, bor nästgårds och han hade massa saker färdigt till AVR gjorde att jag skaffade en AVRISP mkII. Har också fått massa exempelkoder i C, men eftersom han tog semester i några dagar så får jag köra med mikroBasic PRO for AVR så länge. När han får tid så ska vi lägga in: AVR910: In-System Programming, AVR Studio 4.18 (build 684) och C kompileraren WinAVR-20100110. Han snackade nåt om nån AVR-GCC eller nåt sånt. Hoppas det inte blir helt pannkaka att lära nytt språk. :vissla:

Appropå det där med mikroBasic PRO. Har tittat på mikroBasic PRO för PIC och för AVR. Lastade även ner mikroC PRO för AVR för att titta i helpen, men vilken satans blandning dom lyckats med. Rena exempelkoder som kan klippas och klistras är det väl inte så mycket fel i, men resten har dom bara kopierat och ändrat lite i. Så ibland är det Basic och ibland C. :doh:

Tänkte prova med grafisk skärm, men då blev Demon full. :( Det med RS232 vore inte dumt, det kan jag ha nytta av, men kanske ska vänta tills man börjar med nya programmen och C. :humm:

Just nu ska jag sätta dit en pot så jag kan styra servot med den. Vi får se om jag får till det, annars är det väl ganska onödigt "jobb" jag håller på med, men alltid lär man sig nåt. Får ju iaf tiden å gå. :D
Användarvisningsbild
Icecap
Inlägg: 26659
Blev medlem: 10 januari 2005, 14:52:15
Ort: Starup (Haderslev), Danmark

Re: Styra ett RC-servo.

Inlägg av Icecap »

Och är det så att du behöver styra ett antal RC-servon med en mikroprocessor via en COM-port finns det ett färdigt projekt på min hemsida (under "Freebies") som kan styra 12 RC-servos på det vis. Källkod (C) och allt är med.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Tackar Icecap, det ska jag titta närmare på. :tumupp:

Lite av orsaken till att jag vill styra servon är att en kompis har en bom för att filma med. Kameran ska snurras och tiltas och sen är det nån ratt på kameran han vill styra. Tror det var för ljuset. Jag fick hjälp med att styra stegmotorer, men dom blir tunga och han fattade inte hur programmet fungerade. Så jag blev sugen på att göra ett styrprogram light och med servon. Allt styrs från micprocessorn så det behövs ingen kommunikation med datorn, men jag hittar säkert på nåt sätt att "blanda" in den också. :vissla:

Ett annat projekt är att ta tider på t ex dragracebilar. Då kan det vara lämpligt att ha AVR'en som en koppling mellan datorn och fotocellerna. Gjorde en sån grej med parallellporten för massa år sen, men jag hittar inte alla filerna. Databasen var gjord i Access. Jag vet det finns färdigt att köpa, men jag ska iaf ligga här minst två månader till, så... :D

Edit: Icecap, länkarna till mikroelektronika funkar inte längre.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Enkla å dumma frågor: :wink:
1. Kan man skriva ihop nedanstående kod till en enda rad?
2. Ska det vara 0b00000100 för AVR och 0x00000100 för PIC?
(Har för mig att jag skrev med "0x...." i PIC-basic.)
3. Behöver man inte ange om en ingång är analog eller digital i AVR?
Det fixar sig kanske automatiskt när man använder typ: adc_rd = ADC_Read(2) ' get ADC value from 2nd channel

Kod: Markera allt

'  DDRB.0 = 0               ' Set PORTB pin 0 as input
'  DDRB.1 = 0               ' Set PORTB pin 1 as input
'  DDRB.2 = 1               ' Set PORTB pin 2 as output
  DDRB = 0b00000100        ' Set PORTB pin 0 and 1 as input, pin 2 as output
Edit: Hade nio "bitar" isf åtta i tex 0b00000100.
Senast redigerad av jojje 26 juni 2010, 14:20:59, redigerad totalt 1 gång.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra ett RC-servo.

Inlägg av sodjan »

> ...men att t ex (nästan) alla PIC'ar har olika kommandon för att utföra samma sak

Fel.

Sen, att du har en granne som kör AVR är mer avgörande för valet
än några tekniska skillnader. Så har du enklare att få hjälp med AVR
så är det sannolikt ett korrekt val...
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

OK, jag kanske hårddrar det till sitt yttre, men som du skriver så var valet av granne viktigaste skälet, och det fick avgöra. :D
Man har ju mest behov för hjälp i början, sen kanske man kanske lär sig hitta själv, utan GPS för microprofessorer. :vissla:
victor_passe
Inlägg: 2436
Blev medlem: 28 januari 2007, 18:45:40
Ort: Kungsbacka

Re: Styra ett RC-servo.

Inlägg av victor_passe »

0x är före hexadecimala tal, 0b är före binära tal.
tex 0x8E0F och 0b0100101
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Ja just det, så var det ja. :wacko: Tackar.

Har föresten fått igång servot med pot och display nu. :whoho:

Kod: Markera allt

program ADC
' Skrivet för ATmega88
' LCD module connections
dim LCD_RS as sbit at PORTD.2
dim LCD_EN as sbit at PORTD.3
dim LCD_D4 as sbit at PORTD.4
dim LCD_D5 as sbit at PORTD.5
dim LCD_D6 as sbit at PORTD.6
dim LCD_D7 as sbit at PORTD.7

dim LCD_RS_Direction as sbit at DDRD.2
dim LCD_EN_Direction as sbit at DDRD.3
dim LCD_D4_Direction as sbit at DDRD.4
dim LCD_D5_Direction as sbit at DDRD.5
dim LCD_D6_Direction as sbit at DDRD.6
dim LCD_D7_Direction as sbit at DDRD.7
' End LCD module connections

  dim I, adc_rd, adc_rd_Sum as word
      outstr as char[12]
main:
  DDRB.2 = 1                        ' Set PORTB pin 2 as output
  DDRC.2 = 0                        ' Set PORTC pin 2 as input
  PORTB.2 = 0                       ' Ingen puls ut. Kan tas bort
  Lcd_Init()                        ' Initialize LCD
  Lcd_Cmd(_LCD_CLEAR)               ' Clear display
  Lcd_Cmd(_LCD_CURSOR_OFF)          ' Cursor off
  Delay_ms(500)

  while TRUE                        ' Endless loop
    adc_rd = ADC_Read(2)            ' Get ADC value from 2nd channel (PC2, pin25)
    adc_rd_Sum = adc_rd / 12        ' Delar talet med 12 för att utnyttja hela potten
    WordToStr(adc_rd_Sum,outstr)    ' Måste göra om till sträng för att kunna visa på LCD'n
    outstr = "Sum:" + outstr        ' Plussar på "grundtext"
    LCD_Out(1,1,outstr)             ' Write text in first row
    PORTB.2 = 1                     ' Puls ut
    for I = 1 to adc_rd_Sum         ' Kör från ena till andra ändläget
      Delay_us(1)                   ' Väntar med minsta värdet som går
    next I
    PORTB.2 = 0                     ' Ingen puls ut
    Delay_ms(20)                    ' Delay för att köra nästa puls
  wend
end.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

Det där med RS-232. Behövs det nån typ MAX232 om man kör med t ex ATmega88?
Ser ut som den innehåller: Programmable Serial USART
Står iaf så i databladet, eller tar jag fel?
Kan vara att det är förberätt, men det behövs iaf en MAX232'a.
sodjan
EF Sponsor
Inlägg: 43251
Blev medlem: 10 maj 2005, 16:29:20
Ort: Söderköping

Re: Styra ett RC-servo.

Inlägg av sodjan »

Det finns inga mikrokontrollers som har RS232 drivers inbyggt, så vitt jag vet.
Om man tänker köra mot en annan RS232-enhet så behövs det någon
form av signalanpassning, det vanligaste är en MAX232.
Användarvisningsbild
jojje
Gått bort
Inlägg: 6380
Blev medlem: 20 januari 2006, 01:53:33
Ort: Stockholms utkant
Kontakt:

Re: Styra ett RC-servo.

Inlägg av jojje »

OK, tack för svaret, det var så som jag trodde/befarade.
Får väl skaffa en sådan då. Bra att ha troligtvis. :D


När vi ändå frågar massa konstigheter.
Kan någon länka till eller lägga in lite microBasic-kod hur man använder
timern för att ta tiden mellan t ex två slutningar på ingångarna?
Det funkar t ex inte med dom inbyggda Time_dateToEpoch eller Time_dateDiff
Allt blir i hela sekunder och jag vill gärna ha hundradelar eller bättre.

Tack på förhand. :D
Skriv svar