wtorek, 19 października 2021

Kontroler OnStep oparty o Arduino Mega 2560 i RAMPS 1.4


Kilka miesięcy temu udało mi się okazyjnie kupić teleskop z lustrem 6 cali. Celestron C6-N. Trochę zabytkowy z wczesną wersją montażu CG-4. Co istotne nie był zmotoryzowany. Już poprzedni mój teleskop Sky Watcher 1309eq2, częściowo zmotoryzowałem zaczynając od focusera. Przy Celestronie było to po prostu łatwiejsze. Zacząłem od zaprojektowania sposobu montażu silników krokowych, a w czasie oczekiwania na potrzebne elementy i próbowania kolejnych wersji mocowań, sprawdzałem jak to wszystko wprowadzę w ruch. Focuser sam oprogramowałem w Micropython, ale tu było dużo trudniej i wiele problemów do rozwiązania. Na szczęście trafiłem na projekt OnStep. Opis mocowania silniczków jest tu.

Musiałem przeczytać wiele wątków na forum OnStep, stron Wiki i innych wpisów by wykonać mój sterownik. Dlatego postanowiłem spisać HowTo dla mojej wersji. Może ktoś będzie chciał też zmotoryzować swój teleskop i ten  opis mu pomoże. By było jasne, ten opis nie zrobi wrażenia na starych wyjadaczach. Od nich chętnie usłyszę co zrobiłem źle lub co mogło by być zrobione lepiej. Ten opis jest dla amatorów słabo znających się na elektronice, ale potrafiących coś zlutować, użyć miernika i użyć wiertarki jeśli trzeba.      


Platforma sprzętowa

Siłą projektu jest możliwość dostosowania go do różnych montaży teleskopowych i uruchomienia go na różnych mikrokontrolerach. Ja wybrałem wersję z minimalną ilością lutowań i tanimi komponentami choć jednocześnie jedną z mniej wydajnych. Dzięki popularyzacji drukarek 3D, komponenty, które wybrałem do budowy są stosunkowo tanie. Klon Arduino Mega + RAMPS to razem koszt około 55pln. Ten sprzęt już miałem, w związku z krótką przygodą z AstroEQ. Sterowniki silników krokowych (stepstick) kosztują od 6-76pln. Zależy od ich głośności, zakresu mikrokroków i precyzji kroków. Wybrałem kompromis. LV8729 zapewnia mikrokroki do 1/128 i w miarę cichą pracę. Obsługuje też całkiem duże napięcie (max do 1.8A). Jeśli wybierzecie inny model to upewnijcie się na Wiki projektu, czy dana wersja będzie działać z OnStep. 

Klon Arduino Mega 2560 v.3.0
RAMPS 1.4
Wemos D1 Mini ESP8266
Konwerter poziomów 5V-3V
Moduł RTC DS3231
Obudowa z tworzywa Z4A
Sterownik silnika krokowego LV8729
Listwy GoldPin
kabel KYNAR i kabelki połączeniowe
gniazdo DC 2,1/5,5 i przedłużacz kilkumetrowy na ten wtyk
włącznik kołyskowy bistabilny

Razem koszt to mniej niż 200pln. Po dodaniu montażu silników razem to około 300pln.


Kilka linków

Strona grupy OnStep

Strona Wiki 

Strona autora projektu http://www.stellarjourney.com/  

Wiki: RAMPS 1.4, 1.5, 1.6

Wiki (starszy opis): RAMPS 1.4/1.5 with Mega2560

Wątek o regulacji LV8729

Realizacje wg montaży

Przydatny wątek o LV8729

Ciekawy opis realizacji na Arduino Mega bez RAMPS

Strona RAMPS 1.4

Realizacja opisane na Instructables


Podłączanie do RAMPS

RAMPS został stworzony do obsługi drukarek 3D. Ale OnStep ma bardzo podobne potrzeby: obsługa kilku silników krokowych przez kontrolery stepstick, podłączenie urządzeń po portach szeregowych i I2C. Dzięki temu nie trzeba dużo lutować.

Oto co podłączyłem w aktualnej wersji kontrolera: 

1. Dwa kontrolery LV8729 do kontroli osi RA/DEC teleskopu.

    Pod kontrolerami są wyprowadzone zworki do ustawienia mikrokroków. Prędkość określa się podając napięcie na odpowiedni pin stepstick-a czyli zwierając odpowiednią zworkę. Projekt przewiduje korzystanie z dwóch wartości mikrokroków: wolniejszy obrót dla śledzenia (AXISn_MICROSTEPS) i szybszy dla zmiany pozycji (AXISn_MICROSTEPS_GOTO). Trzy piny to trzy bity dające wartość 0-7. Tyle jest też różnych wartości mikrokroków. Dla ułatwienia dobiera się te wartości dla stałych ustawień pierwszych dwóch bitów i OnStep dokonuje regulacji na bicie 3. Daje to następujące trzy pary parametrów AXISn_MICROSTEPS/AXISn_MICROSTEPS_GOTO: 32/2, 64/4, 128/8. Uzyskuje się to łącząc trzecią zworkę z pinem na RAMPS (jak na schemacie) a pozostałe odpowiednio zwierając. Ja w tej chwili mam ustawione 32/2, ale być może zwiększę parametry, gdy spróbuję fotografować. Oczywiście trzeba odpowiednio wyregulować stepstick-i do silników. Kalkulator np. tu. A tu opis LV8729.

