17.03.2012

Arduino Project 11 - Temperature Sensor

Herkese merhaba bu çalışmada ısı sensöründen aldığım ölçüm değerlerini processing ile hazırladığım bir grafik arayüz üzerinde göstereceğim. Başlamadan önce kısa bir not. Bu aralar yoğun olduğum için yaptığım projelerin yazıları çok gecikiyor. Tabikide bu yazdığım bir bahane ve bunun gerçek adı tembellik ;) Daha sırada düzenlenmeyi bekleyen bir çok yazı  ve proje var :/ (pic, opencv ve lua vs.). Gelelim projeye, bu çalışmada kullanılan sensörün adı LM35DZ basit, ucuz, bulması kolay kullanması çok çok kolay bir sıcalık sensörü. Analog değerler üretiyor ve analog değerleri değerlendirip Celsius ve Fahrenheit cinsinden değerlerndirmek bize düşüyor. 

Programda özen göstermediğim bazı konular var bunları baştan bildireyim ;P İlk olarak grafiksel gösterim çok yeterli değil, ikincisi grafiksel çizimde yuvarlamalar yapıldığı için değerde küçük sapmalar söz konusu. Ayrıca algoritmanın çok da iyi olduğu söylenemez bir iki denemede hatalı ölçümler aldım :). Tabiki öyle bir durumda programı yeniden derlemek en iyi çözüm oldu :) Peki sen neyi düzgün yaptın derseniz ilk olarak gerekliler listesine bakarak başlayalım.

Gerekliler litesi :

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

Arduino Kod :

int lm35Pin =0;
// sensörü bağladığım pin numarası
float temperature = 0; 
void setup (){
 analogReference(DEFAULT);
 Serial.begin(9600);
}
void loop(){

// Anlık sapmaların etksini azaltmak için sensörden okuduğum on değeri topluyorum.
// Sonra ortalamasını alacağım.
 for(int i=0; i<=10 ; i++)
{
 temperature = temperature + analogRead(lm35Pin);
 delay(10);
// Her ölçüm arasına 10 ms lik zaman dilimi koyuyorum
 }
 temperature = temperature / 10;
// Topladığım değerin aritmetik ortalamasını alıyorum
 temperature = (5 * temperature * 100)/1024; 

 // Elde ettiğim değeri celsiusa çeviriyorum. Açıkcası gelen analog değeri voltaj değerine çeviriyorum.
 // Referans değerim 5V. 10 bitlik ADC kullanıyorum. Sensöründe her 1 C için 10mV yolldığını biliyordum.
 Serial.println(temperature);
// Seri port üzerinden veriyi gönderiyorum
 temperature = 0;
// Değişkeni yeniden toplamda kullanılması için sıfırlıyorum
}
-------------------------------------------------------------------------------------------------------------------------
Processing Kod :


/*
*****************
H.Melih ERDOĞAN
*****************
Project 11

Name : Temperature Sensor
*/


import processing.serial.*;
// Gerekli değişkenler tanımlandı
Serial port;
int rect_length= 420;
float temperature;

// sıcaklık değerlerini atacağım değişkenler.
int[] x1 = new int[500];
int[] y1 = new int[500];
int count=0;

// renkleri tanımladım
color orange = color(204, 102, 0);
color white = color(255, 255, 255);
color fire = color(255,0,0);
color ice = color(0,150,255);
int sec,current_sec;
int mx,my;

// Pencere boyutu, seri bağlantı vs. ayarlar yapıldı.
void setup() {
  sec = second();
  size(640,480);
  port = new Serial(this,"COM11",9600);
  port.bufferUntil('\n');
  x1[0]=120;
  y1[0]=500;
  smooth();
}
void draw (){
background(255); 
// Arka plan beyaz
fill(white);
rect(10, 20, 100, rect_length);
// grafiğin ve sıcaklık barının oladuğu alanları oluştur.
rect(120, 20, 500, rect_length);
//bar renklerini ayarla
if(temperature <= 27 )

{
fill(fire);
}
else if(temperature <=20 )
{
fill(ice);
}
else{
fill(orange);
}

// ekrana yazılacak olan yazıları yaz
text("C",125, 35);
text("Time(2s)",565, 455);
text("Current Temperature : " +temperature+" C", 10, 15);
rect(12, rect_length-int((temperature*4))+20, 96, int(temperature*4));
//
grafiği ekrana çiz
if(count==500){
// eğer ekranda 500 tane nokta varsa değişkeni sıfırla.
count=0;
}
current_sec = second();
// bilgisayarın saatinin saniyesini okuyorum.
if(current_sec == sec+2){

// her iki saniyede bir ölçüm alıyorum bunu yapabilmek için bilgisayarın saatini kontrol ettim.
// gereksiz gelebilir fakat kullanımını öğrenmek için yaptığım bir deneme oldu ;)
x1[count]=120+count;
y1[count]=rect_length-(int(temperature*4))+20;
sec = current_sec;
count++;
}
else if(sec+2 > 59){
if(sec+2==60){
sec = 0;
}
else if(sec+2==61){
sec = 1;
}
}

// grafiği ekrana çiziyorum.
for(int i=0; i <= count ; i++ )

{
point(x1[i], y1[i]);
}

// fare ekranda dolaştıkça bulunduğu yerin kaç derece olduğunu gösteriyorum.
// alanı kısıtlıyorumki fare sadece grafik içerisndeyken dereceyi gösteriyor.
if(( mx < 620 && my <= 440 ) && ( mx >= 120 && my >= 20 )) 

{
text((440-my)/4 +" C",mx+5,my-5);
}
delay(10);
}

// farenin hareketlerini takip ediyorum.
void mouseMoved() {
  mx=mouseX;
  my=mouseY;
}

