Arduino yardım..

Kodla Büyü

kemal

Üye
Mesajlar
4
Çizgi izleyen ve engelde duran robota TCS34725 RGB Renk Sensörü eklemek istiyoruz. Bununla kırmızı iışta duran yeşil işıkta devam eden araç yapmak istiyoruz. çizgi izleyen robot kodları düzgün çalışıyor, renk sensörü kodlarıda düzgün çalışıyor ama renk sensörü kodlarını programa katınca araç çizgiyi takip etmiyor...sorunu çözemedim yardımcı olabilirmisiniz...



#include "Wire.h"
#include "Adafruit_TCS34725.h"
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
#define echoPin 12 //
#define trigPin 13 //
int SensorIR1=12 ;
int SensorIR2=5 ;
int SensorIR3=3 ;
int SensorIR5=13 ;
int SensorIR4=4 ;

#define MotorR1 6
#define MotorR2 7//
#define MotorRE 11

#define MotorL1 9
#define MotorL2 8
#define MotorLE 10


void setup() {

pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);

pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);


}

void loop() {

int sag= digitalRead(SensorIR5);
int ortasag= digitalRead(SensorIR4);
int orta= digitalRead(SensorIR3);
int ortasol= digitalRead(SensorIR2);
int sol= digitalRead(SensorIR1);

uint16_t clearcol, red, green, blue;//RENK SENSÖRÜ KODLARI
float average, r, g, b;
delay(100); // Farbmessung dauert c. 50ms
tcs.getRawData(&red, &green, &blue, &clearcol);

average = (red+green+blue)/3;
r = red/average;
g = green/average;
b = blue/average;

do{
if((r > 1.4) && (g < 0.9) && (b < 0.9))
digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); //

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 0); // Sol motorun hızı 0 (Motor duruyor)
}
while((r < 0.95) && (g > 1.4) && (b < 0.9));

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 120); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 110); //

if(sol ==0 && ortasol==1&& orta==1 && ortasag==1&& sag==1){ // sol sensör çizgiyi gördüğünde robot ileri gitsin.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 100); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE,0); //
}

else if(sol ==1 && ortasol==0&& orta==1 && ortasag==1&& sag==1 ){ // Solorta sensör çizgiyi gördüğünde robot sağa dönsün.
digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE,100); // Sağ motorun hızı 0 (Motor duruyor)

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 0); //
}
else if(sol ==1 && ortasol==1&& orta==0 && ortasag==1&& sag==1){ // orta sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 120); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 110); // Sol motorun hızı 0 (Motor duruyor)
}
else if(sol ==1 && ortasol==1&& orta==1 && ortasag==0&& sag==1){ // sagorta sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); //

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 100); // Sol motorun hızı 0 (Motor duruyor)
}
else if(sol ==1 && ortasol==1&& orta==1 && ortasag==1&& sag==0){ // sag sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); //

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 100); // Sol motorun hızı 0 (Motor duruyor)
}



}
 
Hocam şuradaki delay işi bozuyor gibi geldi bana.

Hocamın dediği gibi, bana göre de sorun o kısımda.

orada yazan "delay(100)" komutu çizgi izleyen kodlarının o kadar süre son halinde kalmasına neden olur ve bu süre çizgi izleyen için oldukça uzun bir süre ve çizgiyi kaçırmasına neden olur
 
Hocam bu yıl Tübitak4006 için benzer bir proje benimde aklımda var. Bu tip birden fazla sensör ve motor içeren uygulamalarda interrupt kullanmanın sıkıntıları çözeceği kanaatindeyim. Geçen yıl ki projelerde vakit daraldigi için kullanamamistim. Sorun koddaki delay ler....
 
Hocam bu yıl Tübitak4006 için benzer bir proje benimde aklımda var. Bu tip birden fazla sensör ve motor içeren uygulamalarda interrupt kullanmanın sıkıntıları çözeceği kanaatindeyim. Geçen yıl ki projelerde vakit daraldigi için kullanamamistim. Sorun koddaki delay ler....
Hocam delay'ı kaldırdığımda kod hiç çalışmıyor. interrupt nasıl kullanacağımı bilemedim
#include "Wire.h"
#include "Adafruit_TCS34725.h"
Adafruit_TCS34725 tcs = Adafruit_TCS34725(TCS34725_INTEGRATIONTIME_50MS, TCS34725_GAIN_1X);
#define echoPin 12
#define trigPin 13
int SensorIR1=1 ;
int SensorIR2=5 ;
int SensorIR3=3 ;
int SensorIR5=2 ;
int SensorIR4=4 ;

#define MotorR1 6
#define MotorR2 7
#define MotorRE 11

#define MotorL1 9
#define MotorL2 8
#define MotorLE 10


void setup() {

pinMode(MotorR1, OUTPUT);
pinMode(MotorR2, OUTPUT);

pinMode(MotorL1, OUTPUT);
pinMode(MotorL2, OUTPUT);


}