2. Wemos D1 Mini po złączu szeregowym do obsługi Smart Web Server

Smart Web Server pozwala zarządzać podstawowymi funkcjami OnStep przez prostą stronę WWW oraz podłączenie przez sieć IP popularnych aplikacji astronomiczna na Windows/Linux/Android/iOS.

Opis poniżej w rozdziale Smart Web Server.

3. Moduł RTC DS3231 do obsługi zegara na łączu I2C 

Arduino nie ma własnego zegara czasu rzeczywistego. Moduł wystarczy poprawnie podłączyć do wyjścia I2C oraz ustawić model modułu w config.h (na etapie generacji konfiguracji). 


Schemat ze strony Wiki Onstep
Schemat ze strony Wiki Onstep

Schemat połączeń mojego OnStep

Schemat mojego rozwiązania


Zasilanie

Do pracy kontroler Arduino + RAMPS potrzebuje 12V. Ja podpiąłem zasilacz 3,5A. Ale być może jeśli obsadzone będzie więcej silników to było by za mało. Przy moich dwóch silnikach pewnie wystarczyłby mniejszy. Zasilanie podpiąłem do wejścia 5A/12V (widać na schemacie). Zasilacz ma wtyk 5,5/2,1 i takie gniazdo ma obudowa. Zaopatrzyłem się też w kilkumetrowy przedłużacz na te wtyki, ale w terenie przyda się rozwiązanie z akumulatorem 12V. Do wymyślenia na przyszłość. 


Konfiguracja parametrów i Generator

Konfiguracja OnStep jest przechowywana w pliku config.h. Ręczna modyfikacja byłaby trudna. Na szczęście jest strona z generatorem konfiguracji, z której można wygenerować nasz plik. Procedura jest taka:
  1. W dokumencie excel (do pobrania tu) trzeba ustawić parametry napędów.
  2. Na stronie Generatora Konfiguracji  trzeba wypełnić dane. Część trzeba skopiować z pól wyliczonych w excel-u.
  3. Nacisnąć "Generate"
  4. Pobranym plikiem zastąpić zawartość pliku config.h w katalogu z programem OnStep.
  5. To wszystko to punkt 7. z rozdziału poniżej.
Kilka wartości wymaga wyjaśnienia.
    
    Excel:
  1. Stepper-Steps - ilość kroków na obrót silnika krokowego. U mnie 200. 
  2. AXIS1_DRIVER_MICROSTEPS - mikrokroki ustawione dla śledzenia na RAMPS. U mnie 32. 
  3. GR1 - przełożenie na kołach zębatych lub przekładni planetarnej. Ja mam dla DEC 60 zębów na 20 czyli wartość 3. Dla RA mam 40 zębów na 16 czyli wartość 2,5.
  4. GR2 - liczba pełnych obrotów pokrętła mikroruchów teleskopy dla obrócenia tuby teleskopu o 360 stopni w danej osi. Jeśli nie znajdziecie tych parametrów dla waszego montażu w Necie to pozostaje tylko to zmierzyć empirycznie. Np. ustawić tubę w pionie (przyda się poziomica) i obracać aż dojdziecie do poziomu. Potem trzeba przemnożyć przez 4. Dla mojego CG-4 są to: RA=130, DEC=64
  5. SLEW_RATE_BASE_DESIRED - oczekiwana prędkość przesuwania tuby w trybie szybkim (w °/s). Jeśli podacie za dużą wartość to sprzęt może nie dać rady lub silniki będą głośno pracować. Ja w tej chwili podaje 2. Mi się to wydaje dobrym kompromisem między głośnością a szybkością.

    Generator:

  1. MICROSTEPS_GOTO - mikrokroki dla szybkiego ruchu silniczków. U mnie 2.
  2. Automatically Start Tracking - przydatne gdy testujemy silniczki i nie mamy jeszcze możliwości sterowania ruchami teleskopu. Ale potem lepiej to wyłączyć.

Instalacja oprogramowania