// seri portda gelen değeri değişken içerisine atıyorum
void serialEvent (Serial port){
temperature=float(port.readStringUntil('\n'));
}


Devre Şeması :


Programın Ekran görüntüleri :






Devrenin kurulmuş halinin görüntüleri :




Projenin çalıştırılmış halinin videosu aşağıdadır. Herkese iyi seyirler.


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

5.03.2012

Arduino Project 10 LCD

Herkese merhaba



Bu çalışmada karakter tip LCD ekran kullanacağım ve bu tip LCD lerin nasıl kontrol edildiğini göstereceğim. Projede bilgisayarımın seri portuna bağladığım Arduino'ma veri göndereceğim ve Arduino'da bu verileri LCD ekranda gerekli yerlere yazacak. Ayrıca bir aradan potansiyometre yardımı ile LCD nin kontrastını ayarlayacağım.

Öncelikle gerekliler listesine bir göz atalım ;

Parça Listesi :

- 1x Potansiyometre
- 1x LCD (Karakter Tip)
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduino boradlarından biri
- Arduino Yazılımı

Malzemeler ve gerekli kurulumlar tamam ise artık kodlamaya başlayabiliriz.

Kod :



Likit kristal LCD kullanmak için Arduino için hali hazırda bulunan bir kütüphaneyi kullandım. Bu kütüphanenin adı LiquidCrystal.h. Projenin başında bu kütüphaneyi ekliyoruz. LiquidCrystal.h sayesinde fonksiyonlar yarımı ile kolayca LCD ye hükmedebiliyoruz.

/*
  LCD RS pin = pin 50       // LCD nin hangi ucunu nereye bağlayacağım
  LCD Enable pin = pin 52 // Burada hangi pin numaralarını yazdıysam aynı numaralara bağlantı yapmalıyım
  LCD D4 pin = pin 48       // Bu kısım bilgilendirme için yazıldı kodun bir parçası değil !

  LCD D5 pin = pin 46       // D4,D5,D6,D7 ekrana veri göndereceğim pin numaraları

  LCD D6 pin = pin 44   
  LCD D7 pin = pin 42
  LCD R/W pin = GND
*/
#include // gerekli kütüphaneyi ekliyorum
LiquidCrystal lcd(50, 52, 48, 46, 44, 42);
// yaptığım bağlantıları bildiriyoum
void setup() {
  Serial.begin(9600);
// Seri port bağlatı ayarı
  lcd.begin(16, 2);
// Kullandığım LCD türünü belirtiyorum.
  lcd.print("Melih ERDOGAN");
// LCD ye Melih ERDOGAN yazıyorum
  lcd.setCursor(0,1);
// LCD de imleci ikinci satır birinci sütuna getiriyorum. (Sütun, Satır)
  lcd.print("NOT : ");
// LCD ikinci satırına NOT yazıyorum.
}
void loop() {
 if (Serial.available() > 0 )
// Seri portdan  veri gelirse

{
 lcd.write(Serial.read());
// veriyi oku ve LCD ye yaz.
 }
}



Gerekli devre şeması : 



Buradaki bağlantılar zaten kod kısımında vardı. Sadece potansiyometre ve LCD Led bağlantılarından bahsetmedik. Kısaca onlardan da bahsetmek gerekirse. Potansiyometreyi kontrastı ayarlamak için yani yazıların koyuluğunu-silikliğini ayalarmak için kullanıyoruz. Potansiyometreyi aşağıdaki devre şamasında gördünüz şekilde bağlayabilirsiniz. Bunu dışında LDC led + ucuna +5V ve LCD led - ucunuda toprağa bağlıyoruz. LCD led nedir derseniz arka aydınlatma oluyor. Mavi, yeşil, sarı artık LCD niz ne türde bir LCD ise renk değişken olabilir.




Devrenin kurulmuş halinin fotoğrafları aşağıdadır.






Aşağıdaki ekran görüntüsünde seri porttan veri gönderiyorum.

Aşağıdaki fotoğrafta Arduino seri porttan gelen veriyi yazdığımız kod doğrultusunda ekrana yazıyor.



Yaptığım bir çalışmayı daha dilim döndüğünce anlatmaya çalıştım. Aşağıda bu projenin çalıştrılmış halinin videosu bulunmaktadır. Bir sonraki projede görüşmek üzere herkese iyi seyirler :)






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

Arduino Project 9 Arduball

Herkese merhaba bu projede daha önceden de projelerimde kullanmış olduğum potansiyometre ile processing programlama dilinde yazdığım oyunu kontrol etmeye çalışacağım. Oyunda yukarıdan aşağıya doğru düşen topları alt kısımda bulunan yüzeyden sektirilerek toplarım yere dokunmaları engelemeye çalışılıyor. Bu çalışma daha çok Arduino ve Processing programlam dili ile ilgili yaptığım örneği peskiştirmek içindi. Bu nedenle herhangi bir kod ya da açıklama koymayacağım.
Diğer Arduino projelerime de bakmak isterseniz technologylaboratory.blogspot.com/search/label/Arduino
Parça Listesi

- 1K Ohm Potansiyometre
- 1x Breadboard
- Arduino Mega 2560 ya da diğer Arduinoboradlarından biri
- Arduino Yazılımı
- Processing Yazılımı

Devre Şeması :


Projenin çalışmış halinin videosu aşağıdadır. İsterseniz sizde bu ve buna benzer farklı kontrol özelliklerine sahip oyunlar hazırlaya bilirsiniz. Bu arada bende denerken fark ettim top sayısı biraz fazla olmuş ve başlangıçta toplar çok hızlı geliyorlar :D İyi eğlenceler.


;

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



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