[IDEA] Analogowy multiplekser czujników dotyku dla NXT

Mindstorms, WeDo, Lego Digital Desinger, Stud.io

Moderatorzy: Mod Team, Mod Team

Autor
Wiadomość
staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

[IDEA] Analogowy multiplekser czujników dotyku dla NXT

#1 Post autor: staak »

Obrazek

Multiplekser umożliwia podłączenie do jednego portu wejściowego NXT (lub przy odpowiedniej przejściówce do RCX) czterech czujników dotyku.
Wewnętrzna budowa multipleksera...

Obrazek

... i podłączenie do NXT .

Obrazek

W przypadku obu mux'ów zastosowałem rezystory o wartościach 10k 32k 68k i 150k. Czujniki dotyku nowego typu (NXT) mają wbudowany dodatkowy rezystor 2,2k.
Z założenia oba multipleksery (starego typu do RCX i nowy do NXT) miały współpracować z NXT za pośrednictwem jednego bloku programowego NXT-G, w którym odpowiednie progi ustawione byłyby na sztywno bez możliwości zmian (tak jak u konkurencji... :) ). Rezystory wewnętrzne (a także dokładności samych rezystorów) wymusiły jednak konieczność stworzenia bloku dla NXT-G z progami ustawianymi przez użytkownika.

Standardowo po wstawieniu bloku do projektu widoczna jest tyko lewa strona ustawień.
Zaznaczenie checkboxa powoduje ukazanie się okna umożliwiającego ręczne ustawienie odpowiednich progów.
Parametry bloku:
Port: 1 do 4
Port do którego podłączony jest mux
Limit: 1 do 6
Dla progu TH1000 = 520 limit 5 oznacza iż próg ten wykrywany jest w przedziale 515<TH1000<525
Threshold:0 do 1023
Rozwijane pole w lewym oknie służy jedynie do podglądu wartości danego progu.
Wartość progu to nic innego jak wartość Raw Value dla odpowiedniej konfiguracji stanów czujników
TH1011 należy czytać jako TH Czujnik1=1 Czujnik2=0 Czujnik3=1 Czujnik 4=1 gdzie
Czujnik1 - linia z rezystorem 10k
Czujnik2 - linia 32k
Czujnik3 - linia 68k
Czujnik4 - linia 150k

Sygnał wyjściowy z bloku stanowią cztery wyjścia (T1-T4) typu True/False
Stan True na wyjściu oznacza, że dany czujnik jest wciśnięty

Po ustawieniu i sprawdzeniu progów blok należy zapisać w projekcie.
Opcja Copy/Paste pozwala na wstawienie bloku do nowego projektu wraz z ustawionymi wcześniej progami.

Blok można pobrać z ...
Obrazek

PS
Koszt elementów multipleksera wyniósł około 5 zł.
Blok został napisany w LabView z nakładką LabVIEW Toolkit for LEGO MINDSTORMS NXT dostępnych na stronach National Instruments.
Myślenie ma kolosalną przyszłość.

student-85
Posty: 21
Rejestracja: 2008-06-30, 14:55
Lokalizacja: Poznań

#2 Post autor: student-85 »

Sam zabrałem się jakiś czas temu za podłączenie większej ilości przycisków pod jeden port NXT. Skończyło się na 6 przyciskach zamontowanych na płytce drukowanej i drabince diod 0,7V. Dawało to dość stabilne wyniki dla każdego z przycisków. Minusem jest brak możliwości ciśnięcia więcej niż jednego przycisku na raz (wykrywa i tak naciśnięcie jednego).

Kolejną wadą, a raczej niedociągnięciem było używanie do odczytu wartości bloczka czujnika światła lub dźwięku i w sumie chciałbym to dorobić. Jak trudne jest zrealizowanie własnego bloczka, czy istnieje jakaś darmowa/studencka/trial wersja oprogramowania LabView? Czy można to zrobić jakoś inaczej?

staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

#3 Post autor: staak »