Szczegółowa instrukcja instalacji OnStep na Arduino Mega 2560 jest tu. W skrócie należy:

  1. Zainstalować Arduino IDE
  2. Dla klona Arduino z CH340 trzeba zainstalować sterownik np. stąd: https://cdn.sparkfun.com/assets/learn_tutorials/8/4/4/CH341SER.EXE
  3. Pobrać kod OnStep z GITHUB wybierając Code -> Download ZIP
  4. Rozpakować do jakiegoś katalogu i uruchomić OnStep.ino
  5. Uruchomi się Arduino IDE, ustawić w menu Tools->Board->Arduino Mega or Mega 2560
  6. Wybrać port, który się pojawi po podpięciu Arduino do USB (numer można sprawdzić w Menagerze Urządzeń)
  7. Plik config.h nadpisać wygenerowanym w rozdziale powyżej.
  8. Jeśli domyślnie nie masz biblioteki dla RTC DS3231 to pojawi się błąd. Przejdź do Sketch->Include library->Manage Libraries i wyszukaj 'RTC by Makuna' na liście dostępnych bibliotek i zainstaluj.
  9. Nacisnąć "Upload" i poczekać na komunikat, że się udało.

Smart Web Server

Łączność z OnStep można zapewnić na 4 sposoby.

1. Kabel USB podłączony do portu Arduino Mega. To rozwiązanie wymaga modyfikacji kabla. Trzeba odłączyć linię zasilania 5V, zostawiając pozostałe 3 sygnały. Jest to konieczne, ponieważ Arduino po podpięciu kabla USB wyłącza inne zasilania zewnętrzne. Jeśli odetniemy w kabli V+ to Arduino zostanie na zasilaniu zewnętrznym (w naszym przypadku z RAMPS) i jednocześnie będzie działać łączność szeregowa na USB. Ja użyłem taśmy izolacyjnej wyciętej w wąski pasek naklejonej na styk we wtyczce, ciągle działa.

2. Łączność WiFi. To rozwiązanie zastosowałem. Wymaga podpięcia mikrokontrolera ESP8266 do jednego z dwóch postów szeregowych na RAMPS. Najczęściej stosowany model to Wemos D1 Mini, choć na stronie projektu jest wymienionych więcej modeli. Akurat Wemos-a miałem pod ręką z wcześniejszego projektu.  

Trzeba pamiętać, że Wemos D1 musi zostać oddzielnie zaprogramowany. Opis na Wiki jest tu. A program tu

Na czas programowania najlepiej wyjąć go z płytki, tak by nie dostał jednocześnie zasilania z dwóch źródeł. W Arduino IDE należy zmienić Board na "LOLIN(WEMOS) D1 R2 and mini" oraz port na ten, który się pojawi po podpięciu. Konfiguracja sieci jest w pliku Extended.config.h, w którym można zmienić ustawienia np. czy ma wystawić własny AccesPoint czy podłączyć się do istniejącego. Konfiguracja dla jego AP mi zadziałała, ale nie mogłem go przełączyć na moje domowe WiFi. Na szczęście na wystawionej przez niego stronie WWW można zmienić parametry sieci i taka zmiana działa.

Poniżej fragment konfiguracji odpowiedzialny za sieć:

// IP ADDRESS SETTINGS -----------------------------------------------------------------------
// These settings are stored in NV (EEPROM) and will not revert to the defaults once first set 
// NV is wiped, these settings (where applicable) can be changed at runtime however.
#define AP_ENABLED                   true //        true, Wifi Access Point Enabled.
#define AP_SSID                  "ONSTEP" //    "ONSTEP", Wifi Access Point SSID.
#define AP_PASSWORD            "password" //  "password", Wifi Access Point password.
#define AP_CHANNEL                      7 //           7, Wifi Access Point channel. 
#define AP_IP_ADDR          (192,168,0,1) // ..,168,0,1), Wifi Access Point IP Address.
#define AP_GW_ADDR          (192,168,0,1) // ..,168,0,1), Wifi Access Point GATEWAY Address.
#define AP_SN_MASK        (255,255,255,0) // ..55,255,0), Wifi Access Point SUBNET Mask.

#define STA_ENABLED                 false //       false, Wifi Station Enabled. 
#define STA_DHCP_ENABLED             true //        true, Wifi Station DHCP Enabled.
#define STA_SSID                   "Home" //      "Home", Wifi Station SSID to connnect to.
#define STA_PASSWORD           "password" //  "password", Wifi Station mode password.
#define STA_IP_ADDR        (192,168,1,55) // ..168,1,55), Wifi Station/Ethernet IP Address.
#define STA_GW_ADDR         (192,168,1,1) // ..,168,1,1), Wifi Station/Ethernet GATEWAY Address.
#define STA_SN_MASK       (255,255,255,0) // ..55,255,0), Wifi Station/Ethernet SUBNET Mask.

Ważnym tematem jest różnica napięć na stykach RX/TX oby mikrokontrolerów. Arduino Mega pracuje na 5V, a Wemos ESP2866 na 3.3V. To zmusza do zastosowania rozwiązania z rezystorami lub konwerterem poziomów (Level Shifter). Ja zastosowałem konwerter bo miałem go pod ręką.

