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