Yumurtaya Yazı yazan Makine ( EggBot )

Başlatan DenizUfuktas, 25 Ağustos 2022, 13:27:06

DenizUfuktas

Abilerim Hocalarım sizlere tam olarak anlayamadığım bazı kavramlar hakkında danışmak istiyorum.

İnternette gördüğüm yumurta gibi elipsoid cisimlere yazı yazan Eggbot ismiyle bilinen makineden yapmak istiyorum.
Sistemin elektronik alt yapısını  Atmega 328P MCU ve CNC Shield kullanarak kurdum. 2 Adet step motoru ve 1 adet servoyu kontrol etmek istiyorum.

Bu sayede biraz kendimi geliştirmek ve yeni bir şeyler öğrenmek istiyorum. Yazılım alt yapısını kendim yazayım istiyorum. Atmel MCU'lar ve programlanması hakkında bilgim var. program yazarken  Register - Interrupt gibi donanımsal  kavramları kullanabiliyorum. Öğrenme aşamasında amatör anlamda bazı projeler yapıp çalıştırdım.

Step motorları istediğim koordinatlara hareket ettirebiliyorum.

Grbl gibi programların kodlarına bakarak birşeyler öğrenmeye çalıştım.

Benim anlamadığım tek konu Step Motorları sürerken Kullanılan Hız - Rampa tekniği.
Üçgen - Yamuk Hız profillerine baktım. oradaki formuller ile ilgili sıkıntımda yok.

Örneğin Grbl programında hızlanma ve ivme için X ekseni için aşağıdaki kodlarla değer giriyoruz.

$110   3600   (x ekseni maximum rate mm/min) X ekseni için maksimum hız
$120   10       (x ekseni accel mm/sec^2 ) x ekseni için ivme değeri

X eksenin hızını mm/saniyeye çevirmek için ( 3600 /  60 = 60 mm/saniye)  olarak hesaplıyorum.
X ekseni ivme değeri 10 mm/saniye^2

Bu iki kavramı şu şekilde yorumladım ama doğrumu bilmiyorum.

X ekseninin  maksimum çıkabileceği hız 60mm/saniye ve ivme 10 mm/saniye^2

Fizik Hız ivme formullerini kullanırsam şöyle bir şey yazabilirim.
 
V=a*t   [ V=hız , a=ivme , t=zaman ]
60=10 * t     -->   t=60/10   -->   t=6 saniye

Anladığım kadarıyla 0 dan 60 mm/saniye hıza çıkabilmesi için 6 saniye zaman geçmesi gerekiyor. Bu anladıklarım doğrumu bilmiyorum.   

Bir diğer anlamadığım konu ise yukarıda hız ve birimler mm/saniye. Bunu step motor adımlarına göre düzenlemem gerekiyor.
Bunu da  şöyle düşünerek yaparım diye hesapladım.

X eksenindeki step  motor tam turunu 6400 adımda tamamlıyor  200 * 32 mikrostep =6400 adım

X eksenindeki step  motor 1 mm ilerlemek için 64 adım atması gerekiyor.

Saniyede 60 mm hızla gidebilmesi için saniyede ( 60mm * 64 adım = 3840 adım )  atması gerekiyor.

En yüksek hızda 1 adım atma süresini zaman cinsinden yazmak istersem 1 / 3840  = 0,000260 mikrosaniyede bir adım atması gerekiyor diye hesaplıyorum.

Ben step motora ISR(interrupt Service Rutine ) ile 16 bit timer kullanarak adım attırıyorum.
FCPU = 16 000 000 Hertz  (16 Mhz)
Timer Prescaler = 8
Timer Clock F = 16.000.000 / 8 = 2 000 000 ( 2 Mhz)
Timer Counter Max = 65536

Timer clock Time = 1 /2000 0000 = 0,0000005 nanoseconds ;
 Timer CTC Mode kullanıyor.
Karşılaştırma yazmacı OCR1A;

Step motor en hızlı anında 1 / 3840  = 0,000260 mikrosaniyede bir adım atması gerekiyor.

Bu süreye göre OCR1A değerini hesaplarsak
OCR1A=  0,000260 /  0,0000005 = 520 değerini alıyor.

 OCR1A maximum değeri çönürlüğü 0-65535 buda maximum 65536 * 0,0000005 = 0,032768 milisaniyelik bekleme yapılabilir demek oluyor.

