Elektroda.pl
Elektroda.pl
X

Search our partners

Find the latest content on electronic components. Datasheets.com
Elektroda.pl
Please add exception to AdBlock for elektroda.pl.
If you watch the ads, you support portal and users.

Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino

p.kaczmarek2 23 Dec 2020 10:01 3564 16
  • Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Witajcie moi drodzy
    W tym temacie najpierw szczegółowo pokażę wnętrze drukarki HP Deskjet D1360, a potem przedstawię jak można wykorzystać jej części z Arduino. Określę pinout enkodera ze środka, napiszę kod pozwalający określić pozycję karetki dzięki użyciu enkodera, oraz też oczywiście posteruję jej silnikiem DC za pomocą dodatkowego modułu mostka H. Końcowym efektem prac będzie własny skecz Arduino pozwalający ustawić karetkę tej drukarki na wybranej przez nas pozycji.

    Teardown drukarki HP Deskjet D1360
    Drukarkę tą otrzymałem luzem, bez zasilacza - po prostu uratowałem ją z elektrośmieci.
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Drukarka od spodu:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Tabliczka znamionowa:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Aby dostać się do środka potrzebny nam będzie śrubokręt typu torx (czyli tzw. sześciokątny/gwiazdowy), taki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    (końcówka śrubokretu typu torx; źródło: Wikipedia)
    Taki też przygotowałem:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Często aby odsłonić śruby należy otworzyć pokrywę drukarki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Śruby są po obu stronach obudowy, z przodu i z tyłu:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Po odkręceniu górnej pokrywy można już zajrzeć do wnętrza drukarki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    W środku rzuca nam się w oczy ruchomy mechanizm karetki wraz z dwoma pojemnikami na tusz (które ruszają się razem z nią).
    Co ciekawe, ten mechanizm zrealizowany jest w oparciu o zwykły silnik DC, a nie krokowy. W tym momencie tego jeszcze nie widać, ale łatwo można się przekonać o tym po demontażu całości - do silniczka idą tylko dwa przewody.
    Sam silnik i mechanizm karetki też jest przykręcony torxami:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Drukarka określa pozycję karetki w oparciu o enkoder (tutaj ten enkoder jest podwójny - ma jedną diodę i dwa fototranzystory, ale o tym nieco dalej) który zlicza przeskoki kolorów na foliowym pasku:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teraz pokażę z bliska te paski. Do wykonania tego zdjęcia musiałem użyć lepszego oświetlenia i tła (biała kartka papieru).
    Oto foliowy pasek (tzw. 'encoder strip') na zdjęciu dobrej jakości:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Tutaj z powiększeniem:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    I jeszcze z nieco większym powiększeniem:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Wyraźnie widać paski.
    Sam enkoder po wylutowaniu wygląda tak:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Szczelina na pasek:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Z paskiem:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Środek enkodera; takie przepołowienie go jest oczywiście może być destrukcyjne, zrobiłem to by pokazać tutaj jego wnętrze:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Wyraźnie widać diodę i odbiornik.
    (Ale to nie jest enkoder z rozbieranej tutaj drukarki, tylko z innej; z tej drukarki z tematu go nie wylutowywałem)
    Do tematu enkodera i jego paska jeszcze wrócę.

    Kontynuując teardown drukarki: po wymontowaniu szyny z karetką możemy dostać się do płyty głównej oraz drugiego silnika DC, tutaj odpowiedzialnego za podawanie papieru:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino

    W ten sposób zostajemy już praktycznie z samą plastikową podstawą drukarki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Jednakże na zdjęciu powyżej ukryty jest jeszcze jeden wartościowy element. Znajduje się on w plastikowym podajniku papieru:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Często nie jest on nawet przykręcony, tylko trzyma się na zaczepach.
    Jest to płytka z kolejnym enkoderem, tutaj nawet z symbolem diody (dzięki czemu wiemy jaki jest pinout):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    I to już będzie wszystko w kwestii teardown. Poniżej podsumowanie rozbiórki.

    Uzyskane elementy
    Z drukarki zachowałem tylko to, co uznałem za przydatne. Plastikowa obudowa i zbędne metalowe elementy od razu zostały zutylizowane.
    Zostawiłem tylko te części:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Na zdjęciu widać:
    - prowadnica karetki wraz z ruchomą karetką (na karetce jest płytka z układem scalonym i podwójnym enkoderem; na prowadnicy jest paskowany czarny pasek dla enkodera)
    - dwa silniki DC (jeden od wyrzuconego mechanizmu podajnika papieru, drugi od karetki, tutaj osobno)
    - przycisk na osobnej płytce na dwóch kabelkach
    - pojedynczy enkoder luzem na osobnej płytce
    - płyta główna z drukarki ze złączem USB i kolejnym enkoderem
    - śrubki
    W powyższym zestawie nie ma ani jednego silnika krokowego (jak już to trafiałem na nie w układach od skaneru) i nie ma zasilacza, gdyż ta drukarka miała zasilacz zewnętrzny który chyba od mnie nie trafił.
    Poniżej spróbuję coś z pokazanych tutaj części zdziałać i zademonstrować, że można ich użyć do hobbystycznych projektów.


    Pinout enkodera od karetki
    Pierwsze czym się zainteresowałem to enkoder pozwalający określić nam bieżącą pozycję karetki. Enkoder posiada szczelinę na wcześniej wspomniany pasek:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Enkoder ten ma 6 wyprowadzeń, z jednej strony dwa, z drugiej cztery:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Enkoder ten zawiera w sobie jedną diodę i dwa czujniki. Jego schemat naszkicowałem poniżej:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Pomiędzy diodą a dwoma czujnikami przesuwa się wcześniej pokazany pasek - w trakcie przesuwania zasłania czujniki (czasem jeden, czasem drugi, czasem oba) co pozwala nam określić jego ruch i co za tym idzie pozycje karetki.
    Dioda od enkodera oczywiście wymaga rezystora - możliwe, że jest on gdzieś w pobliżu na PCB. Jeśli będziemy sami uruchamiać enkoder, to też musimy pamiętać by ten rezystor tam dać.
    Same wyprowadzenia enkodera nie są oznaczone i nie byłem w stanie znaleźć jego dokumentacji w internecie, choć znalazłem informacje mówiącą o tym, że nie są one standaryzowane i mogą być różne w zależności od modelu drukarki.
    Dlatego uważam, że warto wiedzieć, jak samemu określić który pin jest który.
    Zacząć można od najprostszego - masy:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Ten pin oczywiście będzie podłączony do masy całego układu/wylewki masowej na płytce. Na zdjęciu powyżej pokazuję że jest bezpośrednie połączenie między wybranym pinem enkodera a testowym pinem masy na PCB.
    Następnie warto rozpoznać VDD - zasilanie - w moim przypadku było na dwóch pinach:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    O tym, że jest to VDD możemy się domyśleć drogą eliminacji. Jeśli nie jest to masa, to co innego może być na dwóch pinach w takim enkoderze? Właśnie zasilanie - VDD. Jest ono podłączone zarówno do diody od enkodera, jak i do fototranzystorów z niego. VDD też jest często podłączone do + kondensatora elektrolitycznego.
    Dalej upewniłem się co do wyprowadzeń diody. Są one po jednej stronie enkodera, tam gdzie są tylko dwa piny. Użyłem do tego testu diody w moim multimetrze - pokazuje on spadek napięcia. Oczywiście dioda przewodzi tylko w jedną stronę, w drugą stronę tego odczytu nie będzie.
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    W tym momencie można już metodą eliminacji określić które piny (te dwa pozostałe) są wyjściami sygnałowymi czujników.
    Tak rozpoznałem wyprowadzenia enkodera.
    Na koniec trzeba zwrócić uwagę, że enkodery naprawdę mają różne wyprowadzenia i czasem np. na dwóch pinach mają masę, a czasem na dwóch pinach zasilanie...
    Też należy pamiętać, że enkoder przy swojej diodzie nie ma rezystora - musimy sami go tam dać.

    Podłączenie się do enkodera i karetki
    Teraz coś mało odkrywczego, lecz niezbędnego - sposób na podłączenie się do enkodera na karetce.
    Można po prostu dać własne przewody i może tak jest najprościej, ale ja postanowiłem użyć istniejącej tasiemki.
    W tym celu usunąłem z płytki zbędny układ scalony z pomocą pistoletu na gorące powietrze oraz usunąłem wszelkie połączenia układu z tasiemką (z jej złączem) z pomocą małej szlifierki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Podkreślam - przy robieniu podłączenia tą metodą należy usunąć WSZELKIE ZWARCIA oraz ZBĘDNE ELEMENTY z pinów od tasiemki i od nóżek enkodera. Inaczej można stracić dużo czasu na sprawdzanie potem czemu coś nie działa bo będzie np. zwierać zbędnie sygnał nam zapomniany rezystor SMD lub przelotka.
    Następnie wykonałem połączenia bezpośrednio od pinów enkodera do pinów złącza tasiemki. Do tego umieściłem tam rezystor:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Gotowa płytka karetki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teraz trzeba powtórzyć ten sam zabieg dla złącza z drugiej strony. Złącze na tasiemkę wyciąłem z PCB i sprawdziłem multimetrem czy nie ma zwarć, a te co były to usunąłem.
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Do złącza tego przylutowałem kabelki które pasują do Arduino:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Zachowałem kolorystykę połączeń zgodną z tym co miałem przy enkoderze:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Tak powstały wszystkie niezbędne połączenia dla testu już z Arduino, który przedstawię w następnym akapicie.

    Test enkodera - ADC
    Na początek przetestowałem enkoder z użyciem ADC. Enkoder najpierw zasiliłem z 5V, ale szybko okazało się, że 3.3V z Arduino też starcza i tego napięcia polecam Wam na początek użyć.
    Podłączenie do Arduino przedstawiam na zdjęciu:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Użyty sketch:
    Code: c
    Log in, to see the code

    Rezultat (w trakcie przesuwania głowicy):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Wygląda na to, że wszystko jest ok - wartość z ADC jest taka a nie inna dlatego, że enkoder zasiliłem z 3.3V z płytki Arduino a nie z 5V.
    1024*(3.3/5)=675, czyli około to co widzimy na UART.
    Następnie przerobiłem program tak by nie korzystał z ADC.

    Test enkodera - digitalRead
    Poniższy kod robi zasadniczo to samo co wcześniejszy przykład, po prostu korzysta z digitalRead zamiast zupełnie zbędnego w tej sytuacji analogRead. Warto zwrócić uwagę, że pin enkodera konfiguruję tutaj w trybie wejścia z rezystorem pullup (do zasilania), czyli INPUT_PULLUP, a nie np. tylko INPUT.
    Code: c
    Log in, to see the code

    Rezultat (w trakcie przesuwania głownicy):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Za pomocą tego kodu sprawdziłem oba wyjścia enkodera i oba dawały poprawny odczyt.

    Test enkodera - odczyt z obu czujników
    Następnie zmodyfikowałem kod tak, aby odczytywał wartości z obu czujników enkodera jednocześnie. Pozwoli to nam zaobserwować jak zmieniają się one względem siebie w trakcie przesuwania karetki.
    Code: c
    Log in, to see the code

    Poniżej przedstawiam rezultaty działania kodu.
    Ruch do strony silnika:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Ruch od strony silnika:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Porównanie na jednym obrazku:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Widać tutaj, że dzięki użyciu dwóch czujników tego enkodera na raz też możliwe jest określenie kierunku w który przesuwa karetka. Nieco dalej na pewno z tego skorzystam.
    (oczywiście by mieć sensowne odczyty Arduino musi nadążać z próbkowaniem enkodera i nie może gubić pasków)

    Wykrycie pozycji skrajnej/stopu - 'endstop'
    Kolejną rzeczą która przyda się zrobić jest wykrycie początkowej (bądź, jak kto woli - końcowej) pozycji karetki - czyli end stop. Jest to coś niemalże nie do obejścia - nawet drukarki 3D (w tym mój Ender 3 Pro) mają podobny mechanizm.
    Zrealizuję go tutaj w oparciu o kolejny element wymontowany wcześniej z drukarki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Element ten po prostu zwiera styki w momencie gdy jest naciśnięty.
    Jego oznaczenie to DMBL-01L 1A125 i można znaleźć o nim nieco informacji w sieci. Co ciekawe jest on używany też w myszkach komputerowych:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Ale myślę, że my nie potrzebujemy dodatkowych informacji na jego temat - obsługuje się go tak jak normalny przycisk w Arduino (digitalRead), dla wygody z wewnętrznym rezystorem pullup (tryb INPUT_PULLUP). Element podłączymy między ten pin a masę.
    Element zamontowałem z pomocą małej śrubki:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Dodatkowo zakleiłem jego od strony PCB by nie zrobić przypadkiem spięcia:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Zamontowany element:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Zostało tylko przygotować kod - odczyt stanu przycisku i wysyłanie go na UART w celu sprawdzenia czy wszystko działa.
    Całość poniżej:
    Code: c
    Log in, to see the code

    Kod przetestowałem w dwóch pozycjach karetki.
    Test endstop - karetka zaparkowana (przycisk jest wciśnięty, więc pin jest zwarty do masy, więc mamy 0):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Test endstop - karetka poza pozycja 0 (przycisk nie jest wciśnięty; pin nie jest zwarty do masy, ale jest pullup - rezystor do VCC, więc mamy 1):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino


    Sterowanie silnikiem DC poprzez moduł L298N
    Mamy już:
    - obsługę enkodera (zliczanie przesunięcia w oparciu o encoder strip)
    - obsługę wykrywania endstop
    Brakuje nam jeszcze obsługi silnika.
    Jest to silnik DC, kierunek przepływu prądu określa kierunek obrotów, więc potrzebny będzie mostek H. Najlepiej użyć gotowego modułu. Wybrałem moduł oparty o układ scalony L298N:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Powyżej pokazany moduł obsługuje dwa silniki DC i łatwo jest go znaleźć w wielu sklepach online.
    Pracuje na napięciach do 35V i prądach do 2A. Na pewno starczy.
    Schemat podłączenia silnika oraz jego sterowania:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Nota katalogowa L298:
    L298_H_Br..ge.pdf Download (597.3 kB)
    W ramach testu L298 przygotowałem prosty kod, który tylko i wyłącznie steruje silnikiem - po prostu co sekundę zmienia kierunek obrotów:
    Code: c
    Log in, to see the code

    Linia z analogWrite określa wypełnienie PWM czyli szybkość obrotów, natomiast digitalWrite dla pinów DA i DB określają kierunek obrotów.
    Niestety napięcie 5V tutaj okazało się za małe dla silnika od karetki; musiałem użyć zasilacza 12V DC:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Po jego odpowiednim podłączeniu silnik ruszył.
    Rezultat na filmie:

    Karetka już się porusza - w następnym akapicie przedstawię nieco lepsze nią sterowanie.

    Parkowanie i zliczanie kroków enkoderem
    Następnie mogłem już przygotować nieco bardziej zaawansowany przykład który wykorzysta już wcześniej omówiony detektor parkowania jak również enkoder (ale tylko jeden jego czujnik).
    Działanie przykładu opiera się na obsłudze bieżącego stanu urządzenia określonego enumeracją command_e.
    Zmienna offset określa bieżącą pozycję karetki.
    Zmienna repeats tutaj tylko pomaga wykryć zatrzymanie karetki.
    Zmienna prev_encoderA pamięta poprzedni stan odczytany z enkodera (wysoki lub niski), bo potrzebujemy go porównywać z bieżącym by móc wykryć zmianę.
    Cały kod poniżej:
    Code: c
    Log in, to see the code

    Przykład powyżej jeszcze nie obsługuje zliczania ruchu na pasku enkodera w obie strony, to przedstawię w następnym akapicie. Mimo to wszystko dobrze działa. co przedstawię na filmikach.
    Test z karetką na drugim końcu szyny:

    Test z karetką przy początku szyny:

    Arduino wykrywa w którym momencie karetka osiągnie skrajną wartość na szynie i wtedy przesuwa ją na drugą stronę. Po wykonaniu ruchu na UART wysyłana jest liczba zliczonych kroków.

    Parkowanie i zliczanie kroków enkoderem - na przerwaniach
    Kod z poprzedniego akapitu aż prosi się poprawić tak, by korzystał z przerwań - a dokładniej z przerwania 'on change'.
    W Arduino UNO jest ono dostępne na pinach 2 i 3.
    Więcej informacji tutaj:
    https://www.arduino.cc/reference/en/language/functions/external-interrupts/attachinterrupt/
    Do takich rzeczy należy używać przerwań, a nie sprawdzać ich co pętle tak jak w poprzednim przykładzie. Sprawdzanie co pętle może zawieść zwłaszcza jeśli chcemy coś w tej pętli robić oprócz sprawdzania.
    Przy okazji dodałem też obsługę zliczania kroków enkodera w obie strony - czyli odczyt z drugiego czujnika enkodera. Szczegóły w kodzie (w funkcji przerwania):
    Code: c
    Log in, to see the code


    Przesunięcie karetki do wybranej pozycji
    Teraz można jeszcze dodać osobną 'komendę' do kodu, czyli przesuwanie karetki na daną pozycję. Zrealizuję to w obsłudze przerwania, po prostu będę sprawdzać czy karetka jest za czy przed oczekiwaną pozycją. Oczekiwana pozycja będzie opisana zmienną target_offset.
    Pełny kod:
    Code: c
    Log in, to see the code

    Rezultat:

    Powyższy kod jest bardzo prymitywny. Sprawdzenie osiągnięcia celu karetki realizowane jest tutaj:
    Code: c
    Log in, to see the code

    Niestety takie rozwiązanie w wielu przypadkach może się nie sprawdzić - karetka będzie siłą rozpędu przeskakiwać swój cel i na przemian będzie wywoływać się ruch w prawo i w lewo (raz setup_move(0,120) a raz setup_move(1,120)).
    Można tu kombinować i np. bazować moc silnika na odległości od celu, choćby w ten sposób:
    Code: c
    Log in, to see the code

    albo zaprząc do pracy jakiś poważniejszy algorytm.

    Poprawić też tu mógłbym mechanikę tej karetki z drukarki, bo w moim przypadku ma luzy na szynie, ale uznałem że w ramach demonstracji jest to dopuszczalne. Być może wkrótce wrócę do tego projektu i coś więcej na nim zrealizuję.

    Sam kod powyżej też można by zoptymalizować, choćby digitalWrite w Arduino jest dość wolne (sprawdza indeks pinu, itp):
    Spoiler:

    Code: c
    Log in, to see the code


    Można je zamienić na zapis bezpośrednio do rejestru portu (np. do PORTB), operacja wykona się szybciej a efekt będzie ten sam. Jest to o dziwo bardzo duża zmiana, daje raptem jeden rozkaz zamiast kilkunastu lub więcej.

    Podsumowanie
    Pokazałem tu wnętrze drukarki HP Deskjet D1360 oraz zaprezentowałem jak można samemu obsłużyć jej enkoder i karetkę na platformie Arduino. Pokazane przykłady można by znacznie ulepszyć i pociągnąć dalej, a na bazie ich zrealizować jakiś bardziej zaawansowany projekt.
    Oczywiście w pełni zdaję sobie sprawę z tego, że o wiele wygodniej steruje się silnikami krokowymi, ale celem tematu było przedstawienie działania enkodera z drukarki a nie szukanie najlepszego rozwiązania.
    W kolejce do rozebrania mam też kilka skanerów z silnikami krokowymi, więc być może je też wkrótce opiszę.

    Cool! Ranking DIY
    Do you have a problem with Arduino? Ask question. Visit our forum Arduino.
  • NOVATEK-ELECTRO POLSKA SP. Z O.O.NOVATEK-ELECTRO POLSKA SP. Z O.O.
  • #2
    elektryku5
    Level 38  
    Z niektórych takich sprzętów cennym łupem były także krokowce, a jak się trafił unipolarny, to dopiero było fajnie, bo do sterowania starczał ULN2803 i jakikolwiek uC, w dobie gotowych modułów z driverami unipolarny nie robi problemu, ale jeszcze kila lat temu był jakimś atutem.
  • NOVATEK-ELECTRO POLSKA SP. Z O.O.NOVATEK-ELECTRO POLSKA SP. Z O.O.
  • #3
    p.kaczmarek2
    Level 25  
  • #4
    elektryku5
    Level 38  
    W skanerach przeważnie są, ale w starej plujce Lexmarka krokowiec też się znalazł.
  • #5
    SylwekK
    Level 31  
    Nie lubię arduino, ale temat będę śledził, bo nie jest mi obcy :) W swoich projektach przeważnie wykorzystuję silniki DC z enkoderami do ich pozycjonowania. Sterowanie takie ma szereg zalet względem silników krokowych. Wszystko zależy od docelowego urządzenia.
  • #6
    p.kaczmarek2
    Level 25  
    Też nie preferuję Arduino, ale kod Arduino to najlepszy sposób na zobrazowanie działania i najwięcej osób tak zrozumie. Robienie tego np. na PIC (tak jak bym wolał) i/lub pisanie po rejestrach by wprowadziło niepotrzebny zamęt.

    I jeśli komuś zależy to może nawet ten podany tu kod skompilować pod inną platformę, wystarczy zrobić wrappery dla użytych funkcji, choć użyta platforma musi mieć chociaż te dwa piny z zewnętrznym przerwaniem on change

    Swego czasu rozkręcałem dużą kserokopiarkę, tam to są fajne silniki krokowe.
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    M. in. 17PM-J142-P2VS i 17PM-J142-P1VS:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    jeszcze nie było czasu się nimi dobrze zająć, ale może kiedyś ożyją w jakimś DIY
  • #7
    acctr
    Level 18  
    p.kaczmarek2 wrote:
    Robienie tego np. na PIC (tak jak bym wolał) i/lub pisanie po rejestrach by wprowadziło niepotrzebny zamęt.

    Wystarczy dobrze opakować w funkcje lub makra i będzie wyglądać czytelnie :)

    Taka drukarka dobrze nadaje się na realizację odwróconego wahadła. Ciekawe jak arduino sobie z tym poradzi.
  • #8
    Pablo2015
    Level 18  
    acctr wrote:
    p.kaczmarek2 wrote:
    Robienie tego np. na PIC (tak jak bym wolał) i/lub pisanie po rejestrach by wprowadziło niepotrzebny zamęt.

    Wystarczy dobrze opakować w funkcje lub makra i będzie wyglądać czytelnie :)

    Taka drukarka dobrze nadaje się na realizację odwróconego wahadła. Ciekawe jak arduino sobie z tym poradzi.


    A no tak:
    https://www.youtube.com/watch?v=xwXPipYmJ9A&ab_channel=KousheekChakraborty

    Nie rozumiem tego hejtu na Arduino. Jest złe bo co? Bo jest proste i więcej osób może sobie zaprogramować mikrokontroler? Takie durne podejście można spotkać wszędzie na forum, byleby było jak najtrudniej bo wtedy jest dobrze, bo jest trudno, otóż nie...
    Ciekawe ile osób hejtujących Arduino pisze w asm? Proponuje iść o krok dalej i pisać w kodzie maszynowym albo w ogóle budować sterowniki na tranzystorach i opampach...

    To wyżej to oczywiście ironia, jednak w/w pytanie pozostawiam otwarte, dla czego Arduino jest wg. niektórych rodzynków z elektrody takie złe?
  • #9
    acctr
    Level 18  
    Pablo2015 wrote:
    Nie rozumiem tego hejtu na Arduino. Jest złe bo co?

    Serio nie rozumiesz czy tylko tak piszesz? Ja widzę dwa źródła znienawidzenia arduino przez elektroników z dłuższym doświadczeniem:
    - techniczny - arduino narzuca pewien sposób myślenia o programie, czyli np programista piszący od wielu lat w asm czy C czuje się ograniczony i mimo że posiada dużą wiedzę musi się nauczyć nowych reguł. Biblioteki udostępniane przez społeczność mają swoje mocne i słabe strony - można się naciąć na bugi trudne do identyfikacji.
    - społecznościowy - wystarczy wpisać w internecie Arduino i np asembler PIC i porównać wyniki wyszukiwań. Arduino to już niemal synonim elektroniki, na youtube arduinowcy mają po miliony wyświetleń. To jest rozpoznawalna marka nawet przez laików. Powiedz w towarzystwie, że robisz smart home z pomocą Arduino - od razu zyskasz zainteresowanie i podziw. A jeśli powiesz, że kontemplujesz PICe z pomocą asemblera popatrzą z politowaniem. Ssaki już tak mają, że dobrze czują się w grupie i źle traktują odmieńców. Arduino daje poczucie wspólnoty. Poza tym, to może być po prostu wkurzające, że specjalista z doświadczeniem kilkunastoletnim nie jest doceniany w sposób jaki są doceniani amatorzy, którzy w jeden dzień sklecili z Arduino jakieś urządzenie sterowane ze smartfona.
  • #10
    klakier2121
    Level 9  
    Dosyć dawno temu zrobiłem całą "drukarkę" na pisak. Karetka z HP identyczna jak autora tematu, a pozycjonowanie stołu zrobione z silniczka z enkoderem od skanera. Konwersja obrazu na instrukcje do arduino pisałem w pythonie. Stary filmik, ale coś tam widać.


    Link
  • #11
    SylwekK
    Level 31  
    Pablo2015 wrote:
    Nie rozumiem tego hejtu na Arduino. Jest złe bo co? Bo jest proste i więcej osób może sobie zaprogramować mikrokontroler? Takie durne podejście można spotkać wszędzie na forum, byleby było jak najtrudniej bo wtedy jest dobrze, bo jest trudno, otóż nie...

    Kolega wyżej już opisał część "złego" arduino, a ja to jeszcze uzupełnię. Idea arduino była może i słuszna, ale poszło to w złym kierunku. 80% "elektroników" to modułowi składacze nie mający pojęcia co w ogóle do czego podłączają. Arduino uczy od samego początku NIE łatwego wejścia w świat elektroniki (choć takie było pewnie założenie) tylko zwykłego niechlujstwa. Wystarczy spojrzeć na YT ile jest głupkowatych projektów w pośpiechu poskładanych na płytkach stykowych i zalanych termoglutem w pudełku po butach. Młodzi wchodzą często w świat mikrokontrolerów bez ŻADNYCH podstaw cyfrowej elektroniki, bez wiadomości jak działa przerzutnik czy branka NAND, co pozwoliło by zrozumieć wiele niuansów podczas programowania i projektowania układów.
    Pablo2015 wrote:
    Ciekawe ile osób hejtujących Arduino pisze w asm? Proponuje iść o krok dalej i pisać w kodzie maszynowym

    Jeśli Ci to poprawi humor to bardzo dużo pisałem w ASM zanim poznałem C, wprawdzie na inną rodzinę mikroprocesorów, ale nawet nie wyobrażasz sobie jak mi to teraz pomaga w projektowaniu i tworzeniu rozmaitych algorytmów :)
    Pablo2015 wrote:
    albo w ogóle budować sterowniki na tranzystorach i opampach...

    I tu dochodzimy do sedna, a właściwie wracamy do początku, o tysiącach głupkowatych projektów typu migająca dioda gdzie wg, nie których bez arduino nie jest możliwe wykonanie takiego efektu. Wiele prostych projektów łatwiej i taniej jest zrobić właśnie na tranzystorach i opampach, ale do tego potrzebna jest ...wiedza. To właśnie jest to o czym pisałem - zero podstaw elektroniki. Zatwardziali arduinowcy u mnie plasują się mniej więcej na równi ze składaczami klocków lego - w większości to nie są żadni elektronicy.
    Na koniec żeby nie być tu niesprawiedliwym, nie wkładam wszystkich do jednego wora. Doceniam sporo naprawdę świetnych projektów na arduino stworzonych przez ludzi, którzy zrozumieli tą ideę i wykorzystali w dobrym kierunku. Powstało też mnóstwo ciekawych bibliotek stworzonych przez pasjonatów. Szkoda tylko, że gubią się w milionach innych ścieków pisanych na kolanie, przez ludzi bez elementarnej wiedzy.
    Możesz się ze mną nie zgadzać. Przechodziłem przez wiele etapów elektroniki i programowania. Obserwuję rozwój techniki i staram się być na bieżąco. To są moje spostrzeżenia.
  • #12
    zulugula
    Level 17  
    Też się bawiłem taką prowadnicą tyle ze na stm32, mają wbudowany licznik kwadraturowy. Można się fajnie PID'em pobawić, zrobić prosty serwomotor.
  • #13
    Matheu
    Level 23  
    @P.Kaczmarek – dzięki za bardzo prosto i przystępnie napisany artykuł!
    mam tylko "pytania":
    a) przy testach enkodera (odczyty z obu kierunków)
    - w dwóch tabelkach jest taki sam opis <Ruch od strony silnika> ?
    b) śródtytuł mówi o <Sterowanie silnikiem DC przez moduł L239D>
    a w tekście i na rysunku jest moduł 298N
    Prawdopodobnie – drobne omsknięcia?

    Dzięki i dobra robota!
    pozdr- Maciek
  • #14
    satanistik
    Level 27  
    Taka mała uwaga - sam transoptor szczelinowy nie jest jeszcze enkoderem.
  • #15
    p.kaczmarek2
    Level 25  
    acctr wrote:

    Wystarczy dobrze opakować w funkcje lub makra i będzie wyglądać czytelnie :)

    Akurat Arduino jest właśnie dobrym opakowaniem w funkcje i makra.

    Ale ogólnie to jak ktoś chce wyzwanie to może sobie wziąć bieżący kod i pod innym mikrokontrolerem upakować w funkcje i makra tak by działał. Jak najbardziej się da, nawet w dużej mierze w języku C się uda (choć trzeba będzie wyrzucić z pętli for deklarację zmiennej int i dać ją na początek funkcji, wszystkie deklaracje dać na początek bloków, oraz przeładowywanie funkcji pominąć, czyli tracimy Arduionowe printy od Serial). Ale np. samo Serial.begin da się nawet w C odwzorować, mimo iż nie ma tam klas:
    Code: c
    Log in, to see the code

    To powyżej się kompiluje w C, można by to pociągnąć dalej (nie jest kompletne).

    acctr wrote:

    - społecznościowy - wystarczy wpisać w internecie Arduino i np asembler PIC

    Assembler PIC, akurat wspomniałeś o tym czym się trochę zajmowałem. I nie tylko samym pisaniem w assemblerze.
    Mam częściowo zrobiony np. własny disassembler dla PIC:
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    I też mam prototyp własnego assemblera dla PIC18F (już kompiluje proste programy):
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    Teardown drukarki HP Deskjet D1360 i przykład użycia jej części z Arduino
    I mimo wszystko uważam, że Arduino może być dobre, a już na pewno lepiej użyć Arduino do celów demonstracyjnych niż np. PICa

    Matheu wrote:

    b) śródtytuł mówi o <Sterowanie silnikiem DC przez moduł L239D>
    a w tekście i na rysunku jest moduł 298N

    Dobre spostrzeżenie, oczywiście mój błąd. Początkowo chciałem użyć L293D i dać go na płytce stykowej (bo on jest w DIP) i zademonstrować dokładnie co i jak samemu podłączyć bez użycia modułu. A potem uznałem, że to zbędna komplikacja, bo to jednak dział "Wnętrza urządzeń" i chcę pokazać samą zasadę działania.
    Poprawione.

    Matheu wrote:

    a) przy testach enkodera (odczyty z obu kierunków)
    - w dwóch tabelkach jest taki sam opis <Ruch od strony silnika> ?

    Chyba raz jest "od" a w drugiej "do"? Ale można by to lepiej ująć.

    Temat jeszcze przejrzę pod kątem takich niedopatrzeń.
  • #16
    acctr
    Level 18  
    p.kaczmarek2 wrote:
    I też mam prototyp własnego assemblera dla PIC18F (już kompiluje proste programy):

    To wygląda jak makroasembler. Z jakim kompilatorem go używasz?
  • #17
    czareqpl
    Level 30  
    p.kaczmarek2 wrote:
    Środek enkodera; takie przepołowienie go jest oczywiście może być destrukcyjne, zrobiłem to by pokazać tutaj jego wnętrze:


    To jest destruktywne, czy nie?