2.03.2012

Arduino Project 8 Arduino & Processing

Kısa bir aradan sonra tekrar herkse merhaba :)

Daha önceden processing programalam dili ile ilgli bir giriş yapmıştım. Processing programlama dili ile ilgili yazımı okumak isterseniz buyrun link. O yazımda Processing programlama dilini Arduino ile birlikte kullanacağımdan bahsetmiştim. Şimdi ise bu çalışmada basit bir örnekle Arduino ve bilgisayar nasıl bir arada kullanılır onu denyeceğim. Aslında processing sayesinde Arduino'yu tek başına kullanmak yerine işin içine bilgisayarımızı da ekleyerek bir çok sınırları ortadan kaldırıyoruz. Bu çalışmamda Arduino'dan gelen değerler için bir grafiksel arayüz hayırlayacağım. Arduinoya bağladığım dip switchin anahtarının açık-kapalı durumunu grafiksel olarak ekranda gözlemleyeceğim.

Gerekliler Listesi :

- 8x 220 Ohm Direnç
- 1x dip switch

- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı

Arduino Kod :

/*
*****************
H.Melih ERDOĞAN
*****************
Project 8
Name : Arduino & Processing
*/
int value = 0;    
        // Seri portan göndereceği değer
int last_switch1 = 0; 
// Anahtarlama yapabilmek için gerekli olan değişkenler
int last_switch2 = 0;
int last_switch3 = 0;
int last_switch4 = 0;
int last_switch5 = 0;
int last_switch6 = 0;
int last_switch7 = 0;
int last_switch8 = 0;

int switchPin1 = 13;
// Anahtarları bağladığım pin numaralarını bulunduran değişkenler.
int switchPin2 = 12;
int switchPin3 = 11;
int switchPin4 = 10;
int switchPin5 = 9;
int switchPin6 = 8;
int switchPin7 = 7;
int switchPin8 = 6;

void setup(){
Serial.begin(9600);
// USB seri bağlantı ayarı
pinMode(switchPin1,INPUT);
// Anahtarları bağladığım pin leri dijital giriş olarak tanımlıyorum.
pinMode(switchPin2,INPUT);
pinMode(switchPin3,INPUT);
pinMode(switchPin4,INPUT);
pinMode(switchPin5,INPUT);
pinMode(switchPin6,INPUT);
pinMode(switchPin7,INPUT);
pinMode(switchPin8,INPUT);
}
void loop(){
if(digitalRead(switchPin1) == HIGH && last_switch1 == 0 ){ 
// anahtar açık ise
value = value + 128;

// değere 128 değeri ekle ( neden böyle değerler eklediğimi ilerleyen kısımlarda anlaşılacaktır )
last_switch1 = 1;
}
else if(digitalRead(switchPin1) == LOW && last_switch1 == 1 ){
// anahtar kapalı ise
value = value - 128;
// değerden 128 değerini çıkart
last_switch1 = 0;
}

// aynı işlemleri diğer anahtar durumları içinde yapıyorum.
if(digitalRead(switchPin2) == HIGH && last_switch2 == 0 ){ 
value = value + 64;
last_switch2 = 1;
}
else if(digitalRead(switchPin2) == LOW && last_switch2 == 1 ){
value = value - 64;
last_switch2 = 0;
}
if(digitalRead(switchPin3) == HIGH && last_switch3 == 0 ){
value = value + 32;
last_switch3 = 1;
}
else if(digitalRead(switchPin3) == LOW && last_switch3 == 1 ){
value = value - 32;
last_switch3 = 0;
}
if(digitalRead(switchPin4) == HIGH && last_switch4 == 0 ){
value = value + 16;
last_switch4 = 1;
}
else if(digitalRead(switchPin4) == LOW && last_switch4 == 1 ){
value = value - 16;
last_switch4 = 0;
}
if(digitalRead(switchPin5) == HIGH && last_switch5 == 0 ){
value = value + 8;
last_switch5 = 1;
}
else if(digitalRead(switchPin5) == LOW && last_switch5 == 1 ){
value = value - 8;
last_switch5 = 0;
}
if(digitalRead(switchPin6) == HIGH && last_switch6 == 0 ){
value = value + 4;
last_switch6 = 1;
}
else if(digitalRead(switchPin6) == LOW && last_switch6 == 1 ){
value = value - 4;
last_switch6 = 0;
}
if(digitalRead(switchPin7) == HIGH && last_switch7 == 0 ){
value = value + 2;
last_switch7 = 1;
}
else if(digitalRead(switchPin7) == LOW && last_switch7 == 1 ){
value = value - 2;
last_switch7 = 0;
}
if(digitalRead(switchPin8) == HIGH && last_switch8 == 0 ){
value = value + 1;
last_switch8 = 1;
}
else if(digitalRead(switchPin8) == LOW && last_switch8 == 1 ){
value = value - 1;
last_switch8 = 0;
}
Serial.println(value);
delay(100);
}

