[[
✎ pl:miw:2009:miw09_nxtsensors1
]]
aiWiki
Pokaż stronę
Ostatnie zmiany
Indeks
Zaloguj
Ta strona jest tylko do odczytu. Możesz wyświetlić źródła tej strony ale nie możesz ich zmienić.
====== Opis ====== Paweł Konas, pawelkonas@gmail.com NXT_sensors Build extra sensors from the Extreme NXT Book (available for us!) warning: requires some hardware and experience! ====== Spotkania ====== ===== 20090219 ==== * [[http://mindstorms.lego.com/Overview/NXTreme.aspx|NXtreme]] ===== 20090305 ==== W planie dostarczenie prototypu czujnika. ===== 20090416 ==== Próba skonstruowania czujnika od początku w oparciu o mikrokontroler AVR ATmega8. Zalety: zwarta konstrukcja, tańszy, możliwość przeprogramowania. Zastanowić się jak podłączyć czujnik od strony PC (widoczność w sofcie NXT). ====== Projekt - STAN AKTUALNY ====== W skrócie zamieszczam aktualny stan projektu.\\ Zlutowany prototypowy czujnik odległości działający w zakresie 0 - 200cm z dokładnością około 5cm (dla odległości 10 do 15cm wyświetla 15cm itd.). Dodatkowo dołączona gotowa biblioteka do komunikacji za pomocą protokołu I2C i przygotowane połączenia dla tejże (podpięte piny). \\ Oprócz tego dołączony programator pod LPT.\\ ====== Projekt - TODO ====== 1) Poprawić jakość czujnika - łatwiejsze jeśli ma się __oscyloskop__. Większy zasięg/dokładność?, \\ 2) Zaimplementować komunikację przez I2C,\\ 3) Zaprojektować i zaimplementować komunikację z aplikacjami na PC (np. zrobić osobny bloczek w programie Mindstorms NXT odpowiadający za ten czujnik?).\\ ====== Projekt - wersja pierwotna ====== Na początek proponuję laserowy czujnik odległości zaczerpnięty ze strony: \\ http://www.philohome.com/sensors/lasersensor.htm \\ Jednak mogą wystąpić - jak zwykle to bywa :) - pewne problemy.\\ 1) W Polsce ciężko będzie dostać zastosowany czujnik odległości Hamamatsu S6986, \\ 2) Jeszcze nie wiem gdzie kupić soczewki i odpowiednią taśmę odblaskową albo odpowiednik, \\ 3) 1 i 2 muszę w praktyce przetestować i dostroić z hardware'm wyjętym ze wsk. laserowych dostępnych na polskim rynku, 4) Jak się okazało krótka żywotność. \\ \\ Z powyższą propozycją wiążą się jednak pewne kwestie i dodatkowe komplikacje, które chciałbym omówić na konsultacjach. Drugi proponowany czujnik odległości - tym razem ultradźwiękowy - można znaleźć tutaj:\\ http://www.interq.or.jp/japan/se-inoue/e_srm.htm \\ Plusy: * Szczegółowo przetestowany, * Niezły zasięg, wg autora 35cm do 10m (dla porównania oryginalny czujnik z NXT ma wg dokumentacji zasięg do 2,33m), * Części powszechnie dostępne, * Zasilanie 9V czyli takie jakie może dostarczyć centralna jednostka NXT. \\ Ostatecznie z wersji tej zrezygnowałem - z trzech zasadniczych powodów: \\ 1) Duży rozmiar - wbrew pozorom bardzo istotny powód patrząc na rozmiar choćby jednostki centralnej NXT, \\ 2) Początkowo nie uwzględniałem kolejnych elementów koniecznych m.in. do komunikacji przy pomocy I2C, \\ 3) Mała 'elastyczność' (w porównaniu do programowalnych mikrokontrolerów).\\ ====== Projekt - wersja końcowa ====== Po skonstruowaniu czujnika opisanego powyżej i problemach z jego debuggingiem zdecydowałem się na projekt od zera. Tym razem - i ostatecznie - sonar skonstruowałem w oparciu o tani (około 6zł w momencie pisania tego tekstu) i powszechnie dostępny mikrokontroler Atmega8. Dzięki m.in. posiadaniu komparatora analogowego, wewnętrznego zegara (1MHz) oraz programowalności samego układu udało się otrzymać konstrukcję zwartą i elastyczną.\\ Poniżej zamieszczam schemat układu (stworzony przy pomocy programu [[http://www.cadsoft.de/|Eagle]]):\\ {{:pl:miw:2009:schemat_czujnika.png|}} Poniżej zdjęcie wykonanego czujnika:\\ {{:pl:miw:2009:nxtsensor1_zdjecie_czujnika.png|}} Dodatkowo zamieszczam pliki projektu wykonanego w programie (wersja ograniczona jest darmowa) Eagle - tj. powyższy plik schematu a także przygotowany do wydruku/zamówienia w firmie projekt płytki.\\ Spakowane pliki projektu w Eagle:\\ {{:pl:miw:2009:nxtsensor_eagle_projekt.rar|}} ==== Wykaz użytych elementów ==== * konektor 2x5pin (gniazdo żeńskie), * 2 wyświetlacze 7-segmentowe ze wspólną katodą, * 5 kondensatorów elektrolitycznych __1uF__, * 1 kond. ceramiczny __100nF__, * 1 kond. ceramiczny __330nF__, * 2 rezystory __82k__, * 1 rezystor __5k6__, * 8 rezystorów __1k__, * nadajnik i odbiornik ultradźwięków (średnica 16mm), * stabilizator napięcia 7805, * konwerter napięć max232n, * mikrokontroler Atmega8-16PI. ==== Podłączenie wyświetlaczy 7-segmentowych ==== Z uwagi na być może niezbyt czytelny fragment schematu odpowiadający za podłączenie pinów Atmegi do wyświetlaczy poniżej przedstawiam to połączenie raz jeszcze. Zaznaczam przy tym, że z uwagi na różne modele 7-segmentowych wyświetlaczy napiszę jedynie nazwy segmentów typu a,b, etc. zamiast konkretnych pinów zależnych od danego egzemplarza (powtarzam - wyświetlacze są ze wspólną katodą).\\ Rozmieszczenie segmentów jest jak na poniższym obrazku:\\ {{:pl:miw:2009:nxtsensor_7led.jpg|}}\\ Zatem:\\ == nazwa segmentu - pin atmegi == * a - 16 (PB2) * b - 15 (PB1) * c - 10 (PB7) * d - 14 (PB0) * e - 19 (PB5) * f - 17 (PB3) * g - 18 (PB4) * kropka - 9 (PB6) Dodatkowo wspólna katoda wyświetlaczy jest podłączona do pinu 23 (PC0) i 24 (PC1). ====== Uwagi do skonstruowanego czujnika ====== Poniżej opiszę szczegółowo proces tworzenia schematu czujnika i uwagi jego dotyczące. \\ Przede wszystkim czujnik wykonany został w oparciu o tutorial programowania mikrokontrolerów AVR zamieszczony na stronie:\\ [[http://www.patron.ehost.pl/patron/artykuly/vinavr/AVR_tutorial.htm|Tutorial pana Teodora Otulaka]] \\ Oraz projekt zmodyfikowanego przykładu czujnika odległości ze strony: \\ [[http://www.dioda.com.pl/forum/topics20/ultradzwiekowy-czujnik-odleglosci-do-robota-vt937.htm?sid=277b87a4e64e45209a3f6c48ec0d9065|Modyfikacja przykładu z powyższego źródła]] \\ W efekcie udało mi się skonstruować czujnik, który miał zasięg około 50cm. Przy większych odległościach niestety sygnały zanikały. W tym momencie inspiracją stał się ogólnodostępny schemat czujników odległości dostępnych komercyjnie na rynku pod nazwą SRF08 (tudzież SRF02, SRF06 etc.). Zastosowano w nich dodatkowy układ scalony max232, którego głównym zadaniem była konwersja napięć ze standardu TTL na RS232. Tym samym nadajnik ultradźwięków zasilony został napięciem około 9V (zamiast początkowych 5V bezpośrednio z atmegi).\\ Wspomniany komercyjny schemat sonarów można znaleźć np. pod tym adresem: [[http://www.freeinfosociety.com/electronics/schemview.php?id=2096|SRF06]]\\ Kupić zaś można choćby tutaj: [[http://www.nodna.com/xtc/product_info.php?language=en&info=p617_Devantech-SRF08-Ultraschall-Sensor.html|SRF08-sklep]].\\ ====== Programator ====== W ramach projektu dołączam także programator pod LPT (używałem go wraz z darmową aplikacją [[http://www.lancos.com/prog.html|PonyProg]] do której link znajduje się na dole strony). Jego schemat jest następujący:\\ {{:pl:miw:2009:nxtsensor_avrisp-siprog.gif|}}\\ Dołączoną taśmę do Atmegi8-16PI podłączyć należy następująco (zakładając, że żyłka różowa ma nr 10, a żyłka po drugiej stronie taśmy ma nr 1). == Numer żyłki - odpowiadający pin Atmegi == * żyłka 2 - pin GND (pin 8) * żyłka 4 - pin MISO (pin 18) * żyłka 6 - pin MOSI (pin 17) * żyłka 8 - pin SCK (pin 19) * żyłka 9 - pin RST (pin 1) * żyłka 10 - pin VDD (pin 7) **Uwaga:** W przypadku problemów (np. PonyProg wciąż zgłasza błąd) sprawdzić czy jest odblokowany port LPT w BIOS'ie. ====== Kod źródłowy ====== Prezentuję poniżej kod źródłowy sonaru (nie uwzględniam tu plików biblioteki Procyon AVRlib). <code c> //############################# // // Sonar ultradźwiekowy // //############################# #include <avr/io.h> #include "deprecated.h" #include "sonar.h" #include "znaki.h" #include <avr/interrupt.h> #include <util/delay.h> #include "i2c.h" #define wait 0xffff int distance=0; int idx; //zmienna uzyta w petli w funkcji wynik unsigned int TicksNo[42] = {10,20,50,85,120,150,170, //3...30cm 220,240,280,315,335,375, //35...60cm 400,440,460,500,530,560, //65...90cm 600,630,660,690,720,760, //95...120cm 790,820,850,885,910,945, //125...150cm 970,1010,1050,1080,1115, //155...175cm 1150,1180,1210,1240,1270, //180...200cm 1300}; //troche ponad 2m unsigned short DisplayChars0[42] = {0,0,1,1,2,2,3,3, //03...35cm 4,4,5,5,6,6,7,7, //40...75cm 8,8,9,9,0,0,1,1, //80...115cm 2,2,3,3,4,4,5,5, //120...155cm 6,6,7,7,8,8,9,9, //160...195cm 0,10}; //200...troche ponad 200 unsigned char DisplayChars1[42] = {3,5,0,5,0,5,0,5, //03...35cm 0,5,0,5,0,5,0,5, //40...75cm 0,5,0,5,0,5,0,5, //80...115cm 0,5,0,5,0,5,0,5, //120...155cm 0,5,0,5,0,5,0,5, //160...195cm 0,10}; //200...troche ponad 200 unsigned char digits[11] = { ((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)), ((1<<LEDB)|(1<<LEDC)), ((1<<LEDA)|(1<<LEDB)|(1<<LEDD)|(1<<LEDE)|(1<<LEDG)), ((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDG)), ((1<<LEDB)|(1<<LEDC)|(1<<LEDF)|(1<<LEDG)), ((1<<LEDA)|(1<<LEDC)|(1<<LEDD)|(1<<LEDF)|(1<<LEDG)), ((1<<LEDA)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)|(1<<LEDG)), ((1<<LEDA)|(1<<LEDB)|(1<<LEDC)), ((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDE)|(1<<LEDF)|(1<<LEDG)), ((1<<LEDA)|(1<<LEDB)|(1<<LEDC)|(1<<LEDD)|(1<<LEDF)|(1<<LEDG)), (1<<LEDG) //kreska pozioma }; unsigned char DisplayedChar[2]; unsigned char Com[2] = {~(1<<COM1),~(1<<COM2)}; // //############################################################ // //------------------------- // // procedura wysyłania paczki ultradźwięków // //------------------------- int sygnal(void) { int echo=0; // zmienna do bliczenia powrotu ultradźwięków sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); sinus_40_khz(); // teraz trzeba wytłumić drgania przetwornika zwierając go do masy cbi(ultrasonic_pinA_port,ultrasonic_pinA_pin); cbi(ultrasonic_pinB_port,ultrasonic_pinB_pin); delay(8); // przetwornik wejściowy też zwieramy do masy w celu wytłumienia sbi(DDRD,PD6); cbi(PORTD,PD6); delay(8); cbi(DDRD,PD6); // no i można go włączyć </code> ====== TODO - Materiały, linki ====== Poniżej zamieszczam materiały i linki, które znalazłem, a które mogą się przydać osobom pragnącym kontynuować projekt.\\ \\ 1)[[http://hubbard.engr.scu.edu/embedded/avr/avrlib/docs/html/index.html|Dokumentacja biblioteki Procyon AVRlib pod mikrokontrolery Atmegi obejmująca między innymi komunikację przez I2C]].\\ 2)[[http://avr-news.freehostia.com/projekty/procyon-avrlib-biblioteka-funkcji-dla-mikrokontrolerow-avr/|Strona skąd można pobrać bibliotekę Procyon AVRlib gdyż link na stronie oficjalnej nie działa]].\\ 3)[[http://avr.15.forumer.com/a/using-twii2c-with-avrlib_post1039.html|Przykład użycia powyższej biblioteki (Procyon AVRlib)]].\\ 4)[[http://bricxcc.sourceforge.net/|IDE do pisania programów w NXC (not exactly C) dla Bricka NXT]].\\ 5)[[http://www.atmel.com/dyn/Products/tools_card.asp?tool_id=2725|IDE do pisania programów w C pod mikrokontrolery Atmega]].\\ 6)[[http://www.lancos.com/prog.html|PonyProg - darmowy programator dla Atmegi]].\\ 7)[[http://www.tau.ac.il/~stoledo/lego/msp430-ir-remote/|Przykładowy projekt własnego czujnika komunikującego się z NXT przez I2C]].\\ 8)[[http://forums.nxtasy.org/index.php?showtopic=2051|Wątek na oficjalnym forum NXT dotyczący prób komunikacji NXT z mikrokontrolerami przy użyciu I2C]].\\ 9)[[http://mindstorms.lego.com/eng/Egypt_dest/Default.aspx|Strona lego mindstorms]].\\ 10)[[http://mindstorms.lego.com/Overview/NXTreme.aspx|Dokumentacja techniczna NXT]].\\ 11)[[https://gerard.etc.upt.ro/~Robotics/Lego%20NXT%20Hardware%20Developer%20Kit/Appendix%207-LEGO%20MINDSTORMS%20NXT%20Ultrasonic%20Sensor%20I2C%20communication%20protocol.pdf|Dokumentacja I2C zaimplementowanego w NXT]].\\ 12)[[http://www.avrfreaks.net/index.php?name=PNphpBB2&file=viewtopic&t=80990|Wątek na forum dot. prób komunikacji Atmegi z NXT przez I2C wraz z __załączonym kodem__ który teoretycznie powinien działać, ale nie działa...]].\\ 13)[[http://www.alldatasheet.com/|Strona z wyszukiwarką "datasheet'ów" układów scalonych]].\\ 14)[[http://www.prototypy.com/|Firma 1 gdzie można zamówić wykonanie profesjonalnej płytki PCB]].\\ 15)[[http://www.drukowane.pl/|Firma 2 gdzie można zamówić wykonanie profesjonalnej płytki PCB]].\\
pl/miw/2009/miw09_nxtsensors1.1248701882.txt.gz
· ostatnio zmienione: 2019/06/27 15:57 (edycja zewnętrzna)
Pokaż stronę
Poprzednie wersje
Menadżer multimediów
Do góry