
Proteus 8 kullanıyorum, arduino devrem var fakat ir alıcı yerleştiremiyorum. ir yerine birer buton koydum. ama simulasyonda hatalar var. butondan kaynaklı diye düşünüyorum. ne yapabiliriz?
devre şemasını da ekledim..

IR Receiver lie switch düğme farklı çalışıyordur.
Nasıl bir hata? Ne yapmak istiyorsun da yapamıyorsun?


bir adet engel kaçan robotum var sen hatırlarsın. arduino simulasyonu yapıyorum proteus'da düzgün çalışmıyo orası ayrı. iki adet dc motor ve iki adet ir algılayıcı kullanıyorum. arduino kodunu yazdım motorlar en başta ileri dönüyo istediğim gibi fakat engel algıladığında birinin terse dönmesi gerek. engel kalktığında yani butonu kaldırdığımda tekrar ileri dönmesi gerek terse dönmeye devam ediyo.


Proteus'luk bir işin yok aslında, neyse...
IR kütüphanesi nasıl çalışıyor bilmiyorum ama sorun sanki onu tam anlamamış olmanla ilgili gibi geldi. Kodu kontrol ettin mi? IR receiver düzgün çalışıyor mu?


ben devreyi kurmadım daha sadece proteusta kurdum kodları da orda çalıştırıyorum
bazı yerlerde hata vardır kesin ben zaten arduino bilmiyorum :D
bak kodlar da bunlar:
///
void setup()
{
pinMode(7, OUTPUT); //A kanalının ileri
pinMode(6, OUTPUT); //A kanalının geri
pinMode(4, OUTPUT); //B kanalının ileri
pinMode(5, OUTPUT); //B kanalının geri
pinMode(A1, INPUT); // Engel Gören Sensör
pinMode(A2, INPUT); // Engel Gören Sensör
}
void loop()
{
while(1)
{ // While(1) ile sonsuz döngü oluşturuyoruz
//analogWrite(3, 255); // A kanalının Motor hızını belirleyen PWM değeri 0-255 -- Hızı azaltmak istiyorsak 255den daha küçük bir değer seçiniz.
//analogWrite(11, 255); // B kanalının Motor hızını belirleyen PWM değeri 0-255
basla:
sagsensor:
while(digitalRead(A1) == HIGH) // sag sensör engel gördüyse
{
digitalWrite(7, HIGH); //sol motor terse dönecek
digitalWrite(6, LOW);
digitalWrite(5, HIGH); //sol motor terse dönecek
digitalWrite(4, LOW);
delay(1000);
goto sagsensor;
}
solsensor:
while(digitalRead(A2) == HIGH) // sol sensör engel gördüyse
{
digitalWrite(7, LOW); //sağ motor terse dönecek
digitalWrite(6, HIGH);
digitalWrite(5, LOW); //sağ motor terse dönecek
digitalWrite(4, HIGH);
delay(1000);
goto solsensor;
}
ileri:
digitalWrite(7, LOW); //A Kanalının // ileri
digitalWrite(4, LOW); //B Kanalının // ileri
digitalWrite(6, HIGH); //A Kanalının // sinyal yok
digitalWrite(5, HIGH); //B Kanalının // sinyal yok
goto basla;
}//while
}//void loop


A ve B kanalları ne? Sağ ve sol motorlar ayrı ayrı digital out 4-5, 6-7 şeklinde bağlı değil mi?
Bir de kodun solsensor lokasyonuna hiç gitmez ki böyle...


işte algoritma hatası var sanırım bende ve evet A ve B motorlarım L293 entegresiyle sürüyorum. arduino pinlerinden:
pin7: a kanalı ileri
pin6: a kanalı geri
pin5: b kanalı geri
pin4: b kanalı ileri
çalıştırıyo
A1 ve A2 sensörlerim.
edit: A1 ve A2 dedim amadevre şemasında 1 ve 2 pinlerine bağlamışım


Arduino için çok doğru bir syntax ile yazmamışsınız. Label'lar oluşturup goto ile gitmek yerine method'lar oluşturup bu method'ları çağırın. 'Goto' komutunu çok ender durumlarda kullanın, çünkü programın akışını bozan bir komuttur bu.
Arduino'da loop'un içine sonsuz döngü için while yazmanıza gerek yok. Loop zaten sonsuz döngüde çalışır.
Sanırım motorları pulse ile sürüp ikişer pin ile de yön değiştiriyorsunuz. Ama analogWrite'ları command'lemişsiniz. Yani motorlarını hiç çalışmıyor bu şekliyle.
Bir de algoritmanız sağlıklı çalışmaz.


