Arduino'da Kullanılmayan Pinler

cirak05

Üye
Katılım
14 Nis 2018
Mesajlar
10
Puanları
1
Selamın Aleyküm

Arduino'ya yeni başladım sayılır. Forumda ve internette aradım ama net bir bilgi bulamadım.

Arduino projemizde değerlendirmek istemediğimiz pinleri nasıl kullanmak lazım? (Örneğin; yazılımda hepsini ile çıkış yapmak, direnç ile gnd'ye bağlamak, vs...)

Hazırladığımız projeyi devre halinde getirip, sahada kullanmak istediğimizde kararsızlıkları önlemek için neler yapmalıdır?

Saygılar
 
Genelde sıkıntı çıkmaz. Ama içiniz
rahat olması açısından giriş ve pull-up
yapabilirsiniz.
 
Genelde sıkıntı çıkmaz. Ama içiniz
rahat olması açısından giriş ve pull-up
yapabilirsiniz.
Hocam giriş yapmak sıkıntı olmaz mı Bence çıkış yapmak daha mantıklı en azından devreyi etkilemez. Yada IDLE mode'a çekilebilir.
 
Mesele ya Vcc ya da Gnd seviyesinde
tutmak. Boş kalmaması gerekli. Bu durum
mcu yapısına ve kullanım amacına göre
yeniden değerlendirilir.
Genelde giriş yapmak daha düşük güç
harcaması yapmaz mı? Sen daha iyi bilirsin.
 
Öyle hocam da benim korkum her zaman Input yapınca etraftan gelecek herhangi bir sinyal ve işaret girişi olacaktır. Bu da MCU yu bozabilir, O yüzden dedim.
 
Vcc veya GND seviyesini bastırarak gelen
sinyal zaten herkesi korkutur. Öncelikle
donanımsal önlemler almak gerekli.
Pini giriş yapıp Z seviyesinde bırakınca;
iç yapıyı bozacak gerilim epey ciddi büyüklükte
demek. Pinlerin giriş/çıkış olmasından bunun
koruma altına alınması gerekli.

Konuyu açan arkadaşın kafası karışmasın:
*Şimdilik kafana göre takıl. Geliştirdiğin projelere
göre zaten gerekli önlemleri alman hususu
kendini belli eder.
 
Vcc veya GND seviyesini bastırarak gelen
sinyal zaten herkesi korkutur. Öncelikle
donanımsal önlemler almak gerekli.
Pini giriş yapıp Z seviyesinde bırakınca;
iç yapıyı bozacak gerilim epey ciddi büyüklükte
demek. Pinlerin giriş/çıkış olmasından bunun
koruma altına alınması gerekli.

Konuyu açan arkadaşın kafası karışmasın:
*Şimdilik kafana göre takıl. Geliştirdiğin projelere
göre zaten gerekli önlemleri alman hususu
kendini belli eder.

Arduino ve 2'li röle modülü kullanarak bir silecek motorunu ileri geri yönde hareket ettiriyorum.

Start tuşuyla motor ileri hareket ediyor,
İlk siviçe bastığında motor geri yöne dönmeye başlıyor,
diğer siviçe geldiğinde stop ederek, tekrar start tuşuna basılmasını bekliyor.

Ama her ne oluyorsa
(temassızlık olamaz çünkü devreyi jumper kabloları birbirine geçirerek değil, lehimleyerek yaptım)
bazen ben start tuşuna 1 kez basmış olmama rağmen, devre bu ileri geri gidip geldikten sonra stop etme olayını iki kez tekrarlıyor.

Yani ben start tuşuna 1 kez basıyorum ama, start tuşuyla harekete geçip ilk siviçle yön değiştirerek geri gelen motor, son sivice bastığında STOP etmesi gerekirken, sanki ben tekrar start tuşuna basmışım gibi çalışmaya devam edip yine ileri gidiyor, ilk sivice basıyor, ters yönde dönüp gelip son sivice basınca duruyor. Hızını alamıyor olmalı :))

Ve yine bazen start tuşuna basıyorum, motor ileri yönde harekete başlıyor ama henüz siviç anahtarına ulaşmadan, röle kendi kendine tetikliyor ve motor öylece kala kalıyor.

