Bunu daha önce acip soracaktim ama bir türlü kismet olmadi nihayetinde simdi yaziyorum. Arkadaslar servo motorlarla yaptigim calismalarda(robotarm, robot örümcek) gibi , tüm bu calismalarda Ardunioya ilk enerji verme aninda arduinaya bagli servolar tepki veriyor. yani tüm motorlarda kisa ve ani bir hareketlenme oluyor. Bunun önüne nasil gecebiliriz? Yani Arduinoya enerji verdigimizde Motorlarin hic etkime yapmamasini nasil saglayabiliriz? Yazilim kismindami yada Elektronik kisimdami birseyler yapmamiz gerek? Bilgilerinizi paylasirsaniz sevinirim.
Bilen yok mu? yoksa yanlis yeremi sordum?
Kodunu yayınlarsan yardımcı olacak bir arkadaş çıkar.
Tabiki su kod örnegin. Bu 5 eksenli bir Robot kol icin kullandigim kod. Arduinoaya enerji verdigim an motorlar tepkime yapiyor. Arduino enerjilendiginde ilk etabta robot kolda takil servo motorlarin hic reaksiyon göstermemesini istiyorum. //////////////////////////////////////////////////////////////////////////////// include <varspeedservo.h>
include <softwareserial.h>
SoftwareSerial myBluetooth(0, 1); // RX, TX
VarSpeedServo servo1;
VarSpeedServo servo2;
VarSpeedServo servo3;
VarSpeedServo servo4;
VarSpeedServo servo5;
// Degiskenlerimiz
int userInput[3]; // raw input from serial buffer, 3 bytes
int startbyte; // start byte, begin reading input
int servo; // which servo to pulse?
int pos; // servo angle 0-180
//Komut Arrayalari
int veri = {190, 473, 55, 290, 4110, 274, 5135, 4142, 2125, 482, 2170, 1161, 295, 4118, 270, 55, 2170, 448, 190, 5135};
int al = {5135, 190, 448, 2170, 55, 270, 4118, 295, 1161, 2170, 482, 2125, 4142, 5135, 274, 4110, 290, 55, 473, 190};
int dik_dur = {190, 2170, 4129, 3180, 5135};
int l_konum = {190, 2170, 4129, 368, 5135};
void setup()
{
servo1.attach(4);
servo2.attach(5);
servo3.attach(6);
servo4.attach(11);
servo5.attach(12);
islem(dik_dur, sizeof(dik_dur));
//Serial.begin(9600);
myBluetooth.begin(9600);
}
//Burada Serial Port’dan gelen verilere göre islem yapiliyor
void loop()
{
myBluetooth.flush();
// Wait for serial input (min 3 bytes in buffer)
if (myBluetooth.available() > 2) {
// Read the first byte
startbyte = myBluetooth.read();
//Serial.print(startbyte);
// If it’s really the startbyte (ASCII 35 -> #)
if (startbyte == 35) {
// … then get the next two bytes
for (int i = 0; i < 2; i++) {
userInput[i] = myBluetooth.read();
}
// First byte = servo to move?
servo = userInput[0];
// Second byte = which position?
pos = userInput[1];
// Packet error checking and recovery
if (pos == 255) {
servo = 255;
}
// Assign new position to appropriate servo
switch (servo) {
case 1:
servo1.write(pos); // move servo1 to 'pos'
break;
case 2:
servo2.write(pos);
break;
case 3:
servo3.write(pos);
break;
case 4:
servo4.write(pos);
break;
case 5:
servo5.write(pos);
break;
case 6: //Objeyi al getir funktionu icin
islem(veri, sizeof(veri));
break;
case 7: //Standart Pozition al funktionu
islem(al,sizeof(al));
break;
case 8: //Dikdur Pozition al funksiyonu
islem(dik_dur, sizeof(dik_dur));
break;
case 9: //L Pozition al funksiyonu
islem(l_konum, sizeof(l_konum));
break;
}
}
}
}
void islem(int komut, int deger) //Burdaki funktionun paremetresi bir int array
{
String konum;
String gelen_veri;
String servonumm;
for (int i = 0; i < deger / 2; i++)
{
gelen_veri = String(komut[i]); //Gelen veriyi string islemler yapabilmek icin stringe cevirioyruz
servonumm = gelen_veri.substring(0, 1); //Ilk karekteri aliyoruz
konum = gelen_veri.substring(1, 4); //Ilk karekterden sonraki karekterleri aliyoruz
yap(servonumm, konum.toInt()); //konum degiskeninini tekrar int’e ceviriyoruz
}
}
int yap(String servo_nummer, int pos)
{
//Serial.print(servo_nummer + " - " + pos);
//Serial.println();
switch (servo_nummer.toInt()) {
case 1:
servo1.write(pos, 20, true);
break;
case 2:
servo2.write(pos, 20, true);
break;
case 3:
servo3.write(pos, 20, true);
break;
case 4:
servo4.write(pos, 20, true);
break;
case 5:
servo5.write(pos, 20, true);
break;
}
}
/////////////////////////////////////////////////////////////////////</softwareserial.h></varspeedservo.h>
Bu sorunla karsilasanlar yokmu? Eger bir kac servo motorlu bir robot veya ne bileyim herhangi bir Proje yaptiginizda, Arduinoya ilk enerji verdiginizde motorlar kisa bir tepkime yapmiyormu? Servo lar ilek enerji aldiginda bir tepkime yapiyor ondan kaynaklaniyor acaba bu sorunu nasil giderebiliriz??
bildiğim kadarı ile servolar servo.attach(4); denildiği andan itibarem sürekli konumunu korumak için enerji uygular bunu milini hafif bir yöne ittiğinizde farkedersiniz tekrar konumuna dönmek için karşı direnç koyar sürekli konumunu sabit tutar yani sizin ilk başta farkettiğiniz belki bu olaydır bilemiyorum bazı konularda servo.detach(); ile devre dışı brakılabileceği söylenmiş ama ne kadar doğru bilemiyorum bunun için servo.attach(4); setupta değil de motorun çalıştırılacağı anda yapılıp gerekli komut verildikten sonra da servo.detach(); yapılıyor servo.attach(4); servo.write(pos, 20, true); servo.detach(); her seferinde bu şekilde tekrarlanmış
şöyle bir şey olabilir mi; servo’ya ilk komutu göndermeden ilgili servonun nesnesini açmayın, ilk kullanım esnasında bir kez çalışacak ve ilgili servoyu etkinleştirecek bir fonksiyon çağrılsın. sanırım bu şekilde görüntü olarak kusurun önüne geçilebilir. birde bunu yaparken servo sinyal bacaklarını setup esnasında low hale getirin, ileride pin high kaldığı için belki servo etkin hale geliyordur. algoritma mantıklı mı: hayır işe yarar mı: kulağa mantıklı geliyor bunun çözümü hakkında çok eskiden bir şeyler okuduğumu hatırlıyorum, ingilizce kaynak taramak en iyi seçenek
bu olayi nasil isimlendirmeliyim ki? Yani nette ne diye aramaliyim?
boot anında birkaç saniye pinler karasız kalıyor ondan hep bu saçmalıklar oluyor, belki temiz bir boot kodu yazıp yuklemek en baştan işi sağlama almak iyi olabilir.
Merhabalar, Servo kütüphanesinden servo.attach(5) fonksiyonu aşağıdaki fonksiyonu çağıyor, 5 i output yapıyor ama durumu belli değil, siz oraya durumunu belirtip low der iseniz, sorununuz çözülmüş olur diye düşünüyorum. https://github.com/arduino-libraries/Servo/blob/master/src/avr/Servo.cpp kütüphanedeki int8_t Servo::attach(int pin, int min, int max) { if(this->servoIndex < MAX_SERVOS ) { pinMode( pin, OUTPUT) ; // set servo pin to output servos[this->servoIndex].Pin.nbr = pin; // todo min/max check: abs(min - MIN_PULSE_WIDTH) /4 < 128 this->min = (MIN_PULSE_WIDTH - min)/4; //resolution of min/max is 4 uS this->max = (MAX_PULSE_WIDTH - max)/4; // initialize the timer if it has not already been initialized timer16_Sequence_t timer = SERVO_INDEX_TO_TIMER(servoIndex); if(isTimerActive(timer) == false) initISR(timer); servos[this->servoIndex].Pin.isActive = true; // this must be set after the check for isTimerActive } return this->servoIndex ; }