Bu tür sistemlerde hız rampası  kontrolü yaparken ne tür bir teknik kullanılıyor. Hızlanma - Sabit hız - Yavaşlama   bölgeleri hesaplanırken nasıl bir yöntem izleniyor.
Anladığım kadarıyla Grblde çoklu iş paylaşım modeli gibi bir teknik kullanıyor.
Yani bir kısım iş grubu Gcode kodunu hareket doğrularına çeviriyor. Diğer kısım hareket doğrularını hız segmentlerine dönüştürüp ISR ye gerçek zamanlı olarak  teslim ediyor diye algıladım.   

Ama rampa hesaplama algoritmasını tam olarak anlayamadım.  Nasıl yapıldığını kavrayamadım. Gerçek zamanlı bu hesaplamalar nasıl yapılıyor. Kafam karışmış durumda.


Örnek olarak aşağıdaki  soru  model üzerinden açıklama yaparak anlatmanızı rica ediyorum.

Örnek  : X ekseni 200 mm hareket edecek   hız = 1800 mm/dakika = 30 mm/saniye       ivme =10 mm/saniye^2 ;
Bu durumu  step motor kullanan bir sistem için nasıl yorumlamak doğru olacaktır.

Biraz ufkumu açmanızı rica ediyorum.   





   


 


 



 




 



Endorfin35+

Sadece makineyi yapmak istiyorsan hazır kütüphane kullanabilirsin. Accelstepper kütüphanesi ile birkaç proje yaptım. Başarılı bir kütüphane. Fakat aynı zamanda kendi stepper kütüphanemi yazmak istiyorum diyorsan hızlanmalar s eğrisi şeklinde olur. S-curve şeklinde aratabilirsin. Arduino nano için İvmelenme süresine veya ivme değerine göre bir s eğrisi şeklinde bir stepper yazmayı denemiştim. İvmelenme boyunca gerekli olan step sayısı bulunduktan sonra bu steplerin zamanlamasını hesaplamak gerekiyor ve bu zaman aralıkları doğrusal değil. Yabancı bir forumda tek satır formul ile s eğrisi için s eğrisine çok yakın sonuç veren süreleri hesaplayan bir formul bulup step sayısı kadar bir döngü içerisinde pals sürelerini hesaplamıştım. Sonuçta yaptığım hesapları yazdığım kod ile arduino, ivmelenme zamanı içerisinde düzgün işleyemedi. Mcu Saat hızı yetersiz kaldı. Grlb de olduğu gibi low level kodlama yapmak gerekliydi. Tam sırada accelstepper kütüphanesini bulup daha uğraşmadım. Hatırladıklarım bunlar. Umarım faydalı olur.
"İşi bilen yapar, az bilen akıl verir, bilmeyen eleştirir, yapamayan çamur atar."

DenizUfuktas

Endorfin35+ hocam zaman ayırdığın için çok teşekkür ediyorum. Dediğiniz kütüphaneleri daha önceden kullandım.  İstediğim şey makineyi yapıp hazır kodlarla çalıştırmak değil. Makineyi araç olarak kullanıp yeni bir şeyler öğrenmeyi amaçlıyorum. Öğrendiğim bilgiler ile daha gelişmiş veya verimli bir şeyler yapabilir miyim diye uğraşıyorum.

Grbl  yazılımıyla alakalı anlamadığım ve yorumlayamadığım bazı konular olduğunu düşünüyorum. Sizin söylediğiniz S Eğrisi konularını bende internette araştırdım. Sigmoid fonksiyonları kullanarak yapılmış örnekler mevcut. "Örnek :"  Sigmoid Function 


Sizinde söylediğiniz gibi hızlanma işlemleri tam istenilen doğrusallıkta olmuyor. Bu biraz da İşlemcinin gücüne ve Timer Donanım çözünürlüğünün  sınırlı olmasından kaynaklı olduğunu düşünüyorum.

Örneğin 1 mm gitmek için 160 adım atan bir motoru 300 mm götürmek için 300*160 =   48000 adım attırmak gerekiyor.  Bu 300 mm mesafenin 1/3 kadarlık mesafede  hızlanma 1/3 sabit hız 1/3 yavaşlama olarak düşünürsem , 
hızlanma =  100mm * 160adım = 16000 adım atmam gerekiyor.
100mm mesafede ki  adım sayısı 16000 adım :) 