3. Łączność po bluetooth. Wystarczy podpiąć do jednego z dwóch wyjść szeregowych wyprowadzonych na RAMPS moduł HC-05 lub HC-06. Obsługa modułu jest w głównym oprogramowaniu OnStep. Trzeba pamiętać, że HC-05 działa na 3.3V. Można zastosować rozwiązanie z konwerterem poziomów. HC-06 pracuje na 5V.

4. Port Ethernet. Nie zgłębiałem tego rozwiązania bo dla mnie było mało praktyczne. Szczegóły są na Wiki OnStep.



Sterowanie

Najlepszy opis jest tu. Kilka uwag ode mnie. Na Windows potrzebny jest ASCOM Driver. Działają wtedy programy typu Stellarium, Cartes du Ciel lub Sky Planetarium. Sterownik pozwala obsłużyć połączenie kablem USB (z odciętym 5V) lub przez WiFi (adres IP Smart Web Servera i port 9999).
Ale z tych aplikacji nie da się lub tylko częściowo się da wykonać parkowanie, odparkowywanie, kalibrowanie na gwiazdy lub korekta strzałkami w czterech kierunkach. Dlatego ja zawsze zaczynam od strony lub aplikacji OnStep na komórce. Tam wykonuję pierwsze przesunięcia. Kalibruję na gwiazdy, a potem dopiero ewentualnie przechodzę do aplikacji na komputerze. Aplikacje sterujące na komputerze są za darmo, na telefon są płatne (z wyjątkiem wspomnianej OnStep) i ponieważ jeszcze ich nie kupiłem to się na ich temat nie wypowiem.
Warto jednak wyjaśnić co to jest parkowanie, bo trochę mi zajęło zanim znalazłem i zrozumiałem. Na początku gdy się już wypoziomuje statyw i ustawi oś na biegun, trzeba ustawić tubę tak by też patrzyła na biegun a przeciwwaga była skierowana na północ. Ta pozycja nazywana jest PARK. Potem można zawsze wrócić do tej pozycji lub ponownie ją ustawić. Jeśli się wybierze przycisk PARK na stronie to teleskop wróci do tej pozycji i przestaje reagować, do momentu wybrania UNPARK. 
Są jeszcze kontrolery BHC i SHC. A jeśli do Wemos-a podłączy się HC-05/HC-06 to można też parować z game padem przez bluetooth. Ale jeszcze nie zgłębiłem tematu. Opis jest na Wiki. 

Obudowa

Jest dużo dostępnych projektów obudów do druku 3D, pewnie da się też dobrać mniejszą obudowę, ale ja po prostu miałem taką pod ręką :). Należy tylko pamiętać, że w ramach rozbudowy może być potrzebne miejsce na porty RJ na podłączenia silników i ST-4. Można też wyprowadzić diody pokazujące, w jaki stanie jest kontroler. Ja dodałem jedynie gniazdo zasilania 5.5/2.1, wyłącznik i wyprowadziłem port USB Arduino. Oczywiście warto pomyśleć o sposobie mocowania do nogi statywu teleskopu. Ja dodałem dwa paski z rzepem.  

OnStep CaseOnStep Case
 

Wnioski po testach

Kontroler działa. Niestety nie jest precyzyjny. Pomimo prób z różnymi ustawieniami nie ustawia się precyzyjnie na cel. Powodem mogą być złe parametry w config.h, ale też problemy z zasilaniem, lub wydajnością sprzętu. 
Ale to jest i tak niesamowity skok jakościowy. W połączeniu z kamerą (mam kamerkę planetarną SVBony SV105) mogę spokojnie przy ekranie laptopa ustawić parametry nagrywania lub zdjęć. 

To Do

Jeśli znajdę czas to w kolejce czekają poniższe modyfikacje i rozbudowy:
  • Smart Hand Controler
  • ST-4
  • Wymiana kabli do silników na RJ11, RJ12, lub RJ45
  • może zmiana platformy na szybszą np. maxESP3
  • Usuwanie odchyleń ruchu
  • Dodanie obsługi focusera na A4988
  • Zasilanie z akumulatora
 

 



wtorek, 12 października 2021

Montaż silników do OnStep dla teleskopu C6-N

Montaż silników krokowych NEMA 17 do montażu Celestron CG-4 (odpowiednik EQ3-2). Po jednym do RA i DEC. Całość będzie sterowana z kontrolera OnStep w oparciu o Arduino Mega + RAMPS 1.4.  


Wcześniej zrobiłem zautomatyzowany focuser (wyciąg okularu). Teraz postanowiłem zmechanizować tubę teleskopu. Zaczęło się od pomysłu, by dało się fizycznym pilotem lub aplikacją przesuwać tubę na dowolny fragment nieba oraz włączyć śledzenie.

Potem trafiłem na projekt AstroEQ, który był super. Miał jednak wadę, nie był już  rozwijany. Ale tam znalazłem link do OnStep. Na pierwszy rzut oka projekt jest bardzo chaotyczny. Trzeba przeczytać wiele postów, stron Wiki, wzmianek i zobaczyć kilka filmików. Ale opłacało się. Mam działający kontroler, a tu pokażę jak zamontowałem silniki. Oczywiście to końcowa wersja (w tej chwili ;)). Wcześniej było wiele innych, ale okazały się nieoptymalne.

