Spisu treści:

Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe: 5 kroków
Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe: 5 kroków

Wideo: Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe: 5 kroków

Wideo: Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe: 5 kroków
Wideo: Przegląd aplikacji dedykowanych do przetwarzania produktów LiDAR 2024, Lipiec
Anonim
Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe
Skaner punktowy XYZ wykorzystujący odzyskane enkodery obrotowe

Po nabyciu sporej ilości porzuconych obrotowych enkoderów optycznych z mojego miejsca pracy, w końcu postanowiłem zrobić z nimi coś zabawnego/użytecznego.

Niedawno kupiłem nową drukarkę 3D do mojego domu i co może ją komplementować lepiej niż skaner 3D! Ten projekt dał mi również doskonałą okazję do wykorzystania mojej drukarki 3D do produkcji wymaganych części.

Kieszonkowe dzieci

Enkodery optyczne i odpowiadające im czujniki optyczne

Arduino UNO

opcjonalna tarcza do prototypowania

szyny z prętów stalowych, dostęp do drukarki 3D

Krok 1: Enkodery optyczne

Enkodery optyczne
Enkodery optyczne
Enkodery optyczne
Enkodery optyczne
Enkodery optyczne
Enkodery optyczne

W tym projekcie można użyć prawie każdego enkodera obrotowego, pod warunkiem, że zapewnia on stosunkowo dużą liczbę „kliknięć” na mm. Oczywiście różne enkodery będą wymagały odpowiedniego rozwiązania montażowego.

Użyłem miernika ciągłości, aby prześledzić schemat połączeń fotoczujników.

Krok 2: Części drukowane w 3D

Części drukowane w 3D
Części drukowane w 3D
Części drukowane w 3D
Części drukowane w 3D

Części te mieszczą obrotowe enkodery i zapewniają prowadnicę dla szyny. Obudowa pojedynczego enkodera ma z tyłu dwa otwory, do których można zamontować poprzeczne szyny. Obudowa podwójnego enkodera to po prostu dwie pojedyncze obudowy połączone ze sobą pod właściwymi kątami.

Zaprojektowałem te mocowania na fusion360, aby pasowały do mojego wyboru enkoderów i szyn, wałek enkodera ma krótki kawałek gumowej osłony procy, aby pomóc mu lepiej chwycić wałek ze stali nierdzewnej.

Chcesz, aby wałek ślizgał się swobodnie i spadał przez obudowę, gdy jest trzymany pionowo, ale musi wywierać wystarczający nacisk na enkoder, aby się nie ześlizgnął. U mnie zadziałało umożliwienie zachodzenia suwaka wałka na wałek enkodera o 0,5 mm. Guma procy jest wystarczająco miękka, aby odkształcić się o tę wartość i zapewnia dobrą przyczepność.

Krok 3: Schemat połączeń

Schemat połączeń
Schemat połączeń

Obwód jest bardzo prosty. Czujniki optyczne wymagają prądu dla diod emitujących IR, uziemienia i rezystorów podciągających dla fotodiod.

Zdecydowałem się na 5mA dla szeregowych diod emiterowych, w tym konkretnym enkoderze spadek napięcia na diodach wynosi 3,65V. Używam zasilania 5 V z Arduino, które pozostawia 1,35 V dla rezystora, przy 5 mA daje to 270 omów.

Do podciągania wybrano 10k omów, ponieważ fotodiody mogą odprowadzać tylko niewielki prąd, 10 k omów użyto również do przycisku. Dostępny jest przycisk do użycia na płytce prototypowej już podłączonej do masy, wystarczy wyposażyć ją w rezystor podciągający i podłączyć do żądanego pinu wejściowego.

Krok 4: Kod Arduino

Kod Arduino
Kod Arduino
Kod Arduino
Kod Arduino
Kod Arduino
Kod Arduino

Kod wymaga niewielkiego wyjaśnienia, ponieważ jego działanie może nie być od razu oczywiste, jednak musiał zostać w ten sposób zoptymalizowany, aby móc wystarczająco szybko przetworzyć 3 kodery.

Po pierwsze chcemy przetwarzać dane kierunku tylko JEŚLI nastąpiła zmiana pozycji enkodera.

zmiany = nowa_wartość ^ przechowywana wartość;

Aby uzyskać większą rozdzielczość z moich enkoderów, musiałem przetwarzać zarówno zbocza narastające, jak i opadające.

Na mojej konfiguracji moja rozdzielczość to 24 kliknięcia na 1cm.

To pozostawia nam kilka scenariuszy.

S1 jest stała 0, a S2 zmienia się z 0 na 1