Processing Kod :

/*
*****************
H.Melih ERDOĞAN
*****************
Project 8
Name : Arduino & Processing
*/
import processing.serial.*;                // Seri bağlantı için gerekli olan kütüphaneyi ekledim
Serial port;                                         // Yapacağım seri bağlantıyı tanımlıyorum
color c_red = color(225,0,0);             // renkleri tanımlıyorum
color c_white = color(255,255,255);
color c_black = color(0,0,0);
float serial_value = 0;
// seri portdan okuyacağım değeri atacağım değişken
int switch_value = 0;
// okuğum float değeri int değere dönüştüreceğim onun için gerekli olan değişken
int x=20;
void setup(){
port = new Serial(this,"COM11",9600);
// seri bağlantıyı kuruyorum
port.bufferUntil('\n');

// Seri bağlantı ile '\n' karakterine kadar gelen dataları dikkate alıyorum
// Yani her '\n' karakterinden sonra yeni bir data geldiğini kabul ediyorum.
size(250,200);
// Pencere boyutunu ayarladım
smooth();
}
void draw(){
background(255);
// Arkaplan artık bembeyaz.
// İşte algoritmanın başladığı yer. Programın en karmaşık yeri :)
/* Basit bir şekilde anlatmam gerekirse seri porttan gelen bir değeri göz önüne alalım. Diyelimki '3' değeri gelmiş olsun. 3 = 0000 0011 dir. Dolayısıyla aşağıdaki algoritma 3 değerini birer yana kaydırarak '1' olan sıradaki yerlerine kırmızı daireler koyar. Toplam 8 defa sağa kaydırma yaparak değeri baştan sona kontrol eder. Zaten değerimiz 1-2-4-8-16-32-64-128 değerlerinden oluşuyor. Bu nedenle ilk kodda değerden (1-2-4-8-16-32-64-128) değerlerini çıkartıp toplama işlemini yapıyordum. Bu sayede isteğim, yani anahtarın değiştiği yerdeki bit "1" değerini alıyor. Anahtarı eski yerine getirincede ekledği değeri geri çıkartarak aynı biti "0" yapıyor. İnşallah anlatabildim :)

*/
for(int i=1;i<=9;i++){
if(switch_value % 2 == 1){
// eğer sayı tek ise yani kontrol etmek istedeğim bit '1' ise
fill(c_red);
// Boya kalemi kırmızı Bu sayede sayece gerektiği zaman kırmızı daire çiziyorum
}
switch_value = switch_value >> 1;
text(i,x,75);
// ekranda  x, 75 noktasına i değerini yaz (başlangıçta x = 20)
ellipse(x, 90, 20, 20);
// ekrana dairelere çiz. ellipse(x,y,çap,çap)
x=x+30;
fill(c_white);
//boya kalemim artık beyaz
}
x=20;
delay(200);
// 200 ms bekleme yap
}
void serialEvent (Serial port){
// Eğer seri porttan veri gelirse
serial_value = float(port.readStringUntil('\n'));
// '\n' karakterine kadar olan kısmı oku değişkene at
switch_value = int(serial_value);
//float değeri  int değere dönüştür.
}


Devre Şeması :

Sekizli anahtar daha önce yaptığım anahtar devreleri ile aynı sekilde Arduino'ya bağlanır.


Devrenin kurulmuş v çalıştırılmış şekli aşağıdaki fotoğraflardadır.




Dip switch ile anahtarların yerlerini değiştirdikten sonra ekranda görünün görüntü. 1. 3. 4. 6. ve 7. anahtarlar yer değiştirmiş. Yani kapalı duruma getirilmiş durumda. Anahtar için kapalı terimi üzerinden akımı geçirdiği anlamına gelir ! :)


Yaptığım çalışmanın videosu aşağıdadır. İlerideki çalışmalarım da görüşmek üzere herkese iyi seyirler :)




Diğer Arduino projelerine de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino

Hiç yorum yok:

Yorum Gönder