Ardunio'ya yazıcı encoderi bağlama

GT-R

Hectopat
Katılım
29 Ekim 2014
Mesajlar
47
Daha fazla  
Cinsiyet
Erkek
Ardunio leonardo kullanarak 900 derece dönen Ffb'li direksiyon seti yapmak istiyorum. İnternetteki videolarda encoderin "+" kablosunu 5V pinine "-" kablosunu da GND ye bağlıyorlar diğer iki kablodan birini de RX0 la TX1'e bağlıyorlar. Bende öyle yapıyorum ama kontrol etmek için programı açtığımda dönüşü algılamıyor. Encoderin lazer ışığı yanıyor. Belki encoder sorunludur diye 3 farklı yazıcı encoderi ile denedim hepsinin lazer ışığı yanıyor ama program dönüşü algılamıyor. Nerede yanlış yapıyorum?

DSC_0374.JPG


sketch-1607261289143.png
 
Hocam bu işler inan çok zarlayıcı oluyor kendim yapmıştım zamanında kolay gelsin diyorum.

Şimdi en önce şunu söylemek istiyorum Arduino'nun modeli çok önemli burada çünkü birçok model var ve aralarında kütüphane farkı olduğu için videolarda izlediğin şeyleri yapamıyorsun onu kontrol eder misin bir?

Eğer aynı ise uygulamayı bırakıp de-bug almayı dener misin print olarak bakalım orada değer açıcak mı encoder.
 
Hocam bu işler inan çok zarlayıcı oluyor kendim yapmıştım zamanında kolay gelsin diyorum.

Şimdi en önce şunu söylemek istiyorum Arduino'nun modeli çok önemli burada çünkü birçok model var ve aralarında kütüphane farkı olduğu için videolarda izlediğin şeyleri yapamıyorsun onu kontrol eder misin bir?

Eğer aynı ise uygulamayı bırakıp de-bug almayı dener misin print olarak bakalım orada değer açıcak mı encoder.

Ardunio leonardo kullanıyorum baktığım yerlerde de hep leonardo modelini kullanıyorlardı. Dediğin şekilde Debug alma işlemini nasıl yapabilirim değerleri görmek için.
 
Öncelikle bir değer kaydet sonrasında encoderi çalıştır ve ardından encoderin değer veren ucunu temasa ve o değere yazdır ardından serial println ile o değeri yazdır.
 
İnternette şöyle bir kod buldum encoder değeri ölçmek için ne kadar doğru bilmiyorum ama kod şöyle:
#define led 13
#define sensor 12

int encoderPin1 = 2;
int encoderPin2 = 3;

volatile int lastEncoded = 0;
volatile long encoderValue = 0;

long lastencoderValue = 0;

int lastMSB = 0;
int lastLSB = 0;

int ledvalue = 0;



void setup() {
Serial.begin (9600);

pinMode(encoderPin1, INPUT_PULLUP);
pinMode(encoderPin2, INPUT_PULLUP);

digitalWrite(encoderPin1, HIGH); //turn pullup resistor on
digitalWrite(encoderPin2, HIGH); //turn pullup resistor on

//call updateEncoder() when any high/low changed seen
//on interrupt 0 (pin 2), or interrupt 1 (pin 3)
attachInterrupt(0, updateEncoder, CHANGE);
attachInterrupt(1, updateEncoder, CHANGE);

/////////////////////////////////

pinMode(led, OUTPUT);
pinMode(sensor, INPUT_PULLUP);

digitalWrite(led, HIGH);
// digitalWrite(button, HIGH);

}

void loop(){
if (encoderValue >= 100)
digitalWrite(led, HIGH);
else digitalWrite(led, LOW);

ledvalue = digitalRead(led);


//Do stuff here
Serial.print("Enkoder");
Serial.print(' ');
Serial.print("Sensor");
Serial.println(' ');
Serial.print(encoderValue);
Serial.print('\t');
Serial.print(ledvalue);
Serial.println('\t');

delay(250); //just here to slow down the output, and show it will work even during a delay

}


void updateEncoder(){
int MSB = digitalRead(encoderPin1); //MSB = most significant bit
int LSB = digitalRead(encoderPin2); //LSB = least significant bit

int encoded = (MSB << 1) |LSB; //converting the 2 pin value to single number
int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded value

if(sum == 0b1101 || sum == 0b0100 || sum == 0b0010 || sum == 0b1011) encoderValue ++;
if(sum == 0b1110 || sum == 0b0111 || sum == 0b0001 || sum == 0b1000) encoderValue --;


if (ledvalue == 1) encoderValue = 0;

else if(ledvalue == 0)
lastEncoded = encoded; //store this value for next time


//lastEncoded = encoded;
}