Yada start tuşu ile motor harekete geçiyor, gidip ilk siviçe basıyor, ters yönde harekete geçiyor ama son siviçe ulaşmadan yine yolun yarısında röle tetikleme yapıyor ve motor yarı yolda kalıyor.

İşin en kötüsü de, böyle durumlarda START tuşu çalışmaz oluyor. Her böyle bir an yaşadığımda arduinoyu resetlemek zorunda kalıyorum.

Bunun sebebi nedir? "Firzen" arkadaşımızın bahsettiği konu ile alakalı olabilir mi hocam benim yaşadığım durum ? Yani birşeylerden mi etkileniyor arduino?

Gerçi denemedim ama, boşta kalan pinler giriş olarak atansa ve 10 K lık dirençler ile pull-down yapıp (-) ye bağlansa dış etkenlerden etkilenmesinin önüne geçilebilir mi?

Yada tam tersi boşta kalan pinlerin tamamı OUT olarak atansa daha iyi olmaz mı?
Çünkü mantıken düşününce, boştaki pinlerin hepsi out olarak atandı ama hiçbirinden akım çekilmediği ve arduinoya yük binmediği için devreye sıkıntı yaratmayacağını düşünüyorum.

Boştakilerin hepsinin çıkış pini olarak atandığı için de, dışarıdan herhangi bir şekilde etkilenmeyeceğini düşünüyorum.
 
Moderatör tarafında düzenlendi:
Burada bana göre iki olay
var:
Biri debounce gecikmesi ilave
edildi mi? Biri de rölede
ters diyot var mı?
Hatta motor uçlarında da
diyot olmalı.
 
Burada bana göre iki olay
var:
Biri debounce gecikmesi ilave
edildi mi? Biri de rölede
ters diyot var mı?
Hatta motor uçlarında da
diyot olmalı.

20180517_104142 copy.jpg


Hocam öncelikle ilginiz için çok teşekkür ederim. Ben orduino yu öğrenmeye yeni başladım. Daha doğrusu bu 12 voltluk dc motoru 2 siviç ve start butonu yardımıyla ileri-geri yaptırıp stop ettirebilmek için, arduino ya başlamak zorunda kaldım da diyebilirim.

Elektroniğe oldum olası meraklıyım. Hatta dirençlerin diyotların içinde yatıp uyuyabilirim de diyebilirim :))

Ama gel gör ki pek fazla bilgi sahibi değilim.
Debounce gecikmesi ilave edildi mi diye sormuşsunuz. Bu terimi ilk kez duyduğum için google amca dan araştırdım.

Yazılım ile bu sorunun çözülebildiği hakkında yazılar okudum ancak bu gecikmeyi hangi satıra koyacağımı bilemedim.

RÖLE DE TERS DİYOT VARMI demişsiniz. Resimde gördüğünüz gibi, röle modülü kullanıyorum. Modül üreticisinin bunu düşünmüş olmasını ümit ediyorum ve vardır diye düşünüyorum.

MOTOR UÇLARINDA DA DİYOT OLMALI demişsiniz.
Röle çıkışına koyamayacağımızı düşünüyorum çünkü rölelerin tetiklemesiyle (+) (-) kutuplar yön değiştiriyor. Bu durumda Röleye motor beslemesi için gönderdiğim voltaja bağlamak bana daha mantıklı geliyor. Diyotu nereye koymalıyım?

Arduino kodu:
Kod:
  int buton=2;
  int s1=3;
  int s2=4;
  int motorileri=5; // birinci röleyi açıp kapatıyor
  int motorgeri=6;  // ikinci röleyi açıp kapatıyor
  int butondurumu;
  int s1durumu;
  int s2durumu;


  void setup()
  {
  pinMode(buton,INPUT);
  pinMode(s1,INPUT);
  pinMode(s2,INPUT);
  pinMode(motorileri,OUTPUT);
  pinMode(motorgeri,OUTPUT);

  digitalWrite(motorileri,HIGH); // RÖLELER SÜREKLİ ÇEKİLİ OLMAMASI İÇİN
  digitalWrite(motorgeri,HIGH);  // RÖLELER SÜREKLİ ÇEKİLİ OLMAMASI İÇİN
 
  digitalWrite(motorgeri,LOW); // RESETLEYİNCE MOTORU BAŞLANGIÇ KONUMUNA GETİRMEK İÇİN
  }
 