student-85 pisze:Jak trudne jest zrealizowanie własnego bloczka
Bloki które zrobiłem nie są zabezpieczone hasłem - mogą służyć jako przykład (na dobry początek).
Tu znajdziesz bardziej skomplikowane bloki (również nie są zablokowane hasłem)
W gruncie rzeczy merytorycznej obróbce podlegają dwa pliki: config (odpowiada za interfejs pomiędzy użytkownikiem a blokiem) i sub (który zawiera stronę logiczną działania bloku). Pozostałe bloki to "kosmetyka"
Przed tym jak napisałem te kilka bloków nie miałem żadnego kontaktu z LabView...
Blok logiki zajął mi parę minut, blok interfejsu....pobliski sklep mięsny miałby pełen asortyment przez cały czas pisania bloków.
To co działało w LVabView bez żadnych problemów ... w środowisku LEGO MINDSTORMS NXT 2.0 (już jako gotowy blok) nie wykazywało chęci do współpracy (gubienie ustawień, brak list wyboru itd itp)
Ale metodą prób i błędów udało mi się stworzyć (i nauczyć się jak to się robi) w pełni funkcjonalne bloki.
Kwestia wytrwałości
student-85 pisze: czy istnieje jakaś darmowa/studencka/trial wersja oprogramowania LabView? Czy można to zrobić jakoś inaczej?
National Instruments udostępnia oba programy na swoich stronach (niestety dopiero po zalogowaniu)
LabView (baza) jest/był dostępny w wersji trial 30 dni natomiast Toolkit for LEGO MINDSTORMS NXT (nakładka) jest free.
Inaczej chyba się nie da bo stuktura bloku (struktura plików w bloku) jest określona a dodatkowo pliki *.vi nie są zapisywane w postaci tekstowej (tylko jakaś forma kompilacji danych)
Myślenie ma kolosalną przyszłość.

Coval_pl

#4 Post autor: Coval_pl »

A czy ktokolwiek próbował wstawiać te rezystory do samych czujników? Może byłoby to prostsze rozwiązanie gdyby było na nie miejsce, zwłaszcza przy podłączaniu, bo wystarczyłyby same kable spiąć jeden na drugim.

staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

#5 Post autor: staak »

W przypadku czujników RCX możesz zrobić to tak:Obrazek
Tyle, że w tym przykładzie użyte zostały czujniki z zestawu CyberMaster 8482-1.
Czujniki dotyku z tego zestawu (jasno niebieska przezroczysta obudowa +czerwony, żółty, lub biały "zderzak") mają fabrycznie wbudowane wewnętrznie rezystory o różnych wartościach. Standardowy (szara obudowa) czujnik RCX nie ma wbudowanego rezystora.

Więcej znajdziesz tu:
http://www.brickshelf.com/cgi-bin/gallery.cgi?f=234174
na jednym z obrazków widać w jaki sposób wbudowane są rezystory w czujniki CM
http://www.brickshelf.com/gallery/Philo ... ouch_5.jpg

Bez ryzyka nie ma zabawy :)
Myślenie ma kolosalną przyszłość.

Coval_pl

#6 Post autor: Coval_pl »

Jeli chodzi o wnetrze, to dokładnie o to mi chodziło. Zobacze czy te szare da się bezpiecznie rozebrać. Jeśli nie to ztobie taki pasywny multiplekser. Mam natomiast pytanie o to załączone zdjęcie. Czym jest podyktowany sposób połączenia? CZy tym, że jest to podpięte do NXT? sądziełem, że wystarczy spiąć te czujniki równolegle, klocek na klocku.
Ostatnio zmieniony 2011-05-20, 09:59 przez Coval_pl, łącznie zmieniany 1 raz.

staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

#7 Post autor: staak »

Coval_pl pisze: Czym jest podyktowany sposób połączenia? CZy tym, że jest to podpięte do NXT? sądziełem, że wystarczy spiąć te czujniki równolegle, klocek na klocku.
Podpięcie do NXT czy RCX to kwestia jedynie różnych wtyczek.
W "standardowym" multiplekserze rezystory lutowane są SZEREGOWO do styku czujnika.
Więc czujniki można łączyć równolegle (2 obrazek w pierwszym poście)
Rezystor w czujnikach dotyku CyberMaster wlutowany jest RÓWNOLEGLE do styku.
Jeżeli podłączysz czujniki CM (albo bez rezystorów) równolegle to wciśnięcie któregokolwiek z czujników spowoduje zwarcie jego styku i ustawienie sygnału wysokiego (1023 w raw) na wyjściu. Stan dwóch pozostałych czujników będzie elektrycznie nieistotny (a co się z tym wiąże nie będziesz w stanie sprawdzić ich stanu).

PRAWDOPODOBNIE taki układ dla czujników CM jak na obrazku zapewnia możliwość sprawdzania jednocześnie stanu wszystkich 3 czujników (na podstawie różnych wartości raw).