Zastosowałem silniki które miałem pod ręką. W osi RA 17HS4401S, a w osi DEC 17HS4023. Koła zębate miały być w obu osiach 20 zębów (na silniku) i 60 na teleskopie, ale okazało się, że dla osi RA koło zaczepia o rączkę blokady. Dla RA zastosowałem 16 na 40 z dodatkową przedłużką osi. Ponieważ nigdzie nie znalazłem łącznika na osie 6mm i 6mm, musiałem zastosować łącznik 6mm na 8mm i kilkucentymetrową oś 8mm. Koło duże oczywiście też musiałem zmienić na takie z otworem 8mm (akurat pod ręką miałem 40 zębów).
 
Poniżej kilka zdjęć poglądowych:




Daje to dla osi RA przełożenie 40:16 (2,5), a dla osi DEC 60:20 (3,0). Oba mocowania udało się wykonać za pomocą typowego mocowania typu L do NEMA17. Przy osi RA co prawda trzeba je było je zamocować odwrotnie i lekko rozwiercić jeden z otworów. Paski zębate u mnie sprawdziły się 172mm dla osi DEC i 154mm dla osi RA.

Elementy


silnik krokowy 17HS4401S
silnik krokowy: 17HS4023
Paski zębate 154mm i 172mm 6mm szerokości
Koła zębate 16, 40, 60 zębów 5, 6, 8 mm GT2
Mocowanie stalowe typu L do NEMA 17 2szt.

Łącznik osi 6 na 8 mm

Koszt mocowania trochę ponad 100pln.






sobota, 11 września 2021

Projekt MotoFocuser do teleskopu Celestron C6-N

Wcześniej pracowałem nad Focuserem do mniejszego teleskopu, ale w międzyczasie kupiłem 6-cio calowego Celestrona, którego wyciąg okularowy jest łatwiejszy do modyfikacji (odkręcane pokrętła i 4 śruby mocujące). Dlatego tym razem poszło łatwo. Miałem już silnik 17HS4023, do sterowania stepstick A4988 i do kontroli ESP32. zastosowałem dwa koła zębate z paskiem (przełożenie 16:40). Dzięki temu nawet powerbank dał radę zasilić wszystko, przez kabel z konwertujący napięcie na 9V. U mnie konkretnie pracuje ESP32-WROOM-32D, ale można zastosować dowolny ESP32 z WiFi, RP2040 lub ESP8266. Ideą było, by można było sterować przez przeglądarkę, przez WebAPI np. z programu w Pythonie lub z pilota na kablu.

Elementy

mikrokontroler: ESP32-WROOM-32D
silnik krokowy: 17HS4023
sterownik silnika krokowego: A4988
zasilanie mikrokontrolera: Moduł Mini Stabilizatora AMS1117 3,3V
klawiatura samoprzylepna 4 przyciski
Kabel USB na wtyk 5,5/2,1 z konwerterem napięcia 5V na 9V
Pasek zębaty 140mm długości 6mm szerokości
Zębatka 16 zębów 5mm do silnika
Zębatka 40 zębów 10mm do pokrętła
Mocowanie stalowe typu L do NEMA 17
płytka uniwersalna
wtyk JST XH2.54, złącze zaciskowe, listwa goldpin

Pewnie coś tu pominąłem, ale w 100-150pln można się zamknąć.


Oprogramowanie Micropython dla ESP32

Najłatwiej zainstalować edytor Thonny. On pozwoli wgrać automatycznie najnowsze oprogramowanie MicroPython. Można też pobrać je samemu z micropython.org. Rozbudowana dokumentacja do MicroPython jest na stronie projektu micropython.org. Edytor Thonny wydał mi się też najłatwiejszy w użyciu. Jeśli pracujesz na Windows będziesz potrzebował sterownika Serial USB. powinien się sam wyszukać po podłączeniu mikrokontrolera do komputera. Przydać się też może ESPTool i zapomniałbym o najważniejszym Python for Windows z python.org.



Ustawienie stepstick-a

Sterownik silnika krokowego A4988 posiada potencjometr i należy nim ustawić napięcie wyjściowe, które wylicza się z wzoru. Sposób został opisany np. tu https://printo3d.pl/regulacja-stepstickow/. Dla mojego silnika i mojego sterownika, powinno to być 0,5-0,6 V.


Testowe podłączenie układu

Próbne podłączenie zrobiłem spinając wszystko przewodami do płytek stykowych.


A4988 PinPołączenie
VMOTBateria +
GNDBateria -
VDD3.3V
GNDGND ESP32
STP26 ESP32
DIR27 ESP32
1A, 1B, 2A, 2BSilnik
MS1, MS2, MS314, 15, 18 ESP32


