Měření času průjezdu trasy I BROB 2017 Vedoucí práce: prof. Ing. Luděk Žalud, Ph.D. Konzultant: Bc. Tomáš Lázna Vypracovali: Andrýsek Jan, Bednář Ladislav, Hendl Adam B-AMT 01,02
ZADÁNÍ TÉMATU PROJEKTU Navrhněte a realizujte systém pro měření času průjezdu trasy robotem založený na principu optické závory. Při návrhu uvažujte dvě varianty trasy okruh a z bodu A do bodu B. Realizujte rovněž komunikační interface s PC a vytvořte demonstrační aplikaci, která umožní vyčítat měřené časy. Volitelně doplňte systém o displej, který bude přímo vizualizovat výsledek měření.
Obsah 1. Raspberry Pi 1.1. Základní charakteristika 1.2. Program 2. Optická brána 2.1. Teorie 2.2. Zapojení 3. Závěr
1.1. Základní charakteristika Raspberry pi 2 je mikropočítač v ktorom je možné vytvárať vlastné programy v rôznych programovacích jazykoch. V našom prípade C. V raspberry je nahraný operačný systém RASPBIAN JESSIE WITH PIXEL. V skutočnosti sme nemuseli použiť operačný systém s grafickým rozhraním. Operačný systém sa nahráva z micro SD karty. Raspberry pi 2 má 4 USB porty,ethernet port,3.5mm jack,hdmi výstup, port na micro SD kartu.port na pripojene displeja a kamery. Pre nás sú však dôležité vstupno/výstupne porty GPIO pomocou ktorých ovládame LCD display a načítavame výstupy z optickej brány Obrázek 1 Zapojení maticového displeje
1.2. Program Program bol napísaný pomocou rozhrania NetBeans,pomocou ktorého bol aj samotný program zapísaný do pamäte raspberry pi. K meraniu času bola využitá knižnica wiringpi.h v ktorej sa nachádza funkcia micros(). Táto funkcia nám umožňuje merať čas na mikro sekundy. Presnosť je otázna pretože meranie sa odvíja od hodín samotného raspberry pi. Ďalšie možné riešenie by mohlo byť pomocou externého krištáľu a vyhodnocovania času mimo raspberry. Raspberry by bolo použité len na výpis času na obrazovku/display. Zobrazenie času na display bolo prevedené pomocou knižnice lcd.h ktorá je súčasťou wiringpi. Využil som 4 bitové zapojenie, pri ktorom využívame len 6 GPIO pinov. Pre zobrazenie plynúceho času sme použili zobrazovaciu konštantu rel=80 milisekúnd. Túto konštantu sme zvolil odhadom, display už viditeľne neblikal. Začiatok merania času vyhodnocujeme podľa stavu na GPIO pinoch. Meranie môžeme vykonávať v dvoch metódach a to na 1 bránu alebo 2 brány. Režim pre jednu bránu využíva len jeden GPIO pin a teda môže byť použitý pre meranie času na okruhu. Režim pre dve brány využíva dva GPIO piny, meriame čas od prvej brány k druhej bráne.
Ukážka kódu: 1. /* 2. * File: main.c 3. * Author: Ladislav Bednar 4. * 5. * Created on April 15, 2017, 12:36 AM 6. */ 7. 8. #include <stdio.h> 9. #include <stdlib.h> 10. #include <wiringpi.h> 11. #include <lcd.h> 12. 13. 14. #define LCD_RS 25 //Register select pin 15. #define LCD_E 24 //Enable Pin 16. #define LCD_D4 23 //Data pin 4 17. #define LCD_D5 22 //Data pin 5 18. #define LCD_D6 21 //Data pin 6 19. #define LCD_D7 14 //Data pin 7 20. 21. #define clear() printf("\033[h\033[j") 22. 23. 24. 25. int main() { 26. 27. wiringpisetup () ; 28. pinmode (3, INPUT) ; 29. pinmode (2, INPUT) ; 30. pinmode (0, INPUT) ; 31. pullupdncontrol(3,pud_down); 32. pullupdncontrol(2,pud_down); 33. pullupdncontrol(0,pud_down); 34. 35. int lcd; 36. lcd = lcdinit (2, 16, 4, LCD_RS, LCD_E, LCD_D4, LCD_D5, LCD_D6, LCD_D7, 0, 0, 0, 0); 37. 38. int state = 0; 39. double time=0; 40. int time1=0; 41. int x,i2,y; 42. int z=0; 43. int rel=80; 44. char sec [5]; 45. char mil [10]; 46. char min [5]; 47. 48. for(;;) 49. { 50. switch(state) 51. { 52. case 0: 53. { 54. clear(); 55. lcdclear(lcd); 56. if(digitalread(3)==1) 57. state=1; 58. if(digitalread(3)==0) 59. state=5; 60. break; 61. } 62. case 1: 63. { 64. clear();
65. printf("1 brana\n"); 66. lcdclear(lcd); 67. lcdputs(lcd, "1 brana"); 68. if (digitalread(0)==1) 69. { 70. time1=micros(); 71. delay(200); // konstanta na prechod 72. state=2; 73. } 74. if(digitalread(3)==0) 75. state=5; 76. delay(rel); // konstanta na zobrazovanie dislpay 77. break; 78. } 79. case 2: 80. { 81. clear(); 82. time=(micros()-time1); 83. time/=1000000; 84. 85. 86. 87. x=(int)time; 88. y= (time-(int)time)*1000000; 89. if(x>=60) 90. { 91. x=x-60*(z); 92. lcdclear(lcd); 93. z=(int)time/60; 94. } 95. 96. sprintf(mil, "%d", y); 97. sprintf(sec, "%d", x); 98. sprintf(min, "%d", z); 99. 100. lcdclear(lcd); 101. lcdputs(lcd, "cas je:"); 102. lcdposition(lcd, 1, 1); 103. lcdprintf(lcd, "%s:%s,%s",min,sec,mil); 104. lcdposition(lcd, 1, 15); 105. lcdputs(lcd,"s"); 106. 107. printf("1 brana\n"); 108. printf("meranie sa zaclo\n"); 109. printf("%fs\n",time); 110. 111. if (digitalread(0)==1) 112. { 113. delay(200); 114. state=3; 115. } 116. if(digitalread(3)==0) 117. state=5; 118. delay(rel); // konstanta na zobrazovanie dislpay 119. break; 120. } 121. case 3: 122. { 123. time=(micros()-time1);; 124. time /= 1000000; 125. state=4; 126. break; 127. } 128. case 4: 129. { 130. clear(); 131. printf("1 brana\n"); 132. printf("cas je: %fs\n",time);
133. 134. x=(int)time; 135. y= (time-(int)time)*1000000; 136. if(x>=60) 137. { 138. x=x-60*(z); 139. lcdclear(lcd); 140. z=(int)time/60; 141. } 142. 143. sprintf(mil, "%d", y); 144. sprintf(sec, "%d", x); 145. sprintf(min, "%d", z); 146. 147. lcdclear(lcd); 148. lcdputs(lcd, "cas je:"); 149. lcdposition(lcd, 1, 1); 150. lcdprintf(lcd, "%s:%s,%s",min,sec,mil); 151. lcdposition(lcd, 1, 15); 152. lcdputs(lcd,"s"); 153. 154. if (digitalread(0)==1) 155. { 156. time=0; 157. time1=micros(); 158. delay(200); 159. state=2; 160. } 161. if(digitalread(3)==0) 162. state=5; 163. delay(rel); // konstanta na zobrazovanie dislpay 164. break; 165. } 166. case 5: 167. { 168. clear(); 169. printf("2 brany\n"); 170. lcdclear(lcd); 171. lcdputs(lcd, "2 brany"); 172. if(digitalread(0)==1) 173. { 174. time1=micros(); 175. delay(200); // konstanta na prechod 176. state=6; 177. } 178. if(digitalread(3)==1) 179. state=1; 180. delay(rel); // konstanta na zobrazovanie dislpay 181. break; 182. 183. } 184. case 6: 185. { 186. clear(); 187. time=(micros()-time1); 188. time/=1000000; 189. 190. x=(int)time; 191. y= (time-(int)time)*1000000; 192. if(x>=60) 193. { 194. x=x-60*(z); 195. lcdclear(lcd); 196. z=(int)time/60; 197. } 198. 199. sprintf(mil, "%d", y); 200. sprintf(sec, "%d", x);
201. sprintf(min, "%d", z); 202. 203. lcdclear(lcd); 204. lcdputs(lcd, "cas je:"); 205. lcdposition(lcd, 1, 1); 206. lcdprintf(lcd, "%s:%s,%s",min,sec,mil); 207. lcdposition(lcd, 1, 15); 208. lcdputs(lcd,"s"); 209. 210. printf("2 brany\n"); 211. printf("meranie sa zaclo\n"); 212. printf("%fs\n",time); 213. if (digitalread(2)==1) 214. { 215. delay(200); 216. state=7; 217. } 218. if(digitalread(3)==1) 219. state=1; 220. delay(rel); // konstanta na zobrazovanie dislpay 221. break; 222. 223. } 224. case 7: 225. { 226. time=(micros()-time1); 227. time /= 1000000; 228. state=8; 229. break; 230. } 231. case 8: 232. { 233. clear(); 234. printf("2 brany\n"); 235. printf("cas je: %fs\n",time); 236. 237. x=(int)time; 238. y= (time-(int)time)*1000000; 239. if(x>=60) 240. { 241. x=x-60*(z); 242. lcdclear(lcd); 243. z=(int)time/60; 244. } 245. 246. sprintf(mil, "%d", y); 247. sprintf(sec, "%d", x); 248. sprintf(min, "%d", z); 249. 250. lcdclear(lcd); 251. lcdputs(lcd, "cas je:"); 252. lcdposition(lcd, 1, 1); 253. lcdprintf(lcd, "%s:%s,%s",min,sec,mil); 254. lcdposition(lcd, 1, 15); 255. lcdputs(lcd,"s");; 256. 257. if (digitalread(0)==1) 258. { 259. time=0; 260. time1=micros(); 261. delay(200); 262. state=6; 263. } 264. if(digitalread(3)==1) 265. state=1; 266. delay(rel); // konstanta na zobrazovanie dislpay 267. break; 268. }
269. } 270. } 271. 272. return (0); 273. } Obrázek 2 Program pro měření času
Optická brána Teoretický úvod Optoelektronické limitní snímače polohy se vyznačují binárním výstupem, bezdotykovým měřením, necitlivostí na elektromagnetická pole a mohou dosahovat velkých spínacích vzdáleností. Optoelektronické snímače se dělí na: Jednocestné světelné závory Reflexní světelné závory Reflexní světelné difusní snímače Jako vysílače se používají LED a polovodičové laserové diody. Výhodné je používat infračervené světlo o vlnové délce λ = 880 nm, protože fototranzistory a fotodiody jsou nejcitlivější v infračerveném pásmu. Dále kvůli necitlivosti vůči rušení z viditelného spektra. Fototranzistory a fotodiody se používají jako snímače. Jednocestné světelné závory Vysílač je namontován do optické osy snímače. Detekovaný objekt musí být větší než aktivní zóna, kvůli spolehlivému přerušení paprsku. Výhodami jsou například velký dosah, jednoduchost, rozpoznání neprůhledných materiálů. Nevýhodné je přesné umístění vysílače a přijímače, nejisté rozpoznání průhledných materiálů. Obrázek 3 Jednocestná světelná závora
Reflexní světelná závora Vysílač i přijímač jsou v jednom pouzdře. Na druhé straně sledovaného prostoru je připevněna odrazka, zrcadlo. Aby odrazná plocha zaručila správný odraz i při mírném naklopení, využívá se odrazka s malými trojhrany. Tím odpadá nutnost přesné montáže jako u jednocestné světelné závory. Problémy s detekcí předmětů s lesklým povrchem Obrázek 4 Reflexní světelná závora
Reflexní snímače Přijímač i vysílač jsou v jednom pouzdře, dochází k odrazu od detekovaného předmětu. Jedná se o difuzní odraz a je odražena pouze část paprsku. Jedná se o jednoduchou montáž, protože se jedná o jediný přístroj a nepotřebujeme odrazku. Lepší rozpoznávání průhledných předmětů než u závor. Používají se pro menší snímací vzdálenosti a tato vzdálenost závisí na reflexních vlastnostech detekovaných objektů. Obrázek 5 Reflexní světelný snímač
2.2 Schéma zapojení Obrázek 6 Schéma zapojení světelné závory Návrh desky plošného spoje Obrázek 7 Návrh desky plošného spoje
Při návrhu desky plošného spoje jsme nejdříve vycházeli ze zapojení v obrázku 6. Toto schéma se však ukázalo jako nevyhovující v důsledku špatného výběru součástek a příliš jednoduchého zapojení. Obrázek 8 Ideové schéma zapojení 1
Naše výsledné zapojení vychází ze schématu v obrázku 7, které už využívá komparátor LM311. Obrázek 9 Ideové schéma zapojení 2
Návrh krabičky Obrázek 10 Návrh krabičky
Seznam součástek 4x Kapacitor 100 nf 6x Rezistor 1 kohm 2x Rezistor 10 kohm 2x Rezistor 62 kohm 2x Komparator TLC 272CP 2x Laserova dioda F-LASER 5mW 2x Fototranzistor BPW 40 1x Raspberry PI 1x LCD alfanumericky display WINSTAR WH1602A-YGH-ET
Závěr Program na měření času je funkční pro jednu i dvě závory. Aktuální čas se zobrazuje na maticovém displeji. Ten nám je schopen zobrazit čas až do rozsahu mikrosekund a to ve formátu mm/ss,-µs. Přepínání z jedné brány na dvě a opačně je uskutečněno přepínačem. Reflexní fotobrány jsme nestihli dodělat, protože jsme nestihli pořídit komparátor LM311. Tištěný spoj je vyrobený, zapojený a připravený na osazení komparátorem. Bylo by třeba ještě vytisknout krabičky pro fotobrány. A vyrobit nosnou desku pro displej, aby bylo možné ho namontovat na raspberry PI.
Zdroje Obrázek 1 Zapojení maticového displeje Obrázek 2 Program pro měření času Obrázek 3 Jednocestná světelná závora Obrázek 4 Reflexní světelná závora Obrázek 5 Reflexní světelný snímač Obrázek 6 Schéma zapojení světelné závory Obrázek 7 Návrh desky plošného spoje Obrázek 8 Ideové schéma zapojení 1 Obrázek 9 Ideové schéma zapojení 2 Obrázek 10 Návrh krabičky http://uvp3d.cz/dum/?page_id=2588 http://uvp3d.cz/dum/?page_id=2588 http://uvp3d.cz/dum/?page_id=2588 http://www.astromik.org/raspi/30.htm http://robodoupe.cz/2011/cerna-nebo-bila/