Bunu çalıştırdığımda sağa sola döndürdükçe encoder kısmı 0 la -1 arası değişiyor sanırım normalde çok daha fazla değer göstermesi gerekiyor. Encoder mi sorunlu sence?
 
İnternette şöyle bir kod buldum encoder değeri ölçmek için ne kadar doğru bilmiyorum ama kod şöyle:
#Define LED 13
#Define sensor 12

İnt encoderPin1 = 2;
İnt encoderPin2 = 3;

Volatile int lastEncoded = 0;
Volatile long encoderValue = 0;

Long lastencoderValue = 0;

İnt lastMSB = 0;
İnt lastLSB = 0;

İnt ledvalue = 0;

Void setup() {
Serial. Begin (9600);

PinMode(encoderPin1, INPUT_PULLUP);
PinMode(encoderPin2, INPUT_PULLUP);

DigitalWrite(encoderPin1, High); //turn pullup resistor on
DigitalWrite(encoderPin2, High); //turn pullup resistor on

//Call updateEncoder() when any high/low changed seen
//On interrupt 0 (pin 2), or interrupt 1 (pin 3)
AttachInterrupt(0, updateEncoder, CHANGE);
AttachInterrupt(1, updateEncoder, CHANGE);

/////////////////////////////////

PinMode(LED, OUTPUT);
PinMode(sensor, INPUT_PULLUP);

DigitalWrite(LED, High);
// DigitalWrite(button, High);

}

Void loop(){
İf (encoderValue >= 100)
DigitalWrite(LED, High);
Else DigitalWrite(LED, Low);

Ledvalue = DigitalRead(LED);

//Do stuff here
Serial. Print("Enkoder");
Serial. Print(' ');
Serial. Print("Sensor");
Serial. Println(' ');
Serial. Print(encoderValue);
Serial. Print('\t');
Serial. Print(ledvalue);
Serial. Println('\t');

Delay(250); //just here to Slow down the output, and show it will work even during a delay

}

Void updateEncoder(){
Int MSB = DigitalRead(encoderPin1); //MSB = most significant Bit
Int LSB = DigitalRead(encoderPin2); //LSB = least significant Bit

Int encoded = (MSB << 1) |LSB; //converting the 2 pin Value to Single number
Int sum = (lastEncoded << 2) | encoded; //adding it to the previous encoded Value

If(sum == 0B1101 || sum == 0B0100 || sum == 0B0010 || sum == 0B1011) encoderValue ++;
If(sum == 0B1110 || sum == 0B0111 || sum == 0B0001 || sum == 0B1000) encoderValue --;

If (ledvalue == 1) encoderValue = 0;

Else if(ledvalue == 0)
LastEncoded = encoded; //Store this Value for Next time

//LastEncoded = encoded;
}

Bunu çalıştırdığımda sağa sola döndürdükçe encoder kısmı 0 la -1 arası değişiyor sanırım normalde çok daha fazla değer göstermesi gerekiyor. Encoder mi sorunlu sence?

0 La - 1'den kastın sadece 1 0 ve - 1 mi yoksa

1100110 gibi mi?
 
Tamamdır şu an hallettim. Encoderi test etmek için başka bir kod buldum şöyle:

#define encoder0PinA 2
#define encoder0PinB 3
volatile int encoder0Pos = 0;
volatile boolean PastA = 0;
volatile boolean PastB = 0;

void setup()
{
Serial.begin (9600);

pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);

PastA = (boolean)digitalRead(encoder0PinA);
PastB = (boolean)digitalRead(encoder0PinB);

attachInterrupt(0, doEncoderA, RISING); // pin2 için kesme
attachInterrupt(1, doEncoderB, CHANGE); // pin3 için kesme
}

void loop()
{
Serial.println(encoder0Pos % 360);
delay(100);
}

void doEncoderA()
{
PastB ? encoder0Pos--: encoder0Pos++;
}

void doEncoderB()
{
PastB = !PastB;
}

Bunu çalıştırıp baktığımda encoderlerden biri sorunluymuş ama diğerlerinde encoderi döndürdükçe farklı farklı dönüş açıları verdi 350 ile -350 arası falandı yanlış hatırlamıyorsam. Daha sonra tekrar direksiyon seti için olan programı çalıştırdım düzgünce çalıştı. İlgilendiğin için teşekkürler.
 