S1 jest stała 0, a S2 zmienia się od 1 do 0

S1 jest stała 1, a S2 przełącza od 0 do 1

S1 jest stała 1, a S2 przełącza od 1 do 0

S2 jest stała 0, a S1 zmienia się z 0 na 1

S2 jest stała 0, a S1 zmienia się od 1 do 0

S2 to stała 1, a S1 przełącza od 0 do 1

S2 to stała 1, a S1 przełącza od 1 do 0

Warunki te są lepiej zrozumiane w powyższych tabelach prawdy, również każdy warunek daje „kierunek”, arbitralnie nazwany 0 lub 1.

Wykresy dają nam dwie ważne wskazówki:

1) jeden wykres jest całkowitą odwrotnością drugiego, więc jeśli mamy jeden, możemy łatwo obliczyć drugi, po prostu odwracając dane wyjściowe. Odwracamy wyjście tylko wtedy, gdy jeden pin się zmienia, a nie drugi, możemy wybrać jeden dowolnie.

2) sam wykres to po prostu XOR sygnałów S1 i S2. (drugi wykres jest NIE tego).

Teraz zrozumienie kodu jest proste.

// wczytaj PORT równolegle//pamiętaj, że sąsiednie pary należą do tego samego stanu enkodera = PINB & 0x3f; // jakie piny się zmieniły, jeśli jakakolwiek diff = hold ^ state; // XOR sąsiadujące sygnały S1 i S2 w celu uzyskania tabeli prawdy // najłatwiej zrobić kopię aktualnego stanu // i przesunąć go w prawo o jeden bit lookup = state >> 1; // teraz bity są wyrównane dla XOR dir = lookup ^ state; // pamiętaj, tabela musi zostać odwrócona, jeśli // jedno z wejść pozostało stałe, nie potrzebujemy do tego // instrukcji IF. Obecnie żądany bit kierunku // jest prawym bitem każdej pary w zmiennej 'dir' // lewy bit jest bez znaczenia // zmienna 'diff' ma bit, który zmienił 'set' // więc albo mamy '01' lub '10' // XOR to z bajtem 'dir' odwróci lub nie znaczący bit. katalog ^= różnica; // teraz zaktualizuj hold zmienna hold = stan; // jeśli któryś z bitów się zmienił dla tego kodera if(diff & 0x03) { // określ kierunek if(dir & 0x01) { // na podstawie sprzętu i okablowania ++ lub -- --z; } inny { ++z; } } // tak samo dla reszty if(diff & 0x0c) { if(dir & 0x04) { ++y; } inny { --y; } } if(diff & 0x30) { if(dir & 0x10) { --x; } inny { ++x; } }

Po naciśnięciu przycisku wysyłamy aktualną wartość XYZ do programu terminala.

Dane szeregowe są wolne, ale podczas normalnej pracy pozycje enkoderów i tak nie będą się w tym czasie zmieniać.

Dane są wysyłane jako nieprzetworzone liczniki. Możesz wykonać obliczenia i wysłać dane w mm lub calach itp. Uważam, że surowe wartości są równie dobre, ponieważ możemy później skalować obiekt w oprogramowaniu.

Krok 5: Pierwsze skanowanie

Pierwszy skan
Pierwszy skan
Pierwszy skan
Pierwszy skan
Pierwszy skan
Pierwszy skan
Pierwszy skan
Pierwszy skan

Zbieranie punktów jest powolnym procesem, podbijam sondę w lewym górnym rogu i resetuję Arduino.

To zeruje pozycję jako dom.

Następnie przesuń sondę do miejsca na celu, przytrzymaj ją nieruchomo i naciśnij przycisk „migawka”.

Za tę dość dużą próbkę wziąłem tylko ~140 punktów, więc szczegóły nie są zbyt dobre w produkcie końcowym.

Zapisz dane w pliku. PCD i dodaj nagłówek

#. PCD v.7 - Format pliku danych chmury punktów WERSJA.7 POLA x y z ROZMIAR 4 4 4 TYP F F F LICZBA 1 1 1 SZEROKOŚĆ (liczba punktów) WYSOKOŚĆ 1 PUNKT WIDZENIA 0 0 0 1 0 0 0 PUNKTÓW (liczba punktów)

Umieść liczbę punktów w nagłówku, jest to łatwe w każdym edytorze, który udostępnia numery linii.

Powyżej kropek widać w programie freeCad, są one następnie eksportowane z programu freeCad jako plik. PLY.

Otwórz. PLY na MeshLab i wyłóż obiekt na powierzchnię. Gotowe!!

Zalecana: