Robotik Kodlama

Robotik Kodlama
Ana Sayfa

İLGİNİZİ ÇEKEBİLECEK LİNKLER :

döner kodlayıcı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster
döner kodlayıcı etiketine sahip kayıtlar gösteriliyor. Tüm kayıtları göster

2 Mayıs 2021 Pazar

Arduino ile Rotary Encoder(Döner Kodlayıcı)

 

Arduino ile Rotary Encoder


Döner Kodlayıcı:  Döner, sonsuza kadar döndürmek için kullanabileceğiniz bir cihazdır. Size bir potansiyometre gibi görünebilir ancak kullanımda farklıdır. Açısal konumu belirlemek için kullanabileceğiniz bir konum sensörü türüdür. Dönme hareketine bağlı olarak analog veya dijital sinyal üretir.Bunlar ledin parlaklığını kontrol etmek, servoları kontrol etmek ve daha birçok şey için kullanılabilir.



Döner kodlayıcının başlangıcı, ortası veya sonu yoktur, böylece istediğiniz kadar döndürebilirsiniz. Birçok döner kodlayıcıda, onu hareket ettirdiğinizde bir çarpma hissedeceksiniz. Bunlar adımlar olarak bilinir. Çoğunun 12 adımı vardır, ancak bunlar 200'e kadar çıkabilir. Çıkış sinyali veya algılama teknolojisi olarak sınıflandırılan birçok döner kodlayıcı türü vardır. Kullandığımız, çıkışlı döner kodlayıcıdır ve en basit olanıdır.








Rotary Enkoderler Nasıl Çalışır? 

Döner kodlayıcı bize 90 derece faz dışı olan ve her dönüşte tamamlanan darbe sayısı değişen iki kare dalga çıkışı (A ve b) verir. A sinyal darbesi pozitiften her gittiğinde B darbesinin değerini okuruz. sıfıra. Kodlayıcı saat yönünde döndürüldüğünde, B darbesi pozitiftir ve kodlayıcı saat yönünün tersine çevrildiğinde, B darbesi negatiftir. Böylece her iki çıkışı mikro denetleyici ile kontrol ederek ve A darbelerinin sayısını sayarak dönüş yönünü belirleyebiliriz. Darbelerin sıklığını sayarak da hızı belirleyebiliriz. Yani, birçok avantajı olduğunu ve basit bir potansiyometreden çok daha fazla uygulama olduğunu görebilirsiniz. Bu eğitimde, onu en basit uygulamalarda kullanacağız. Bir ledin parlaklığını onu kullanarak kontrol edeceğiz.

Döner kodlayıcı Pin Çıkışı

Döner kodlayıcının aşağıdaki gibi 5 pimi vardır.döner kodlayıcı

  • CLK: Enkoder pimi A
  • DT: Enkoder pimi B
  • SW: Basmalı Düğme Anahtarı Yok
  • + 5V: 5V güç kaynağı
  • GND: Kodlayıcı Pin C

Modül, anahtarlar kapatıldığında çıkış düşük, anahtarlar açıldığında yüksek olacak şekilde tasarlanmıştır.


Döner kodlayıcı ile Arduino arduino ile döner kodlayıcı arabirimi

Öncelikle kodlayıcının 5V ve Gnd'sini Arduino'nun 5V ve Gnd'sine bağlayın. Ardından CLK ve DT olan kodlayıcı pini A ve Kodlayıcı pini B'yi sırasıyla Arduino pimi 19 ve 18'e bağlayın. Daha sonra kodlayıcı buton pimini (SW) Arduino pin 28'e bağlayın. Son olarak parlaklığını kontrol edeceğimiz led'i bağlamamız gerekiyor. Led'in pozitif tarafını Arduino'nun 3. pinine ve negatif tarafını Arduino'nun zeminine bağlayın. Yani döner kodlayıcıyı bir yöne hareket ettireceğimizde ledin parlaklığı artacak ve diğer yönde kullanacağımız zaman ledin parlaklığı azalacaktır. Bu, onu kullanabileceğimiz en basit örnektir. Bununla birlikte, motoru ve onu kullanan diğer birçok şeyi de kontrol edebiliriz.

LED'lerin parlaklığını kontrol etmek için kodlayıcı döner kodlayıcı 

Bu kod, ledin parlaklığını kontrol etmek için döner kodlayıcı içindir.

int brightness = 120 ;                                       // how much led will be bright at start

