Files
cnc_draw_machine/README.md
T
2026-06-25 18:42:40 +02:00

138 lines
5.5 KiB
Markdown
Raw Blame History

This file contains ambiguous Unicode characters
This file contains Unicode characters that might be confused with other characters. If you think that this is intentional, you can safely ignore this warning. Use the Escape button to reveal them.
# CNC Drawing Machine Firmware
Projekt jest maszyną CNC do rysowania z dwoma silnikami NEMA17 sterowanymi przez DRV8825 na płytce CNC shield, ESP32 WROOM, serwomechanizm do pisaka, wyświetlacz LCD I2C 2x16, karta SD, 3 przyciski (Up/Down/OK). Celem jest kompletny firmware: przeglądanie plików GCode na karcie SD, drukowanie z podglądem postępu, regulacja prędkości podczas druku, tryb komend przez UART.
# Działanie
* Start normalny: lista plików .gcode/.nc z karty SD, Up/Down przewija, OK rozpoczyna druk
* Podczas druku: Up/Down zmienia prędkość (0.5x2.0x), OK → dialog przerwania
* Boot z wciśniętym OK (2s): tryb UART — wysyłaj GCode przez monitor (G1 X50 Y30 F1000, G28, M3/M5)
# Elementy
* Moduł deweloperski ESP32
* Dwa silniki krokowyme NEMA17
* Sterownik A4988 DRV8825,
* Sterownik silnika krokowego DRV8825
* Serwo do opuszczania pisaka.
* Moduł karty SD
* LCD I2C 2x16
* 3x przycisk Up/Down/OK
## include/config.h parametry dostosowalne przez użytkownika
* WORKSPACE_WIDTH_MM, WORKSPACE_HEIGHT_MM — pole robocze
* STEPS_PER_MM_X, STEPS_PER_MM_Y — zależne od mikrostepowania DRV8825
* SPEED_DEFAULT_MM_S, SPEED_MIN_MM_S, SPEED_MAX_MM_S — prędkości
* SPEED_MULT_MIN/MAX/STEP — zakres regulatora prędkości (0.5x2.0x)
* ACCEL_MM_S2 — przyspieszenie AccelStepper
* SERVO_ANGLE_UP, SERVO_ANGLE_DOWN — kąty pisaka (nacisk)
* SERVO_SETTLE_MS — czas oczekiwania po ruchu serwa
### Wszystkie numery pinów GPIO
* LCD_I2C_ADDR, LCD_COLS, LCD_ROWS
* SD_MAX_FILES, FILENAME_MAX_LEN
* DISPLAY_UPDATE_MS, BUTTON_DEBOUNCE_MS, BOOT_HOLD_MS
* Enum AppState i struct GCodeLine, PrintStatus
### Przypisanie pinów (domyślne, zmieniane w config.h)
Sygnał GPIO
* X STEP 26
* X DIR 27
* Y STEP 14
* Y DIR 12
* STEPPER ENABLE 13
* SERVO 25
* SD CS 5
* LCD SDA 21
* LCD SCL 22
* BTN UP 32
* BTN DOWN 33
* BTN OK 4
Uwaga: GPIO12 to strapping pin — DRV8825 DIR ma wysoką impedancję przy braku sygnału, więc nie powinien przeciągać pinu podczas bootu. Jeśli problemy — zmienić na inny pin.
## Do skonfigurowania przed użyciem w config.h:
* STEPS_PER_MM_X/Y — zależy od mikrostepowania DRV8825 (jumperów na shield)
* SERVO_ANGLE_DOWN — kąt nacisku pisaka (kalibracja mechaniczna)
* PIN_* — jeśli CNC shield używa innych pinów niż domyślne
* LCD_I2C_ADDR — sprawdzić 0x27 lub 0x3F (zależy od modułu LCD)
include/config.h
PIN_LIMIT_X = 34, PIN_LIMIT_Y = 35 (GPIO input-only, idealne dla krańcówek)
HOMING_DIR_X = -1, HOMING_DIR_Y = -1 — silniki jadą w kierunku ujemnym do lewego górnego rogu
HOMING_SPEED_MM_S = 20, HOMING_BACKOFF_MM = 2 — cofnięcie po wyzwoleniu
Pole robocze: 297 × 210 mm (A4 poziomo)
otowe. Podsumowanie geometrii w kodzie:
Fizyczna maszyna Pole robocze (GCode)
───────────────── ───────────────────────────────
Prawy górny (HOME) ────→ (0,0) = lewy górny = START
Lewy górny ────→ (297, 0) = prawy górny
Prawy dolny ────→ (0, 210) = lewy dolny
Lewy dolny ────→ (297, 210) = prawy dolny = koniec
Sekwencja homingu: silniki jadą w kierunku HOMING_DIR = +1 (dodatni krok AccelSteppera) → po wyzwoleniu obu krańcówek = pozycja (0,0) → maszyna gotowa do drukowania od lewego górnego rogu.
Jeśli przy homingu silnik jedzie w złą stronę (od krańcówki zamiast do niej): zmień HOMING_DIR_X lub HOMING_DIR_Y na -1 w include/config.h.
Kompilacja OK. Co zostało dodane:
Nowy stan AppState::ERROR — wyświetla błąd na LCD, OK wraca do listy plików.
Wykrywane błędy:
Sytuacja Komunikat
Nie można otworzyć pliku Blad odczytu SD / Nie otwarto pliku
Plik istnieje ale jest pusty Blad pliku / Plik jest pusty
Karta SD odłączona w trakcie druku Blad karty SD / Utracono plik
Współrzędne GCode poza polem roboczym Blad GCode / Poza polem rob.
Zachowanie: po każdym błędzie silniki są zatrzymywane i pisak unoszony (abortPrint()), a wciśnięcie OK przywraca listę plików (z ponownym odczytem z karty SD, gdyby karta była wymieniona).
ESP32 ma wbudowane WiFi — dodajemy asynchroniczny serwer HTTP, który serwuje stronę WWW do zarządzania maszyną bez fizycznego dostępu: upload plików .gcode, przeglądanie listy, start/stop druku, podgląd postępu. Eliminuje konieczność wyjmowania karty SD.
Najważniejszy wybór: ESPAsyncWebServer (nie wbudowany WebServer.h), bo callbacks HTTP działają w osobnym tasku FreeRTOS (Core 0), dzięki czemu motion_run() w loop() nie jest nigdy blokowany przez request HTTP ani upload.
Co zostało zaimplementowane
Serwer HTTP na porcie 80 (ESPAsyncWebServer — nie blokuje loop() ani silników):
URL Metoda Funkcja
/ GET Strona WWW (PROGMEM)
/api/status GET JSON: stan, plik, postęp, prędkość
/api/files GET JSON: lista plików .gcode z SD
/api/print POST Start druku — file=nazwa.gcode
/api/stop POST Zatrzymanie druku
/api/upload POST Upload pliku .gcode na kartę SD
Strona WWW (działa z telefonu/laptopa, offline, bez CDN):
Status druku z paskiem postępu, aktualną prędkością
Lista plików z przyciskami "Drukuj"
Upload z paskiem postępu
Przycisk "Zatrzymaj druk"
Polling co 1 sekundę
Sekwencja startu:
Próba połączenia z WIFI_SSID (10s timeout)
Sukces → LCD "WiFi STA: 192.168.x.x"
Brak sieci → fallback AP mode → LCD "WiFi AP: 192.168.4.1"
Konfiguracja — zmień w include/config.h:
#define WIFI_SSID "NazwaSieci"
#define WIFI_PASSWORD "Haslo"
1. [Moduł sterownika silników](docs/MotoExpander.md)
[Wersje systemu, poprawki, etc.](docs/versions.md)