Project

General

Profile

Statistics
| Revision:

root / trunk / code / behaviors / formation_control / circle / circle.c @ 1517

History | View | Annotate | Download (3.44 KB)

1
#include <dragonfly_lib.h>
2
#include <encoders.h>
3

    
4
#define RADIUS 300
5

    
6
extern void blink(int);
7
extern void search(void);
8
extern void approach(void);
9
extern void lastDrive(void);
10

    
11
int main(void)
12
{
13

    
14
        /* Initialize dragonfly board */
15
        dragonfly_init(ALL_ON);
16
        encoders_init();
17

    
18
        orb_set_color(GREEN);
19
        delay_ms(300);
20
                
21
        search();
22
        
23
        approach();
24
        
25
        while(1); /* END HERE */
26

    
27
        return 0;
28
}
29

    
30

    
31

    
32
void blink(int num)
33
{
34
        for(int i = 0; i<num; i++)
35
        {
36
                orb_set_color(ORB_OFF);
37
                delay_ms(200);
38
                orb_set_color(RED);
39
                delay_ms(200);
40
        }
41
        orb_set_color(ORB_OFF);
42
}
43
void search()        //makes the robot face the beacon
44
{
45
        orb_set_color(YELLOW);        //show that the robot is searching
46
        bom_refresh(BOM_ALL);
47
        int top=bom_get_max();
48
        
49
        if ((top<4) || (top>11))        //determine which way to turn
50
        {
51
                motor_r_set(BACKWARD,200);
52
                motor_l_set(FORWARD,200);
53
        }
54
        else if((top>4) && (top<12))
55
        {
56
                motor_r_set(FORWARD,200);
57
                motor_l_set(BACKWARD,200);
58
        }
59
        while (top != 4)
60
        {
61
                bom_refresh(BOM_ALL);
62
                top=bom_get_max();
63
        }
64
        motors_off();
65
}
66
void approach()
67
{
68
        int dist = 0;
69
        int temp = 0;
70
        int counter = 0;
71
//        int correct = 0;
72
        
73
        while(dist != RADIUS)        //puts the robots in the given distance RADIUS
74
        {
75
                temp=0;
76
                counter = 0;
77
                
78
                while(counter<8)
79
                {
80
                        if(range_read_distance(IR2) == -1){}
81
                        
82
                        else
83
                        {
84
                                temp += range_read_distance(IR2);
85
                                counter++;
86
                        }
87
                        delay_ms(20);
88
                }
89
                dist = temp/8;
90
                
91
                /*if (correct >2){
92
                        orb_set_color(RED);
93
                        break;
94
                        
95
                        }        // stop within the dead zone: it knows it is in the dead zone if it hits +- 15 from RADIUS 3 times*/
96
                bom_refresh(BOM_ALL);
97
                int top = bom_get_max();
98
                while(top!=4)
99
                {
100
                        search();
101
                        bom_refresh(BOM_ALL);
102
                        top = bom_get_max();
103
                }        
104
                
105
                if ( dist<(RADIUS+30) && dist>(RADIUS-30)) {        // the dead zone
106
                        orb_set_color(RED);
107
                        break;
108
                }
109
                
110
                else if ((dist>RADIUS) || (dist==-1))
111
                {                        
112
                        ///delay_ms(200);
113
                        search();
114
                        
115
                        motor_r_set(FORWARD,200);
116
                        motor_l_set(FORWARD,200);
117
                }
118
                else if ((dist<RADIUS))
119
                {
120
                        //delay_ms(200);
121
                        search();
122
                        
123
                        motor_r_set(BACKWARD,200);
124
                        motor_l_set(BACKWARD,200);
125
                }
126
                
127
        }
128
        
129
        orb_set_color(BLUE);
130
        
131
        motors_off();
132

    
133
        /*usb_puti(range_read_distance(IR2));
134
        usb_puts("\n\r");
135
        motor_r_set(FORWARD,200);
136
        motor_l_set(FORWARD,200);
137
        delay_ms(300);
138
        usb_puti(range_read_distance(IR2));
139
        usb_puts("\n\r");
140
        delay_ms(300);
141
        usb_puti(range_read_distance(IR2));
142
        usb_puts("\n\r");
143
        delay_ms(300);
144
        usb_puti(range_read_distance(IR2));
145
        usb_puts("\n\r");*/
146
}
147
void lastDrive()
148
{
149
        int lspeed = 190;
150
        int rspeed = 190;
151
        int firstldist = encoder_get_x(LEFT);
152
        int firstrdist = encoder_get_x(RIGHT);
153
        int ldist = firstldist;
154
        int rdist = firstrdist;
155
        while ( (ldist-firstldist<800) && (rdist-firstrdist<800) )
156
        {
157
                motor_l_set(FORWARD,lspeed);
158
                motor_r_set(FORWARD,rspeed);
159
                
160
                int lvel = encoder_get_v(LEFT);
161
                int rvel = encoder_get_v(RIGHT);
162
                
163
                usb_puts("\n\rLeft distance: ");
164
                usb_puti(ldist-firstldist);
165
                usb_puts("\n\rRight distance: ");
166
                usb_puti(rdist-firstrdist);
167
                usb_puts("\n\rLeft velocity: ");
168
                usb_puti(lvel);
169
                usb_puts("\n\rRight velocity: ");
170
                usb_puti(rvel);
171
                usb_puts("\n\r\n\r");
172
                
173
                if (rvel<lvel)
174
                {
175
                        rspeed += 1;
176
                        lspeed -= 1;
177
                }
178
                else if (rvel>lvel)
179
                {
180
                        rspeed -= 1;
181
                        lspeed += 1;
182
                }
183
                ldist = encoder_get_x(LEFT);
184
                rdist = encoder_get_x(RIGHT);
185
                
186
                delay_ms(25);
187
        }
188
        motors_off();
189
        orb_set_color(GREEN);
190
}