1 Ekim 2013 Salı

1.3 ) DİJİTAL

INPUT ( BUTTON - TUŞ - DÜĞME ÖRNEKLERİ )

1) Button - Tuş kullanımına bir çok durumda ihtiyaç duyacağız ve önemli bir elemandır.
pin8'e bağladığımız button (tuş) ve direnç kombinasyonu ile arduino arayüzüne tuştan gelen bilgiyi göndererek bilgisayar ekranından gözlemleyelim.
- Tuşa basılmadığı zamanlarda ekrana durmadan 0 bilgisi gider iken
- Tuşa bastığımız andan itibaren ekrana durmadan 1 bilgisi gitmektedir

int dugme=8;
void setup(){
  Serial.begin(9600);
  pinMode(dugme,INPUT);  // tuşlar giriş olarak ayarlanmıştır. Yani pin8 bu kez çıkış değilde girdi olarak ayarlamış oluyoruz.
}
void loop(){
  int dugmeDurumu = digitalRead(dugme);   // pin8 den okunan değeri anahtarDurumu isimli değişkenine atadık ve düğmeden gelecek olan bilgiyi digitalRead() komutu ile yapıyoruz.
  Serial.println(dugmeDurumu);   
  delay(1);
}

EKRAN ÇIKTISI
tuşa basılmadan önce       tuşa basıldı esnada
                                             1
                                             1
                                             1
                                             1
... 
                                            ...

2) Aynı devreyi kullanarak arduino uno üzerinde bulunan pin13 deki led'i buton kontrolü ile yakıp söndürmeye çalışalım.
- Tuşa basılmadığı zamanlar da led yanmayacak
- Tuşa basıldığı zamanlar da ise led yanacak
( Bu komut daha çok oyuncak arabaları uzaktan kumandalarda kullanılır ileri - geri - sağa - sola gibi )

int anahtar=8;
int led=13;
void setup(){
  pinMode(anahtar,INPUT);
  pinMode(led,OUTPUT);
}
void loop(){
  int anahtarDurumu = digitalRead(anahtar);
  digitalWrite(led,anahtarDurumu);               // HIGH = 1(açık) , LOW = 0 (kapalı) anlamına gelmektedir
}

3) Aynı işlemi farklı yazılımlar ile çalıştıralım

const int tus = 8;
const int led =  13;
int tusDurumu = 0;

void setup() {
  pinMode(led, OUTPUT);
  pinMode(tus, INPUT);
}

void loop(){
  tusDurumu = digitalRead(tus);
  if (tusDurumu == HIGH) {
    digitalWrite(led, HIGH);
  }
  else {
    digitalWrite(led, LOW);
  }
}


4) Bu kez aynı devrede butona her basıldığında sayı artışı yapılıyor ve bu sayıların takibini arduino arayüzünden USB bağlantısı ile görelim.

int button = 8;
int sayi = 0;
void setup(){
  pinMode( button, INPUT );
  Serial.begin(9600);
}
void loop(){
  int kontrol = digitalRead( button );
  if( kontrol == 1 ){      // kontrol değeri bire "1" eşit ise sayı değerini bir arttırıyor ve ekrana basıyor.
    sayi = sayi + 1;
    Serial.println( sayi );
    delay(1);
  }
}

NOT: Burada dikkat etmeniz gereken husus ise button'a basmaya başladığımız anda çok hızlı bir şekilde numaralar saymaya başlıyor ve ekran dan bu çıktıyı kontrol edin.

5) Aynı devrede tuşa her bastığımız süre zarfında değilde sadece elimizi tuştan çektikten sonra sadece bir defa sayı artışının olmasını sağlamak. yani tuşa basılı kaldığı sürece sayı artışı olmayacak  ve sadece bir defa olacak ( Bu komut daha çok tek komut görevi yüklenen numara sayacı komutunda kullanılır )

int button=8;
int sayi=0;
void setup(){
  pinMode(button,INPUT);
  Serial.begin(9600);
}
void loop(){
  int kontrol=digitalRead(button);
  if(kontrol==1){
    sayi=sayi+1;
    for(;;){
    int kontrol=digitalRead(button);
    if(kontrol==0)break;
    }
    Serial.println(sayi);
  }
}


