root / trunk / code / projects / colonet / utilities / robot_slave / dragonfly_lib.c @ 13
History | View | Annotate | Download (11.4 KB)
1 |
#include <dragonfly_lib.h> |
---|---|
2 |
|
3 |
/* init_dragonfly - Initializes functions based on configuration parameters
|
4 |
examples:
|
5 |
|
6 |
init_dragonfly (0, 0, 0); - just initialize the digital IO (buttons, potentiometer)
|
7 |
|
8 |
init_dragonfly (ANALOG | SERIAL | BUZZER, C0_C1_ANALOG, BAUD115200);
|
9 |
Initialize ADC and set C0 and C1 as analog inputs. Initialize serial and set baud rate
|
10 |
to 115200 bps. Initialize the buzzer.
|
11 |
|
12 |
init_dragonfly (MOTORS | ORB, 0, 0);
|
13 |
Initialize motor driving and the color fading abilities of the ORB. */
|
14 |
|
15 |
void dragonfly_init(int config) |
16 |
{ |
17 |
// Set directionality of various IO pins
|
18 |
DDRG &= ~(_BV(PING0)|_BV(PING1)); |
19 |
PORTG |= _BV(PING0)|_BV(PING1); |
20 |
|
21 |
if(config & ANALOG) {
|
22 |
analog_init(); |
23 |
} |
24 |
|
25 |
if(config & COMM) {
|
26 |
//Defaults to 115200. Check serial.h for more information.
|
27 |
sei(); |
28 |
usb_init(); |
29 |
xbee_init(); |
30 |
} |
31 |
|
32 |
if(config & BUZZER) {
|
33 |
sei(); |
34 |
buzzer_init(); |
35 |
} |
36 |
|
37 |
if(config & ORB) {
|
38 |
sei(); |
39 |
orb_init(); |
40 |
} |
41 |
|
42 |
if(config & MOTORS) {
|
43 |
motors_init(); |
44 |
} |
45 |
|
46 |
if(config & SERVOS) {
|
47 |
sei(); |
48 |
//Servos not yet implemented
|
49 |
//servo_init();
|
50 |
} |
51 |
|
52 |
if(config & LCD) {
|
53 |
lcd_init(); |
54 |
} |
55 |
|
56 |
if(config & (SERVOS | ORB)) {
|
57 |
sei(); |
58 |
orb_init(); |
59 |
//Servos not yet implemented
|
60 |
} |
61 |
|
62 |
// delay a bit for stability
|
63 |
_delay_ms(1);
|
64 |
} |
65 |
|
66 |
void adc_gain_test(void); |
67 |
void analog_test(void); |
68 |
void batt_test(void); |
69 |
void button_test(void); |
70 |
void buzzer_test(void); |
71 |
void dio_test(void); |
72 |
void general_test(void); |
73 |
void i2c_test(void); |
74 |
void lcd_test(void); |
75 |
void motor_test(void); |
76 |
void orb_test(void); |
77 |
void pullup_test(void); |
78 |
void ranger_test(void); |
79 |
void reset_test(void); |
80 |
void ring_buffer_tester(void); |
81 |
void rtc_test(void); |
82 |
void rtc_test_pulse(void); |
83 |
void serial_test(void); |
84 |
void servo_orb_test(void); |
85 |
void wl_receive_test(void); |
86 |
void wl_send_test(void); |
87 |
void wl_send_packet_test(void); |
88 |
void move_test(void); |
89 |
|
90 |
void move_test(void){ |
91 |
range_init(); |
92 |
motors_init(); |
93 |
analog_init(); |
94 |
while(1){ |
95 |
move_avoid(200,0,50 ); |
96 |
} |
97 |
} |
98 |
|
99 |
void general_test(){
|
100 |
int i;
|
101 |
dragonfly_init(MOTORS|BUZZER|ORB|USB); |
102 |
|
103 |
while(1){ |
104 |
if(button1_read()){
|
105 |
|
106 |
for(i=0;i<17;i++){ |
107 |
buzzer_set_val(i); |
108 |
delay_ms(100);
|
109 |
} |
110 |
|
111 |
buzzer_off(); |
112 |
|
113 |
motor1_set(1, 255); |
114 |
motor2_set(1, 255); |
115 |
|
116 |
delay_ms(3000);
|
117 |
|
118 |
motor1_set(1, 200); |
119 |
|
120 |
delay_ms(1000);
|
121 |
motor1_set(0, 255); |
122 |
motor2_set(0, 255); |
123 |
|
124 |
delay_ms(3000);
|
125 |
motors_off(); |
126 |
} |
127 |
if(button2_read()){
|
128 |
orb_enable(); |
129 |
orb1_set_color(RED); |
130 |
delay_ms(500);
|
131 |
orb2_set_color(GREEN); |
132 |
delay_ms(500);
|
133 |
orb1_set_color(YELLOW); |
134 |
delay_ms(500);
|
135 |
orb2_set_color(CYAN); |
136 |
delay_ms(500);
|
137 |
orb1_set_color(WHITE); |
138 |
delay_ms(500);
|
139 |
orb2_set_color(WHITE); |
140 |
delay_ms(500);
|
141 |
orb_disable(); |
142 |
|
143 |
} |
144 |
|
145 |
} |
146 |
} |
147 |
|
148 |
void reset_test() {
|
149 |
|
150 |
dragonfly_init(ORB|SERIAL); |
151 |
|
152 |
delay_ms(1000);
|
153 |
usb_puti((int)DDRE);
|
154 |
|
155 |
orb_set_color(RED); |
156 |
delay_ms(1000);
|
157 |
|
158 |
orb_set_color(GREEN); |
159 |
delay_ms(1000);
|
160 |
|
161 |
DDRE |= 0x80;
|
162 |
|
163 |
reset(); |
164 |
|
165 |
/*
|
166 |
alternate implelmentation using external interrupts
|
167 |
maintains register values on reset
|
168 |
|
169 |
sei();
|
170 |
EIMSK |= 0x80;
|
171 |
EICRB |= 0xC0;
|
172 |
DDRE |= 0x80;
|
173 |
PORTE &= 0x7F;
|
174 |
PORTE |= 0x80;
|
175 |
*/
|
176 |
|
177 |
/*
|
178 |
should not reach here
|
179 |
*/
|
180 |
|
181 |
orb_set_color(BLUE); |
182 |
delay_ms(1000);
|
183 |
} |
184 |
|
185 |
void ring_buffer_tester (void) { |
186 |
|
187 |
dragonfly_init(ALL_ON & ~ORB); |
188 |
orb_disable(); |
189 |
|
190 |
RING_BUFFER_NEW(ring_buffer, 12, int, buffer); |
191 |
RING_BUFFER_INIT(buffer, 12);
|
192 |
RING_BUFFER_CLEAR(buffer); |
193 |
|
194 |
for(int i=0;i<10;i++) |
195 |
RING_BUFFER_ADD(buffer, 0);
|
196 |
|
197 |
int x;
|
198 |
for(int i = 0; i < 100; i++) { |
199 |
|
200 |
RING_BUFFER_REMOVE(buffer, x); |
201 |
|
202 |
RING_BUFFER_ADD(buffer, i); |
203 |
|
204 |
usb_puti(i-x); |
205 |
usb_putc(' ');
|
206 |
|
207 |
} |
208 |
|
209 |
usb_puts("\n\rfull? " );
|
210 |
usb_puti(RING_BUFFER_FULL(buffer)); |
211 |
|
212 |
while(!RING_BUFFER_FULL(buffer))
|
213 |
RING_BUFFER_ADD(buffer, 0);
|
214 |
|
215 |
usb_puts("\n\rfilling... full? " );
|
216 |
usb_puti(RING_BUFFER_FULL(buffer)); |
217 |
|
218 |
usb_puts("\n\rempty? " );
|
219 |
usb_puti(RING_BUFFER_EMPTY(buffer)); |
220 |
usb_puts("\n\rclearing... empty? ");
|
221 |
RING_BUFFER_CLEAR(buffer); |
222 |
usb_puti(RING_BUFFER_EMPTY(buffer)); |
223 |
|
224 |
usb_puts("\n\r");
|
225 |
|
226 |
|
227 |
} |
228 |
|
229 |
#define WL_BAUD BAUD115200
|
230 |
//serial -- XBEE
|
231 |
//serial1 -- USB
|
232 |
|
233 |
void wl_send_test(void) { |
234 |
|
235 |
int i;
|
236 |
|
237 |
usb_init(); //WIRED
|
238 |
xbee_init(); //WIRELESS
|
239 |
|
240 |
orb_init(); |
241 |
sei(); |
242 |
|
243 |
while(1) { |
244 |
|
245 |
for(i = 32; i <= 126; i++) { |
246 |
|
247 |
if(i%4) { |
248 |
orb1_set(255, 0, 0); |
249 |
} |
250 |
else {
|
251 |
orb1_set(0,0,0); |
252 |
} |
253 |
|
254 |
usb_putc(i); //wired
|
255 |
xbee_putc(i); //wireless
|
256 |
delay_ms(100);
|
257 |
|
258 |
} |
259 |
|
260 |
} |
261 |
|
262 |
return;
|
263 |
} |
264 |
|
265 |
void wl_send_packet_test(void) { |
266 |
|
267 |
int i;
|
268 |
|
269 |
usb_init(); //WIRED
|
270 |
xbee_init(); //WIRELESS
|
271 |
|
272 |
orb_init(); |
273 |
sei(); |
274 |
|
275 |
while(1) { |
276 |
|
277 |
for(i = 65; i <= 122; i++) { |
278 |
usb_putc(i); //wired
|
279 |
xbee_putc(i); //wireless
|
280 |
//delay_ms(100);
|
281 |
} |
282 |
|
283 |
delay_ms(1000);
|
284 |
|
285 |
} |
286 |
|
287 |
return;
|
288 |
} |
289 |
|
290 |
volatile char c; |
291 |
volatile char haveNew = 0; |
292 |
|
293 |
|
294 |
void wl_receive_test(void) { |
295 |
|
296 |
|
297 |
usb_init(); |
298 |
xbee_init(); |
299 |
orb_init(); |
300 |
|
301 |
|
302 |
c = '.';
|
303 |
|
304 |
xbee_putc('r');
|
305 |
|
306 |
|
307 |
UCSR1B |= _BV(RXCIE); |
308 |
UCSR0B |= _BV(RXCIE); |
309 |
sei(); |
310 |
|
311 |
orb1_set(255, 0, 0); //blue |
312 |
|
313 |
|
314 |
while(1) { |
315 |
|
316 |
if(haveNew) {
|
317 |
xbee_putc(c); |
318 |
haveNew = 0;
|
319 |
} |
320 |
} |
321 |
|
322 |
orb1_set(0, 0, 255); //green |
323 |
|
324 |
while(1); |
325 |
|
326 |
} |
327 |
/*
|
328 |
ISR(USART1_RX_vect) {
|
329 |
|
330 |
c = UDR1;
|
331 |
haveNew = 1;
|
332 |
}
|
333 |
|
334 |
ISR(USART0_RX_vect) {
|
335 |
|
336 |
c = UDR0;
|
337 |
haveNew = 1;
|
338 |
}
|
339 |
*/
|
340 |
void buzzer_test(void) |
341 |
{ |
342 |
sei(); |
343 |
buzzer_init(); |
344 |
unsigned int i = 0; |
345 |
|
346 |
while(1) { |
347 |
buzzer_set_val(i); |
348 |
if (i == 20) { |
349 |
i = 0;
|
350 |
delay_ms(250);
|
351 |
} else {
|
352 |
i++; |
353 |
} |
354 |
|
355 |
delay_ms(100);
|
356 |
} |
357 |
} |
358 |
|
359 |
void adc_gain_test(void) |
360 |
{ |
361 |
analog_init(); |
362 |
lcd_init(); |
363 |
|
364 |
while(1) |
365 |
{ |
366 |
|
367 |
lcd_putint(ADCH); |
368 |
delay_ms(100);
|
369 |
lcd_clear_screen(); |
370 |
} |
371 |
|
372 |
|
373 |
|
374 |
} |
375 |
|
376 |
void ranger_test( void ) |
377 |
{ |
378 |
lcd_init(); |
379 |
|
380 |
while(1) { |
381 |
lcd_clear_screen(); |
382 |
lcd_putint(linearize_distance(read_distance(PIN_C0))); |
383 |
delay_ms(100);
|
384 |
|
385 |
} |
386 |
|
387 |
} |
388 |
|
389 |
|
390 |
void button_test ( void) |
391 |
{ |
392 |
dragonfly_init(ALL_ON); |
393 |
|
394 |
|
395 |
move(200,0); |
396 |
|
397 |
while(1) { |
398 |
|
399 |
|
400 |
if(button1_read()) {
|
401 |
//lcd_putchar('1');
|
402 |
usb_putc('1');
|
403 |
} else if(button2_read()) { |
404 |
//lcd_putchar('2');
|
405 |
usb_putc('2');
|
406 |
} |
407 |
|
408 |
} |
409 |
|
410 |
|
411 |
|
412 |
} |
413 |
void motor_test (void) { |
414 |
|
415 |
motors_init(); |
416 |
//led_init();
|
417 |
|
418 |
//motor1_set(1, 255);
|
419 |
//motor2_set(1, 255);
|
420 |
move(200,0); |
421 |
|
422 |
delay_ms(5000);
|
423 |
|
424 |
//motor1_set(0, 200);
|
425 |
move(200,100); |
426 |
|
427 |
delay_ms(5000);
|
428 |
|
429 |
//motor2_set(0, 170);
|
430 |
move(200,0); |
431 |
|
432 |
delay_ms(5000);
|
433 |
motors_off(); |
434 |
//LED USER NO LONGER EXISTS
|
435 |
//led_user(1);
|
436 |
|
437 |
|
438 |
while(1); |
439 |
|
440 |
|
441 |
|
442 |
} |
443 |
|
444 |
void orb_test( void ) { |
445 |
int orbs[12] = { ORB_OFF, RED, ORANGE, YELLOW, LIME, GREEN, CYAN, BLUE, PINK, PURPLE, MAGENTA, WHITE }; |
446 |
int orb_select = 0; |
447 |
lcd_init(); |
448 |
orb_init(); |
449 |
sei(); |
450 |
orb2_set(254, 253, 252); |
451 |
orb1_set(251, 250, 249); |
452 |
while(1) { |
453 |
|
454 |
orb_set_color(orbs[orb_select]); |
455 |
/*orb_set1(251, 250, 249);
|
456 |
delay_ms(2000);
|
457 |
orb_set1(255, 1,2);
|
458 |
delay_ms(1000);
|
459 |
orb_set1(1, 255, 2);
|
460 |
delay_ms(1000);
|
461 |
orb_set1(1, 2, 255);
|
462 |
*/
|
463 |
delay_ms(3000);
|
464 |
|
465 |
orb_select++; |
466 |
|
467 |
|
468 |
|
469 |
if(orb_select == 13) { |
470 |
orb_disable(); |
471 |
delay_ms(2000);
|
472 |
orb_enable(); |
473 |
orb_select = 0;
|
474 |
} |
475 |
|
476 |
/*
|
477 |
for (int i = 0; i < 256; i++) {
|
478 |
for (int j = 0; j < 256; j++) {
|
479 |
for (int k = 0; k < 256; k++) {
|
480 |
orb_set(i, j, k);
|
481 |
}
|
482 |
}
|
483 |
}
|
484 |
*/
|
485 |
} |
486 |
return;
|
487 |
|
488 |
} |
489 |
|
490 |
void servo_orb_test( void ) { |
491 |
// int orbs[13] = { ORB_OFF, RED, ORANGE, YELLOW, LIME, GREEN, CYAN, BLUE, PURPLE, PINK, PURPLE, MAGENTA, WHITE };
|
492 |
int orb_select = 0; |
493 |
|
494 |
orb_init(); |
495 |
sei(); |
496 |
orb_set_angle(1,250); |
497 |
orb_set_angle(2,250); |
498 |
orb_set_angle(4,0); |
499 |
orb_set_angle(5,0); |
500 |
orb_set_angle(6,0); |
501 |
|
502 |
while(1) { |
503 |
|
504 |
//orb_set_color(orbs[orb_select]);
|
505 |
|
506 |
orb_set_angle(0,orb_select+1); |
507 |
// orb_set_angle(1,orb_select+1);
|
508 |
// orb_set_angle(2,orb_select+1);
|
509 |
delay_ms(50);
|
510 |
orb_select++; |
511 |
|
512 |
|
513 |
|
514 |
if(orb_select == 255) { |
515 |
|
516 |
orb_select = 0;
|
517 |
} |
518 |
|
519 |
/*
|
520 |
for (int i = 0; i < 256; i++) {
|
521 |
for (int j = 0; j < 256; j++) {
|
522 |
for (int k = 0; k < 256; k++) {
|
523 |
orb_set(i, j, k);
|
524 |
}
|
525 |
}
|
526 |
}
|
527 |
*/
|
528 |
} |
529 |
return;
|
530 |
|
531 |
} |
532 |
|
533 |
|
534 |
void lcd_test(void) { |
535 |
int i, j;
|
536 |
lcd_init(); |
537 |
|
538 |
for(i = 32,j = 1; i <= 126; i++) { |
539 |
lcd_putchar(i); |
540 |
delay_ms(250);
|
541 |
if(j > 50) { |
542 |
lcd_clear_screen(); |
543 |
j = 0;
|
544 |
} |
545 |
j++; |
546 |
} |
547 |
|
548 |
|
549 |
return;
|
550 |
|
551 |
} |
552 |
|
553 |
void serial_test( void ) { |
554 |
int i;
|
555 |
|
556 |
usb_init(); |
557 |
|
558 |
for(i = 32; i <= 126; i++) { |
559 |
usb_putc(i); |
560 |
delay_ms(250);
|
561 |
} |
562 |
|
563 |
return;
|
564 |
} |
565 |
|
566 |
void pullup_test()
|
567 |
{ |
568 |
lcd_init(); |
569 |
lcd_putstr("pullup test");
|
570 |
delay_ms(100);
|
571 |
|
572 |
digital_pull_up(PIN_A4); |
573 |
digital_pull_up(PIN_A5); |
574 |
digital_pull_up(PIN_A6); |
575 |
digital_pull_up(PIN_A7); |
576 |
while(1){ |
577 |
lcd_clear_screen(); |
578 |
if(!digital_input(PIN_A4))
|
579 |
lcd_putchar('0');
|
580 |
else
|
581 |
lcd_putchar(' ');
|
582 |
if(!digital_input(PIN_A5))
|
583 |
lcd_putchar('1');
|
584 |
else
|
585 |
lcd_putchar(' ');
|
586 |
if(!digital_input(PIN_A6))
|
587 |
lcd_putchar('2');
|
588 |
else
|
589 |
lcd_putchar(' ');
|
590 |
if(!digital_input(PIN_A7))
|
591 |
lcd_putchar('3');
|
592 |
else
|
593 |
lcd_putchar(' ');
|
594 |
delay_ms(100);
|
595 |
} |
596 |
} |
597 |
|
598 |
void batt_test()
|
599 |
{ |
600 |
lcd_init(); |
601 |
usb_init(); |
602 |
|
603 |
analog_init(); |
604 |
|
605 |
while(1){ |
606 |
usb_puti(battery8()); |
607 |
usb_putc(' ');
|
608 |
delay_ms(10000);
|
609 |
} |
610 |
} |
611 |
|
612 |
|
613 |
void analog_test(void){ |
614 |
//int i;
|
615 |
analog_init(); |
616 |
usb_init(); |
617 |
range_init(); |
618 |
usb_puts(" information:\n");
|
619 |
while(1){ |
620 |
printAllBoms(); |
621 |
/*for(i=0;i<16;i++){
|
622 |
digital_output(MONK0,i&1);
|
623 |
digital_output(MONK1, (i>>1)&1);
|
624 |
digital_output(MONK2, (i>>2)&1);
|
625 |
digital_output(MONK3, (i>>3)&1);
|
626 |
usb_puts("Bom ");
|
627 |
usb_puti(i);
|
628 |
usb_puts(": ");
|
629 |
usb_puti(analog8(MONKI));
|
630 |
usb_puts("\n\r");
|
631 |
}*/
|
632 |
|
633 |
/*for(i=1;i<8;i++){
|
634 |
usb_puts("Analog Ext ");
|
635 |
usb_puti(i);
|
636 |
usb_puts(": ");
|
637 |
usb_puti(analog8(i));
|
638 |
usb_puts("\n\r");
|
639 |
}
|
640 |
|
641 |
usb_puts("IR1 val: ");
|
642 |
usb_puti(read_distance(IR1));
|
643 |
usb_puts("\n\rIR2 val: ");
|
644 |
usb_puti(read_distance(IR2));
|
645 |
usb_puts("\n\rIR3 val: ");
|
646 |
usb_puti(read_distance(IR3));
|
647 |
usb_puts("\n\rIR4 val: ");
|
648 |
usb_puti(read_distance(IR4));
|
649 |
usb_puts("\n\rIR5 val: ");
|
650 |
usb_puti(read_distance(IR5));
|
651 |
*/
|
652 |
delay_ms(2000);
|
653 |
} |
654 |
} |
655 |
|
656 |
void dio_test()
|
657 |
{ |
658 |
while(1) |
659 |
{ |
660 |
digital_output(_PIN_E5,1);
|
661 |
delay_ms(1000);
|
662 |
digital_output(_PIN_E5,0);
|
663 |
delay_ms(1000);
|
664 |
} |
665 |
} |
666 |
|
667 |
void rtc_test_pulse() {
|
668 |
usb_putc('s');
|
669 |
} |
670 |
|
671 |
void rtc_test() {
|
672 |
sei(); |
673 |
usb_init(); |
674 |
usb_putc('a');
|
675 |
rtc_init(HALF_SECOND, &rtc_test_pulse); |
676 |
} |
677 |
|
678 |
#define RECEIVE 1 |
679 |
|
680 |
#define MY_ADDR (RECEIVE == 1 ? 0x01 : 0x02) |
681 |
#define TARGET_ADDR (RECEIVE == 1 ? 0x02 : 0x01) |
682 |
|
683 |
void i2c_test() {
|
684 |
char c = 0; |
685 |
char i = 0; |
686 |
|
687 |
sei(); |
688 |
i2c_init(MY_ADDR); |
689 |
usb_init(); |
690 |
|
691 |
usb_putc('5');
|
692 |
delay_ms(1000);
|
693 |
|
694 |
while(1) { |
695 |
if (RECEIVE) {
|
696 |
while(c != 'z') { |
697 |
if(!i2c_getc(&c)) {
|
698 |
usb_putc(c); |
699 |
usb_putc(' ');
|
700 |
} |
701 |
} |
702 |
} else {
|
703 |
while(i < 26) { |
704 |
if(!i2c_putc(TARGET_ADDR, i + 0x61)) |
705 |
i++; |
706 |
} |
707 |
} |
708 |
|
709 |
delay_ms(1000);
|
710 |
|
711 |
if (!RECEIVE) {
|
712 |
while(c != 'z') { |
713 |
if(!i2c_getc(&c)) {
|
714 |
usb_putc(c); |
715 |
usb_putc(' ');
|
716 |
} |
717 |
} |
718 |
} else {
|
719 |
while(i < 26) { |
720 |
if(!i2c_putc(TARGET_ADDR, i + 0x61)) |
721 |
i++; |
722 |
} |
723 |
} |
724 |
|
725 |
c = 0;
|
726 |
i = 0;
|
727 |
} |
728 |
while(1); |
729 |
} |