Może któryś z kolegów dysponuje takimi czujnikami CM i będzie miał ochotę sprawdzić (i podzielić się wrażeniami) to rozwiązanie z obrazka?
Myślenie ma kolosalną przyszłość.

Coval_pl

#8 Post autor: Coval_pl »

staak pisze: Podpięcie do NXT czy RCX to kwestia jedynie różnych wtyczek.
W "standardowym" multiplekserze rezystory lutowane są SZEREGOWO do styku czujnika.
Więc czujniki można łączyć równolegle (2 obrazek w pierwszym poście)........
Przejrzałem zdjęcia tych przezroczystych czujników i widziałem ten rezystor. Chodzi mi o sam rysunek połączenia z posta wyżej. Próbowałem przeanalizować schemat elektryczny tego połączenia i nie rozumiem jak to ma działać. Ta kwadratowa łączówka ma 2 pary styków. Podłączenie do niej drugiej pod kątem prostym z elektrycznego punktu widzenia powoduje zwarcie. Chyba że ja czegoś nie wiem :)
Na chwilę obecną mam 2 zwykłe szare czujniki i jeszcze 2 do mnie idą. Jak mi się uda wlutować tam te rezystory to sprawdzę czy takie połączenie ma sens, ale na razie go nie widzę.
Ostatnio zmieniony 2011-05-23, 10:09 przez Coval_pl, łącznie zmieniany 3 razy.

staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

#9 Post autor: staak »

Coval_pl pisze:Podłączenie do niej drugiej pod kątem prostym z elektrycznego punktu widzenia powoduje zwarcie.
Jeżeli spojrzysz na wtyczkę "od góry" (przewód do dołu) to zobaczysz 4 piny kontaktowe.
Dwa lewe piny (pierwsza para połączona razem) metalową część kontaktu mają wyprowadzoną w kierunku lewa góra, dwa prawe piny( druga para połączona razem)- kontakty idą w prawy dół.
W przypadku połączenia wtyczek równolegle (kabelki w tej samej osi) przewodzenie odbywa się po 2 pinach (tej samej pary) dla każdego biegunu zasilania
Jeżeli dopniesz wtyczki prostopadle przewodzenie dla każdego z biegunów odbywa się na jednym pinie (lewy górny i prawy dolny).
Drugi pin (z każdej pary) wisi "w powietrzu".
Takie wykonanie wtyczki zapobiega zwarciom przy prostopadłych połączeniach wtyczek.
Myślenie ma kolosalną przyszłość.

Coval_pl

#10 Post autor: Coval_pl »

Tak jak przypuszczałem "czegoś nie wiedziałem" lub po prostu nie przyjrzałem się wystarczająco dokładnie. Czyli wracając do rysunku, czujniki tutaj połączone są szeregowo? Nie mam kabli w rękach więc próbuję to sobie tylko wyobrazić :)

staak
Posty: 53
Rejestracja: 2008-10-07, 19:05
Lokalizacja: Warszawa
brickshelf: staak

 

#11 Post autor: staak »

Coval_pl pisze:czujniki tutaj połączone są szeregowo?
Tak.
Myślenie ma kolosalną przyszłość.

Awatar użytkownika
Darek Mróz
VIP
Posty: 213
Rejestracja: 2004-06-02, 14:12
Lokalizacja: Rzeszów
brickshelf: sasik

 

#12 Post autor: Darek Mróz »

staak pisze: Może któryś z kolegów dysponuje takimi czujnikami CM i będzie miał ochotę sprawdzić (i podzielić się wrażeniami) to rozwiązanie z obrazka?
Mam takie czujniki i rzeczywiście działa to tak, jak opisałeś. Wartości rezystorów zależne są koloru przycisku, niestety szczegóły podam Wam jak wrócę z urlopu na początku czerwca.
LEg GOdt Darek Mróz

skorupa
Posty: 13
Rejestracja: 2009-12-03, 17:39
Lokalizacja: Andrychów
brickshelf: skorupa

 

#13 Post autor: skorupa »

student-85 pisze:Minusem jest brak możliwości ciśnięcia więcej niż jednego przycisku na raz (wykrywa i tak naciśnięcie jednego).
Na początek zrobiłem analogowy multiplekser 3 czujników dotyku, z tym, że NXT identyfikuje czujniki poprawnie nawet jeśli zostały wciśnięte dwa przyciski.
Idea jest taka, aby dobrać takie wartości oporników R1, R2, R3, aby opór zastępczy przy połączeniu równoległym w każdej możliwej kombinacji był inny.
Ponieważ dla trzech czujników mamy 8 możliwych kombinacji (2^3 = 8):

