Project

General

Profile

Statistics
| Revision:

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

History | View | Annotate | Download (3.39 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_err_old;
22
volatile int right_err_old;
23

    
24
volatile int left_vel_old = 0;
25
volatile int right_vel_old = 0;
26

    
27
volatile int left_i = 0;
28
volatile int right_i = 0;
29

    
30
volatile int left_u;
31
volatile int right_u;
32

    
33
volatile int left_vel;
34
volatile int right_vel;
35

    
36
#define PL        1
37
#define DL        0.1
38
#define IL        0.1
39

    
40
/*
41
#define PR        1.5
42
#define DR        0.2
43
#define IR        0.1
44
*/
45
#define PR        1
46
#define DR        0.1
47
#define IR        0.1
48

    
49

    
50
#define INTERVAL        20
51

    
52
/* receive motor speed from master: 
53
 * left_speed left_dir right_speed right_dir
54
 * then sent raw encoder values back to master: 
55
 * high_left low_left high_right low_right 
56
 */
57
void packet_receive (char type, int source, char* packet, int length) {
58
        if (type != MOTOR) return;
59
        
60
        left_ref = packet[0];
61
        if (left_ref > 127)
62
                left_ref -= 256;
63
        right_ref = packet[1];
64
        if (right_ref > 127)
65
                right_ref -= 256;
66

    
67
//        sprintf(buf, "received: %d %d\n", left_ref, right_ref);
68
//        usb_puts(buf);
69
        //orb_set_color(GREEN);
70
}
71

    
72
void ctrl() {
73
        int left_err = left_ref - left_vel;
74
        int right_err = right_ref - right_vel;
75
        
76
        if (!left_ref)
77
                left_err = 0;
78
        if (!right_ref)
79
                right_err = 0;
80
        
81
//        left_err = left_vel == 2048 ? left_err_old : left_err;
82
//        right_err = right_vel == 2048 ? right_err_old : right_err;
83

    
84
        left_i += left_err;
85
        left_u = (int)(PL*(float)left_err + DL*(float)(left_err - left_err_old) + IL*(float)left_i);
86
        left_err_old = left_err;
87
        
88
        right_i += right_err;
89
        right_u = (int)(PR*(float)right_err + DR*(float)(right_err - right_err_old) + IR*(float)right_i);
90
        right_err_old = right_err;
91

    
92
//        sprintf(buf, "u: %d %d\n", left_u, right_u);
93
//        usb_puts(buf);
94
        
95
        if (left_u < 0) {
96
                left_dir = 0;
97
                left_u = -left_u;
98
        }
99
        else
100
                left_dir = 1;
101

    
102
        if (right_u < 0) {
103
                right_u = -right_u;
104
                right_dir = 0;
105
        }
106
        else
107
                right_dir = 1;
108

    
109
        left_u += 160;
110
        right_u += 160;
111

    
112
        left_u = left_u > 210 ? 210 : left_u;
113
        right_u = right_u > 210 ? 210 : right_u;
114

    
115
        if (!left_ref)
116
                left_u = 0;
117
        if (!right_ref)
118
                right_u = 0;
119
}
120

    
121
int main (void) {
122
        char encoder[2];
123
        dragonfly_init(ALL_ON);
124
        usb_init();
125
        encoders_init();
126
        //usb_puts("xbee id ");
127
        //usb_putc(wl_get_xbee_id());
128
        wl_init();
129

    
130
        wl_register_packet_group(&packetHandler);
131
        //orb_set_color(RED);
132
        //motor1_set(FORWARD,230);
133
        //motor2_set(FORWARD,230);
134
        
135
        while (1) {
136
                
137
                left_vel = encoder_get_v(0);
138
                right_vel = encoder_get_v(1);
139
                // err handling
140
                if (left_vel == 2048)
141
                        left_vel = left_vel_old;
142
                else 
143
                        left_vel_old = left_vel;
144
                
145
                if (right_vel == 2048)
146
                        right_vel = right_vel_old;
147
                else 
148
                        right_vel_old = right_vel;
149
                
150
                
151
                if (!(count % INTERVAL)) {
152
                        wl_send_global_packet(GROUP, ENCODER, encoder, 2, 0);
153
                        encoder[0] = left_vel;
154
                        encoder[1] = right_vel;
155
                        //sprintf(buf, "sent (%d): %d %d %d %d\n", count, left_vel, right_vel, encoder[0], encoder[1]);
156
                        //usb_puts(buf);
157
                }        
158

    
159
                ctrl();
160
        
161
                if (!(count % INTERVAL))
162
                        wl_do();
163
                
164
//                sprintf(buf, "motor (%d): %d %d %d %d\n", count, left_dir, left_ref, right_dir, right_ref);
165
//                usb_puts(buf);
166

    
167
                motor1_set(left_dir, left_u);
168
                motor2_set(right_dir, right_u);
169
                
170
                count++;
171
//                delay_ms(100);
172
        }
173
}
174