|
|
pl:miw:2009:miw09_nxtsensors1 [2009/07/27 15:36] jsi08 |
pl:miw:2009:miw09_nxtsensors1 [2019/06/27 15:50] |
====== 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]].\\ | |