Revision 1803

branches/16299_s10/code/behaviors/formation_control/hive/hive.h (revision 1803)
1
#ifndef _CIRCLE_H
2
#define _CIRCLE_H
3

  
4
#include <inttypes.h>
5

  
6
/**** This file should not be edited! ****/
7

  
8
/*
9
 * The packet structure is 2 bytes
10
 * byte 0 is the action, which is one of the values below
11
 * byte 1 is the robot id
12
 */
13

  
14
#define CIRCLE_ACTION_EXIST 'E'
15
#define CIRCLE_ACTION_POSITION 'P'
16
#define CIRCLE_ACTION_ACK 'A'
17
#define CIRCLE_ACTION_DONE 'D'
18
//#define EDGE 0;
19
//#define BEACON 1;
20

  
21
#endif
branches/16299_s10/code/behaviors/formation_control/hive/hive.c (revision 1803)
1
#include <dragonfly_lib.h>
2
#include <wl_basic.h>
3
#include <encoders.h>
4
#include "hive.h"
5

  
6
int timeout = 0;
7
int sending = 0;
8
int desired_max_bom;
9
int bom_max_counter;
10

  
11

  
12
//Last used 12,13,7(BOM)
13
void set_desired_max_bom(int desired_angle)
14
{
15
    if (desired_angle >= 348 || desired_angle < 11) desired_max_bom = 0;
16
    if (desired_angle >= 11 && desired_angle < 33) desired_max_bom = 1;
17
    if (desired_angle >= 33 && desired_angle < 56) desired_max_bom = 2;
18
    if (desired_angle >= 56 && desired_angle < 78) desired_max_bom = 3;
19
    if (desired_angle >= 78 && desired_angle < 101) desired_max_bom = 4;
20
    if (desired_angle >= 101 && desired_angle < 123) desired_max_bom = 5;
21
    if (desired_angle >= 123 && desired_angle < 145) desired_max_bom = 6;
22
    if (desired_angle >= 145 && desired_angle < 167) desired_max_bom = 7;
23
    if (desired_angle >= 167 && desired_angle < 190) desired_max_bom = 8;
24
    if (desired_angle >= 190 && desired_angle < 212) desired_max_bom = 9;
25
    if (desired_angle >= 212 && desired_angle < 235) desired_max_bom = 10;
26
    if (desired_angle >= 235 && desired_angle < 257) desired_max_bom = 11;
27
    if (desired_angle >= 257 && desired_angle < 280) desired_max_bom = 12;
28
    if (desired_angle >= 280 && desired_angle < 302) desired_max_bom = 13;
29
    if (desired_angle >= 302 && desired_angle < 325) desired_max_bom = 14;
30
    if (desired_angle >= 325 && desired_angle < 348) desired_max_bom = 15;
31
}
32

  
33
void forward(int speed){			// set the motors to this forward speed.
34
	motor_l_set(FORWARD,speed);
35
	motor_r_set(FORWARD,speed);
36
}
37
void left(int speed){				// turn left at this speed.
38
	motor_l_set(FORWARD,speed);
39
	motor_r_set(BACKWARD,speed);
40
}
41
void right(int speed){
42
	motor_l_set(BACKWARD,speed);
43
	motor_r_set(FORWARD,speed);
44
}
45
void stop(void){					// could be set to motors_off(), or just use this as an alternative.
46
	motor_l_set(BACKWARD,0);			// stop() is better - motors_off() creates a slight delay to turn them back on.
47
	motor_r_set(FORWARD,0);
48
}
49
void setforward(int spd1, int spd2){
50
	motor_l_set(FORWARD,spd1);
51
	motor_r_set(FORWARD,spd2);
52
}
53
void backward(int speed){
54
	motor_l_set(BACKWARD, speed);
55
	motor_r_set(BACKWARD, speed);
56
}
57

  
58

  
59
void switch_sending(void)
60
{
61
    if(sending)
62
    {
63
	sending = 0;
64
	bom_off();
65
    }
66
    else
67
    {
68
	sending = 1;
69
	bom_on();
70
    }
71
}
72

  
73

  
74

  
75
int get_distance(void){				// takes an averaged reading of the front rangefinder
76
    int temp,distance,kk=5;			// kk sets this to 5 readings.
77
    distance =0;
78
    for (int i=0; i<kk; i++){
79
	temp = range_read_distance(IR2);
80
	if (temp == -1)
81
	{
82
	    //temp=0;
83
	    i--;
84
	}
85
	else
86
	    distance+= temp;
87
	delay_ms(3);
88
    }
89
    if (kk>0)
90
	return (int)(distance/kk);
91
    else 
92
	return 0;
93
}
94

  
95

  
96

  
97
/*
98
  Orients the robot so that it is facing the beacon (or the broadcasting BOM).
99
	
100
*/
101
void correctTurn(void)
102
{
103
    orb1_set_color(BLUE);			// BLUE and PURPLE
104
    left(220);
105
    while(1)
106
    {
107
	int bomNum = 0;				// bomNum is the current maximum reading
108
	bom_refresh(BOM_ALL);
109
	bomNum = bom_get_max();
110
	usb_puti(bomNum);
111
	if(bomNum == 4)				// when it's turned the right way, stop
112
	{
113
	    timeout = 0;
114
	    //motor_l_set(1, 200);
115
	    //motor_r_set(1, 200);
116
	    break;				// exits the while() loop to stop the method
117
	}
118
	else					// facing the wrong way
119
	{
120
	    if(bomNum == -1)
121
	    {
122
		timeout++;
123
				
124
		if(timeout > 5000)	// if it's been looking too long, move a little bit as it turns
125
		{
126
		    motor_r_set(FORWARD, 210);
127
		    motor_l_set(BACKWARD, 190);
128
		}
129
	    }
130
	    else if((bomNum >= 12) || (bomNum < 4))
131
	    {
132
		motor_l_set(FORWARD, 200);
133
		motor_r_set(BACKWARD, 200);
134
		timeout = 0;
135
	    }
136
	    else
137
	    {
138
		motor_l_set(BACKWARD, 200);
139
		motor_r_set(FORWARD, 200);
140
		timeout = 0;
141
	    }
142
	}
143
    }
144
    return;
145
}
146

  
147

  
148

  
149
/* 
150
   drives forward a hardcoded distance. May not be useful.
151
*/
152
void go_straight(void){
153
    forward(200);
154
    encoder_rst_dx(LEFT);
155
    encoder_rst_dx(RIGHT);
156
    delay_ms(100); 
157
    int x_left = encoder_get_x(LEFT), x_right = encoder_get_x(RIGHT);
158
    int count = 0;
159
    int d;
160
    while (count<25){						//count = 25 when bot6; count <12
161
	x_left = encoder_get_x(LEFT);
162
	x_right = encoder_get_x(RIGHT);
163
	d = x_right-x_left;
164
	if (d>13 || d<-13){
165
	    if(d<50 && d>-50){
166
		d = round(1.0*d/4);
167
		setforward(200+d, 200-d);
168
	    }
169
	}
170
	delay_ms(32);
171
	count++;
172
    }
173
}
174

  
175

  
176
/* 
177
   BLINK the given number times
178
*/
179
void blink(int num) {
180
    for(int i = 0; i<num; i++)
181
    {
182
	orb_set_color(ORB_OFF);
183
	delay_ms(350);
184
	orb_set_color(RED);
185
	delay_ms(200);
186
    }
187
    orb_set_color(ORB_OFF);
188
}
189

  
190

  
191
int main(void)
192
{
193
    /* Initialize dragonfly board */
194
    dragonfly_init(ALL_ON);
195
    /* Initialize the basic wireless library */
196
    wl_basic_init_default();
197
    /* Set the XBee channel to your assigned channel */	/* Set the XBee channel to your assigned channel */
198
    wl_set_channel(24);
199

  
200

  
201
    orb_set_color(RED);
202
    while(1); /* END HERE */
203

  
204
    //return 0;
205
}
branches/16299_s10/code/behaviors/formation_control/hive/Makefile (revision 1803)
1
# this is a local makefile
2

  
3
# Relative path to the root directory (containing lib directory)
4
ifndef COLONYROOT
5
COLONYROOT := ..
6

  
7
# Target file name (without extension).
8
TARGET = hive
9

  
10
# Uncomment this to use the wireless library
11
USE_WIRELESS = 1
12

  
13
# com1 = serial port. Use lpt1 to connect to parallel port.
14
AVRDUDE_PORT = $(shell if uname -s |grep -i w32 >/dev/null; then echo 'COM4:'; else echo '/dev/ttyUSB0'; fi)
15
#AVRDUDE_PORT = $(shell if uname -s |grep -i w32 >/dev/null; then echo 'COM4:'; else echo '/dev/ttyUSB0'; fi)
16
else
17
COLONYROOT := ../$(COLONYROOT)
18
endif
19

  
20
include $(COLONYROOT)/Makefile

Also available in: Unified diff