Project

General

Profile

Statistics
| Revision:

root / branches / encoders / code / behaviors / spline / slave / slave.c @ 1344

History | View | Annotate | Download (2.95 KB)

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

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

    
8
void packet_receive (char type, int source, char* packet, int length);
9
void ctrl(void);
10

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

    
13
char buf[32];
14
long unsigned int count = 0;
15
volatile int left_dir = FORWARD;
16
volatile int right_dir = FORWARD;
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

    
44
/* receive motor speed from master: 
45
 * left_speed left_dir right_speed right_dir
46
 * then sent raw encoder values back to master: 
47
 * high_left low_left high_right low_right 
48
 */
49
void packet_receive (char type, int source, char* packet, int length) {
50
        if (type != MOTOR) return;
51
        
52
        left_ref = packet[0];
53
        right_ref = packet[1];
54

    
55
        sprintf(buf, "received: %d %d\n", left_ref, right_ref);
56
        usb_puts(buf);
57
        //orb_set_color(GREEN);
58
}
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

    
96
int main (void) {
97
        char encoder[2];
98
        dragonfly_init(ALL_ON);
99
        usb_init();
100
        encoders_init();
101
        //usb_puts("xbee id ");
102
        //usb_putc(wl_get_xbee_id());
103
        wl_init();
104
    left_ref = 20;
105
        right_ref = 20;
106
        wl_register_packet_group(&packetHandler);
107
        //orb_set_color(RED);
108
        //motor1_set(FORWARD,230);
109
        //motor2_set(FORWARD,230);
110
        
111
        while (1) {
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
                
127

    
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);
141
        }
142
}