void loop() {

int sag= digitalRead(SensorIR5);
int ortasag= digitalRead(SensorIR4);
int orta= digitalRead(SensorIR3);
int ortasol= digitalRead(SensorIR2);
int sol= digitalRead(SensorIR1);

uint16_t clearcol, red, green, blue;
float average, r, g, b;
delay(10); // Farbmessung dauert c. 50ms
tcs.getRawData(&red, &green, &blue, &clearcol);

average = (red+green+blue)/3;
r = red/average;
g = green/average;
b = blue/average;


if((r > 1.4) && (g < 0.9) && (b < 0.9)) {
digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 0); // Sol motorun hızı 0 (Motor duruyor)
}
else if((r < 0.95) && (g > 1.4) && (b < 0.9)){

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 120); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 110); //
}


else if(sol ==0 ){ // sol sensör çizgiyi gördüğünde robot ileri gitsin.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 100); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE,0); // Sol motorun hızı 150
}

else if(ortasol==0 ){ // Solorta sensör çizgiyi gördüğünde robot sağa dönsün.
digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE,100); // Sağ motorun hızı 0 (Motor duruyor)

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 0); // Sol motorun hızı 150
}
else if( orta==0){ // orta sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 120); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 110); // Sol motorun hızı 0 (Motor duruyor)
}
else if( ortasag==0){ // sagorta sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 100); // Sol motorun hızı 0 (Motor duruyor)
}
else if( sag==0){ // sag sensör çizgiyi gördüğünde robot sağa dönsün.

digitalWrite(MotorR1, HIGH); // Sağ motorun ileri hareketi aktif
digitalWrite(MotorR2, LOW); // Sağ motorun geri hareketi pasif
analogWrite(MotorRE, 0); // Sağ motorun hızı 150

digitalWrite(MotorL1, HIGH); // Sol motorun ileri hareketi aktif
digitalWrite(MotorL2, LOW); // Sol motorun geri hareketi pasif
analogWrite(MotorLE, 100); // Sol motorun hızı 0 (Motor duruyor)
}



}
 
Arduino'da bende hiç kullanmadım. Şu linkteki açıklama gayet tatmin edici. Örneklerde inşallah işinize yardımcı olur hocam.
https://gelecegiyazanlar.turkcell.c...im/arduino-401/arduino-ile-interrupt-kesmeler

Kesme anlamına gelen Interrupt, birden fazla işlemin yapıldığı projelerde sıklıkla kullanılan bir özelliktir. Interrupt, Arduino'nun çalışması sırasında veya dışarıdan bir etkiyle meydana gelen olaylara otomatik olarak tepki vermesidir. Interrupt sayesinde Arduino sürekli beklenen olayın gerçekleşip gerçekleşmemesini beklemez. Arduino, başka görevleri yerine getirirken bu olay gerçekleştiğinde, otomatik olarak bu olaydan haberdar olur.
 
Delay yerine millis kullanabilirsiniz. Renk sensörü ile kırmızı ışık tesbitiniz zor olacaktır. Çünkü ortam ışığı değişkendir ve sensör sürekli Farklı veriler üretecektir.
Kolay gelsin
 
çözemedim...delay komutunun sorun çıkardığı belli ama nasıl çözeceğimi bulamadım..interrupt örnekleri pin kontrolü ile ilgili pin de 5 volt varsa gibi kullanılıyor.. renk sensöründe nasıl kullanılır ..
 
Hocam Interrupt için kullanılabilecek kütüphaneler var. Onlardan indirin ve kurun. Böyle bir kütüphane sayesinde tanımladığınız bir fonksiyonu istediğiniz zaman aralıklarında çalıştırabiliyorsunuz. Çizgi izleme kısımları loopun içinde kalsın, renk tanıma kısımlarına interrupt fonksiyonuna atın öyle deneyin, çalışması lazım. 2 sene önce yaptığımız projelerde interrupt kullanmıştım ama evdeki bilgisayarda bulamadım hangi interrupt kütüphanesini kullandığımı yarın okula gidince bakayım bi unutmazsam.
 
Arkadaşlar;elimde 1 numaralı motorlardan var pololu nun 250 RPM lik motorları ama bu motorlara uygun silikon;iyi yol tutan tekerlekler almak istiyorum ;birde tekerlek tek başına yeterli olmuyor sanıyorum içerisine bir de rulman gibi bir aparat kullanıyorlar;
Tekerlekle iç rulmanı ayrı ayrı mı satılıyor?_ yoksa tekerlekle birlikte mi satılıyor?
Bir de 2 numaralı şaseyi nerden temin edebilirim?Labirent çözen robot yapmak istiyorum tam aradığım şase ama robotistan da falan bulamadım..

Untitled-1.png
 
Geri
Üst