Arduino Öğrenme Fonksiyonlu Robot Kolu (Servo Hatası)

karacaoglu

Üye
Katılım
11 Ocak 2018
Mesajlar
6
Puanları
1
Yaş
28
Arkadaşlar öncelikle merhaba. Bitirme projesi olarak öğrenme fonksiyonuna sahip robot kolu tasarlıyorum. Projeden biraz bahsedecek olursam size:

Malzemeler:
4,SG90 Servo, 2-Switch, 3-LED, Robot Kol, 2-Miniboard, Arduino Uno, 9V Pil, 5V Adaptör, Kontrplak çevrimli kutu

Çalışma Mantığı:
Switch1 (S1): Sisteme enerji temin etme
Switch2 (S2): Öğrenme Fonksiyonunu kontrol etme
LED1: Sistem enerjili (yeşil)
LED2: Sistem öğreniyor (sarı)
LED3: Sistem öğrendiği hareketi yapıyor (mavi)

Servo Motorlar 5V-1A adaptör ile besleniyor.
Arduino 9V pil ile besleniyor.
S1 anahtarını on konumuna getirince LED1 yanıyor. Sonrasında S2 anahtarını on konumuna getirdiğimde (LED2 on) robot koluna el ile zorlama vasıtasıyla hareket yapıtırılıp, S2 off konumuna getirilince (LED3 on) öğrendiği hareketi yapmasını bekliyorum.

Bağlantı:
-5V Adaptörün +' sı 4 adet servonun Vcc girişine board üzerinden bağlı
-5V Adaptörün -' si 4 adet servonun gnd ucuna board üzerinden bağlı (arduinonun GND si de bağlı bu konuma)
- Servoların bilgi pinleri sırasıyla Digital (6,9,10,11) pinlerine bağlı -PWM
- Servonun içerisinde bulunan potansiyometreden çıkan kablolar ise sırasıyla Analog(0,1,2,3) pinlerine bağlı ******* Servo motor içerisinde bulunan potansiyometre (kendi üzerinden bulunuyor, dışarıdan bağlanmadı) bana konum bilgisini veriyor (testleri yapıldı)
- S1 anahtarının bir ucunda 5V (Arduinonun 5V ve GND sini ayrı bir board üzerine taktım. Oradaki 5V) diğer ucu ise D4 pini ile pull down direncine bağlı (pull down direncinin diğer bacağı toprak)
- S2 anahtarı içinde aynı bağlantı geçerli (D5 pini)

Ancak karşılaştığım sorun şu;
- S1 anahtarını on yaptıktan sonrasında S2 anahtarını da on yapınca hareketi öğretebilmem gerekiyor. Ancak robot kendisini belirli bir konumda kilitliyor ve elimle oynatmama izin vermiyor.
- S2 off yaptıktan sonra öğrendiği hareketi yapması gerekiyor ancak herhangi bir hareket yaptıramadığım için belirli bir hareket yapamıyor.

Bu konuda yardımcı olabilecekler varsa şimdiden çok teşekkür ederim. Yazdığım kodu paylaşayım, inceleyebilirsiniz. Gözümden kaçan bir hata veya eksiklik olabilir (ki ben kodsal bir hatadan şüpheleniyorum)
Kısacası arkadaşlar benim robot kola elimle hareket yaptırmam gerekiyor (iteleyerek, elimle döndererek) ancak servolar hareket yaptırmama izin vermiyorlar. Dönmüyorlar hiçbir yere. Sadece bir konumda tutuyorlar kendilerini.

KOD:

Kod:
#include <Servo.h> // SERVO KÜTÜPHANESİ EKLENDİ

Servo myservo1; // ALT SERVO
Servo myservo2; // SAĞ SERVO
Servo myservo3; // SOL SERVO
Servo myservo4; // ÜST SERVO

