1 #include <pololu/orangutan>
2 #include <stdio.h>
3 #include <avr/pgmspace.h>
4 #include <stdlib.h>
5 #include "assert.h"
6
7 const char bars[] PROGMEM = {
8 0b00000,
9 0b00000,
10 0b00000,
11 0b00000,
12 0b00000,
13 0b00000,
14 0b00000,
15 0b11111,
16 0b11111,
17 0b11111,
18 0b11111,
19 0b11111,
20 0b11111,
21 0b11111
22 };
23
24 const char left_bar[] PROGMEM = {
25 0b10000,
26 0b10000,
27 0b10000,
28 0b10000,
29 0b10000,
30 0b10000,
31 0b10000,
32 0b00000
33 };
34
35 const char right_bar[] PROGMEM = {
36 0b00001,
37 0b00001,
38 0b00001,
39 0b00001,
40 0b00001,
41 0b00001,
42 0b00001,
43 0b00000
44 };
45
display_values(unsigned int * values,unsigned int max)46 void display_values(unsigned int *values, unsigned int max)
47 {
48 unsigned char i;
49
50 unsigned char characters[] = {' ',0,1,2,3,4,5,255};
51
52 OrangutanLCD::gotoXY(0,1);
53 for(i=0;i<5;i++)
54 {
55 // get characters[0] to characters[7]
56 OrangutanLCD::print(characters[values[i]*8/(max+1)]);
57 }
58 }
59
60 unsigned char pins[] = {14,15,16,17,18};
61 PololuQTRSensorsRC qtr(pins,5,2000,19);
62 //unsigned char pins[] = {0,1,2,3,4};
63 //PololuQTRSensorsAnalog qtr(pins,5,1,19);
64
test_qtr()65 void test_qtr()
66 {
67 OrangutanLCD::clear();
68
69 OrangutanLCD::print(sizeof(PololuQTRSensorsAnalog));
70 delay_ms(1000);
71
72 OrangutanLCD::clear();
73
74 // Load bar graph characters.
75 // Together with space and the solid block at 255, this makes almost
76 // all possible bar heights, with two to spare.
77 unsigned char i;
78 for(i=0;i<6;i++)
79 {
80 OrangutanLCD::loadCustomCharacter(bars+i,i);
81 }
82 OrangutanLCD::loadCustomCharacter(left_bar,6);
83 OrangutanLCD::loadCustomCharacter(right_bar,7);
84
85 // test RC
86 unsigned int values[5];
87
88 // raw values
89
90 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
91 {
92 OrangutanLCD::clear();
93
94 qtr.read(values);
95
96 printf("IR+ %4ud",values[0]);
97
98 display_values(values,2000);
99
100 qtr.calibrate(QTR_EMITTERS_ON);
101
102 assert(qtr.calibratedMaximumOn != 0); // make sure the malloc worked
103 assert(qtr.calibratedMinimumOn != 0); // make sure the malloc worked
104
105 OrangutanLCD::gotoXY(5,1);
106 // OrangutanLCD::print(qtr.calibratedMinimumOn[0]);
107 delay_ms(50);
108 }
109
110 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
111
112 // calibrated values
113 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
114 {
115 qtr.readCalibrated(values);
116
117 OrangutanLCD::clear();
118 printf("C + %4ud",values[0]);
119
120 display_values(values,1000);
121 delay_ms(50);
122 }
123
124 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
125
126 // off values
127 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
128 {
129 OrangutanLCD::clear();
130
131 qtr.read(values,QTR_EMITTERS_OFF);
132
133 printf("IR- %4ud",values[0]);
134
135 display_values(values,2000);
136
137 qtr.calibrate(QTR_EMITTERS_OFF);
138
139 assert(qtr.calibratedMaximumOff != 0); // make sure the malloc
140 // worked
141 assert(qtr.calibratedMinimumOff != 0); // make sure the malloc worked
142
143 OrangutanLCD::gotoXY(5,1);
144 OrangutanLCD::print(qtr.calibratedMinimumOff[0]);
145 delay_ms(50);
146 }
147
148 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
149
150 // calibrated values
151 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
152 {
153 qtr.readCalibrated(values, QTR_EMITTERS_OFF);
154
155 OrangutanLCD::clear();
156 printf("C - %4ud",values[0]);
157
158 display_values(values,1000);
159 delay_ms(50);
160 }
161
162 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
163
164 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
165 {
166 OrangutanLCD::clear();
167
168 qtr.read(values,QTR_EMITTERS_ON_AND_OFF);
169
170 printf("IR+-%4ud",values[0]);
171
172 display_values(values,2000);
173 delay_ms(50);
174 }
175
176 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
177
178 // calibrated values
179 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
180 {
181 qtr.readCalibrated(values, QTR_EMITTERS_ON_AND_OFF);
182
183 OrangutanLCD::clear();
184 printf("C +-%4ud",values[0]);
185
186 display_values(values,1000);
187 delay_ms(50);
188 }
189
190 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
191
192 // line detection
193 while(!OrangutanPushbuttons::isPressed(ALL_BUTTONS))
194 {
195 unsigned int pos = qtr.readLine(values);
196
197 OrangutanLCD::clear();
198
199 // we want pos = 0-499 to print zero spaces, etc
200 unsigned char spaces = (pos+500)/1000;
201 for(i=0;i<spaces;i++)
202 OrangutanLCD::print(' ');
203
204 // print the bar to the left, middle, or right, as appropriate
205 if(pos == 0)
206 OrangutanLCD::print((char)6); // all the way on the left
207 else if(pos == 4000)
208 OrangutanLCD::print((char)7); // all the way on the right
209 else if((pos+500)%1000 <= 333)
210 OrangutanLCD::print((char)6);
211 else if((pos+500)%1000 <= 666)
212 OrangutanLCD::print('|');
213 else OrangutanLCD::print((char)7);
214
215 display_values(values,1000);
216 delay_ms(50);
217 }
218
219 OrangutanPushbuttons::waitForButton(ALL_BUTTONS);
220 }
221