Jakby coś, to będzie errata.
Sterownik to Makerbase TinyBee dostępny na Aliexpress za całe 80 PLN z wliczoną wysyłką https://www.aliexpress.com/item/1005006607128915.html
Ten sterownik jest dedykowany do drukarki 3d, co skutkuje pewnymi rozwiązaniami niekoniecznie pasującymi do sterowania frezarką, a jako firmware wgrany jest jakiś Marlin, który do tego celu nie nadaje się w ogóle.
Ale formalnie rzecz biorąc, jest to procesor ESP32 obudowany układami I/O typowymi dla CNC.
Tak więc pierwszą czynnością jest usunięcie Marlina i wgranie firmware dedykowanego do frezarki.
Wybór padł na FluidNC, którego od dawna używam i specjalnie nie narzekam.
Tutaj jest pewien problem, bo o ile firmware jest dobrze przetestowane i działa dość dobrze, to sama instalacja może być drogą przez mękę.
O "FluidNC Web Installer" nie napiszę nic, bo jedyne co dostałem, to komunikat "Browser not supported Please use Chrome, Edge or Opera instead".
Cóż, używam Firefoksa i to w wersji 106.0.5, bo to ostatnia która zaspokaja moje potrzeby i nie narzuca mi rozwiązań, których nigdy nie zaakceptuję. Tak więc instalacja innej przeglądarki, u mnie przynajmniej, nie wchodzi w rachubę.
Pozostaje ściągnięcie z https://github.com/bdring/FluidNC/releases/tag/v3.7.17
Tylko tutaj jest zupełnie inny problem.
Otóż skrypty instalacyjne są oparte na języku Python, chyba najbardziej popieprzonym i kapryśnym, jaki kiedykolwiek wymyślono. Z wersji na wersję są tam wprowadzane tak rewolucyjne zmiany, że w konsekwencji programy Pythona działają poprawnie tylko u ich autora i tylko na jego komputerze...
Tak właśnie miałem, u mnie nie chce działać prawie nic, na szczęście oprócz tego co najważniejsze.
A najważniejszym jest Fluidterm, który pozwala na upload plików konfiguracyjnych.
Otóż skrypt fluidterm.sh nie działa, natomiast w folderze common jest plik fluidterm.py, który daje się uruchomić (trzeba mu nadać atrybut wykonywalności), a jeżeli mu czegoś brakuje, to wyświetla jasny komunikat co trzeba doinstalować z użyciem pip3 install.
Ogólnie, należy pamiętać że to skrypt Python3 i w starszych Linuksach mogą dziać się cuda, jeśli zainstalowany jest Python zarówno w wersji 2 jak i 3...
Opisywać tego dokładniej nie będę, ale najważniejsze jest to, że skrypt fluidterm.py (nie sh) powinien dać się uruchomić.
Pozostaje kwestia zaprogramowania ESP32.
Otóż ściągnięty razem z firmware esptool działa tylko ze skryptami FluidNC i nie jest instalowany w systemie, więc jeśli te skrypty nie działają, to trzeba esptool zainstalować inaczej, czyli przez pip3 install esptool
Samo zaprogramowanie procesora nie powinno stanowić problemu.
Ja potrzebuję wersję Bluetooth, więc tylko o niej napiszę. Dla wersji WiFi trzeba jeszcze wgrać index.html.gz do lokalnego systemu plików, co powinien załatwić upload we Fluidterm (CTRL+U), ale tego nie sprawdzałem.
Aby wgrać firmware bez użycia dostarczonych przez autorów skryptów Pythona, trzeba wejść do folderu z firmware i wydać polecenie
Kod: Zaznacz cały
esptool.py -p /dev/ttyUSB0 -b 460800 --before default_reset --after hard_reset --chip esp32 write_flash --flash_mode dio --flash_size detect --flash_freq 40m 0x1000 bootloader.bin 0x8000 partitions.bin 0x10000 firmware.bin
Teraz trzeba uruchomić Fuidterm i kombinacją CTRL+U zrobić upload pliku config.yaml.
Plik może się nazywać inaczej, ale wtedy trzeba ustawić parametr $Config/Filename co jest opisane w dokumentacji i nie będę tego rozwijał. Jest to jednak o tyle ważne, że jeden fizyczny sterownik może mieć kilka różnych konfiguracji, pomiędzy którymi można się dość komfortowo przełączać.
Plik konfiguracji wygląda następująco:
Kod: Zaznacz cały
board: MKS TinyBee V1.0
name:
kinematics:
Cartesian:
i2so:
bck_pin: gpio.25
data_pin: gpio.27
ws_pin: gpio.26
spi:
miso_pin: gpio.19
mosi_pin: gpio.23
sck_pin: gpio.18
sdcard:
cs_pin: gpio.5
# MAKE SURE jumper J2 is set to SDDET!!!
card_detect_pin: gpio.34:low
stepping:
engine: I2S_STATIC
idle_ms: 255
pulse_us: 4
dir_delay_us: 5
disable_delay_us: 0
axes:
x:
steps_per_mm: 200
max_rate_mm_per_min: 3000.000
acceleration_mm_per_sec2: 200.000
max_travel_mm: 345.000
soft_limits: true
homing:
cycle: 2
positive_direction: false
mpos_mm: 0.000
feed_mm_per_min: 500.000
seek_mm_per_min: 2000.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: NO_PIN
limit_pos_pin: NO_PIN
limit_all_pin: gpio.33:low:pu
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.1
direction_pin: I2SO.2
disable_pin: I2SO.0
y:
steps_per_mm: 200
max_rate_mm_per_min: 3000.000
acceleration_mm_per_sec2: 200.000
max_travel_mm: 550.000
soft_limits: true
homing:
cycle: 2
positive_direction: true
mpos_mm: 0.000
feed_mm_per_min: 500.000
seek_mm_per_min: 2000.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: NO_PIN
limit_pos_pin: NO_PIN
limit_all_pin: gpio.32:low:pu
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.4
direction_pin: I2SO.5
disable_pin: I2SO.3
z:
steps_per_mm: 200.000
max_rate_mm_per_min: 3000.000
acceleration_mm_per_sec2: 200.000
max_travel_mm: 100.000
soft_limits: true
homing:
cycle: 1
positive_direction: true
mpos_mm: 0.000
feed_mm_per_min: 500.000
seek_mm_per_min: 2000.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
motor0:
limit_neg_pin: NO_PIN
limit_pos_pin: NO_PIN
limit_all_pin: gpio.22:low:pu
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.7
direction_pin: I2SO.8
disable_pin: I2SO.6
a:
steps_per_mm: 200.000
max_rate_mm_per_min: 3000.000
acceleration_mm_per_sec2: 60.000
max_travel_mm: 80.000
soft_limits: false
homing:
cycle: -1
positive_direction: true
mpos_mm: 0.000
feed_mm_per_min: 300.000
seek_mm_per_min: 500.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
# use E0 driver for A axis motor
motor0:
limit_neg_pin: NO_PIN
limit_pos_pin: NO_PIN
# TB connector
limit_all_pin: gpio.39:low
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.10
direction_pin: I2SO.11
disable_pin: I2SO.9
b:
steps_per_mm: 200.000
max_rate_mm_per_min: 3000.000
acceleration_mm_per_sec2: 60.000
max_travel_mm: 80.000
soft_limits: false
homing:
cycle: -1
positive_direction: true
mpos_mm: 0.000
feed_mm_per_min: 300.000
seek_mm_per_min: 500.000
settle_ms: 500
seek_scaler: 1.100
feed_scaler: 1.100
# use E1 driver for B axis motor
motor0:
limit_neg_pin: NO_PIN
limit_pos_pin: NO_PIN
# TH1 connector
limit_all_pin: gpio.36:low
hard_limits: false
pulloff_mm: 1.000
stepstick:
step_pin: I2SO.13
direction_pin: I2SO.14
disable_pin: I2SO.12
control:
# EXP2 connector
fault_pin: gpio.12:PU
# EXP2 connector
reset_pin: gpio.14:PU:low
safety_door_pin: NO_PIN
feed_hold_pin: NO_PIN
cycle_start_pin: NO_PIN
macro0_pin: NO_PIN
macro1_pin: NO_PIN
macro2_pin: NO_PIN
macro3_pin: NO_PIN
coolant:
# Heated Bed Terminal Block
flood_pin: i2so.16
# HE0 Terminal Block
mist_pin: i2so.17
delay_ms: 0
# spindle PWM signal
PWM:
pwm_hz: 2500
#3D_TOUCH connector
output_pin: gpio.2:high
# HE1 Terminal Block
enable_pin: I2SO.18
s0_with_disable: true
tool_num: 0
spinup_ms: 4000
spindown_ms: 4000
speed_map: 0=0.000% 24000=100.000%
start:
must_home: false
probe:
#MT-DET connector
pin: gpio.35
check_mode_start: true
Tutaj ważna uwaga.
Otóż sterowniki osi (także sygnały STEP/DIR/ENA dostępne na goldpinach, oraz kilka innych sygnałów) są sterowane z układu rozszerzenia wyjść zbudowanego na rejestrze przesuwającym. Po pierwsze, to są wyłącznie wyjścia, po drugie pewnych funkcji nie obsłużą, na przykład wyjścia PWM.
Jak pisałem, osie X.Y i Z są "hardwired" i niczego tam się zmienić nie da, albo przynajmniej nie ma sensu.
Natomiast dwa pozostałe stepsticki są przeznaczone do obsługi ekstruderów, które z zasady nie wymagają bazowania. W naszym przypadku nie ma to znaczenia, bo silnik to silnik i nie ważne czym będzie poruszał, natomiast możemy potrzebować bazowania tych dwóch osi, co da się zrobić wykorzystując dostępne piny procesora.
Żeby było elegancko, wypadałoby użyć łatwo rozpoznawalnych złącz dostępnych na płytce.
Wybór padł na TB i TH1.
Złącza TH2 użyć się nie da, o czym później.
Ja mam oś obrotową, ale nie jest ona przypisana do żadnej maszyny, założę ją tam, gdzie akurat będzie potrzebna, a dodatkowo nie ma tam czujnika bazującego, który dopiero jest w planach.
Dlatego osie A i B mają wpisy w sekcji homing: cycle: -1 co znaczy że nie ma tam czujników bazujących i sterownik nie będzie sprawdzał ich stanu. Jest to opisane w dokumentacji.
Teraz kolej na czujnik długości narzędzia. Ja ostatnio zakupiłem takie https://www.aliexpress.com/item/1005006163585832.html
One mają dwie pary styków NC, jedna para do pomiaru narzędzia, druga na wszelki wypadek, żeby wywołać alarm gdy pierwsza nie zadziała i narzędzie będzie chciało wbić się w stół...
To się łączy ze sprawą drugą, mam w maszynie zintegrowane serwokrokowce, które wystawiają alarm gdy błąd pozycji przekroczy zaprogramowaną wartość, ale one są NO i z NC nie da się ich połączyć razem.
FluidNC ma dwa sygnały, estop i fault, które różnią się chyba tylko tym, że wyświetlają inny komunikat, natomiast działają tak samo i awaryjnie zatrzymują maszynę.
Dlatego sygnały aktywne stanem niskim i sygnały aktywne stanem wysokim, są podpięte albo tu, albo tam.
Sam pomiar narzędzia jest na złączu MT_DET.
Teraz czas na złącze TH2, które prosi się, żeby go użyć.
Otóż pin procesora gpio.34 może być przełączony zworką albo na złącze TH2, albo na gniazdo karty SD, gdzie służy do sprawdzenia czy karta jest fizycznie obecna w gnieździe. Ponieważ nie ma żadnego sensu rezygnowanie z obsługi karty SD, więc zworkę należy ustawić w pozycji SDDET, co z kolei powoduje że sygnał z gniazda TH2 dociera tylko do wolnego pinu tego złącza, ale nikt nam przecież nie broni poprowadzić go kabelkiem gdzieś dalej. Ja kawałkiem zworki wysłałem go na trzeci pin gniazda EXT2 i takim cudem pin gpio.14 i sygnał estop znalazły się na gnieździe TH2,
Teraz kwestia PWM.
Jak pisałem, niektóre sygnały przechodzą przez rozszerzający rejestr przesuwny i nie mogą być wykorzystane do obsługi sygnału PWM (przynajmniej we FluidNC nie da rady).
Niestety, dotyczy to wszystkich sygnałów sterujących tranzystorami wyjściowymi, zarówno tymi malutkimi (FAN1, FAN2), tymi średnimi (HEATER0, HEATER1), jak i prawdziwym potworem (HOTBED). One wszystkie mogą być tylko sterowane włącz/wyłącz, co oczywiście też się przyda.
Ale do PWM potrzeba wyjścia bezpośrednio z procesora.
No i tutaj byłem naprawdę zaskoczony, bo sygnał na złączu 3d_TOUCH okazał się sygnałem wyjściowym, a nie wejściowym, jak się spodziewałem...
Nie, nic w tym złego, po prostu nie znam konstrukcji tego czujnika więc sądząc po nazwie, zakładałem że powinien on dawać sygnał gdy czegoś dotknie, a nie dostawać sygnał gdy to się stanie... Najwyraźniej jest inaczej.
Gniazdo 3d_TOUCH może obsługiwać sygnał PWM wrzeciona i tak jest w konfiguracji.
Oprócz sygnału PWM potrzebujemy też sygnału SPINDLE_ENABLE, czyli prostego włącz/wyłącz.
No i tutaj jest kilka możliwości.
Oczywiście każdy tranzystor wyjściowy może obsłużyć ten sygnał, ale pasować może nam bardzo różnie.
Ja mam wrzeciono sterowane falownikiem i chłodzone powietrzem. PWM zasadniczo nie potrzebuję, bo takie wrzeciono ma sprawność chłodzenia silnie zależną od obrotów. Najlepiej zawsze pracować na maksymalnych obrotach, a nigdy nie wolno zejść poniżej połowy. Sygnał SPINDLE_ENABLE dałem na "średni" tranzystor, bo boję się zakłóceń z falownika, ale spróbuję też dać go na "mały", może będzie dobrze. Najsilniejszy tranzystor zostawiłem na chłodziwo, bo on da radę bezpośrednio sterować małą pompką.
Ale jeśli ktoś chce bezpośrednio wysterować wrzeciono 12/24V (na przykład takie tanie na silniczku 775) to musi konfigurację wyedytować i pozamieniać piny.
Gdyby ktoś nie wiedział, to ten sterownik ma gniazda na stepsticki, co wystarcza do malutkich maszynek, ale też sygnały sterujące wyprowadzone na goldpiny i da się podłączyć duże sterowniki dużych silników.
FluidNc jest w sporej części kompatybilny z GRBL i można używać programów "sender" kompatybilnych z GRBL.
Ja używam bCNC, który polecam.
Oprócz podstawowych funkcji ma on prosty CAM i rozszerzenia, na przykład wymianę narzędzia z jego pomiarem, którego sam GRBL nie obsługuje.
Na koniec linki:
http://wiki.fluidnc.com/
https://github.com/makerbase-mks/MKS-Ti ... 20V1.0_003