int bekle = 300; // BEKLEME SÜRESİ 300 MİLİSANİYE OLARAK AYARLANDI
int bekle2 = 1000; // BEKLEME SÜRESİ 1 SANİYE OLARAK AYARLANDI
int servodeger1 = A0; // ALT SERVO ENCODER PİNİ A0' A AYARLANDI
int servodeger2 = A1; // SAĞ SERVO ENCODER PİNİ A1' E AYARLANDI
int servodeger3 = A2; // SOL SERVO ENCODER PİNİ A2' E AYARLANDI
int servodeger4 = A3; // ÜST SERVO ENCODER PİNİ A3' E AYARLANDI
int servo1pozisyon[] = {1, 1, 1, 1};
int servo2pozisyon[] = {1, 1, 1, 1};
int servo3pozisyon[] = {1, 1, 1, 1};
int servo4pozisyon[] = {1, 1, 1, 1};
int servo1; // SERVOLAR İÇİN DEĞİŞKENLER TANIMLANDI
int servo2;
int servo3;
int servo4;
int aci1; // SERVO DÖNÜŞ AÇILARINI ALABİLMEK İÇİN DEĞİŞKENLER TANIMLANDI
int aci2;
int aci3;
int aci4;

void setup() {
  pinMode(4, INPUT); // SİSTEM ANAHTARI D4 PİNİNE GİRİŞ OLARAK AYARLANDI
  pinMode(5, INPUT); // ÖĞRENME ANAHTARI D5 PİNİNE GİRİŞ OLARAK AYARLANDI
  pinMode(7, OUTPUT); // YEŞİL LED 7. PİN OLARAK AYARLANDI
  pinMode(8, OUTPUT); // SARI LED 8. PİN OLARAK AYARLANDI
  pinMode(12, OUTPUT); // MAVİ LED 12. PİN OLARAK AYARLANDI
  myservo1.attach(6); // 1. SERVO BİLGİ PİNİ D6' A AYARLANDI
  myservo2.attach(9); // 2. SERVO BİLGİ PİNİ D9' A AYARLANDI
  myservo3.attach(10); // 3. SERVO BİLGİ PİNİ D10' A AYARLANDI
  myservo4.attach(11); // 4. SERVO BİLGİ PİNİ D11' E AYARLANDI
  Serial.begin(9600); // SERİ HABERLEŞME BAŞLATILDI
}

void loop() {
System: // GOTO KOMUTU İÇİN ETİKET TANIMLANDI
  servo1 = 0;
  servo2 = 0;
  servo3 = 0;
  servo4 = 0;
  digitalWrite(6, LOW); // BAŞLANGIÇTA PWM GÖNDERİLMEMESİ HEDEFLENDİ
  digitalWrite(9, LOW);
  digitalWrite(10, LOW);
  digitalWrite(11, LOW);
  int s1 = digitalRead(4); // SİSTEM ANAHTARI OKUNDU
  int s2 = digitalRead(5); // ÖĞRENME ANAHTARI OKUNDU
  if (s1 == HIGH) { // SİSTEM ANAHTARI KAPATILDI MI?
    digitalWrite(7, HIGH); // YEŞİL LEDİ YAK
    if (s2 == HIGH) { // ÖĞRENME ANAHTARI KAPATILDI MI?
      digitalWrite(8, HIGH); // SARI LEDİ YAK
      digitalWrite(12, LOW); // MAVİ LEDİ SÖNDÜR
      servo1 = analogRead(servodeger1); // HER SERVO DEĞİŞKENİ KENDİ ENCODERİNDEN GELEN BİLGİYİ KAYDEDER
      aci1 = map(servo1, 0, 1023, 0, 179);
      servo2 = analogRead(servodeger2);
      aci2 = map(servo2, 0, 1023, 0, 179);
      servo3 = analogRead(servodeger3);
      aci3 = map(servo3, 0, 1023, 0, 179);
      servo4 = analogRead(servodeger4);
      aci4 = map(servo4, 0, 1023, 40, 179);
      delay(bekle);
      switch (s2) { // 4 KONUM BİLGİSİ KAYDEDİLDİ
        case 1:
          servo1pozisyon[0] = aci1;
          servo2pozisyon[0] = aci2;
          servo3pozisyon[0] = aci3;
          servo4pozisyon[0] = aci4;
          break;
        case 2:
          servo1pozisyon[1] = aci1;
          servo2pozisyon[1] = aci2;
          servo3pozisyon[1] = aci3;
          servo4pozisyon[1] = aci4;
          break;
        case 3:
          servo1pozisyon[2] = aci1;
          servo2pozisyon[2] = aci2;
          servo3pozisyon[2] = aci3;
          servo4pozisyon[2] = aci4;
          break;
        case 4:
          servo1pozisyon[3] = aci1;
          servo2pozisyon[3] = aci2;
          servo3pozisyon[3] = aci3;
          servo4pozisyon[3] = aci4;
          break;
      }

      if (s2 == LOW) { // ÖĞRENME ANAHTARI AÇILDI MI?
        for (int i = 0; i < 4; i++) {
          digitalWrite(12, HIGH); // MAVİ LED' İ YAK
          digitalWrite(8, LOW); // SARI LED' İ SÖNDÜR
          myservo1.write(servo1pozisyon[i]); // HER SERVOYA İLGİLİ AÇI DEĞİŞKENLERİ YAZILIR
          myservo2.write(servo2pozisyon[i]);
          myservo3.write(servo3pozisyon[i]);
          myservo4.write(servo4pozisyon[i]);
          delay(bekle2);
        }
      }
      else {
        goto System;
      }
    }
    else {
      digitalWrite(8, LOW);
      digitalWrite(12, HIGH);
      goto System;
    }
  }
  else if (s1 == LOW) { // SİSTEM ANAHTARI AÇILDI MI?
    digitalWrite(7, LOW); // YEŞİL LEDİ SÖNDÜR
    digitalWrite(12, LOW); // MAVİ LEDİ SÖNDÜR
    digitalWrite(8, LOW); // SARI LEDİ SÖNDÜR
    goto System; // System ETİKETİNE GİT
  }
}
 
