Project

General

Profile

Revision 1344

Final version of feedback controls project

View differences:

slave.c
3 3

  
4 4
#define GROUP 1
5 5
#define MOTOR 0
6
#define ENCODER 1
6
#define ENCODER 132
7 7

  
8
#define LS 0
9
#define LD 1
10
#define RS 2
11
#define RD 3
8
void packet_receive (char type, int source, char* packet, int length);
9
void ctrl(void);
12 10

  
13
#define H0 0
14
#define L0 1
15
#define H1 2
16
#define L1 3
17

  
18
void packet_receive (char type, int source, unsigned char* packet, int length);
19

  
20 11
PacketGroupHandler packetHandler = {GROUP, NULL, NULL, &packet_receive, NULL};
21 12

  
22 13
char buf[32];
23
int count = 0;
24
int left_dir = FORWARD;
25
int right_dir = FORWARD;
26
int left_speed = 0;
27
int right_speed = 0;
14
long unsigned int count = 0;
15
volatile int left_dir = FORWARD;
16
volatile int right_dir = FORWARD;
28 17

  
18
volatile int left_ref;
19
volatile int right_ref;
20

  
21
volatile int left_old;
22
volatile int right_old;
23

  
24
volatile int left_i = 0;
25
volatile int right_i = 0;
26

  
27
volatile int left_u;
28
volatile int right_u;
29

  
30
volatile int left_vel = 0;
31
volatile int right_vel = 0;
32

  
33
#define PL	1
34
#define DL	0.1
35
#define IL	0.1
36

  
37
#define PR	1.5
38
#define DR	0.2
39
#define IR	0.1
40

  
41

  
42
#define INTERVAL	50
43

  
29 44
/* receive motor speed from master: 
30 45
 * left_speed left_dir right_speed right_dir
31 46
 * then sent raw encoder values back to master: 
32 47
 * high_left low_left high_right low_right 
33 48
 */
34
void packet_receive (char type, int source, unsigned char* packet, int length) {
49
void packet_receive (char type, int source, char* packet, int length) {
35 50
	if (type != MOTOR) return;
36
	//orb_set_color(WHITE);
37
	left_dir = packet[LD];
38
	left_speed = packet[LS];
39
	right_dir = packet[RD];
40
	right_speed = packet[RS];
41
	sprintf(buf, "Received: %d %d %d %d\n", packet[LS], packet[LD], packet[RS], packet[RD]);
51
	
52
	left_ref = packet[0];
53
	right_ref = packet[1];
54

  
55
	sprintf(buf, "received: %d %d\n", left_ref, right_ref);
42 56
	usb_puts(buf);
43
	//motor1_set(packet[LD],packet[LS]);
44
	//motor2_set(packet[RD],packet[RS]);
45 57
	//orb_set_color(GREEN);
46 58
}
47 59

  
60
void ctrl() {
61
	int left_err = left_ref - left_vel;
62
	int right_err = right_ref - right_vel;
63
	
64
	left_err = left_vel == 2048 ? left_old : left_err;
65
	right_err = right_vel == 2048 ? right_old : right_err;
66

  
67
	left_i += left_err;
68
	left_u = (int)(PL*(float)left_err + DL*(float)(left_err - left_old) + IL*(float)left_i);
69
	left_old = left_err;
70
	
71
	right_i += right_err;
72
	right_u = (int)(PR*(float)right_err + DR*(float)(right_err - right_old) + IR*(float)right_i);
73
	right_old = right_err;
74

  
75
	if (left_u < 0) {
76
		left_dir = 0;
77
		left_u = -left_u;
78
	}
79
	else
80
		left_dir = 1;
81

  
82
	if (right_u < 0) {
83
		right_u = -right_u;
84
		right_dir = 0;
85
	}
86
	else
87
		right_dir = 1;
88

  
89
	left_u += 160;
90
	right_u += 160;
91

  
92
	left_u = left_u > 210 ? 210 : left_u;
93
	right_u = right_u > 210 ? 210 : right_u;
94
}
95

  
48 96
int main (void) {
97
	char encoder[2];
49 98
	dragonfly_init(ALL_ON);
50 99
	usb_init();
51 100
	encoders_init();
52 101
	//usb_puts("xbee id ");
53 102
	//usb_putc(wl_get_xbee_id());
54 103
	wl_init();
55

  
104
    left_ref = 20;
105
	right_ref = 20;
56 106
	wl_register_packet_group(&packetHandler);
57 107
	//orb_set_color(RED);
58 108
	//motor1_set(FORWARD,230);
59 109
	//motor2_set(FORWARD,230);
60

  
110
	
61 111
	while (1) {
62
		int encoder_left = encoder_get_v(LEFT);
63
		int encoder_right = encoder_get_v(RIGHT);
64
		unsigned char encoder[4];
65
		encoder[H0] = (encoder_left >> 8) & 0xFF;
66
		encoder[L0] = (encoder_left) & 0xFF;
67
		encoder[H1] = (encoder_right >> 8) & 0xFF;
68
		encoder[L1] = (encoder_right) & 0xFF;
69
		wl_send_global_packet(GROUP, ENCODER, encoder, 4, 0);
70
		sprintf(buf, "Sent (%d): %d %d\n", count++, encoder_left, encoder_right);
71
		usb_puts(buf);
112
		usb_puts("We Win\n");
113
	    //left_vel = encoder_get_v(0);
114
		//right_vel = encoder_get_v(1);
115
		 delay_ms(1000);
116
		//if (!(count % INTERVAL)) {
117
		//	wl_send_global_packet(GROUP, ENCODER, encoder, 2, 0);
118
			encoder[0] = left_vel;
119
			encoder[1] = right_vel;
120
		
121
		   // usb_puti(left_vel);
122
		  //  sprintf(buf, "sent (%d): %d %d %d %d\n", count, left_vel, right_vel, encoder[0], encoder[1]);
123
		   // usb_puts(buf);
124
		   // usb_puti(encoder[0]);
125
	  //  }
126
		
72 127

  
73
		wl_do();
74
		motor1_set(left_dir, left_speed);
75
		motor2_set(right_dir, right_speed);
76
		delay_ms(100);
128
		//ctrl();
129
	
130
	  //  if (!(count % INTERVAL))
131
	  //  	wl_do();
132
		
133
//		sprintf(buf, "motor (%d): %d %d %d %d\n", count, left_dir, left_ref, right_dir, right_ref);
134
//		usb_puts(buf);
135

  
136
	    //motor1_set(left_dir, left_u);
137
		//motor2_set(right_dir, right_u);
138
		
139
		count++;
140
	    delay_ms(1000);
77 141
	}
78 142
}
79

  

Also available in: Unified diff