int fadeAmount = 10 ;                                      

unsigned long currentTime ;

unsigned long loopTime ;

const int pin_A = 19;                                  // initializing pin 19 for encoder pin A

const int pin_B = 18;                               // initializing pin 18 for encoder pin B

int pushbutton = 28;                               // initializing pin 28 for push button.

unsigned char encoder_A;

unsigned char encoder_B;

unsigned char encoder_A_prev=0;

void setup ( )  {

  pinMode ( 3 , OUTPUT ) ;                       // declaring pin 3 as output for the led

  pinMode ( pin_A , INPUT ) ;                    // declaring pin 19 as input

  pinMode ( pin_B , INPUT ) ;                   // declaring pin 18 as input

  currentTime = millis ( ) ;

  loopTime = currentTime ; 

} 

void loop ( )  {

  currentTime = millis ( ) ;                           // This command will get the current elapsed time

  if ( currentTime >= ( loopTime + 5 ) ){              // 5ms since last check of encoder = 200Hz 




    encoder_A = digitalRead ( pin_A ) ;                 // Reading the encoder pins

    encoder_B = digitalRead ( pin_B ) ;                 // Reading the encoder pins

    if ( ( !encoder_A ) && ( encoder_A_prev ) ) {

      // A has gone from high to low

      If ( encoder_B )  {                                  // encoder is moved clock wised so B is high

        If ( brightness + fadeAmount <= 255 ) brightness += fadeAmount ;    // This command will increase the brightness      

      }   

      else {

        // if encoder is moved counter-clockwise then b will be low     

        If ( brightness - fadeAmount >= 0 ) brightness -= fadeAmount ;       // This will decrease the brightness

      }   

    }   

    encoder_A_prev = encoder_A ;                                                                            // this will Store value of A for next time   

    analogWrite ( 3, brightness ) ;                                                                                  // This will set the brightness of pin 3:

    loopTime = currentTime ;  

  }

}

Bir Motoru Döner Kodlayıcı Kullanarak Kontrol Etme

dc motor hız kontrolü için döner kodlayıcı

Bu eğitimde, döner kodlayıcıyı kullanarak bir dc motoru kontrol edeceğiz. Bir motora güç sağlamak için 9V güç kaynağı ve L91105 motor kontrolörü kullanacağız.

Arduino kullanarak döner kodlayıcı ile DC motor hız kontrolü

volatile boolean Turnfound;                        // initializing a Boolean turn

volatile boolean up;                             // initializing a Boolean for speed up

const int CLK=2;   // initializng a const int for clock signal

const int DT=3;    // initializng a const int for Reading DT signal

const int SW=4;    // initializng a const int for Reading Push Button switch




// Connections for L9110 motor controller

#define L9110_B_IA 10                                        // initializing pins for motor

#define L9110_B_IB 11                                                 

// Motor Speed & Direction

#define MOTOR_SPEED L9110_B_IA                                       // Motor PWM Speed

#define MOTOR_DIRECTION L9110_B_IB                                              // Motor Direction
// Interrupt routine runs if CLK goes from HIGH to LOW

void isr ()  {

delay(4);                                                                                              // giving a delay

if (digitalRead(CLK))                                                                        // reading the clock signal

  up = digitalRead(DT);

else

   up = !digitalRead(DT);

Turnfound = true;

}




void setup ()  {

pinMode(CLK,INPUT);                                // initializing clk pin as input

pinMode(DT,INPUT);                                 // initializing DT pin as input

pinMode(SW,INPUT);                                // initializing SW pin as input

digitalWrite(SW, HIGH);                           // Pull-Up resistor for switch

attachInterrupt (0,isr,FALLING);

Serial.begin (9600);                             // Setting baud rate at 9600

Serial.println("Start");

pinMode( MOTOR_DIRECTION, OUTPUT );

pinMode( MOTOR_SPEED, OUTPUT );

digitalWrite( MOTOR_DIRECTION, LOW );       // This will Set motor to off

digitalWrite( MOTOR_SPEED, LOW );

}


void loop ()  {

static long RotaryPosition=0;     

if (!(digitalRead(SW))) {  

   if (RotaryPosition == 0)

   } else {

       RotaryPosition=0;

       digitalWrite( MOTOR_DIRECTION, LOW );                        //This will turn motor off

       analogWrite( MOTOR_SPEED, LOW );

       Serial.print ("Reset = ");

       Serial.println (RotaryPosition);

   }

}

