BRUKSANVISNING - Atmel Community · PDF file32768 pulser/varv på motoraxeln i LM629...
-
Upload
truongdien -
Category
Documents
-
view
219 -
download
6
Transcript of BRUKSANVISNING - Atmel Community · PDF file32768 pulser/varv på motoraxeln i LM629...
BRUKSANVISNING
2007-10-29 Bruksanvisning för roboten Saphira
BRUKSANVISNING
Revisionshistoria Datum Beskrivning
2007-08-15 Första utgåva
2007-10-29 Uppdatering av firmware till version 1.1 med nya kommandon för att styra hastigheten.
BRUKSANVISNING
Innehållsförteckning
INLEDNING .......................................................................................................................... 1
SKÖTSELINSTRUKTIONER FÖR ROBOTEN .......................................................................... 2
ROBOTENS UPPBYGGNAD .................................................................................................. 3 Inledning ..................................................................................................................................................... 3 Basplattan .................................................................................................................................................. 3 Infromationsdisplay .................................................................................................................................. 4 Utväxling .................................................................................................................................................... 5
Omkrets för driv hjul och kuggremshjul ............................................................................................. 5 Distans för varje varv motorn snurrar ................................................................................................ 5 Maxhastighet: ......................................................................................................................................... 5 Antal pulser för given distans som skall skickas till motorstyrningskortet: .................................. 5
BAKPLANET ......................................................................................................................... 6 Inledning ..................................................................................................................................................... 6 Matningspänning ...................................................................................................................................... 6 Kommunikation .......................................................................................................................................... 6 Utseende .................................................................................................................................................... 6 Schema för bakplanet ............................................................................................................................. 7 Mönsterkortssymbolen för bakplanskontakten ................................................................................... 9 Mönsterkortssymbolen för skruvplinten ............................................................................................. 10 Mönsterkortssymbolen för servokontakten ....................................................................................... 10 Mönsterkortssymbolen för anslutning bakplan / styrkort .............................................................. 11 Mönsterkortslayout för bakplanet...................................................................................................... 11
KOMMUNIKATIONSPROTOKOLLET .................................................................................. 12 Inledning .................................................................................................................................................. 12 Initiering ................................................................................................................................................... 12 Eko ............................................................................................................................................................ 12 Checksumma ........................................................................................................................................... 12 Kommandon som stöds i version 1.1 .................................................................................................. 12 Svar efter utförd förflyttning .............................................................................................................. 13 Flödeschema ........................................................................................................................................... 14
EXEMPEL PÅ EN ENKEL DESIGN AV ETT STYRKORT ......................................................... 15 Inledning .................................................................................................................................................. 15 Funktion .................................................................................................................................................... 15 Styrkortets uppbyggnad ...................................................................................................................... 15 Schemaritning ......................................................................................................................................... 15 Mönsterkortet ......................................................................................................................................... 16 Mönsterkortsritning ................................................................................................................................ 16
MJUKVARA ....................................................................................................................... 17 Inledning .................................................................................................................................................. 17 Funktion .................................................................................................................................................... 17 Uppbyggnad ......................................................................................................................................... 17 Kort berskrivning av de olika subrutinerna ...................................................................................... 17
main.c ........................................................................................................................................... 17
BRUKSANVISNING
usart.c ........................................................................................................................................... 18 Övrigt ...................................................................................................................................................... 18
EXEMPELKOD FÖR ATMEGA16 ......................................................................................... 19 main.c ....................................................................................................................................................... 19 usart.c ....................................................................................................................................................... 23 control.h ................................................................................................................................................... 25 usart.h ...................................................................................................................................................... 26
+
BRUKSANVISNING
Sida 1
BRUKSANVISNING S A P H I R A
INLEDNING Denna användarhandledning består av fyra delar. Den första delen är allmänna skötselinstruktioner för roboten. Del två beskriver kortfattat funktionen av motorstyrningskortet. Del tre beskriver kommunikationsprotokollet och del fyra visar ett exempel på hur mönsterkortet skall utformas för att passa bakplanet. För att använda sig av denna bruksanvisning förutsätts att läsaren har goda kunskaper i konstruktion med mikrodatorer, CAD med AltiumDesigner6 och C programmering.
Designunderlag finns att hämta på stud_dir under katalogen \TN\E\076_Design av autonoma robotar\Saphira. Dessa är till för att snabbt komma igång med design av hårdvara och mjukvara för styrning av roboten.
BRUKSANVISNING
Sida 2
SKÖTSELINSTRUKTIONER FÖR ROBOTEN
Det viktigaste att sköta på rätt sätt är batteriet. Batteriet består av 4st ackumulatorer på vardera 6V och 1800mAh. Dessa seriekopplas för att ge utspänningen 24V. Laddningen sker genom att ansluta ett nätaggregat. Ställ in spänningen på 28V innan aggregatet ansluts till roboten. När det är anslutet justeras laddströmmen till 10 procent kapaciteten och i detta fall blir det 180mA. Batteriet är fullladdat när laddströmen sjunker under ca 10mA. Detta kan ta upp till 12h när batteriet är helt urladdat. Observera att det endast går att ladda roboten när strömbrytaren är i laddläget och roboten är strömlös.
Roboten får inte dras på golvet då motorerna inducerar en spänning och i värsta fall med omvänd polaritet. Risken är då mycket stor att elektroniken på motorkortet förstörs!
Innan körning skall kontrolleras att alla skruvar är åtdragna. Kontrollera även att inga sladdar kan fastna i hjulen då roboten är mycket stark kommer det att bli skador om en kabel fastnar i ett roterande hjul! Gäller även fingrar!
Placera alltid roboten på ett stöd så att hjulen inte rör marken under utvecklingen, så slipper den åka iväg och krascha ner från bordet. Vi har bara en robot!
Om säkringen går får den endast ersättas med en snabb säkring på 500mA. Säkringen skall gå sönder om roboten kör in i tillexempel en vägg!
Se dock alltid till att roboten inte kan köra emot fasta föremål som tillexempel en vägg.
I övrigt tänk först handla sedan. Även då du är trött, stressad och klockan är mycket!
BRUKSANVISNING
Sida 3
ROBOTENS UPPBYGGNAD
Inledning Robotplattformen består av två stycken DC motorer med pulsigvare, motorstyrningskort, batteri och ett bakplan. Motorerna kontrolleras av motorstyrningskortet vars huvuddelar består av två kontrollkretsar (LM629 en för varje motor) samt en mikrokontroller (Atmega128) för programmering av kontrollkretsarna och kommunikation med kretskorten på bakplanet. Bakplanet är placerat ovanpå roboten och har plats för 5 stycken kretskort. Kretskorten kommunicerar med motorstyrningskortet via en RS232-länk och kan matas med 5 eller 3.3 volt.
Basplattan På basplattan är de delar som tillhör drivpaketet monterade. Dessa är hjul, drivremmar med kuggremshjul, batteri samt drivelektroniken i form av motorstyrningskortet. Bilden nedan visar var dessa delar är placerade.
Motor och tachometer
Batteri 24V 1800mAh
Hjuldiameter 0,15m
Hjuldiameter 0,15m
Drivrem & utväxling Motor och tachometer
Motorstyrningskort
BRUKSANVISNING
Sida 4
Infromationsdisplay Till motorstyrningskortet finns en informationsdisplay kopplad. Den ger information om robotens status. Vid uppstart visas en text om att roboten måste aktiveras samt en rad med batterispänningen. Under körning visas vilken position som höger och vänster hjul befinner sig på.
BRUKSANVISNING
Sida 5
Utväxling Beräkningen nedan visar hur antalet pulser/m och maxhastighet beräknas. OBS att även om det är många decimaler med i beräkningen kan en viss kalibrering vara nödvändig!
Kuggdrev a
Kuggdrev b Kuggrem
Hjul med diameter 0,15m
Omkrets för driv hjul och kuggremshjul
Hjulomkretsen är π * 0,15 = 0,47234 m = c
Omkretsen för motorkuggdrev är 0,03820 m = a
Omkretsen för hjulaxelkuggdrev är 0,02387 m = b
Distans för varje varv motorn snurrar
D = (a/b)*c = 0,754140 m
Maxhastighet:
Enligt databladet till motorn är rotationshastigheten på utgående axel 91 varv/minut vid 24 V.
91/60 * 0,754140= 1,14 m/s
1,14 * 3.6 = 4,1 km/h
Antal pulser för given distans som skall skickas till motorstyrningskortet:
32768 pulser/varv på motoraxeln i LM629 kretsen ökar upplösningen med 4. Detta beror på hur signalerna från tachometern behandlas i LM629 kretsen. Se sidan 9 & 10 i databladet till LM628/LM629. . Systemets upplösning R = 32768 * 4 = 131072
L = 1m
Ger en upplösning på L/(D/R) = 1 / (0,754140 / 131072) = 173803.32 pulser/m = 2A6EB16
BRUKSANVISNING
Sida 6
BAKPLANET
Inledning Till bakplanet skall de egenkonstruerade kretskorten anslutas. Detta avsnitt beskriver bakplanets funktion.
Matningspänning Bakplanet är direkt anslutet till batteriet på 24V. På kortet sitter sedan två stycken switchregulatorer som omvandlar 24V till 5,0V och 3,3V. Dessa två spänningar leds sedan ut till bakplanskontakterna. Strömmen får dock inte överskrida 5A. Om 24V behövs kan en sladd direkt anslutas till den extra batterikontakten som är placerad vid sidan av den som ansluter matningsspänningen till bakplanet.
Kommunikation Från kortet går en flatkabel till motorstyrningskortet. Denna kabel används för kommunikationen via RS232. Det finns även i framtiden möjlighet till I2C kommunikation när mjukvaran har uppdaterats.
Utseende Bilden nedan visar bakplanet och vart de olika delarna är placerade.
3,3V regulator 3,3V regulator
Servokontakt
Batterianslutning
Ansluting till motorstyrningskortet
I2C pullupmotstånd Bakplanskontakt
JP1
Skruvplint
BRUKSANVISNING
Sida 7
FIGUR 1: SCHEMA BAKPLAN
GND
READY
STOP
SCL
SDA
TXDRXDEMR_STOP
ENCALENCBLENCARENCBR
1A1
VCC 14
2A3
3A5
4A9
5A11
6A13
1Y 2
2Y 4
3Y 6
4Y 8
5Y 10
6Y 12
GND7
U1
74HCT04
+5V
READYPWM RDIR RSTOP
TXDRXDEMR_STOP
ENCALENCBL
ENCARENCBR
GND
+5V
+3.3V
GND GND
SDASCL
GND
1 2 3 4 5 6 7 8 9 10 11 12
P1
1 23 45 67 89 1011 1213 14
JP9
Backplane header 7X2
12
JP7Battery connector
12
JP8Battery connector
GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP1
STOP
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
READYPWM RDIR RSTOP
TXDRXD
ENCALENCBL
ENCARENCBR
+5V
GND GND
SDASCL
GND GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP2
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
READYPWM RDIR RSTOP
TXDRXD
ENCALENCBL
ENCARENCBR
+5V
GND GND
SDASCL
GND GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP3
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
READYPWM RDIR RSTOP
TXDRXD
ENCALENCBL
ENCARENCBR
+5V
GND GND
SDASCL
GND GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP4
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
READYPWM RDIR RSTOP
TXDRXD
ENCALENCBL
ENCARENCBR
+5V
GND GND
SDASCL
GND GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP5
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
+5V
+3.3
V
GN
DA
28A
27
A25
A24
A23
A22
A26
A21
A20
B30
B29
B28
B27
B26
B25
B24
B23
BATT_24V BATT_24V
S11
S22
S33
S44
S55
S66
S77
S88
+5V
9
GN
D17
+5V
10
+5V
11
+5V
12
+5V
13
+5V
14
+5V
15
+5V
16
GN
D18
GN
D19
GN
D20
GN
D21
GN
D22
GN
D23
GN
D24
P2
+5V
GN
D
U_PowerPower.SchDoc
+3.3V +3.3V +3.3V +3.3V +3.3V +3.3V +3.3V +3.3V +3.3V
+3.3V +3.3V+3.3V+3.3V+3.3V+3.3V+3.3V+3.3V+3.3V+3.3V
GND
+3.3V +3.3V +3.3V +3.3V +3.3V
A29A30
A29A30
A29A30
A29A30
A29A30
0.1uFC5
+5V
GND
EMR_STOP EMR_STOP EMR_STOP EMR_STOP
ENCODER SIGNALS TO 74HCT04 NOT SUPPORTED WITH MOTOR CARD VERSION 2.0!!!
FIGUR 2: SCHEMA KONTAKT BAKPLAN / STYRKORT
GND
READY
SCL
SDA
TXDRXDEMR_STOP
ENCALENCBLENCARENCBRGND
1 23 45 67 89 1011 1213 14
JP9
Backplane header 7X2
Schema för bakplanet
BRUKSANVISNING
Sida 8
FIGUR 5: SCHEMA BAKPLANSKONTAKT
READYPWM RDIR RSTOP
TXDRXDEMR_STOP
ENCALENCBL
ENCARENCBR
+5V
+3.3V
GND GND
SDASCL
GND GND
A1 B1A2 B2A3 B3A4 B4A5 B5A6 B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14A15 B15A16 B16A17 B17A18 B18A19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30A31 B31A32 B32
JP1
A19A20A21A22A23A24A25A26A27
+5V+5V
+5VGND GND
A18
B6B7B8B9B10B11B12B13B14
B19B20B21B22B23B24B25B26B27B28B29B30
A14
A28
+3.3V
+3.3V+3.3V
+3.3V
A29A30
FIGUR 3: SCHEMA SKRUVPLINT
FIGUR 4: SCHEMA SERVOKONTAKT
1 2 3 4 5 6 7 8 9 10 11 12
P1
+5V
+3.3
V
GN
DA
28A
27
A25
A24
A23
A22
A26
A21
A20
B30
B29
B28
B27
B26
B25
B24
B23
S11
S22
S33
S44
S55
S66
S77
S88
+5V
9
GN
D17
+5V
10
+5V
11
+5V
12
+5V
13
+5V
14
+5V
15
+5V
16
GN
D18
GN
D19
GN
D20
GN
D21
GN
D22
GN
D23
GN
D24
P2
+5V
GN
D
FIGUR 7: SCHEMA SWITCHREGULATOR 5 & 3.3V
+
67-217-08
C41000uF
58-690-29
L2
100uH
R268 ohm
75-313-04
D4EL42-21UBC
FB 4
ON/OFF5
GND3
IN1
OUT 2
73-279-76
U3
LM2576S3.3
+
67-133-25
C1100uF
+
67-217-08
C21000uF
58-690-29
L1
100uH
R168 ohm
75-313-04
D2EL42-21UBC
FB 4
ON/OFF5
GND3
IN1
OUT 2
73-279-68
U2
LM2576S5.0
BATT_F_24V
70-103-25
D11N5822
+5V
+3.3V
BATT_F_24V
+
67-133-25
C3100uF
70-103-25
D31N5822
BRUKSANVISNING
Sida 9
Mönsterkortssymbolen för bakplanskontakten Bakplanskontakten sedd ovanifrån. OBS skillnaden mellan schemasymbolen!
FIGUR 8:
MÖNSTERKORTSSYMBOL BAKPLANSKONTAKT
B32
B1
A32
A1
BRUKSANVISNING
Sida 10
Mönsterkortssymbolen för skruvplinten Skruvplinten sedd ovanifrån:
Pinnumrering från vänster: GND, A28,A27,A26,A25,A24,A23,A22,A21,A20,+3,3V & + 5,0V
Mönsterkortssymbolen för servokontakten Kontakt för anslutning av servon sedd uppifrån
Pinnumrering från vänster Rad 1: GND Rad 2: +5,0V Rad 3: B23, B24, B25, B26, B27, B28, B29 & B30
BRUKSANVISNING
Sida 11
Mönsterkortssymbolen för anslutning bakplan / styrkort Kontakt för anslutning av kabel mellan bakplan och styrkort
Pinnumrering 1: TXD , 3: RXD , 9: GND (Övriga används inte)
Mönsterkortslayout för bakplanet Nedan visas layouten för bakplanet
FIGUR 9: MÖNSTERKORTSLAYOUT FÖR BAKPLANET
BRUKSANVISNING
Sida 12
KOMMUNIKATIONSPROTOKOLLET
Inledning Kommunikationsprotokollet är till för att överföra kommandon från styrkortet till motorkortet via RS232. Protokollet är enligt KISS (keep it simple stupid) och är i skrivande stund inte testat i någon större utsträckning men har visat sig relativt stabilt om man följer reglerna nedan!
Initiering Av säkerhetsskäl lägger sig motorstyrningskortet i spärrat läge när strömmen slås på och måste aktiveras. Motorstyrningskortet sänder då med ca 1sek mellanrum ut ett ’?’. Styrkortet skall då svara med ett ’A’. Därefter är motorstyrningskortet aktiverat och kan ta emot styrkommandon.
Eko För att veta när styrkortet tagit emot ett tecken skickas det i retur. Innan tecknet kommit i retur får inte nästa tecken skickas till styrkortet.
Checksumma All data som skickas till roboten förutom aktiveringen skall följas av en 16-bitars checksumma enligt CCITT. Algoritmen kallas även för CRC (cyclic redundancy check). Checksumman beräknas med formeln x16 + x12 + x5 + 1. Observera att det är ett 16 bitars tal och skickas efter data som msb + lsb. Implementering av funktionen återfinns i subrutinen crc16 nedan.
Kommandon som stöds i version 1.1 I versionen 1.1 av styrprogramvaran stöds kommandona nedan. Detta ger viss begränsning när det gäller hur roboten kan styras. T.ex. är det svårt att få roboten att köra i en cirkel eller svänga med radien > 0.
Kommando Antal bytes Kod Beskrivning
CM_LEFT_LOAD_POS 4 20 Ladda position för höger motor
CM_RIGHT_LOAD_POS 4 21 Ladda position för vänster motor
CM_BOTH_LOAD_POS 4 22 Ladda samma position till båda motorerna
CM_LEFT_START_MOTION 0 23 Starta förflyttning för vänster motor
CM_RIGHT_START_MOTION 0 24 Starta förflyttning för höger motor
CM_BOTH_START_MOTION 0 25 Starta förflyttning för båda motorerna
CM_LEFT_SET_MAX_SPEED 1 26 Sätt max hastighet för vänster motor
CM_RIGHT_SET_MAX_SPEED 1 27 Sätt max hastighet för höger motor
CM_BOTH_SET_MAX_SPEED 1 28 Sätt samma max hastighet för båda motorerna
Efter att godkänt kommando och data mottagits av motorstyrkortet returneras koden CM_OK eller CM_FAILED.
BRUKSANVISNING
Sida 13
Svar efter utförd förflyttning När motorn har roterat till angiven position skickas följande svar:
TC[L/R][b3][b2][b1]b[0]
TC står för Traction Control
[L/R] antingten L=left eller R=right
[b3] msb av 32-bitars possition
[b0] lsb av 32-bitars possition
När höger motor har stannat vid angiven position (0 i detta fall) skickas följande:
TCR’0’’0’’0’’0’ ’0’ = char 0
När vänster motor har stannat vid angiven position (0 i detta fall) skickas följande:
TCL’0’’0’’0’’0’ ’0’ = char 0
Positionen som returneras är begärda positionen +- ett positioneringsfel. Vilket beror av reglerparametrarna och vilka störningar som uppstår under förflyttningen.
BRUKSANVISNING
Sida 14
Flödeschema
START
INIT
Vänta på ’?’ från RS232
Skicka position till höger motor
CM_OK
Vänta tills rörelsen är klar genom att hämta 14 tecken enligt föregående sida.
Skicka position till vänster motor
CM_OK
Starta rörelsen för båda motorerna
5
4
1. Aktivera roboten genom att skicka ’A’
2. Skicka position för höger motor
3. Skicka position för vänster motor
4. Starta förflyttningen 5. Vänta på svar att
förflyttningen är utförd. 6. Beräkna ny position 7. Repetera steg 2 till 6
Skicka ’A’
JA
JA
NEJ
NEJ
Beräkna ny position.
7
1
2 6
3
BRUKSANVISNING
Sida 15
EXEMPEL PÅ EN ENKEL DESIGN AV ETT STYRKORT
Inledning Detta kort skall ses som ett exempel på hur ett enkelt styrkort till roboten kan utformas utifrån de filer som finns tillgängliga på kurskatalogen under \TN\E\076_Design av autonoma robotar\Saphira\hardware\saphira_controler
Funktion Denna hårdvara är till för att göra det möjligt att kommunicera med styrkortet utifrån de regler som sätts upp i mjukvaran.
Styrkortets uppbyggnad Konstruktionen utgår från en Atmega16 processor med JTAG interface. Utöver kommunikationen med motorstyrningskortet finns kopplingar till ultraljudssensorn, I2C-bussen och två servon. Processorn matas med 5V via bakplanet. Programmeringen sker via JTAG kontakten JP2 och kortet ansluts till bakplanet via kontakten JP1. Kommunikationen med motorstyrningskortet sker via anslutningarna RXD och TXD. I övrigt används den interna klockgeneratorn på 8MHz. Nedan visas det fullständiga schemat för styrkortet.
FIGUR 10: SCHEMA STYRKORT
Schemaritning Till AltiumDesigner 6 finns ett bibliotek med specifika schemasymboler och en mall för schemat som bör användas vid ritning av schemat. Namnet på biblioteket är saphira_controler.IntLib och ligger i samma filkatalog som övriga filer. Se även manual för AltiumDesigner.
TCK
TMSTDO 1 2
3 45 67 89 10
JP2
JTAG
TDI
+5V
470R9
PB0 (XCK/T0)1
PB1 (T1)2
PB2 (AIN0/INT2)3
PB3 (AIN1/OC0)4
PB4 (SS)5
PB5 (MOSI)6
PB6 (MISO)7
PB7 (SCK)8
RESET9
PD0 (RXD)14
PD1 (TXD)15
PD2 (INT0)16
PD3 (INT1)17
PD4 (OC1B)18
PD5 (OC1A)19
PD6 (ICP)20
PD7 (OC2)21
XTAL212
XTAL113 GND 11
PC0 (SCL) 22
PC1 (SDA) 23
PC2 (TCK) 24
PC3 (TMS) 25
PC4 (TDO) 26
PC5 (TDI) 27
PC6 (TOSC1) 28
PC7 (TOSC2) 29
AREF 32AVCC 30
GND 31
PA7 (ADC7) 33PA6 (ADC6) 34PA5 (ADC5) 35PA4 (ADC4) 36PA3 (ADC3) 37PA2 (ADC2) 38PA1 (ADC1) 39PA0 (ADC0) 40
VCC 10
U1
ATmega16-16PI
+5V+5V
XTAL_1XTAL_2
X_SERVOY_SERVO
X_SERVOY_SERVO
TRIGG_PULSEECHO_PULSE
TRIGG_PULSEECHO_PULSE
+5V
+5V +5V+3.3V +3.3VA3 +3.3VA4 SDARXD SCLTXD B6A7 B7A8 B8A9 B9A10 B10A11 B11A12 B12A13 B13A14 B14GND GND+5V +5V+3.3V +3.3VA18 NCA19 B19A20 B20A21 B21A22 B22A23 B23A24 B24A25 B25A26 B26A27 B27A28 B28A29 B29A30 B30GND GNDGND GND
JP1
XBotHeader MALE
0.1uFC1
+5V
TDITDOTMSTCKSDASCL
RESET
RESET
SDASCL
TXDRXD
RXDTXD
BRUKSANVISNING
Sida 16
Mönsterkortet Det viktiga vid designen av mönsterkortet är att kontakten JP1 kommer på rätt plats. Annars kommer inte pinnumreringen och avståndet till den nedre fräskanten att stämma. B32 (GND) ligger längst upp till vänster. Använd därför den färdiga mallen med placeringen av JP1 och fräsramen. Givetvis kan fräsramen ändras så att kortet blir större men tänk på att inte ändra läget på den nedre kanten i Y-led! I mallen finns även färdiga regler för ledarbredd och avstånd för polygonplanen till ledare och fräskant.
Använd med fördel ett jordplan och ett plan för matningsspänningen.
Figuren nedan visar det färdiga mönsterkortet.
B32
Mönsterkortsritning Till AltiumDesigner 6 finns ett bibliotek med specifika kretssymboler och en mall för kort som bör användas vid ritning av mönsterkortet. Namnet på biblioteket är saphira.intlib. Namnet på biblioteket är saphira_controler.IntLib och ligger i samma filkatalog som övriga filer. Se även manual för AltiumDesigner.
BRUKSANVISNING
Sida 17
MJUKVARA
Inledning Detta program skall ses som ett exempel på hur roboten kan styras. För att förstå koden krävs god kännedom om C programmering och om Atmega16. För specifik information om Atmega16 hänvisas till databladet. Programfilerna återfinns på stud_dir under katalogen \TN\E\076_Design av autonoma robotar\Saphira\Dokumentation\Software\saphira_control\v0.1
Funktion Detta programs funktion är att styra roboten så att den åker i fyrkanter med sidan 2m.
Uppbyggnad Mjukvaran består av ett antal funktioner för kommunikation, beräkning av checksumma samt ett huvudprogram som sköter styrningen av roboten.
Filerna som bygger upp programmet enligt nedan:
Fil Beskrivning
main.c Huvudfunktioner för styrning av robot och beräkning av crc
usart.c Funktioner för kommunikation via RS232
usart.h Definitioner för kommunikation vi RS232
control.h Definitioner för kommunikationsprotokollet
Kort berskrivning av de olika subrutinerna
main.c
main() Huvudprogram för styrning av roboten
void delay_1s( void ) Väntar 1 sekund
void crc16(unsigned char ser_data) Beräknar crc16. OBS använder sig av globala variabeln crc som måste sättas till 0 innan
beräkningen påbörjas. void send_byte(char data)
Skickar en byte via RS232 till styrkortet unsigned char send_pos(unsigned char lr, long int pos)
Skickar ny position till vald motor via RS232 long int turn(int r, float v)
Beräknar antalet pulser för att svänga v antal grader. OBS inte helt kalibrerad.
BRUKSANVISNING
Sida 18
usart.c
void USART_Init(double baud) Initierar USART i Atmega16 med given baudhastighet. I detta fallet 9600baud.
int USART_Receive_time_out( void );void USART_Init(double baud); Hämtar ett tecken från buffer I Atmega16. Hoppar ur efter ca 1 sek om inget tecken har
kommit. void USART_Transmit( unsigned char data );
Skickar ett tecken via RS232 void USART_Transmit_Str(const char *str );
Skickar en sträng via RS232 void USART_Flush( void );
Tömmer motagarbufferten i Atmega16
Övrigt För övrig information se kommentarerna I koden.
BRUKSANVISNING
Sida 19
EXEMPELKOD FÖR ATMEGA16
main.c /* Shapira control demo (main.c) for Atmega16 for IAR Version 0.2 2007-10-29 Copyright (C) Andreas Kingbäck ([email protected]) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #pragma language=extended #ifndef ENABLE_BIT_DEFINITIONS #define ENABLE_BIT_DEFINITIONS // Enable the bit definitions in the iom128.h file #endif #include "control.h" #include "usart.h" static unsigned int crc; // global for crc calculation void delay_1s( void ) { __delay_cycles(8000000); // Delay 1s } void crc16(unsigned char ser_data) { // Update the CRC for transmitted and received data using // the CCITT 16bit algorithm (X^16 + X^12 + X^5 + 1). crc = (unsigned char)(crc >> 8) | (crc << 8); crc ^= ser_data; crc ^= (unsigned char)(crc & 0xff) >> 4; crc ^= (crc << 8) << 4; crc ^= ((crc & 0xff) << 4) << 1; } void send_byte(char data) { int test = -1; while (test == -1) { USART_Transmit(data); test = USART_Receive_time_out(); } }
BRUKSANVISNING
Sida 20
unsigned char send_pos(unsigned char lr, long int pos) { unsigned char b,b1,b2,b3; // type conversion USART_Flush(); // Flush rx buffer // Reset crc crc = 0; // Connvert to bytes b = (pos & 0xFF000000) >> 24; b1 = (pos & 0x00FF0000) >> 16; b2 = (pos & 0x0000FF00) >> 8; b3 = (pos & 0x000000FF); // Calculate crc for data crc16(lr); crc16(b); crc16(b1); crc16(b2); crc16(b3); // Send command USART_Transmit(lr); USART_Receive_time_out(); // Send data USART_Transmit(b); USART_Receive_time_out(); USART_Transmit(b1); USART_Receive_time_out(); USART_Transmit(b2); USART_Receive_time_out(); USART_Transmit(b3); USART_Receive_time_out(); // Send crc16 USART_Transmit((crc & 0xFF00) >> 8); USART_Receive_time_out(); USART_Transmit((crc & 0xFF)); USART_Receive_time_out(); // Get acc (10101010=OK) if (USART_Receive_time_out() == CM_OK) return CM_OK; else return CM_FAILED; }
BRUKSANVISNING
Sida 21
unsigned char send_max_speed(unsigned char lr, unsigned char maxspeed) { USART_Flush(); // Flush rx buffer // Reset crc crc = 0; // Calculate crc for data crc16(lr); crc16(maxspeed); // Send command USART_Transmit(lr); USART_Receive_time_out(); // Send data USART_Transmit(maxspeed); USART_Receive_time_out(); // Send crc16 USART_Transmit((crc & 0xFF00) >> 8); USART_Receive_time_out(); USART_Transmit((crc & 0xFF)); USART_Receive_time_out(); // Get acc (10101010=OK) if (USART_Receive_time_out() == CM_OK) return CM_OK; else return CM_FAILED; } long int turn(int r, float v) { // Calculates no of puleses for the turn in v deg. (not calibrated!) // Radius = 0. Other radius than 0 is not implemented yet! float dist; long int p; dist = 0.00293705911111*v; p = dist / 5.753632903870394e-006; return p; }
int main( void ) { long int pr; long int pl; unsigned char maxspeed; int i; char rx[14]; USART_Init(9600); // Activate motor controler while (USART_Receive() != '?'); // Wait for activation ready signal USART_Transmit('A'); // Activate! delay_1s(); // Wait for controller to activate USART_Flush(); // Flush rx buffer __enable_interrupt(); // Enable interrupts
BRUKSANVISNING
Sida 22
// This program makes the robot to go in a box 2 by 2 meters. pr=0;pl=0; // Set maxspeed 0x00 to 0x30 maxspeed = 0x05; while (send_max_speed(CM_BOTH_SET_MAX_SPEED,maxspeed) == CM_FAILED); while (1==1) { pr+= 0x00054DD6; // pulses for 2 meters pl+= 0x00054DD6; // pulses for 2 meters // Forward 2m while (send_pos(CM_RIGHT_LOAD_POS,pr) == CM_FAILED); while (send_pos(CM_LEFT_LOAD_POS, pl) == CM_FAILED); USART_Transmit(CM_BOTH_START_MOTION); USART_Receive(); for (i = 0 ; i < 14 ; i++) // Receive trajectory complete reply rx[i] = USART_Receive_time_out(); // Turn 90 deg pr+=turn(0,90); // Radius not implemented! pl-=turn(0,90); while (send_pos(CM_RIGHT_LOAD_POS,pr) == CM_FAILED); while (send_pos(CM_LEFT_LOAD_POS, pl) == CM_FAILED); USART_Transmit(CM_BOTH_START_MOTION); USART_Receive(); for (i = 0 ; i < 14 ; i++) // Receive trajectory complete reply rx[i] = USART_Receive_time_out(); // Set maxspeed for demo switch(maxspeed) { case 0x05: maxspeed = 0x10; break; case 0x10: maxspeed = 0x20; break; case 0x20: maxspeed = 0x30; break; case 0x30: maxspeed = 0x05; break; } while (send_max_speed(CM_BOTH_SET_MAX_SPEED,maxspeed) == CM_FAILED); } }
BRUKSANVISNING
Sida 23
usart.c USART functions (usart.c) for Atmega16 for WINAVR Version 0.1ß 2007-06-18 Copyright (C) Andreas Kingbäck ([email protected]) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #pragma language=extended #ifndef ENABLE_BIT_DEFINITIONS #define ENABLE_BIT_DEFINITIONS // Enable the bit definitions in the iom128.h file #endif #include <ioavr.h> #include <stdio.h> #include <intrinsics.h> #include "usart.h" void USART_Init(double baud) { /* Set baud rate */ double bbaud; bbaud = (8000000/(8*baud))-1; UBRRH = (unsigned char)((unsigned int)bbaud >> 8); UBRRL = (unsigned char)bbaud & 0xFF; UCSRB = (1<<RXEN)|(1<<TXEN); UCSRA |= 2; // U2X } void USART_Transmit_Str(const char *str) { /* Wait for empty transmit buffer */ int i=0; while (str[i] != 0) { while ( !( UCSRA & (1<<UDRE)) ); UDR = str[i]; // Put data into buffer, sends the data i++; } } void USART_Transmit( unsigned char data ) { /* Wait for empty transmit buffer */ while ( !( UCSRA & (1<<UDRE)) ); /* Put data into buffer, sends the data */ UDR = data; }
BRUKSANVISNING
Sida 24
int USART_Receive_time_out( void ) { int timeout = 10000; // time out value /* Wait for data to be received */ int data; while (((UCSRA & 0x80) == 0) && (timeout > 0)) { __delay_cycles(8000); timeout --; } if ((UCSRA & 0x80) == 0) data = -1; // No data availible else data=UDR; return data; } unsigned char USART_Receive( void ) { /* Wait for data to be received */ unsigned char data; while ((UCSRA & 0x80) == 0); data=UDR; /* Get and return received data from buffer */ return data; } void USART_Flush( void ) { unsigned char dummy; while ( UCSRA & (1<<RXC) ) dummy = UDR; } unsigned char USART_ReadUCSRC( void ) { unsigned char ucsrc; /* Read UCSRC */ ucsrc = UBRRH; ucsrc = UCSRC; return ucsrc; } INTERRUPT_USART_RXC()// Interrupt driven USART Receive { unsigned char slask; __disable_interrupt(); slask = UCSRA; // Must read UCSRA with dummy read :-/ slask = UDR; __enable_interrupt(); }
BRUKSANVISNING
Sida 25
control.h /* Parser functions (control.h) for Atmega16 and WINAVR Version 0.2 2007-10-29 Copyright (C) Andreas Kingbäck 2005 ([email protected]) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef _PARSER_H_ #define _PARSER_H_ #include <ioavr.h> // Motor Control commands #define CM_LEFT_LOAD_POS 20 #define CM_RIGHT_LOAD_POS 21 #define CM_BOTH_LOAD_POS 22 #define CM_LEFT_START_MOTION 23 #define CM_RIGHT_START_MOTION 24 #define CM_BOTH_START_MOTION 25 #define CM_LEFT_SET_MAX_SPEED 26 #define CM_RIGHT_SET_MAX_SPEED 27 #define CM_BOTH_SET_MAX_SPEED 28 // Return codes #define CM_OK 254 #define CM_FAILED 255 // Status codes #define ROBOT_DISABLED 0 #define ROBOT_ACTIVATED 1 // Status codes #define true 1 #define false 0 #endif /* _PARSER_H_ */
BRUKSANVISNING
Sida 26
usart.h Usart functions (usart.h) for Atmega16 for IAR Version 0.1ß 2007-06-21 Copyright (C) Andreas Kingbäck ([email protected]) This program is free software; you can redistribute it and/or modify it under the terms of the GNU General Public License as published by the Free Software Foundation; either version 2 of the License, or (at your option) any later version. This program is distributed in the hope that it will be useful, but WITHOUT ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License for more details. You should have received a copy of the GNU General Public License along with this program; if not, write to the Free Software Foundation, Inc., 59 Temple Place, Suite 330, Boston, MA 02111-1307 USA */ #ifndef ENABLE_BIT_DEFINITIONS #define ENABLE_BIT_DEFINITIONS // Enable the bit definitions in the iom128.h file #endif #ifndef _USART_H_ #define _USART_H_ 1 #include <ioavr.h> #include <intrinsics.h> #define true 1 #define false 0 unsigned char USART_Receive( void ); int USART_Receive_time_out( void ); #define INTERRUPT_USART_RXC() _Pragma("vector=USART_RXC_vect") __interrupt void signal_func_USART1_RXC(void) #define INTERRUPT_USART_DATA() _Pragma("vector=USART_UDRE_vect") __interrupt void signal_func_USART1_UDRE_vect(void) void USART_Init(double baud); void USART_Transmit( unsigned char data ); void USART_Transmit_Str(const char *str ); void USART_Flush( void ); #endif /* _USARTUSB_H_ */