void loop()
{
  s1durumu=digitalRead(s1);   // ilk siviç durumunu oku
  s2durumu=digitalRead(s2);   // son siviç durumunu oku
  butondurumu=digitalRead(buton); // buton durumunu oku
 
 
  if(butondurumu == HIGH)        // eğer start butonuna basıldı ise
  digitalWrite(motorileri,LOW); // Birinci röleye güç vererek motor ileri yi çalıştır

 

  if(s1durumu==HIGH)                // eğer ilk sivice basıldı ise
  {
  digitalWrite(motorileri,HIGH); // ileri gitmekte olan motoru durdur
  delay(150); // BEKLE
  }
 
  if (s1durumu==HIGH)   // eğer ilk siviç basılı ise (ki şu anda basılı bekliyor)
  {
  digitalWrite(motorgeri,LOW);  // motoru geri çevir
  }

  if(s2durumu==HIGH)          // son sivice basıldı ise
  {
  digitalWrite(motorgeri,HIGH); // geriye dönen motoru durdur ve tekrar START butonuna basılana dek bekle
  }
 
  }

Yardımlarınız için şimdiden teşekkür ederim hocam.
 
Moderatör tarafında düzenlendi:
Kod:
  int buton=2;
  int s1=3;
  int s2=4;
  int motorileri=5; // birinci röleyi açıp kapatıyor
  int motorgeri=6;  // ikinci röleyi açıp kapatıyor
  int butondurumu;
  int s1durumu;
  int s2durumu;


  void setup()
  {
    pinMode(buton,INPUT);
    pinMode(s1,INPUT);
    pinMode(s2,INPUT);
    pinMode(motorileri,OUTPUT);
    pinMode(motorgeri,OUTPUT);

    digitalWrite(motorileri,HIGH); // RÖLELER SÜREKLİ ÇEKİLİ OLMAMASI İÇİN
    digitalWrite(motorgeri,HIGH);  // RÖLELER SÜREKLİ ÇEKİLİ OLMAMASI İÇİN

    digitalWrite(motorgeri,LOW); // RESETLEYİNCE MOTORU BAŞLANGIÇ KONUMUNA GETİRMEK İÇİN
  }

void loop()
{
  //s1durumu=digitalRead(s1);   // ilk siviç durumunu oku
  //s2durumu=digitalRead(s2);   // son siviç durumunu oku
  //butondurumu=digitalRead(buton); // buton durumunu oku
 /******************************************************************************
  * Buradaki düzeltme gibi diğerlerini de siz yaparsınız. */
 
  //if(butondurumu == HIGH)        // eğer start butonuna basıldı ise
  if(digitalRead(buton) == HIGH)
  {
      delay(20);//Debounce gecikmesi
      //if(butondurumu == HIGH)
      if(digitalRead(buton) == HIGH)// Gecikmeden sonra hala buton basılı mı?
      {
          digitalWrite(motorileri,LOW); // Birinci röleye güç vererek motor ileri yi çalıştır
      }
  }
  /********************************************************************************/

  //if(s1durumu==HIGH)                // eğer ilk sivice basıldı ise
  if(digitalRead(s1) == HIGH)
  {
      delay(20);
      if(digitalRead(s1) == HIGH)
      {
        digitalWrite(motorileri,HIGH); // ileri gitmekte olan motoru durdur
        delay(150); // BEKLE
      }
  }
 //----Burayı anlamadım----
  if (s1durumu==HIGH)   // eğer ilk siviç basılı ise (ki şu anda basılı bekliyor)
  {
  digitalWrite(motorgeri,LOW);  // motoru geri çevir
  }

  //if(s2durumu==HIGH)          // son sivice basıldı ise
  if(digitalRead(s2) == HIGH)
  {
      delay(20);
      if(digitalRead(s2) == HIGH)
      {
          digitalWrite(motorgeri,HIGH); // geriye dönen motoru durdur ve tekrar START butonuna basılana dek bekle
      }
  }
}
 
Son düzenleme:

Forum istatistikleri

Konular
127,952
Mesajlar
913,874
Kullanıcılar
449,599
Son üye
Gksn

Yeni konular

Geri
Üst