# 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.5x–2.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.5x–2.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)