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.
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 Pin | Połączenie |
VMOT | Bateria + |
GND | Bateria - |
VDD | 3.3V |
GND | GND ESP32 |
STP | 26 ESP32 |
DIR | 27 ESP32 |
1A, 1B, 2A, 2B | Silnik |
MS1, MS2, MS3 | 14, 15, 18 ESP32 |
Schemat poniżej:
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.Montaż na teleskopie
Sprawdziłem wiele rozwiązań i wszystkie miały wady, aż okazało się że kupione przy okazji mocowanie stalowe typu L do NEMA 17 okazało się utrzymywać idealnie w osi silnik. Ale nie dopracowałem ostatecznie montażu bo kupiłem kolejny teleskop i ostatecznie zamontowałem tam (link na górze strony). Kłopotem było przekazanie obrotu na pokrętło fokusera i tu też najłatwiejsze okazało się proste rozwiązanie. Chciałem uniknąć paska przekazującego ruch. Koło zębate Lego idealnie wpasowuje się w pokrętło po odklejeniu metalowej zaślepki. A dalej przez kołek pin z osią i sprzęgło elastyczne do silnika (5x5mm). Dzięki temu jest szansa, że jeśli fokuser dojdzie do położenia granicznego to prędzej puści taka ośka niż uszkodzi się fokuser teleskopu. Zdjęcia poglądowe poniżej:ToDo
Trzeba sprawdzić:
włączyć api www dla programu sterowania kamerą Raspberry Pi
zastosowanie takiego silnika do prowadzenia osi RA