c dilinde iyi kullanırdım ben etiketleri ondan denemek istedim ama sonra gördüm ki olmuyo öyle silmemiştim yine de akşam uykum gelince bıraktım öylece..
bi de sonsuz döngü olayını bi türlü yapamadım while(1) satırını sildiğim halde bile döngüye girmemişti sanırım ben de bikaç tane döngü kurayım da kesin olsun dedim. bi yerden sonra artık kafam durunca deneme yanılmayla götürdüm :D
motorlarım da en başta istediğim gibi ileriye dönüyor fakat butonlardan birine bastıktan sonra motorun biri terse dönüyor. butona basılı tuttuğumda değil de basıp bıraktığımda. bastığım sürece terse dönmesi gerek bıraktığımda yine ileri dönmesi gerek ama olmuyo.


Inputları pull-up ya da pull-down yapmanızda fayda var. 5 vermediğinzde toprağa çekilmeli. Bir de evet pwm ile sürmüyormuşsunuz.
Enable 293'ün enable pinlerini beslememişsiniz.


Kod'a bir de şöyle bakın isterseniz.
En alttaki iki method'da motor yönlerini doldurmanız gerekiyor.
void setup()
{
pinMode(7, OUTPUT); //A kanalının ileri
pinMode(6, OUTPUT); //A kanalının geri
pinMode(4, OUTPUT); //B kanalının ileri
pinMode(5, OUTPUT); //B kanalının geri
pinMode(A1, INPUT); // sensor sol
pinMode(A2, INPUT); // sensor sag
analogWrite(3, 255); //motorlari calistir
analogWrite(11, 255); //
}
void loop()
{
if (digitalRead(A1) == HIGH && digitalRead(A2) == LOW ){ //solda engel var
solaDon();
}
else if (digitalRead(A1) == LOW && digitalRead(A2) == HIGH ){ //sagda engel var
sagaDon();
}
else if (digitalRead(A1) == HIGH && digitalRead(A2) == HIGH ){ //karsida engel var
geriGit();
//geri gittikten sonra bir yone donmesi daha dogru olur
//yoksa surekli bir geri bir ileri gider
//bu nedenle buraya bir de sola ya da saga donme ekleyebilirsiniz
}
else if (digitalRead(A1) == LOW && digitalRead(A2) == LOW ){ //engel yok.
ileriGit();
}
delay(100); // bu bekleme suresini artirmak response zamanin artirir, daha gec tepki verir
}
void solaDon(){
solMotor(0);
sagMotor(1);
}
void sagaDon(){
solMotor(1);
sagMotor(0);
}
void ileriGit(){
solMotor(1);
sagMotor(1);
}
void geriGit(){
solMotor(0);
sagMotor(0);
}
void sagMotor(int dir){
if(dir==1){ //sag motor ileri yonde
//buraya motor yonleri girilecek
}else{ //sag motor geri yonde
//buraya motor yonleri girilecek
}
}
void solMotor(int dir){
if(dir==1){ //sol motor ileri yonde
//buraya motor yonleri girilecek
}else{ //sol motor geri yonde
//buraya motor yonleri girilecek
}
}


şimdi çok teknik konnuştuk ben anlamadım. duyurunun en üstüne devre şeması ekledim. onun üstünde çizimlerle anlatılabilir mi bi de pwm kullanmak kolay mı kolaysa nasıl yapabilirim ?


bir tek void sagmotor/solmotor kısmını anlamadım ama genel olarak çok kullanışlı görünüyo yani ben arduino yu ilk kez kullanıcam anladım mucizevi bi şekilde :D


Basit olarak inputları ayrı birer durum gibi düşünüp bunları if'ler şekilden yazdım. Bu inputlara göre oluşacak durumları da (sağa dön, sola dön vb) methodlar halinde yazdım. Mesela solda engel varsa sagaDon methodunu cağırıyor. Bu method da kendi içinde sol motor ve sağ motoru kontrol eden iki ayrı methodu çağırıyor; çağırırken de 0 ya da 1 gibi değerler gondererek yönlerini söylüyor.
Yani sol motoru hareket ettirirken solMotor(0) derseniz sol motor bir yone solMotor(1) derseniz diğer yöne döner. Ama ben o methodlardaki iflerin içini doldurmadım, orayı yazmanız gerekiyor.
Benim şu an çıkmam gerekiyor. Siz bir bakın, olmazsa hatırlatırsınız akşam yine bakarız.


if değil de while kullansak nasıl olur?
butonlar düzgün çalışmıyo basılı tutuyorum tepki yok bırakıyorum yine tepki yok..
ama basıp bırakınca terse dönmeye başlıyor.


