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