Schemat i zdjęcie poniżej:

Kod MicroPythona

Sposób sterowania silnikiem podejrzałem na stronie techtotinker.blogspot.com. Sterowanie przez przeglądarkę z hugokernel/micropython-nanoweb. Sposób obsługi klawiatury zaczerpnąłem z peppe8o.com. Obługa socketów z peterhinch/micropython-async.


Tu kod z obsługą keypad-a


# Micropython code for ESP32
# MotoFocuser project for the Celestron C6-N telescope
# Author: Wojtek B.
from machine import Pin
from time import sleep_ms
import uasyncio


class stepperMotor:
    def __init __ (self, stepPin, dirPin):
        self.step = Pin (stepPin, Pin.OUT)
        self.dir = Pin (dirPin, Pin.OUT)
        self.quarter = Pin (15, Pin.OUT)
        self.quarter.value (1)
        self.turn = 'S'
        self.speed = 0
        self.phase = 0
        # self.block = False
        self.queue = []

    def change (self, turn, speed):
        # self.block = True
        # self.turn = turn
        # self.speed = speed
        self.queue.append ([turn, speed])    
        # self.block = False
        print ('New-> turn:', self.turn, 'speed:', self.speed)
        
    
    async def rotate (self):
        r = {'L': 0, 'R': 1}
        print ('Rotate')
        while True:
            # Get a "work item" out of the queue.
            if len (self.queue)> 0: # and self.block == False:
                # self.block = 
                # print ('Q len:', self.queue)
                params = self.queue [len (self.queue) -1]
                self.queue = []
                print ('p:', params)
                # I change the step
                self.turn = params [0]
                self.speed = params [1]
                self.phase = 0
                print ('New-> turn:', self.turn, 'speed:', self.speed)
            # follow the steps according to the data
            if self.turn == 'S' or self.speed == 0:
                # stepper.rotate (0, 'R', 10000)
                # commands to A4988
                # uasyncio.sleep (20)
                await uasyncio.sleep_ms (1)
            else:
                if self.speed == 2 and self.turn in ['R', 'L']:
                    # s = 56 - 5 * self.phase
                    # quick
                    s = 10
                    if self.phase <11:
                        self.phase + = 1
                        print (s)
                    elif self.phase == 12:
                        s = 1
                        
                elif self.speed == 1 and self.turn in ['R', 'L']:
                    # slow
                    s = 100
                else:
                    print ('Err')
                # commands to A4988
                self.dir.value (r [self.turn])
                self.step.value (1)
                await uasyncio.sleep_ms (s)
                self.step.value (0)
                #await uasyncio.sleep_ms (s)



class Keypad:
    
    def __init __ (self):
        self.Pin0 = Pin (15, Pin.IN, Pin.PULL_DOWN) # GND
        self.pinR1 = Pin (2, Pin.OUT) # 3
        self.pinR2 = Pin (0, Pin.OUT) # 4
        self.pinL2 = Pin (4, Pin.OUT) # 1
        self.pinL1 = Pin (16, Pin.OUT) # 2

        self.keys = [self.pinL2, self.pinL1, self.pinR1, self.pinR2]
        self.labels = ['Left <<', 'Left <', '> Right', '>> Right']
        self.turns = ['L', 'L', 'R', 'R']
        self.speeds = [2, 1, 1, 2]
        self.states = [0, 0, 0, 0]

    async def run (self):
        print ('Run')
        while True:
            for i, k in enumerate (self.keys):
                k.value (1)
                # sleep_ms (40)
                check = self.Pin0.value ()
                if check != self.states [i]:
                    print (self.labels [i], '=', check)
                    if check == 1:
                        pass
                        motor.change (self.turns [i], self.speeds [i])
                    if check == 0:
                        motor.change ('S', 0)
                        print ('.')
                    self.states [i] = check
                k.value (0)
                #print ('Run', i)
                await uasyncio.sleep_ms (50)


motor = stepperMotor (stepPin = 26, dirPin = 27)
keypad = Keypad ()

loop = uasyncio.get_event_loop ()
loop.create_task (motor.rotate ())
loop.create_task (keypad.run ())
loop.run_forever ()

Wersja na płytce uniwersalnej

Zastosowałem płytkę uniwersalną z otworami połączonymi po 3 szt. w rastrze 2,54mm THT i listwy goldpin. Gniazdo do silnika JST XH2.54.

Ponieważ zasilam jednym źródłem zasilania, to zastosowałem stabilizator AMS1117. Obsługuje on napięcie wejściowe DC 4,5-12V. Stepstick A4988 przyjmuje napięcie 8-35V. Ja zamierzam zasilać 9V lub 12V z zasilacza sieciowego lub jeśli nie będzie w zasięgu gniazdka sieciowego z powerbaku lub komputera przez kabel USB zawierający konwerter 5V na 9V. Pierwsze testy tego kabelka wyszły pozytywnie. Trzeba tylko pamiętać by podłączając go do powerbaku wpinać go tylko gdy jest używany. Inaczej szybko wyzeruje powerbank.  