i.hizliresim.com
böyle bir devre kurdum, pull-down yaptığımı düşünüyorum :)
bastığım sürece motorun biri geri dönüyor bıraktığımda ileri dönüyor. fakat ikisini de basılı tuttuğumda geri gitmiyor. sanırım ordaki kodu yazamadım ben.
************
else if (digitalRead(A1) == HIGH && digitalRead(A2) == HIGH ){ //karsida engel var
geriGit();
//geri gittikten sonra bir yone donmesi daha dogru olur
//yoksa surekli bir geri bir ileri gider
//bu nedenle buraya bir de sola ya da saga donme ekleyebilirsiniz
}
************
bölümünde geriGit(); satırının altına bir de sagaDon(); ekledim
ve sanrım sagaDon() den önce biraz bekletmeliyim ki yeteri kadar geriye gidebilsin.
fakat tahmin edersiniz ki beceremedim...
ayrıca
analogWrite(3, 255); //motorlari calistir
analogWrite(11, 255); //
kısmı e anlama gelir motor hızı mı? neden 3 ve 11?


analogWrite satırlarını silebilirsiniz, öyle birşey kullanmıyormuşsunuz. Ben devre şemasını görmeden sadece kodunuza bakarak yazdım o kısmı.
Bu kodu while ile de yazabilirsiniz. Ama sorunun bundan kaynaklandığını düşünmüyorum. Bu haliyle hata ayıklamak daha kolay olur, sonra isterseniz değiştirirsiniz.
inputlar şimdi daha sağlıklı olmuş.
l293'ün enable pinlerini High'a çekin, yani 5 volt bağlayın oraya da.
Kodun son kısmı da şöyle birşeyler olacak, yönleri siz bulup değiştirirsiniz:
void sagMotor(int dir){
if(dir==1){ //sag motor ileri yonde
digitalWrite(7, HIGH); //sol motor terse dönecek
digitalWrite(6, LOW);
}else{ //sag motor geri yonde
digitalWrite(7, LOW); //sol motor terse dönecek
digitalWrite(6, HIGH);
}
}
void solMotor(int dir){
if(dir==1){ //sol motor ileri yonde
digitalWrite(5, LOW); //sol motor terse dönecek
digitalWrite(4, HIGH);
}else{ //sol motor geri yonde
digitalWrite(5, HIGH); //sol motor terse dönecek
digitalWrite(4, LOW);
}
}


ben sadece geriye gidip bi tarafa dönmesi durumunu halledemedim..
onun dışında sorunsuz çalışıyo. iki butona da bastığımda iki motor geri dönüyor ve geriye dönmeye devam ediyor. tek sorun bu


Şu haliyle çalışması lazım. Geri git ve don komutlarının her birinden sonra ufak delay'ler koymakta fayda var, siz de farketmişsiniz zaten.
if'in sonunda bir else ekleyip şöyle denerseniz belki sorun çözülür:
if (digitalRead(A1) == HIGH && digitalRead(A2) == LOW ){ //solda engel var
solaDon();
}
else if (digitalRead(A1) == LOW && digitalRead(A2) == HIGH ){ //sagda engel var
sagaDon();
}
else if (digitalRead(A1) == HIGH && digitalRead(A2) == HIGH ){ //karsida engel var
geriGit();
delay(200);
sagaDon(200)
}
else if (digitalRead(A1) == LOW && digitalRead(A2) == LOW ){ //engel yok.
ileriGit();
}
else {
ileriGit();
}


devreyi bağlayıp çalıştırmayı deniycem. artık sona geldik. sonuçları da paylaşırım. hatta internette paylaşıcam ki genç arkadaşlar faydalansın


Merakla bekliyorum.


montajı yaptım çalışıyor fakat pil yuvası almayı unuttum telefon bataryası da çalıştırmadı aleti. bi de motorların redüktörlerinde biraz sıkışma oluyo arada bu yüzden zordan çalışıyo ama kodlarda bi sıkıntı yok.. teşekkürler yardımlarınız için :)


dear sebastian,
pilleri bağladım program düzgün çalışıyor fakat paletleri takınca motorların gücü sanırım yetmiyor. ayrıca motor sürücü de çok ısındı ne yapabiliriz?
best regards...


Rica ederim.
Ne tip bir motor kullanıyorsunuz? Bir de motorları da 5 voltta mı sürüyorsunuz?


sürücü L293 besleme gerilimim 5 in biraz üstünde 6ya yakın. motorlara da sürücüden gidiyor akım. dc motor ama redüktörü var sanırım redüktör biraz zorlaştırıyo işi çünkü çok kaliteli bişey değil :)


Redüktör olunca daha yavaş döner ama daha yüksek tork üretir. Yalnız motorlar daha yüksek voltaj istiyor olabilir. Eğer öyleyse l293'e uygun beslemeyi vermeniz hem güç hem de ısınma sorununu çözer.
