[]
Proteus'a IR algılayıcı yerleştirmek?
IR Receiver lie switch düğme farklı çalışıyordur.
Nasıl bir hata? Ne yapmak istiyorsun da yapamıyorsun?
Nasıl bir hata? Ne yapmak istiyorsun da yapamıyorsun?
- alperz (30.07.14 11:35:37)
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.
- john caseyden halsizce (30.07.14 11:48:38)
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?
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?
- alperz (30.07.14 11:50:02)
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
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
- john caseyden halsizce (30.07.14 11:59:19)
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...
Bir de kodun solsensor lokasyonuna hiç gitmez ki böyle...
- alperz (30.07.14 12:16:30)
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
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
- john caseyden halsizce (30.07.14 12:19:27 ~ 12:29:59)
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.
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.
- johan sebastian (30.07.14 12:20:36)
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.
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.
- john caseyden halsizce (30.07.14 12:26:07)
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.
Enable 293'ün enable pinlerini beslememişsiniz.
- johan sebastian (30.07.14 12:39:41)
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
}
}
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
}
}
- johan sebastian (30.07.14 12:41:50)
ş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 ?
- john caseyden halsizce (30.07.14 12:42:33)
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
- john caseyden halsizce (30.07.14 12:47:05)
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.
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.
- johan sebastian (30.07.14 12:57:27)
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.
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.
- john caseyden halsizce (30.07.14 16:23:46)
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?
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?
- john caseyden halsizce (30.07.14 16:54:21 ~ 21:22:20)
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);
}
}
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);
}
}
- johan sebastian (30.07.14 21:34:55)
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
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
- john caseyden halsizce (30.07.14 21:50:45)
Ş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();
}
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();
}
- johan sebastian (30.07.14 23:45:21)
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
- john caseyden halsizce (31.07.14 19:57:11)
Merakla bekliyorum.
- johan sebastian (31.07.14 21:33:48)
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 :)
- john caseyden halsizce (03.08.14 12:58:31)
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...
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...
- john caseyden halsizce (07.08.14 18:38:10)
Rica ederim.
Ne tip bir motor kullanıyorsunuz? Bir de motorları da 5 voltta mı sürüyorsunuz?
Ne tip bir motor kullanıyorsunuz? Bir de motorları da 5 voltta mı sürüyorsunuz?
- johan sebastian (07.08.14 19:26:27)
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 :)
- john caseyden halsizce (07.08.14 22:15:23)
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.
- johan sebastian (07.08.14 23:05:02)
1