import React, { useState } from 'react'; import { Download, Settings, Maximize2, Move, Box } from 'lucide-react'; export default function PrinterCalibration() { const [activeTab, setActiveTab] = useState('x-axis'); const [settings, setSettings] = useState({ bedTemp: 60, nozzleTemp: 200, bedSize: { x: 220, y: 220, z: 250 }, nozzleDiameter: 0.4, filamentDiameter: 1.75, }); const [xAxisConfig, setXAxisConfig] = useState({ distance: 100, steps: 80, measured: 0, }); const [yAxisConfig, setYAxisConfig] = useState({ distance: 100, steps: 80, measured: 0, }); const [zAxisConfig, setZAxisConfig] = useState({ distance: 10, steps: 400, measured: 0, }); const [extruderConfig, setExtruderConfig] = useState({ distance: 100, steps: 93, measured: 0, }); const [skewConfig, setSkewConfig] = useState({ ac: 141.4, bd: 141.4, ad: 141.4, }); const calculateXSteps = () => { if (xAxisConfig.measured > 0) { const newSteps = (xAxisConfig.distance / xAxisConfig.measured) * xAxisConfig.steps; return newSteps.toFixed(2); } return xAxisConfig.steps; }; const calculateYSteps = () => { if (yAxisConfig.measured > 0) { const newSteps = (yAxisConfig.distance / yAxisConfig.measured) * yAxisConfig.steps; return newSteps.toFixed(2); } return yAxisConfig.steps; }; const calculateZSteps = () => { if (zAxisConfig.measured > 0) { const newSteps = (zAxisConfig.distance / zAxisConfig.measured) * zAxisConfig.steps; return newSteps.toFixed(2); } return zAxisConfig.steps; }; const calculateESteps = () => { if (extruderConfig.measured > 0) { const newSteps = (extruderConfig.distance / extruderConfig.measured) * extruderConfig.steps; return newSteps.toFixed(2); } return extruderConfig.steps; }; const calculateSkew = () => { const ac = parseFloat(skewConfig.ac); const bd = parseFloat(skewConfig.bd); const ad = parseFloat(skewConfig.ad); if (ac > 0 && bd > 0 && ad > 0) { const xy_skew = Math.atan2(ac - 141.4, 100) * (180 / Math.PI); const xz_skew = Math.atan2(bd - 141.4, 100) * (180 / Math.PI); const yz_skew = Math.atan2(ad - 141.4, 100) * (180 / Math.PI); return { xy: xy_skew.toFixed(4), xz: xz_skew.toFixed(4), yz: yz_skew.toFixed(4) }; } return { xy: '0.0000', xz: '0.0000', yz: '0.0000' }; }; const generateGCode = () => { let gcode = '; 3D Yazıcı Kalibrasyon G-Code\n'; gcode += '; Oluşturma Tarihi: ' + new Date().toLocaleString('tr-TR') + '\n\n'; gcode += '; Sıcaklık Ayarları\n'; gcode += `M140 S${settings.bedTemp} ; Tabla sıcaklığı ayarla\n`; gcode += `M104 S${settings.nozzleTemp} ; Nozzle sıcaklığı ayarla\n`; gcode += `M190 S${settings.bedTemp} ; Tabla sıcaklığını bekle\n`; gcode += `M109 S${settings.nozzleTemp} ; Nozzle sıcaklığını bekle\n\n`; switch(activeTab) { case 'x-axis': gcode += '; X Ekseni Kalibrasyon Testi\n'; gcode += 'G28 ; Home all axes\n'; gcode += 'G90 ; Absolute positioning\n'; gcode += 'G1 Z10 F3000 ; Z eksenini kaldır\n'; gcode += `G1 X${xAxisConfig.distance} F3000 ; X ekseninde ${xAxisConfig.distance}mm hareket\n`; gcode += 'M400 ; Hareketi tamamla\n'; gcode += `; Mevcut steps/mm: ${xAxisConfig.steps}\n`; gcode += `; Hesaplanan yeni steps/mm: ${calculateXSteps()}\n`; gcode += `; Firmware'e uygulamak için: M92 X${calculateXSteps()}\n`; gcode += `; Kalıcı kaydetmek için: M500\n`; break; case 'y-axis': gcode += '; Y Ekseni Kalibrasyon Testi\n'; gcode += 'G28 ; Home all axes\n'; gcode += 'G90 ; Absolute positioning\n'; gcode += 'G1 Z10 F3000 ; Z eksenini kaldır\n'; gcode += `G1 Y${yAxisConfig.distance} F3000 ; Y ekseninde ${yAxisConfig.distance}mm hareket\n`; gcode += 'M400 ; Hareketi tamamla\n'; gcode += `; Mevcut steps/mm: ${yAxisConfig.steps}\n`; gcode += `; Hesaplanan yeni steps/mm: ${calculateYSteps()}\n`; gcode += `; Firmware'e uygulamak için: M92 Y${calculateYSteps()}\n`; gcode += `; Kalıcı kaydetmek için: M500\n`; break; case 'z-axis': gcode += '; Z Ekseni Kalibrasyon Testi\n'; gcode += 'G28 ; Home all axes\n'; gcode += 'G90 ; Absolute positioning\n'; gcode += `G1 Z${zAxisConfig.distance} F300 ; Z ekseninde ${zAxisConfig.distance}mm hareket\n`; gcode += 'M400 ; Hareketi tamamla\n'; gcode += `; Mevcut steps/mm: ${zAxisConfig.steps}\n`; gcode += `; Hesaplanan yeni steps/mm: ${calculateZSteps()}\n`; gcode += `; Firmware'e uygulamak için: M92 Z${calculateZSteps()}\n`; gcode += `; Kalıcı kaydetmek için: M500\n`; break; case 'extruder': gcode += '; Extruder Kalibrasyon Testi\n'; gcode += 'G28 ; Home all axes\n'; gcode += 'G90 ; Absolute positioning\n'; gcode += 'M82 ; Absolute extrusion mode\n'; gcode += 'G92 E0 ; Extruder pozisyonunu sıfırla\n'; gcode += `G1 E${extruderConfig.distance} F100 ; ${extruderConfig.distance}mm filament ekstrüd et\n`; gcode += 'M400 ; Hareketi tamamla\n'; gcode += `; Mevcut E steps/mm: ${extruderConfig.steps}\n`; gcode += `; Hesaplanan yeni E steps/mm: ${calculateESteps()}\n`; gcode += `; Firmware'e uygulamak için: M92 E${calculateESteps()}\n`; gcode += `; Kalıcı kaydetmek için: M500\n`; break; case 'skew': const skewValues = calculateSkew(); gcode += '; Çarpıklık Düzeltme G-Code\n'; gcode += `; XY Çarpıklık: ${skewValues.xy}°\n`; gcode += `; XZ Çarpıklık: ${skewValues.xz}°\n`; gcode += `; YZ Çarpıklık: ${skewValues.yz}°\n\n`; gcode += `M852 I${skewValues.xy} J${skewValues.xz} K${skewValues.yz} ; Çarpıklık düzeltmesini uygula\n`; gcode += 'M500 ; Ayarları kaydet\n'; break; default: break; } gcode += '\n; Kalibrasyon tamamlandı\n'; gcode += 'M104 S0 ; Nozzle ısıtıcısını kapat\n'; gcode += 'M140 S0 ; Tabla ısıtıcısını kapat\n'; gcode += 'G28 X Y ; X ve Y eksenlerini home pozisyonuna getir\n'; gcode += 'M84 ; Motorları devre dışı bırak\n'; return gcode; }; const downloadGCode = () => { const gcode = generateGCode(); const blob = new Blob([gcode], { type: 'text/plain' }); const url = URL.createObjectURL(blob); const a = document.createElement('a'); a.href = url; a.download = `calibration_${activeTab}_${Date.now()}.gcode`; document.body.appendChild(a); a.click(); document.body.removeChild(a); URL.revokeObjectURL(url); }; const tabs = [ { id: 'x-axis', name: 'X Ekseni', icon: Move }, { id: 'y-axis', name: 'Y Ekseni', icon: Move }, { id: 'z-axis', name: 'Z Ekseni', icon: Move }, { id: 'extruder', name: 'Extruder', icon: Box }, { id: 'skew', name: 'Çarpıklık', icon: Maximize2 }, ]; return (
Profesyonel Kalibrasyon ve G-code Üretici
X ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.
{calculateXSteps()} steps/mm
Firmware'e uygulamak için: M92 X{calculateXSteps()}
Y ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.
{calculateYSteps()} steps/mm
Firmware'e uygulamak için: M92 Y{calculateYSteps()}
Z ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.
{calculateZSteps()} steps/mm
Firmware'e uygulamak için: M92 Z{calculateZSteps()}
Extruder'ın doğru miktarda filament ekstrüd etmesini sağlayın.
{calculateESteps()} steps/mm
Firmware'e uygulamak için: M92 E{calculateESteps()}
100x100mm kare baskı yapın ve köşegen mesafelerini ölçün.
Sol üst - Sağ alt
Sağ üst - Sol alt
Dikey köşegen
XY Çarpıklığı
{calculateSkew().xy}°
XZ Çarpıklığı
{calculateSkew().xz}°
YZ Çarpıklığı
{calculateSkew().yz}°
Firmware'e uygulamak için: M852 I{calculateSkew().xy} J{calculateSkew().xz} K{calculateSkew().yz}
Seçili kalibrasyon için G-code dosyası indir
{generateGCode()}
G-code komutlarını uyguladıktan sonra M500 komutu ile ayarları kalıcı olarak kaydetmeyi unutmayın!