11 Nisan 2016 Pazartesi

Arduino da Joystick ile servo motor yönlendirme ve lazer kullanımı.

Merhaba arkadaşlar Arduino mega ile joystick kullanarak 2 adet servo motoru yönlendirme amaçlı sürerek lazerimizi yakıp söndüreceğiz. Aşağı bağlantı şeklini fritzing ile çizmeye çalıştım. Benim hazırladığım projenin videodanda izleyebilirsiniz. Projemizin kodu da aşağıdaki şekildedir. Şemada ve kodda hata olabilir, nihayetinde ben de elektronikçi değilim. Öğrenme amaçlı projelerimi paylaşıyorum. Hepinize mutulu projeler.







#include <Servo.h>

const int buttonPin = A0; // joystick buttonu
const int xPin = A1;     // joystick x koordinat
const int yPin = A2;     // joystick y koordinat
const int servo1Pin = 2; // servo 1
const int servo2Pin = 3; // servo 2
const int laserPin = 30; // lazer
const int lightPin = 31; // Işık

int laserStatus = 0;  // lazer durumu joystick buttonuna basıldığında durumu değişir.

int xPosition = 0; // joystick okunan x koordinat değeri
int yPosition = 0; // joystick okunan y koordinat değeri
int buttonStatus = 0; // joystick okunan button durumu

int xFactor = 2; // joystick orta değeri 
int yFactor = 2; // bu değer joystick artırma ve azaltma da orta değer olarak kullanılıyor
                 // eğer tam sağ yapılırsa değer 250 ye bölünüp 4 değeri alınır ve servo açısı +2 olarak artırılır veya tersi durumunda -2 şeklinde azaltılır 
                 // yarım sağ yapılırsa +1 değeri ile artırım yapılır. 
                 
int servoAyarX = 90; // burada sevoların açılış değeri 90 derece konumunda olması isteniyor.
int servoAyarY = 90;

Servo servomotor1;
Servo servomotor2;


//******************** SETUP ******************** 
void setup() {
Serial.begin(9600);

// joystick 
pinMode(xPin, INPUT);
pinMode(yPin, INPUT);
pinMode(buttonPin, INPUT_PULLUP);

//lazer ve ışık 
pinMode(laserPin, OUTPUT);
pinMode(lightPin, OUTPUT);

// Servolar
servomotor1.attach(servo1Pin);
servomotor2.attach(servo2Pin);

Serial.print(xPosition); 
Serial.print(yPosition);
}


//******************** LOOP ******************** 
void loop() {
  //joystick değerleri alınıyor.
  xPosition = analogRead(xPin); 
  yPosition = analogRead(yPin);
  buttonStatus = digitalRead(buttonPin);
  
  //seri port ekranına alınan değerler yazdırılıyor. 
  Serial.print("X: ");
  Serial.print(xPosition);
  Serial.print(" | Y: ");
  Serial.print(yPosition);
  Serial.print(" | button: ");
  Serial.print(buttonStatus);

  //digitalWrite(laser,HIGH);

  if (buttonStatus == 0) //joystick buttona basılmışsa 
   {
     if (laserStatus == 0) 
      {
        laserStatus = 1; // lazer kapalıysa açıyoruz
      } 
     else 
      {
        laserStatus = 0; // lazer açıksa kapatıyoruz
      }

     if (laserStatus == 1) // lazer durumu 1 ise lazeri ve ışığı açıyoruz 
      {
        digitalWrite(laserPin,HIGH);
        digitalWrite(lightPin,HIGH);
        Serial.print("HIGH");
        delay(100);
      }
     else  // lazer durumu 0 ise lazeri ve ışığı kapatıyoruz 
      {
        digitalWrite(laserPin,LOW);
        digitalWrite(lightPin,LOW);
        Serial.print("LOW");
        delay(100);
      }
  } 

  //servoAyar = analogRead(xPosition);
  xFactor = xPosition /250; // burada okunan joystick değeri max 4 olacak şekilde bölme yapıyoruz. 
  // map(xPosition, 0, 1023, 0, 10); // 0-180 derece arası dönüs
  servoAyarX = servoAyarX + (xFactor - 2); // burada en fazla 2 artırması veya 2 azaltması sağlanıyor.
  Serial.print(" | Servo xFactor: ");
  Serial.print(xFactor);
  if (servoAyarX > 180) // servo değeri 180 den büyük olmasın diye 180 e sabitliyoruz
   {
     servoAyarX=180;
   }
  if (servoAyarX < 0) // servo değeri 0 dan küçük olmasın diye 0 a eşitliyoruz
   {
    servoAyarX=0;
   }
  servomotor2.write(servoAyarX); // motora hesapladığımız açıyı gönderiyoruz.

  //servoAyar = analogRead(yPosition);
  // burada x hesaplanırken yaptığımız işlemleri tekrarlıyoruz 
  yFactor = yPosition /250; //map(yPosition, 0, 1023, 0, 6); // 0-180 derece arası dönüs
  servoAyarY = servoAyarY + (yFactor - 2);
  Serial.print(" | Servo yFactor: ");
  Serial.print(yFactor);
  if (servoAyarY > 180) 
   {
     servoAyarY=180;
   }
  if (servoAyarY < 0) 
   {
     servoAyarY=0;
   } 
  servomotor1.write(servoAyarY);

  Serial.print(" | Servo X: ");
  Serial.print(servoAyarX);
  Serial.print(" | Servo Y: ");
  Serial.println(servoAyarY); 
  
  delay(100);
}

Hiç yorum yok:

Yorum Gönder