Różnice

Różnice między wybraną wersją a wersją aktualną.

Odnośnik do tego porównania

pl:miw:2009:miw09_nxtsensors1 [2009/07/27 15:36]
jsi08
pl:miw:2009:miw09_nxtsensors1 [2019/06/27 15:50]
Linia 1: Linia 1:
-====== 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); 
-</​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.txt · ostatnio zmienione: 2019/06/27 15:50 (edycja zewnętrzna)
www.chimeric.de Valid CSS Driven by DokuWiki do yourself a favour and use a real browser - get firefox!! Recent changes RSS feed Valid XHTML 1.0