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 (

3D Yazıcı Kalibrasyon

Profesyonel Kalibrasyon ve G-code Üretici

Genel Ayarlar

setSettings({...settings, bedTemp: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setSettings({...settings, nozzleTemp: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setSettings({...settings, nozzleDiameter: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
{tabs.map((tab) => { const Icon = tab.icon; return ( ); })}
{activeTab === 'x-axis' && (

X Ekseni Kalibrasyonu

X ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.

setXAxisConfig({...xAxisConfig, distance: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setXAxisConfig({...xAxisConfig, steps: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setXAxisConfig({...xAxisConfig, measured: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" placeholder="Test sonrası giriniz" />
{xAxisConfig.measured > 0 && (

Hesaplanan Değer:

{calculateXSteps()} steps/mm

Firmware'e uygulamak için: M92 X{calculateXSteps()}

)}
)} {activeTab === 'y-axis' && (

Y Ekseni Kalibrasyonu

Y ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.

setYAxisConfig({...yAxisConfig, distance: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setYAxisConfig({...yAxisConfig, steps: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setYAxisConfig({...yAxisConfig, measured: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" placeholder="Test sonrası giriniz" />
{yAxisConfig.measured > 0 && (

Hesaplanan Değer:

{calculateYSteps()} steps/mm

Firmware'e uygulamak için: M92 Y{calculateYSteps()}

)}
)} {activeTab === 'z-axis' && (

Z Ekseni Kalibrasyonu

Z ekseninin hassasiyetini ayarlamak için aşağıdaki adımları izleyin.

setZAxisConfig({...zAxisConfig, distance: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setZAxisConfig({...zAxisConfig, steps: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setZAxisConfig({...zAxisConfig, measured: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" placeholder="Test sonrası giriniz" />
{zAxisConfig.measured > 0 && (

Hesaplanan Değer:

{calculateZSteps()} steps/mm

Firmware'e uygulamak için: M92 Z{calculateZSteps()}

)}
)} {activeTab === 'extruder' && (

Extruder Kalibrasyonu

Extruder'ın doğru miktarda filament ekstrüd etmesini sağlayın.

setExtruderConfig({...extruderConfig, distance: parseInt(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setExtruderConfig({...extruderConfig, steps: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />
setExtruderConfig({...extruderConfig, measured: parseFloat(e.target.value)})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" placeholder="Test sonrası giriniz" />
{extruderConfig.measured > 0 && (

Hesaplanan Değer:

{calculateESteps()} steps/mm

Firmware'e uygulamak için: M92 E{calculateESteps()}

)}
)} {activeTab === 'skew' && (

Çarpıklık Kalibrasyonu

100x100mm kare baskı yapın ve köşegen mesafelerini ölçün.

setSkewConfig({...skewConfig, ac: e.target.value})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />

Sol üst - Sağ alt

setSkewConfig({...skewConfig, bd: e.target.value})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />

Sağ üst - Sol alt

setSkewConfig({...skewConfig, ad: e.target.value})} className="w-full bg-slate-700 border border-slate-600 rounded px-3 py-2" />

Dikey köşegen

Hesaplanan Çarpıklık Değerleri:

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}

)}

G-code Oluştur

Seçili kalibrasyon için G-code dosyası indir

G-code Önizleme:

                {generateGCode()}
              

📝 Kullanım Talimatları

X/Y/Z Ekseni Kalibrasyonu:
  1. Hedef mesafeyi belirleyin (örn: 100mm)
  2. Mevcut steps/mm değerinizi girin
  3. G-code'u indirin ve yazıcınıza gönderin
  4. Hareket tamamlandıktan sonra gerçek mesafeyi ölçün
  5. Ölçülen mesafeyi ilgili alana girin
  6. Hesaplanan yeni steps/mm değerini kaydedin
Extruder Kalibrasyonu:
  1. Filamenti nozzle'dan 120mm işaretleyin
  2. 100mm ekstrüzyon komutu gönderin
  3. Kalan mesafeyi ölçün ve gerçek ekstrüzyon miktarını hesaplayın
  4. Ölçülen değeri girin ve yeni E steps/mm'yi uygulayın
Çarpıklık Kalibrasyonu:
  1. 100x100mm kalibrasyon karesi bastırın
  2. Köşegen mesafeleri (AC, BD, AD) hassas ölçün
  3. Değerleri girin ve çarpıklık açılarını görün
  4. G-code ile düzeltmeyi uygulayın
⚠️ Önemli:

G-code komutlarını uyguladıktan sonra M500 komutu ile ayarları kalıcı olarak kaydetmeyi unutmayın!

); }