Atmelde kullanılan Timer 1 16 bit Timer ve 65536 ya kadar sayabiliyor. 

Ben 10mm hızdan 40 mm hıza çıkmak istediğimde 

10 mm hız ile 1 tane step adım  süresi  = 1.0 saniye / ( 10mm*160mm ) =  0,000625 saniye yapıyor    
40 mm hız ile 1 tane step adım süresi  = 1.0 saniye  / (40mm*160 mm) = 0,00015625 saniye yapıyor. 

ikisi için OCRA yazmacı değerlerini hesaplarsam

10 mm OCRA =   0,000625 / 0.0000005 = 1250
40 mm OCRA =   0,00015625 /  0.0000005 = 312

OCRA toplam fark  = 1250 - 312 =  938  

Toplam adım  16000 Timer çözünürlüğü 938 

Adımlar arası timer artim miktarı  938/16000 = 0,058625 

OCR1A yazmacı kesirli ifadeleri sayamıyor. Tam sayı olmak zorunda. Bu da düzgün bir hızlanma oluşturabilmeyi mümkün kılmıyor.
Daha güzel mantıklı ve verimli bir şey arıyorum. Farklı bir sistem veya yöntem varmıdır , varsa onları anlayıp  öğrenip geliştirmek için çalışmalar yapayım istiyorum.. 


 

Endorfin35+

Epey bir zaman önce uğraşmıştım. Açıkçası çok birşey hatırlamıyorum. Anlattıklarınızdan baya yol aldığınızı anlıyorum. 328 ile bende düzgün hızlanma sağlayamamıştım. Ancak grlb bunu başarıyor. Grlb kodlarına bende bakmıştım ama o zamanki bilgim ile bana ağır gelmişti.

Birde 1/3 hızlanma, 1/3 tam yol, 1/3 yavaşlama mantığı her zaman doğru değil. Örneğin düşük bir ivmelenme değeri ile hızlanma eğrisi tepe noktasına varamadan yavaşlama başlayabilmeli. Yani girilen değerlere bağlı olarak dinamik hesaplanmalı.

Stepperden bir sonraki aşama için özel bir sebebiniz yok ise bence uğraşmayın. Sonuçta mantığı anlamışsınız...
"İşi bilen yapar, az bilen akıl verir, bilmeyen eleştirir, yapamayan çamur atar."

DenizUfuktas

#4
Endorfin35+ hocam bu proje ile öğrenme ve  geliştirme amaçlı uğraşmak istiyorum. İşin matematiğini merak ediyorum.
Interrupt Service Rutine(ISR) kullanarak bu hızlanma ve yavaşlama algoritması nasıl hesaplanıyor bunu merak ediyorum.
ISR yi örneğin 10 Khz ayarlayıp değiştirmeden bu sabit frekansta hızı nasıl yavaşlatabilirm.
Örneğin 100 mm lik mesafede bunu matematiksel olarak nasıl formulize edebilirim. Bunu bir türlü kafamda oturtamadım.

(z)Bülent Hocam böyle bir proje ile uğraşmıştı.Youtube Kanalında XY plotter videoları var. Ayrıca üç boyutlu yazıcı tasarımı yaptı ve çalıştırdı.
Bu yazıcıyı yaparken hatta hızlanma rampası için tabla üzerine koyduğu sigarayı dengede tutmaya çalışıyordu.

   

Hocam lütfen biraz mantığından ve matematiksel modelinden bahsederek yardımcı olabilirmisiniz.

ISR - Timer Interrupt Service  kullanarak bu işi en basit haliyle nasıl yapabiliriz.
benim örneğimde  ISR tam hızda 2 MHZ hızla sayıyor. 0.0000005 saniye;
Timer Counter 16 Bit Max =65535 ' kadar sayabiliyor.
Timer OverFlow = 65535;

Karşılaştırma yazmacı OCR1A = max Değeri =0 - 65535 -> Toplam 65536 değer alıyor.
Timer Counter OCR1A ya eşit olduğunda karşılaştırma yazmacı interrupt Vectorü çağrılıyor.


Gitmek istenilen mesafe 100 mm : Toplam atılacak step adım = 100mm * 160 (step_per_mm)=16000 adım;
Nasıl bir mantık kurmak gerekiyor.

Bilen tüm değerli hocalarımdan biraz mantığından ve matematiksel modelinden bahsederek yardımcı olmasını rica ediyorum.