servonun beslemesini kesip yapın.
Arduinonun pilini çıkarttığımda yani sadece motorları adaptör ile beslediğimde serbest bir şekilde hareket yaptırmama izin veriyorlar. Ne zaman ki arduinoyu enerjilendiriyorum, işte o zaman robotlar belirli bir konumda kendisini kilitliyor. Söylediğiniz çözüm bir işe yaramıyor bu yüzden. Yine de teşekkür ederim
 
Arkadaşlar yardımcı olabilecek hiç kimse yok mu? Günlerdir kafa patlatıyorum ancak çözümünü bulamadım

Arkadaşlar yukarıda ki kod güncellendi en son bu şekilde. Ancak sorunum hala daha devam ediyor.

Kod:
#include <Servo.h> // SERVO KÜTÜPHANESİ EKLENDİ

Servo myservo1; // ALT SERVO
Servo myservo2; // SAĞ SERVO
Servo myservo3; // SOL SERVO
Servo myservo4; // ÜST SERVO

int bekle = 250;
const int servodeger1 = A0; // ALT SERVO ENCODER PİNİ A0' A AYARLANDI
const int servodeger2 = A1; // SAĞ SERVO ENCODER PİNİ A1' E AYARLANDI
const int servodeger3 = A2; // SOL SERVO ENCODER PİNİ A2' E AYARLANDI
const int servodeger4 = A3; // ÜST SERVO ENCODER PİNİ A3' E AYARLANDI
int servopozisyon1[] = {0, 0, 0, 0};
int servopozisyon2[] = {0, 0, 0, 0};
int servopozisyon3[] = {0, 0, 0, 0};
int servopozisyon4[] = {0, 0, 0, 0};
int servoilk[] = {0, 0, 0, 0};
int servoilkaci[] = {0, 0, 0, 0};
int servodegisken[] = {0, 0, 0, 0};
int servoaci[] = {0, 0, 0, 0};
int i;


void setup() {
  pinMode(4, INPUT); // SİSTEM ANAHTARI D4 PİNİNE GİRİŞ OLARAK AYARLANDI
  pinMode(5, INPUT); // ÖĞRENME ANAHTARI D5 PİNİNE GİRİŞ OLARAK AYARLANDI
  pinMode(7, OUTPUT); // YEŞİL LED 7. PİN OLARAK AYARLANDI
  pinMode(8, OUTPUT); // SARI LED 8. PİN OLARAK AYARLANDI
  pinMode(12, OUTPUT); // MAVİ LED 12. PİN OLARAK AYARLANDI
  myservo1.attach(6); // 1. SERVO BİLGİ PİNİ D6' A AYARLANDI
  myservo2.attach(9); // 2. SERVO BİLGİ PİNİ D9' A AYARLANDI
  myservo3.attach(10); // 3. SERVO BİLGİ PİNİ D10' A AYARLANDI
  myservo4.attach(11); // 4. SERVO BİLGİ PİNİ D11' E AYARLANDI
  Serial.begin(9600); // SERİ HABERLEŞME BAŞLATILDI
}

