Upload
others
View
1
Download
0
Embed Size (px)
Citation preview
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
BROB Měření času průjezdu trasy 2017
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í.
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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.
BROB Měření času průjezdu trasy 2017
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();
BROB Měření času průjezdu trasy 2017
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);
BROB Měření času průjezdu trasy 2017
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);
BROB Měření času průjezdu trasy 2017
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. }
BROB Měření času průjezdu trasy 2017
269. } 270. } 271. 272. return (0); 273. }
Obrázek 2 Program pro měření času
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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č
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
Návrh krabičky
Obrázek 10 Návrh krabičky
BROB Měření času průjezdu trasy 2017
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
BROB Měření času průjezdu trasy 2017
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.
BROB Měření času průjezdu trasy 2017
Zdroje
Obrázek 1 Zapojení maticového displeje
Obrázek 2 Program pro měření času
Obrázek 3 Jednocestná světelná závora http://uvp3d.cz/dum/?page_id=2588
Obrázek 4 Reflexní světelná závora http://uvp3d.cz/dum/?page_id=2588
Obrázek 5 Reflexní světelný snímač http://uvp3d.cz/dum/?page_id=2588
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 http://www.astromik.org/raspi/30.htm
Obrázek 9 Ideové schéma zapojení 2 http://robodoupe.cz/2011/cerna-nebo-bila/
Obrázek 10 Návrh krabičky