6) Bundan sonraki örnek komutlar bir önceki örneklerin farklı kodlar kullanılarak tekrarlanmıştır. Bu bölümler başlangıç olarak biraz karmaşık gelebilir ve bu gayet normal. Bu yüzden şimdilik üzerinde fazla durmayın. Sadece görmüş olun yeterli. Burada milis() komutu kullanarak düğmeye basıldığında led'i yakıp söndürelim.

const int buttonPin = 8;
const int ledPin = 13;
int ledState = HIGH;
int buttonState;
int lastButtonState = LOW;
long lastDebounceTime = 0;
long debounceDelay = 50;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  digitalWrite(ledPin, ledState);
}
void loop() {
  int reading = digitalRead(buttonPin);
  if (reading != lastButtonState) {
    lastDebounceTime = millis();
  }
  if ((millis() - lastDebounceTime) > debounceDelay) {
    if (reading != buttonState) {
      buttonState = reading;
      if (buttonState == HIGH) {
        ledState = !ledState;
      }
    }
  }
  digitalWrite(ledPin, ledState);
  lastButtonState = reading;
}

7) Düğmeye tıklanma sayacı ( numaratör ). 5 inci örnek bu işlemin aynısıdır fakat 5 inci örnek daha sade, kısa ve basit bir kullanım yöntemidir.

const int  buttonPin = 8;
const int ledPin = 13;
int buttonPushCounter = 0;
int buttonState = 0;
int lastButtonState = 0;

void setup() {
  pinMode(buttonPin, INPUT);
  pinMode(ledPin, OUTPUT);
  Serial.begin(9600);
}

void loop() {
  buttonState = digitalRead(buttonPin);
  if (buttonState != lastButtonState) {
    if (buttonState == HIGH) {
      buttonPushCounter++;
      Serial.println("on");
      Serial.print("number of button pushes:  ");
      Serial.println(buttonPushCounter);
    }
    else {
      Serial.println("off");
    }
  }
  lastButtonState = buttonState;
}

8) Arduino içerisinde bulunan pin2 deki dahili pull-up direncini kullanarak pin13 deki led'i yakıp söndürmek




void setup(){
  Serial.begin(9600);
  pinMode(2, INPUT_PULLUP);
  pinMode(13, OUTPUT);
  digitalWrite(13,LOW);
}
void loop(){
  int sensorVal = digitalRead(2);
  Serial.println(sensorVal);
  if (sensorVal == HIGH) {
    digitalWrite(13, LOW);
  }
  else {
    digitalWrite(13, HIGH);
  }
}

2 yorum:

  1. Mehmet öncelikle yararlı bilgilerin için teşekkür ederim
    Arduino ya yeni başladım kendi çapımda bişeyler yapmaya çalışıyorum.
    Yukarıda örnek 7 de yazmış olduğun sayıcı kodlarını enkoderden bilgi okumak için kullandım şu an ben gideceği adımları sayıp haritalama yapan efektif çalışan bir robot yapmaya çalışıyorum 2 adet enkoderli dc motorla yapmayı düşünüyorum ve robotta ultrasonik mesafe sensörleri kullanarak duvar takibi yaptıracağım. Ama robotun ileri giderken şaşırmaması için mesela sağ motor fazla gittiğinde yavaşlat yada sol motoru hızlandır gibi pwm kullanıp bunu nasıl yapabilirim, arduino mega 2560 kullanıyorum yada senin bildiğin otonom robotla ilgili örnek kodlar varmı nasıl bişeyler yazabilirim yardımcı olabilirsen sevinirim, saygılar

    YanıtlaSil
    Yanıtlar
    1. Merhaba Deniz,
      öncelikle teşekkür ederim. ilk başta proje yaparken ilk tavsiyem, mümkünse piyasada hem kolay bulunan hemde internet ortamında fazlaca örneğini bulabileceğin parçalar kullanman. Burda şunu vurgulamak istiyorum. daha önce enkoderli bir dc motor kullanmadım. Yanlış bilmiyor isem enkoderli dc motorların kablo sayılarında bile farklılıklar olduğu. Öncelikle servo motor seçimi yapmanı tavsiye ederim ve servo motorlar ile ilgili çok fazla açıklayıcı örnek bulabilirsin. Servo motorda hız kontrolü olduğundan bu projen için en yararlı olan motor olacağını düşünüyorum. Diğer konular için daha detaylı bilgi verir isen yardımcı olurum.

      Sil