Robotik Kodlama

Robotik Kodlama
Ana Sayfa

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

28 Haziran 2021 Pazartesi

Rotary Encoder Nasıl Çalışır ve Arduino ile Nasıl Kullanılır?

 

Rotary Encoder Nasıl Çalışır ve Arduino ile Nasıl Kullanılır?


Döner Kodlayıcı ModülüGenel Bakış


Döner kodlayıcı, dönen bir şaftın açısal konumunu belirlemek için kullanılan bir tür konum sensörüdür. Dönme hareketine göre analog veya dijital bir elektrik sinyali üretir.

Çıkış Sinyali veya Algılama Teknolojisine göre sınıflandırılan birçok farklı tipte döner kodlayıcı vardır. Bu eğitimde kullanacağımız belirli döner kodlayıcı, artımlı bir döner kodlayıcıdır ve dönüşü ölçmek için en basit konum sensörüdür.

Rotary Enkoderler Sınıflandırması

Bu döner kodlayıcı, karesel kodlayıcı veya göreceli döner kodlayıcı olarak da bilinir ve çıktısı bir dizi kare dalga darbesidir.


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


Enkodere daha yakından bakalım ve çalışma prensibini görelim. Kare dalga darbeleri şu şekilde üretilir: Kodlayıcı, aşağıda gösterildiği gibi, ortak pim C'ye ve diğer iki ayrı kontak pimine A ve B'ye bağlanan eşit aralıklı temas bölgelerine sahip bir diske sahiptir.

Rotary Encoder Nasıl Çalışır Çalışma Prensibi

Disk adım adım dönmeye başladığında, A ve B pinleri ortak pin ile temas etmeye başlayacak ve iki kare dalga çıkış sinyali buna göre üretilecektir.

Sinyalin darbelerini sayarsak, iki çıktıdan herhangi biri döndürülmüş konumu belirlemek için kullanılabilir. Bununla birlikte, dönüş yönünü de belirlemek istiyorsak, her iki sinyali de aynı anda dikkate almamız gerekir.

İki çıkış sinyalinin birbirinden 90 derece faz dışı kaydırıldığını fark edebiliriz. Kodlayıcı saat yönünde dönüyorsa, A çıkışı B çıkışının önünde olacaktır.

Döner Kodlayıcı Çıkış Sinyali Çalışma Prensibi Fotoğrafı

Dolayısıyla, sinyalin Yüksekten Alçağa veya Alçaktan Yükseğe her değiştiğinde adımları sayarsak, o anda iki çıkış sinyalinin zıt değerlere sahip olduğunu fark edebiliriz. Tersi, kodlayıcı saat yönünün tersine dönüyorsa, çıkış sinyalleri eşit değerlere sahiptir. Bu nedenle, bunu göz önünde bulundurarak, kontrol cihazımızı kodlayıcı konumunu ve dönüş yönünü okuyacak şekilde kolayca programlayabiliriz.


Rotary Encoder Arduino Örneği


Arduino'yu kullanarak bunun pratik bir örneğini yapalım. Bu örnek için kullanacağım belirli modül bir koparma kartında geliyor ve beş pimi var. İlk pin çıkış A, ikinci pin çıkış B, üçüncü pin Button pin ve tabii ki diğer iki pin VCC ve GND pinidir.

Rotary Encoder Arduino Eğitim Örneği

Çıkış pinlerini Arduino Board'un herhangi bir dijital pinine bağlayabiliriz.

Kaynak kodu


İşte Arduino kodu:

/* Arduino Rotary Encoder Tutorial
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#define outputA 6
#define outputB 7
int counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
Serial.begin (9600);
// Reads the initial state of the outputA
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA); // Reads the "current" state of the outputA
// If the previous and the current state of the outputA are different, that means a Pulse has occured
if (aState != aLastState){
// If the outputB state is different to the outputA state, that means the encoder is rotating clockwise
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
Serial.print("Position: ");
Serial.println(counter);
}
aLastState = aState; // Updates the previous state of the outputA with the current state
}

Kodun açıklaması:  Bu yüzden önce kodlayıcımızın bağlı olduğu pinleri tanımlamamız ve program için gerekli bazı değişkenleri tanımlamamız gerekir. Kurulum bölümünde, iki pini giriş olarak tanımlamamız, sonuçları seri monitörde yazdırmak için seri iletişimi başlatmamız, ayrıca çıkış A'nın başlangıç ​​değerini okuyup değeri aLastState değişkenine koymamız gerekir.

Sonra döngü bölümünde tekrar A çıkışını okuyoruz ama şimdi değeri aState değişkenine koyuyoruz. Dolayısıyla, kodlayıcıyı döndürürsek ve bir darbe üretilirse, bu iki değer farklı olacak ve ilk "if" ifadesi doğru olacaktır. Hemen ardından ikinci "if" ifadesini kullanarak dönüş yönünü belirleriz. Çıkış B durumu, çıkış A durumundan farklıysa, sayaç bir artar, aksi takdirde azalır. Sonunda, sonuçları seri monitöre yazdırdıktan sonra, aLastState değişkenini aState değişkeniyle güncellememiz gerekiyor.

Bu örnek için ihtiyacımız olan tek şey bu. Kodu yüklerseniz, Seri Monitörü başlatın ve kodlayıcıyı döndürmeye başlayın, değerleri seri monitörde almaya başlayacağız. Sahip olduğum belirli modül, her tam döngüde 30 sayıyor.

Örnek 2 - Döner Kodlayıcı Kullanarak Kademeli Motorun Kontrol Edilmesi



Döner Kodlayıcı kullanarak bir step motorun kontrol edilmesi

İşte bu örneğin kaynak kodu:

/* Stepper Motor using a Rotary Encoder
*
* by Dejan Nedelkovski, www.HowToMechatronics.com
*
*/
#include <LiquidCrystal.h> // includes the LiquidCrystal Library
LiquidCrystal lcd(1, 2, 4, 5, 6, 7); // Creates an LC object. Parameters: (rs, enable, d4, d5, d6, d7)
// defines pins numbers
#define stepPin 8
#define dirPin 9
#define outputA 10
#define outputB 11
int counter = 0;
int angle = 0;
int aState;
int aLastState;
void setup() {
// Sets the two pins as Outputs
pinMode(stepPin,OUTPUT);
pinMode(dirPin,OUTPUT);
pinMode (outputA,INPUT);
pinMode (outputB,INPUT);
aLastState = digitalRead(outputA);
lcd.begin(16,2); // Initializes the interface to the LCD screen, and specifies the dimensions (width and height) of the display }
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState){
if (digitalRead(outputB) != aState) {
counter ++;
angle ++;
rotateCW();
}
else {
counter--;
angle --;
rotateCCW();
}
if (counter >=30 ) {
counter =0;
}
lcd.clear();
lcd.print("Position: ");
lcd.print(int(angle*(-1.8)));
lcd.print("deg");
lcd.setCursor(0,0);
}
aLastState = aState;
}
void rotateCW() {
digitalWrite(dirPin,LOW);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}
void rotateCCW() {
digitalWrite(dirPin,HIGH);
digitalWrite(stepPin,HIGH);
delayMicroseconds(2000);
digitalWrite(stepPin,LOW);
delayMicroseconds(2000);
}

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.

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.