Tamamdır şu an hallettim. Encoderi test etmek için başka bir kod buldum şöyle:

#Define encoder0pina 2.
#Define encoder0pinb 3.
Volatile int encoder0pos = 0;
Volatile boolean pasta = 0;
Volatile boolean pastb = 0;

Void setup()
{
Serial. Begin (9600);

Pinmode(encoder0pina, ınput);
Pinmode(encoder0pinb, ınput);

Pasta = (boolean)digitalread(encoder0pina);
Pastb = (boolean)digitalread(encoder0pinb);

Attachınterrupt(0, doencodera, rısıng); // pin2 için kesme.
Attachınterrupt(1, doencoderb, change); // pin3 için kesme.
}

Void loop()
{
Serial. Println(encoder0pos % 360);
Delay(100);
}

Void doEncoderA()
{
Pastb? Encoder0pos--: Encoder0pos++;
}

Void doEncoderB()
{
Pastb =! Pastb;
}

Bunu çalıştırıp baktığımda encoderlerden biri sorunluymuş ama diğerlerinde encoderi döndürdükçe farklı farklı dönüş açıları verdi 350 ile -350 arası falandı yanlış hatırlamıyorsam. Daha sonra tekrar direksiyon seti için olan programı çalıştırdım düzgünce çalıştı. İlgilendiğin için teşekkürler.

Ne demek dostum umarım işin birer ve kullanırken keyif alırsın çd.
 
Tamamdır şu an hallettim. Encoderi test etmek için başka bir kod buldum şöyle:

#Define encoder0pina 2.
#Define encoder0pinb 3.
Volatile int encoder0pos = 0;
Volatile boolean pasta = 0;
Volatile boolean pastb = 0;

Void setup()
{
Serial. Begin (9600);

Pinmode(encoder0pina, ınput);
Pinmode(encoder0pinb, ınput);

Pasta = (boolean)digitalread(encoder0pina);
Pastb = (boolean)digitalread(encoder0pinb);

Attachınterrupt(0, doencodera, rısıng); // pin2 için kesme.
Attachınterrupt(1, doencoderb, change); // pin3 için kesme.
}

Void loop()
{
Serial. Println(encoder0pos % 360);
Delay(100);
}

Void doEncoderA()
{
Pastb? Encoder0pos--: Encoder0pos++;
}

Void doEncoderB()
{
Pastb =!Pastb;
}

Bunu çalıştırıp baktığımda encoderlerden biri sorunluymuş ama diğerlerinde encoderi döndürdükçe farklı farklı dönüş açıları verdi 350 ile -350 arası falandı yanlış hatırlamıyorsam. Daha sonra tekrar direksiyon seti için olan programı çalıştırdım düzgünce çalıştı. İlgilendiğin için teşekkürler.

Usta acaba bu kodu nasıl çalıştırdın bilgi verebilir misin?
 
Tamamdır şu an hallettim. Encoderi test etmek için başka bir kod buldum şöyle:

#define encoder0PinA 2
#define encoder0PinB 3
volatile int encoder0Pos = 0;
volatile boolean PastA = 0;
volatile boolean PastB = 0;

void setup()
{
Serial.begin (9600);

pinMode(encoder0PinA, INPUT);
pinMode(encoder0PinB, INPUT);

PastA = (boolean)digitalRead(encoder0PinA);
PastB = (boolean)digitalRead(encoder0PinB);

attachInterrupt(0, doEncoderA, RISING); // pin2 için kesme
attachInterrupt(1, doEncoderB, CHANGE); // pin3 için kesme
}

void loop()
{
Serial.println(encoder0Pos % 360);
delay(100);
}

void doEncoderA()
{
PastB ? encoder0Pos--: encoder0Pos++;
}

void doEncoderB()
{
PastB = !PastB;
}

Bunu çalıştırıp baktığımda encoderlerden biri sorunluymuş ama diğerlerinde encoderi döndürdükçe farklı farklı dönüş açıları verdi 350 ile -350 arası falandı yanlış hatırlamıyorsam. Daha sonra tekrar direksiyon seti için olan programı çalıştırdım düzgünce çalıştı. İlgilendiğin için teşekkürler.
kodu nasıl çalıştırdın bendede aynı durum var
 

Yeni konular

Geri
Yukarı