Uwaga. Dokumentacja do mojej wersji ESP32 mówi, że można je zasilać tylko jedną drogą, więc jeśli chcę podłączyć układ do komputera po USB, zawsze wyjmuję stabilizator AMS1117. Klawiaturę czteroprzyciskową podłączyłem do pin-ów 2, 0, 4, 16. Służą do obsługi dwóch prędkości w dwóch kierunkach.

 





Proste pudełko

Przygotowałem tymczasowe pudełko. Po prostu zmniejszyłem istniejące tekturowe opakowanie. Widok poniżej:

Montaż na teleskopie

Ponieważ można tu łatwo odkręcić pokrętło wyciągu okularowego, a śruby mocujące mechanizm zębatkowy wykorzystać jako mocowanie silnika, to sposób zamocowania był prosty. Mocowanie stalowe typu L do NEMA 17 przykręcone do wyciągu i dwa koła zębate 16 zębów i 40 zębów połączone paskiem zębatym 14cm rozwiązało problem. trzeba było jedynie wymienić śruby na dłuższe i zadbać by pasek był właściwie naciągnięty i jednocześnie pokrywa obudowy mechanizmu zębatkowego wyciągu była właściwie dokręcona. Mi potrzebną odległość zapewniła nakrętka i podkładka. 

Dzięki przełożeniu 1:2,5 zmniejszyły się wymagania dla zasilania i dlatego mogłem użyć powerbanku z kablem konwertującym napięcie na 9V. 

Zdjęcie poglądowe poniżej:






ToDo

dodać podłączenie do znanego AP WiFi, a jeśli jego brak to wystawienie własnego

dodać serwer ze stroną WWW z obsługą MotoFocusera

dodać obsługę sterowania przez TCP dla aplikacji typu RoboRemoFree  

dopisać WebAPI  dla programu sterowania kamerą Raspberry Pi



niedziela, 11 lipca 2021

Projekt MotoFocuser do teleskopu Sky Watcher 1309

W międzyczasie kupiłem lepszy teleskop Celestron C6-N z montażem CG-4 (EQ3-2). Ma on focuser, który jest łatwiejszy do modyfikacji (odkręcane pokrętła i 4 śruby mocujące) Dlatego ostatecznie projekt opisuje w artykule Projekt MotoFocuser dla teleskopu Celestron C6-N. W tym opisie niedopracowany jest tylko montaż silniczka, reszta zadziałała, ale nie będę go kończył bo teleskop pójdzie na sprzedaż. Zostawiam jednak opis w takiej wersji bo może komuś się przyda. 


Zabierałem się do tego kilka razy. Najpierw próbowałem zastosować silnik 28BYJ-48 z ULN2003, niestety czasem się zacinał, bo był za słaby. To samo z Micro Servo SG90 360. Skończyło się na silniku krokowym NEMA 17. Chciałem by mniej ważył i był stosunkowo tani. Wybrałem 17HS4023, a do sterowania stepstick A4988. Najdłużej mi zajęło przekonanie się, że bateria 9V jest za słaba i wymyślenie sposobu mocowania do teleskopu. Reszta okazała się łatwa. Całość obsługuje ESP32. U mnie konkretnie ESP32-WROOM-32D, ale można zastosować dowolny ESP32 z WiFi, RP2040 lub ESP8266. Ideą było by można było sterować przez przeglądarkę, przez WebAPI np. z programu w pythonie lub z pilota na kablu.

Elementy


mikrokontroler: ESP32-WROOM-32D
silnik krokowy: 17HS4023
sterownik silnika krokowego: A4988
zasilanie mikrokontrolera: Moduł Mini Stabilizatora AMS1117 3,3V
zasilanie silnika: koszyk na 8 baterii AA
klawiatura samoprzylepna 4 przyciski
Lego Technic koło zębate 3650b 24 zęby
Sprzęgło elastyczne do silnika 5x5 mm otwór wewnętrzny

Lego Technic kołek pin z osią 6562
Mocowanie stalowe typu L do NEMA 17
płytka uniwersalna
wtyk JST XH2.54, złącze zaciskowe, listwa goldpin

Pewnie coś tu pominąłem, ale w 100-150pln można się zamknąć.

Oprogramowanie Micropython dla ESP32

Najłatwiej zainstalować edytor Thonny. On pozwoli wgrać automatycznie najnowsze oprogramowanie MicroPython. Można też pobrać je samemu z micropython.org. Rozbudowana dokumentacja do MicroPython jest na stronie projektu micropython.org. Edytor Thonny wydał mi się też najłatwiejszy w użyciu. Jeśli pracujesz na Windows będziesz potrzebował sterownika Serial USB. powinien się sam wyszukać po podłączeniu mikrokontrolera do komputera. Przydać się też może ESPTool i zapomniałbym o najważnieiszym Python for Windows z python.org.