void loop() {
  const int s1 = digitalRead(4);
  const int s2 = digitalRead(5);
  ilkkonumogren();
  if (s1 == HIGH) {
    digitalWrite(7, HIGH);
    if (s2 == HIGH) {
      digitalWrite(8, HIGH); // SARI LEDİ YAK
      digitalWrite(12, LOW); // MAVİ LEDİ SÖNDÜR
      ogren();
      if (s2 == LOW) {
        digitalWrite(12, HIGH);
        digitalWrite(8, LOW);
        ilkkonumhareket();
        hareket();
      }
    }
    else {
      digitalWrite(8, LOW);
      digitalWrite(12, HIGH);
    }
  }
  else {
    digitalWrite(7, LOW);
    digitalWrite(12, LOW);
    digitalWrite(8, LOW);
  }
}

void ilkkonumogren() {
  servoilk[0] = analogRead(servodeger1);
  servoilkaci[0] = map(servoilk[0], 182, 461, 0, 179);
  servoilk[1] = analogRead(servodeger2);
  servoilkaci[1] = map(servoilk[1], 182, 461, 0, 179);
  servoilk[2] = analogRead(servodeger3);
  servoilkaci[2] = map(servoilk[2], 182, 461, 0, 179);
  servoilk[3] = analogRead(servodeger4);
  servoilkaci[3] = map(servoilk[3], 182, 461, 0, 179);
}

void ilkkonumhareket() {
  myservo1.write(servoilkaci[0]);
  myservo2.write(servoilkaci[1]);
  myservo3.write(servoilkaci[2]);
  myservo4.write(servoilkaci[3]);
}

void ogren() {
  for (i = 0; i < 4; i++) {

    servodegisken[0] = analogRead(servodeger1);          // 1. SERVO
    servoaci[0] = map(servodegisken[0], 182, 461, 0, 179);
    servopozisyon1[i] = servoaci[0];

    servodegisken[1] = analogRead(servodeger2);          // 2. SERVO
    servoaci[1] = map(servodegisken[1], 186, 460, 0, 179);
    servopozisyon2[i] = servoaci[1];

    servodegisken[2] = analogRead(servodeger3);          // 3. SERVO
    servoaci[2] = map(servodegisken[2], 275, 520, 75, 179);
    servopozisyon3[i] = servoaci[2];

    servodegisken[3] = analogRead(servodeger4);         // 4. SERVO
    servoaci[3] = map(servodegisken[3], 260, 470, 40, 179);
    servopozisyon4[i] = servoaci[3];
  }
}

void hareket () {
  for (i = 0; i < 4; i++) {
    myservo1.write(servopozisyon1[i]);
    myservo2.write(servopozisyon2[i]);
    myservo3.write(servopozisyon3[i]);
    myservo4.write(servopozisyon4[i]);
    delay(bekle);
  }
}
 
Moderatör tarafında düzenlendi:
Fena ilerleme kaydetmemissin. 1 adet ardionu uyumlu hazir role modulu al. Servolarin + uclarini gruplayarak role kontagina bagla. Rolenin diger kontaginida + ya bagla. Roleyi kontrol etmek icin arduinoda birtane output kullanacaksin. Normal durumlarda role kontrol pini high. Ogrenme fonsiyonunda role pini low olacak boyle motorlarin enerjisi kesilecek. Ogrenme fonksiyonundan cikarken role pinini tekrar high yapacaksin.

Kolay gelsin.
 
merhaba şuan bitirme projesi için bende aynı proje ile uğraşıyorum ve sizinle aynı sorunları yaşıyorum acaba siz çözümü bulabildiniz mi
 

Forum istatistikleri

Konular
127,956
Mesajlar
913,898
Kullanıcılar
449,606
Son üye
rasit.

Yeni konular

Geri
Üst