// Runs if rotation was detected

if (Turnfound)  {

   if (up) {

     if (RotaryPosition >= 100) { // Max value set to 100

       RotaryPosition = 100;

     }else {

         RotaryPosition=RotaryPosition+2;}

   }else {

     if (RotaryPosition <= -100) { // Max value set to -100

       RotaryPosition = -100;}

       else {

         RotaryPosition=RotaryPosition-2;}}

   Turnfound = false;  // do NOT repeat IF loop until new rotation detected

   Serial.print ("Speed = ");  

   Serial.println (RotaryPosition);        // if Rotation is Clockwise

   if (RotaryPosition > 0 && RotaryPosition < 11) {

       digitalWrite( MOTOR_DIRECTION, LOW );                                                      //This will turn off the motor

       analogWrite( MOTOR_SPEED, LOW );

   }

   if (RotaryPosition > 10 && RotaryPosition < 21) {

     digitalWrite( MOTOR_DIRECTION, HIGH );                                                       // direction will be forward

     analogWrite( MOTOR_SPEED, 180 );                                   // PWM speed will be 180

   }




   if (RotaryPosition > 50 && RotaryPosition < 61) {

     digitalWrite( MOTOR_DIRECTION, HIGH );                                                       // direction will be forward

     analogWrite( MOTOR_SPEED, 100 );                                   // PWM speed will be 100

   }

   if (RotaryPosition > 90) {

     digitalWrite( MOTOR_DIRECTION, HIGH );                                                       // direction will be forward

     analogWrite( MOTOR_SPEED, 20 );                                                     // PWM speed will be 20

   }







// if Rotation is Counter-Clockwise




   if (RotaryPosition < 0 && RotaryPosition > -11) {

       digitalWrite( MOTOR_DIRECTION, LOW );                                                      // This will turn off the motor

       analogWrite( MOTOR_SPEED, LOW );

   }

   if (RotaryPosition < -10 && RotaryPosition > -21) {

     digitalWrite( MOTOR_DIRECTION, LOW );                                                        // direction will be reverse

     analogWrite( MOTOR_SPEED, 40 );                                                     // PWM speed will be 40

   }

   if (RotaryPosition < -40 && RotaryPosition > -51) {

     digitalWrite( MOTOR_DIRECTION, LOW );                                                        // direction will be reverse

     analogWrite( MOTOR_SPEED, 100 );                                   // PWM speed will be 100

   }

   if (RotaryPosition < -80 && RotaryPosition > -91) {

     digitalWrite( MOTOR_DIRECTION, LOW );                                        // direction will be reverse

     analogWrite( MOTOR_SPEED, 180 );                   // PWM speed will be 180

   }

   if (RotaryPosition < -90) {

     digitalWrite( MOTOR_DIRECTION, LOW );                                        // direction will be reverse

     analogWrite( MOTOR_SPEED, 200 );                   // PWM speed will be 200

   }

}}

 

ANA SAYFAYA DÖN

Bahadır ÖZGEN
Electronic Robotic Coding Research and Development 1975 - ∞
Learn Forever
If you want, let's learn together...
https://roboticcode2020.blogspot.com/
bahadirozgen1975@gmail.com
facebook    robotic.code
instagram    @roboticcode


Sayfalarımı ziyaret ettiğiniz için teşekkür ederim.Bu sitede mevcut olan içerikler kendi oluşturduğum projeler yazı,resim ve videolardan oluşmaktadır.İçerik oluşturmak çok uzun sürdüğü için bazı projelerde yurtdışı kaynaklardan faydalandım.Buradaki amacım ticari değildir.Kaynağı belli olan ve bizim kaynağına ulaşabildiğimiz materyal (yazı, fotoğraf, resim, video v.b.) için ilgili konularda fotoğraflarda logo varsa v.b. not olarak gösterilecektir.Sitemizde yayınlanan tüm içerik, bizim tarafımızdan ve internet üzerinden youtube, facebook ve blog gibi paylaşıma sunulmuş kaynak sitelerden alındığı için, sitemiz yasal yükümlülüğe tabi tutulamaz. Sitemizde telif haklarının size ait olduğu bir içerik varsa ve bunu kaldırmamızı isterseniz, iletişim sayfamızdan bizimle iletişime geçtiğiniz takdirde içerik yayından kaldırılacaktır.Bu konu ve modüller ile uğraşarak, ileride çok güzel makine ve elektronik aletler yapabilirsiniz.