Ustawienie stepstick-a

Sterownik silnika krokowego A4988 posiada potencjometr i należy nim ustawić napięcie wyjściowe, które wylicza się z wzoru. Sposób został opisany np. tu https://printo3d.pl/regulacja-stepstickow/. Dla mojego silnika i mojego sterownika, powinno to być 0,5-0,6 V.

Testowe podłączenie układu

Próbne podłączenie zrobiłem spinając wszystko przewodami do płytek stykowych.


A4988 PinPołączenie
VMOTBateria +
GNDBateria -
VDD3.3V
GNDGND ESP32
STP26 ESP32
DIR27 ESP32
1A, 1B, 2A, 2BSilnik
MS1, MS2, MS314, 15, 18 ESP32

Schemat poniżej:


Kod MicroPythona

Sposób sterowania silnikiem podejrzałem na stronie techtotinker.blogspot.com. Sterowanie przez przeglądarkę z hugokernel/micropython-nanoweb. Sposób obsługi klawiatury zaczerpnąłem z peppe8o.com. Obługa socketów z peterhinch/micropython-async.

Tu kod z obsługą keypad-a

# Kod Micropython dla ESP32 # Projekt MotoFocuser dla teleskopu Sky Watcher 1309 # Autor: Wojtek B. from machine import Pin from time import sleep_ms import uasyncio class stepperMotor: def __init__(self, stepPin, dirPin): self.step = Pin(stepPin, Pin.OUT) self.dir = Pin(dirPin, Pin.OUT) self.quarter = Pin(15, Pin.OUT) self.quarter.value(1) self.turn = 'S' self.speed = 0 self.phase = 0 #self.block = False self.queue = [] def change(self, turn, speed): # self.block = True #self.turn = turn #self.speed = speed self.queue.append([turn, speed]) # self.block = False print('Nowe-> turn:', self.turn, ' speed:', self.speed) async def rotate(self): r = {'L': 0, 'R': 1} print('Rotate') while True: # Get a "work item" out of the queue. if len(self.queue) > 0: # and self.block == False: #self.block = # print('Q len:', self.queue) params = self.queue[len(self.queue)-1] self.queue = [] print('p:', params) # podmieniam krok self.turn = params[0] self.speed = params[1] self.phase = 0 print('Nowe-> turn:', self.turn, ' speed:', self.speed) # wykonuję krok zgodnie z danymi if self.turn == 'S' or self.speed == 0: #stepper.rotate(0, 'R', 10000) # polecenia do A4988 # uasyncio.sleep(20) await uasyncio.sleep_ms(1) else: if self.speed == 2 and self.turn in ['R', 'L']: # s = 56 - 5 * self.phase # szybki s = 10 if self.phase < 11: self.phase += 1 print(s) elif self.phase == 12: s = 1 elif self.speed == 1 and self.turn in ['R', 'L']: # wolny s = 100 else: print('Err') # polecenia do A4988 self.dir.value(r[self.turn]) self.step.value(1) await uasyncio.sleep_ms(s) self.step.value(0) #await uasyncio.sleep_ms(s) class Keypad: def __init__(self): self.Pin0 = Pin(15, Pin.IN, Pin.PULL_DOWN) # GND self.pinR1 = Pin(2, Pin.OUT) # 3 self.pinR2 = Pin(0, Pin.OUT) # 4 self.pinL2 = Pin(4, Pin.OUT) # 1 self.pinL1 = Pin(16, Pin.OUT) # 2 self.keys = [self.pinL2, self.pinL1, self.pinR1, self.pinR2] self.labels = ['Lewo <<', 'Lewo <', '> Prawo', '>> Prawo'] self.turns = ['L', 'L', 'R', 'R'] self.speeds = [2, 1, 1, 2] self.states = [0, 0, 0, 0] async def run(self): print('Run') while True: for i, k in enumerate(self.keys): k.value(1) # sleep_ms(40) check = self.Pin0.value() if check != self.states[i]: print(self.labels[i], '=', check) if check == 1: pass motor.change(self.turns[i], self.speeds[i]) if check == 0: motor.change('S', 0) print('.') self.states[i] = check k.value(0) #print('Run',i) await uasyncio.sleep_ms(50) motor = stepperMotor(stepPin=26, dirPin=27) keypad = Keypad() loop = uasyncio.get_event_loop() loop.create_task(motor.rotate()) loop.create_task(keypad.run()) loop.run_forever()

Wersja na płytce uniwersalnej

Zastosowałem płytkę uniwersalną z otworami połączonymi po 3 szt. w rastrze 2,54mm THT i listwy goldpin. Gniazdo do silnika JST XH2.54. Wszystko w pudełku pełniącym rolę pilota, zawierającym gniazdo baterii.





ToDo

Trzeba sprawdzić: włączyć api www dla programu sterowania kamerą Raspberry Pi zastosowanie takiego silnika do prowadzenia osi RA