Kod: Zaznacz cały

111
110
101
010
000
100
011

1 - przycisk włączony &#40;=należy uwzględnić opór&#41;
0 - wyłączony
Teraz musimy obliczyć jakie opory mogą mieć oporniki, aby w każdej możliwej kombinacji opór zastępczy liczony ze wzoru:

Kod: Zaznacz cały

1/R&#40;zastępczy&#41; = 1/R1 + 1/R2 + 1/R3
Ważne jest to, aby opory się różniły od siebie o przynajmniej 100Ohm. Chodzi o to, aby mieć kilku punktowy zapas po przeliczeniu oporu na wartość RAW. W celu oszacowania oporników można wykorzystać wykres który umieszczam w załączniku.
Jeśli już dobierzemy oporniki (ja wybrałem takie które miałem pod ręką: 2k, 10k, 1k8), musimy tylko odczytać wartość RAW dla każdej kombinacji (z tabelki powyżej).
Po zanotowaniu tych wartości piszemy przykładowy program (tutaj kod w NXC), który będzie powodował załączanie silników/świateł i wyświetlenie na wyświetlaczu, które czujniki są wciśnięte. Pamiętajmy, że jeżeli wartość odczytu RAW = 100, to lepiej ustawić, żeby robot reagował od 90 do 110.

Kod: Zaznacz cały

#include "NXCDefs.h"
task main&#40;&#41;
&#123;
SetSensorType&#40;IN_1, SENSOR_TYPE_TOUCH&#41;;
SetSensorMode&#40;IN_1, SENSOR_MODE_RAW&#41;;
while&#40;true&#41; &#123;
ResetScreen&#40;&#41;;
if &#40;&#40;SENSOR_1 > 60&#41; && &#40;SENSOR_1 < 83&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "111"&#41;;
OnFwd&#40;OUT_ABC, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 84&#41; && &#40;SENSOR_1 < 99&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "011"&#41;;
OnFwd&#40;OUT_BC, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 110&#41; && &#40;SENSOR_1 < 138&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "101"&#41;;
OnFwd&#40;OUT_AC, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 139&#41; && &#40;SENSOR_1 < 148&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "110"&#41;;
OnFwd&#40;OUT_AB, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 149&#41; && &#40;SENSOR_1 < 159&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "001"&#41;;
OnFwd&#40;OUT_C, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 160&#41; && &#40;SENSOR_1 < 190&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "010"&#41;;
OnFwd&#40;OUT_B, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 490&#41; && &#40;SENSOR_1 < 530&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "100"&#41;;
OnFwd&#40;OUT_A, 100&#41;;
&#125;
if &#40;&#40;SENSOR_1 > 1000&#41; && &#40;SENSOR_1 < 1023&#41;&#41; &#123;
TextOut&#40;0, LCD_LINE4, "000"&#41;;
&#125;
Wait&#40;100&#41;;
Off&#40;OUT_ABC&#41;;
&#125;
&#125;

Pozostaje tylko jedno pytanie: czy warto się bawić w analogowe multipleksery? Moim zdaniem nie. Dlaczego?
1. Masa kodu który musi przetwarzać nasz robot.
2. Dużo roboty z ustalaniem wartości rezystorów itd.
3. Trzy czujniki - ok, mamy tylko 8 kombinacji. A jeśli będę chciał np. 8 czujników to wtedy... 2^8 = 256 kombinacji. Zupełnie odpada.

Czy jest lepsza metoda?
Oczywiście. NXT daje nam interfejs cyfrowy I2C. Wykonanie multipleksera 8 czujników dotyku sprowadza się do jednego układu scalonego za 4,5zł. Do tego nie trzeba ŻADNEJ znajomości elektroniki :) W wolnej chwili wrzucę na forum opis mojego multipleksera czujników dotyku, czujników analogowych i silników. :)
Załączniki
Wykres zależności RAW od oporu.
Wykres zależności RAW od oporu.
raw(r).GIF (19.1 KiB) Przejrzano 9067 razy
Ostatnio zmieniony 2011-07-16, 19:48 przez skorupa, łącznie zmieniany 1 raz.

ODPOWIEDZ