Sida 1 av 2
Styra ett RC-servo.
Postat: 25 juni 2010, 21:03:54
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

) 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.
Re: Styra ett RC-servo.
Postat: 25 juni 2010, 21:39:15
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.

Re: Styra ett RC-servo.
Postat: 25 juni 2010, 22:35:16
av jojje
Nu har jag petat dit lite flera roliga saker.
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 10:40:00
av netrunner
Bra jobbat då vill vi se hur du styr med RS232.
Vad har du för editor och kompilator?
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 11:38:23
av jojje
Tackar för det.
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.
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.
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.
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å.

Re: Styra ett RC-servo.
Postat: 26 juni 2010, 11:48:12
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 12:05:48
av jojje
Tackar Icecap, det ska jag titta närmare på.
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å.
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å...
Edit: Icecap, länkarna till mikroelektronika funkar inte längre.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 12:47:24
av jojje
Enkla å dumma frågor:
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 13:52:17
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...
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 14:01:52
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.
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.

Re: Styra ett RC-servo.
Postat: 26 juni 2010, 16:02:46
av victor_passe
0x är före hexadecimala tal, 0b är före binära tal.
tex 0x8E0F och 0b0100101
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 16:35:44
av jojje
Ja just det, så var det ja.

Tackar.
Har föresten fått igång servot med pot och display nu.
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 21:53:54
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 22:44:53
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.
Re: Styra ett RC-servo.
Postat: 26 juni 2010, 22:59:31
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.
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.
