Haberler:

Foruma Resim Yükleme ve Boyut Sınırlaması ( ! )  https://bit.ly/2GMFb8H

Ana Menü

Pic ile servo robot kol

Başlatan Atima, 22 Haziran 2021, 22:20:59

Atima

Merhabalar,
Pic ile robot kol yapmayi istiyorum servolari surebiliyorim fakat pot ile hareket ettirip o hareketleri hafizasiyla tekrar etmesini istiyorum. Deneyimi olan varsa yardimci olabilcek tüyolar verirseniz sevinirim.

ziyaretci

Merhaba.


-Servo sürme( ::ok )
-ADC
-Algoritma

"o hareketleri hafizasiyla..." cümlesini pek anlamadım ama tahminim şu; pot ile okunan dijital bilgiye göre servoyu hareket ettirip, servonun konum bilgisini belleğe atıp, daha sonra bellekten yürütme işlemini sürekli kılmak istiyorsunuz. Yani bir konveyör üzerinden gelen margarinleri alıp koliye yerleştirecek bu kolumuz.


Algoritması hakkında şunları söyleyebilirim;

1-Pot ile dijital veri okunur.
2-İlgili servonun mil açısını değiştiren fonksiyona bu veri gönderilir. (Hedef konuma varış hızı fonksiyonuna da girebilir.)
3-Bir buton yardımıyla ADC'den okunan dijital bilgi(veriyi anlamlandırdık) "hareket_1" dizisinin (i+0). indeksine yazılır.

Bu döngü tekrar edilir...

Eğer tek bir potansiyometre ile bütün eklemleri kontrol etmek istiyorsanız ya bir tane daha buton ekleyip eklemler arası geçiş yapacaksınız ya da yukarıdaki döngüde yer alan butona zamana bağlı(butona basılı kalma süresi) fonksiyon atayarak geçiş yapacaksınız.

Eklemlerin bütün hareketlerini pot yardımıyla belirledikten ve kaydettikten sonra sıra yine aynı buton ile ya da ek bir buton ekleyerek hareket modları arası geçiş yapıp, harekete onay vereceksiniz.

Mesela 1. hareket modunda; 1. eklemin ilgili dizideki pozisyon bilgisini ilgili eklemin hareket fonksiyonuna  göndereceksiniz(hız fonksiyonuna da sokabilirsiniz), sonra 2. eklemin bilgisini yollayacaksınız vs. Bütün eklemlere aynı anda komut yollarsanız kolun başlangıç konumu hatalı ise ortaya istenmeyen durumlar çıkabilir. Buna dikkat etmek gerek. Kastım; örneğin başlangıç konumları zemine paralelse(yani konunuzu masanın üzerine uzun uzadıya uzattığınızı düşünün) ve siz 3. ekleme -Z yönünde bir hareket verdirmişseniz ilgili eklemdeki servo zemine baskı yapacaktır.

Yukarıdaki döngü ile ilk olarak kola varsayılan pozisyon değerleri atayın(hareket modlarını engellemeyecek biçimde).


Gerisi kıl, yün vs.

Benzer uygulamayı programlamaya ilk başladığım yıllarda yapmıştım. Potlarla verdiğim konumları hafızaya alıp sonrasında hafızadan otomatik olarak aynı hareketi tekrar ettiriyordum. Kodu paylaşamam, çünkü yeni başlayan birisi incelemeye kalkarsa meslekten soğur.  :D  Zorluğundan değil, toy kod olduğundan. Aralara bıraktığım birkaç boş satırı birleştirirsek düz yazı niyetine okunur, o kadar yani.  :P

Siz zamanlayıcı kesmeleri(timer interrupts) daha dinamik bir akış sağlayabilirsiniz.

Detay için şu sıralar yardımcı olamam. Zaten diğer arkadaşlar da daha güzel algoritmalar paylaşacaktır. 

tekosis

#2
Bu tarz çalışma yapan arkadaşların uygulamalarında kolun çok fazla titrediğini gördüm. Bunu da okuma/hafızaya alma sırasında potansiyometrenin ürettiği tüm parazitli voltaj değerinin(haliyle sürekli aşağı yukarı oynayan açı değerlerinin) adc tarafından aynen okunup kaydedilmesi ve sonrasında da aynı açı değerlerinin tekrarlanmasıyla kaynaklandığını düşünüyorum. Bence kolun tüm hareketinin an be an hafızaya alınmasında gerek yok. Sadece dönüş noktaları kaydedilse yeter. Bunu sağlamak ve iki nokta arasındaki hareket sırasında oluşan titreşimi engellemek için ;
* Kol istenen ilk noktaya getirilir, bir butona basılır ve o açı değeri hafızaya alınır.
* Sonra ikinci pozisyona alınır ve tekrar butona basılarak o açı hafızaya alınır.
* Hareket tamamlanana kadar her kritik noktada açılar hafızaya alınarak işlem sonlandırılır.

Bu sayede x noktasından y noktasına hareket ederken aradaki parazit değerler kaybolmuş olur. Tabi her iki hareket arasına tüm eksenlerdeki motorların pozisyonlarına gelmelerini sağlayacak kadar gecikme vermek gerekebilir.
İlim ilim bilmektir, ilim kendin bilmektir, sen kendin bilmezsin, bu nice okumaktır.

Atima

Yorumlariniz icin cok tesekkur ederim,fakat aci degerinin hafizaya alinmasi veya algoritma tamam da, aci degerinin hafizaya alinmasi ccs c dilinde nasil bir karsiligi vardir acaba ?

Atima


serkan

ccs c de böyle yazılıyor olması lazım.
int acidegeri;

write_eeprom(1,acidegeri); // EEPROM'un 0x01 adresine degişken yazılıyor

acidegeri = read_eeprom(1); // EEPROM'un 0x01 adresi okunuyor

alfurkan1064

Yüksek bitli verileri eeproma okuyup yazmak isterseniz bu arkadaşları kullanabilirsiniz kendileri bana çok yardımcı oldular :)
Takıldığınız biryer olur ise yazabilirsiniz.


/*************************EEPROM'A KOPYALAMA***********************************/
void copy_to_eeprom(int16 bilgi,int adres1,int adres2)
{
 unsigned int low=0,high=0;
 low=make8(bilgi,0);
 high=make8(bilgi,1);
 write_eeprom(adres1,high);
 write_eeprom(adres2,low) ;
}
/*----------------------------------------------------------------------------*/

/*************************EEPROM'DAN KOPYALAMA*********************************/
int16 copy_from_eeprom(int adres1,int adres2)
{
 unsigned int low=0,high=0;
 unsigned int16 bilgi=0;
 high=read_eeprom(adres1);
 low=read_eeprom(adres2);
 bilgi=make16(high,low);
 return bilgi;
}
/*----------------------------------------------------------------------------*/