Bisikletler Elektronik Vites Mekanizması yapalım. Bisiklet binmeyi çok severim. Bisiklet ile uğraşmayı ise daha çok severim. Bir gün bisikletin ön vites mekanizmasına motor takıp elektromekanik olarak kontrol etmek istedim.
Amacım bisikletler için otomatik vites yapmaktı bu sayede daha az ekipman ve daha hafif bir sistemin tasarlanarak ve sabit kadans sistemi ile kullanıcılara maximum performans sağlanması ve sabit zincir gerilimi sayesinde daha az zincir kopma ve dişli aşınmasını önlemesi bu sayede daha uzun ömürlü ekipman kullanımı sağlamaktı.
İlk önce sistemin nasıl çalıştığını anlamak için mekanizmayı inceledim. Bir telin çekilmesiyle ufak bir mekanizmanın zincir iteleme harektiyle oluştuğunu anladım.
Bu mekanizmaya bir servo motor takarak pic ile kontrol ettim. Kontrol kısmını iki buton ile sola ve sağa çalışacak şekilde programladım.
Bu sayede butona basılınca servo motor belirli bir açıda dönmekte ve mekanizma zinciri bir sonraki dişliye geçirmektedir. Burada dikkat etmek ve ayarlamak gereken bazı noktalar vardır. Zincir bir sonraki dişliye geçerken o dişilinin ekseninden biraz daha fazla gitmesi dişliye geçmesi açısından kolaylık sağlayabiliyor. Az iteleme haareketi yaptıtılırsa zincir geçmez veya çok giderse bir sonraki dişliye sürtünmeler olabilir.
Pic Programı
/* Project : servo kontrol buton ile bisiklet projesi Author : www.kaizen40.com Comment : servo motor kullanımını ogrenmek periyod 20ms, duty 600us ile 2000us arasında değişebilir. long türündeki bir deðer ile çarpma islemi yapılırken sadece long türündeki bir değer kullanılabilir.***** duty konum (derece) ---- ----- 1000us -90 1500us 0 2000us +90 */ #if defined (__PCM__) #include <16F628A.h> #use delay(clock=4000000) #fuses NOWDT,PUT,NOLVP,NOBROWNOUT,NOMCLR,INTRC_IO,NOPROTECT #endif #byte PORTB = 0x06 #byte PORTA = 0x05 signed long long periyod, doluluk, bosluk; // periyod degeri 255 den büyük oldugu için log olarak tanımlandı void ee_write_long(unsigned int addr , signed long long *longptr) { unsigned char edata; unsigned char I; for(I=0;I<4;I++){ edata = *((unsigned char *)longptr+I); write_eeprom(addr+I,edata); } } void ee_read_long(unsigned int addr , signed long long *longptr) { unsigned char edata; unsigned char I; for(I=0;I<4;I++){ edata=read_eeprom(I+addr); *((unsigned char *)longptr+I) = edata; } } void main() { output_b(0); // pwm periyodu = 20ms olarak ayarladık fakat döngü içinde işlemler olduğu için periyod = 19600; // periyod 20ms i aşıyor. deneme yanılma yöntemi ile 20ms olması için bu değer girildi doluluk = 1850; // doluluk oranını ilk olarak 1.viteste olmasý için 1.85ms olarak ayarlandı bosluk = periyod - doluluk; // boşluğu hesapla ilk enerji verildiğinde sorun çıkmasın ee_read_long(0x01, &doluluk); bosluk = periyod - doluluk; while(TRUE) { if(bit_test(PORTA,0)==0) // vites düşür { delay_ms(25); // ark söndür doluluk = doluluk + 50; // deðer kadar art if(doluluk > 1900){doluluk = 1900;} // üst sınırda kal bosluk = periyod - doluluk; // bosluk süresini ayarla ee_write_long(0x01, &doluluk); } if(bit_test(PORTA,1)==0) // vites arttır { delay_ms(25); doluluk = doluluk - 50; // deðer kadar azal if(doluluk < 850){doluluk = 820;} // alt sınırda kal bosluk = periyod - doluluk; // bosluk süresini ayarla ee_write_long(0x01, &doluluk); } // periyod output_high(PIN_B3); // PWM çıkıþ PORTB nin 4. bitinden (RB3) delay_us(doluluk); output_low(PIN_B3); delay_us(bosluk); } }
Kolay gelsin.
0 yorum