Arduino ile Rotary Encoder
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.
- 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
Ö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
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 } }}
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.
Hiç yorum yok:
Yorum Gönder
Yorum yazdığınız ve üye olduğunuz için Size teşekkür ederim.Burada olduğunuza göre hepimizin ilgi alanı Elektronik ve Programlama sonsuz bir dünyadayız.Hepimize Başarılar...
Not: Yalnızca bu blogun üyesi yorum gönderebilir.