Omega 2+ Gpio ve Node JS Kullanımı

Merhabalar, bu konuda günümüz popüler kartlarından olan Omega 2 kartının bir incelemesini yapacağız ve Node Js ile basit bir web üzerinden led yakma uygulaması gerçekleştireceğiz. Konunun içeriğine girmeden önce Omega 2′ nin Türkiye distribütörü olan “Robokolik” firmasına ilk satın aldığım kartta çıkan sorun üzerine hiç tereddüt etmeden kartın değişimini kabul ettikleri için teşekkür ederim. Sıra geldi ürünün genel özelliklerine bir bakmaya.

(Resim robokolik.com sitesinden alınmıştır)

Kullanacağımız kart üzerinde birçok GPIO ve haberleşme modülleri mevcut. Bu yüzden basit bir mikrodenetleyici yerine de kullanılabilmesi açısından güzel bir özellik. Üzerinde barındırdığı 580 Mhz CPU birimi nerdeyse Raspberry Pi 1 A modelinede hıza denk. Kullanırken herhangi bir takılma vb bir sorunu şu ana kadar çok ciddi derecede yaşamadım. Ancak barındırdığı hafızanın küçük olması en büyük dezavantajlarından bir tanesi. Node JS gibi bir framework yükleyip çalıştırmak için kesinlikle yeterli bir hafıza değil. Bu yüzden Omega 2+ almışsanız SD kart ile, Omega 2 almışssanız USB bellek ile hafızasını genişletmenizi kesinlikle tavsiye ederim. Bunların yanı sıra diğer bir dezavantajı ise pinler arası mesafenin 2.0 mm olması. Sıradan bir board üzerine takıp çalıştırma gibi bir ihtimaliniz eklentisel modül takmadan malesef ki imkansız. Pine takılan direk kablolu bağlantıda ise kablonun sallanamsı gibi sebeplerde oluşan temazsızlıkta anında reset atabiliyor yada kapanabiliyor. Muhtemeln kartın boyutu küçültülmek için yapılmış bir seçim. Çünkü pinler arası boşluk 2.0 mm iken bile Arduino Nano’ dan baya büyük. Bu yüzden çalıştırmak için ya eklentisel modül satın almalı yada kendiniz yapmalısınız. Ben kendim yaptım ve çizimlerini bu konunun ilerleyen kısımlarında paylaşacağım. İhtiyaç duyduğu akımın düşük olması da sevdiğim özelliklerden bir tanesi. Başlangıçta 5-6 sn akdar 300 mA yakın akım çekmekte ancak stabil konuma geçince 100mA civarı bir akım ihtiyacı duymakta ki linux işletim sistemi çalıştıran bir kart oldukça düşük bir değer bu. (Raspberry Pi 3 için 200 – 300mA arası). Üzerinde wifi bulunması ve Access Point olarak çalışabilmesi, cihazın herhangi bir bilgisayar bağlantısı yada internet bağlantısını ihtiyacını (internet kullanılmayacaksa) oldukça düşürüyor. Cihaza güç verdikten sonra bazen Wi-Fi bağlanmama gibi sorunlar yaşanabiliyor. Bu durumda hemen Omega’ ya bağlanıp yeniden Wi-Fi ayarı yapabiliyorsunuz.

Peki ya kartı kullanırken en çok neye dikkat etmelisiniz. Elbette ki pinlerdeki gerilim seviyesine. Omega içerisinde ARM tabanlı bir işlemci olduğu için verebilecek olduğu çıkış gerilimi 3.3V’ dur ve akımı oldukça düşüktür. Bu yüzden hem pin girişlerinde hem de pin çıkışlarında gerilime ve akıma dikkat edilmelidir.

Sıra geldi led yakma işlemine. Benim düşüncem ile herhangi bir denetleyicide yada linux tabanlı kartta bir ledi rahatlıkla yakıp söndürebiliyorsak o platforma hakim olmaya başlamışız demektir. Öncelikle terminalden herhangi bir yazılım yada kütüphane kullanmadan doğrudan terminal komutları ile led yakma ve söndürme yapalım.

Terminalden led yakma işlemi için öncelikle ledi bağladığımız pini export edip kullanılabilir hale getirmemiz lazım. Ledim 18 numaralı pinde olsun.

echo 18 > /sys/class/gpio/export

Pini kullanılabilir hale getirdik. Bu komutu iki kere ardarda kullanırsanız “resource is busy” şeklinde bir hata alırsınız. Bu pin default’ da çıkış olarak yönlendirilmiştir. Ancak emin olmak isterseniz şu komutu yazarak led’ i çıkış olarak yönlendirebilir siniz.

echo "out" > /sys/class/gpio/gpio18/direction

Pini çıkış olarak yönlendirdikten sonra sıra geldi ledi yakmaya. Bunun için de şu komutu yazmamız yeterlidir.

echo 1 > /sys/class/gpio/gpio18/value

Peki ya bu komutlar ne yapıyorlarda kart üzerindeki pinlerin işlevlerini değiştirebiliyor. Son derece basit. Omega 2′ de olduğu gibi bütün linux tabanlı cihazlarda giriş ve çıkış işlemleri metin belgeleri üzerinden gerçekleşir. Öğrenğin siz herhangi bir pini aktif ettikten sonra gidip  bunu direction dosyasına bakarsınız default’ da out yazdığını gözlemleyebilirsiniz. “echo” komutu bu metin belgelerinin içeriğini değiştirmemizi sağlayan komuttur. Buradan anlaşılacağı üzere basit giriş çıkış işlemlerini herhangi bir kütüphaneye ihtiyaç duymadan herhangi bir programlama dili yardımı ile basit dosya yazma mantığı ile yapabiliriz. Ancak kullanacağınız dilde daha önceden oluşturulmuş bir gpio kütüphanesi varsa elbet işlerinizi oldukça hızlandıracaktır. Biz yapacağımız uygulamada Node JS kullanacağımız için öncelikle onun kurulumundan bahsedelim.

Başlamadan önce daha öncede bahsettiğim gibi Omega 2 ve Omega 2+ kartının dahili hafızası Node JS kurulumu için yeterli değildir. Node Js 8 MB, npm ise 9MB yer kaplamaktadır. Yüklenecek ek pakatler ile birlikte hafıza kesinlikle dolacaktır. Bu yüzden harici hafıza kullanmanız gerekmektedir. Unutmayın bu adımlardan sonra SD kart Omega 2 kartı için hard disk görevi görecektir ve ayırırsanız kartınız çalışmayacaktır (Fabrika ayarlarına geri çevirmediğiniz müddetçe). Omega 2+ için SD kart ile hafıza genişletme adımları şu şekildedir:

Öncelikle SD Kartınızı EXT4 dosya sisteminde sıfırdan biçimlendirmelisiniz. Daha sonra bu bağlantıda “Mounting the External Storage Device” başlıklı kısımdan itibaren anlatılan adımları yapmalısınız. Yanlız adımları yaparken oldukça dikkatli olmalısınız. Omega 2′ ye geri döndürülemez derecede zarar verebilir yada firmware yenilemesine ihtiyaç duyabilirsiniz. 

SD Kart ayarlamalarını yaptıktan sonra sıra geldi Node JS yükleme kısmına. Bunun için aşağıdaki adımları yapmalısınız. 

opkg update

opkg install nodejs

opkg install npm

Bu adımlarda paketleri güncelleyip Node Js ve npm kurulumu yaptık. Yukarıda da belirttiğimiz gibi Omega 2′ nin pinlerine erişebilmek için aslında herhangi bir kütüphane kullanmamıza gerek yoktur. Ancak vakitten tasarruf etmek ve daha esnek kontrole sahip olabilmek için Node JS ile kullanım için bir kütüphane kullanmamız gerekli. Bu kütüphanenin github sayfasına bağlantıdan ulaşabilirsiniz. Kütüphaneyi doğrudan omega’ a yüklemek için aşağıdaki komutu omega’ nun komut satırından çalıştırmalısınız.

wget -O - https://raw.githubusercontent.com/sidwarkd/omega_js/master/bin/install.sh | sh

Bu komut ile indireceğimiz klasör bizim çalışma dosyamız olacaktır. İçerisinde bulunan “node_modules” isimli klasör Nojde JS kütüpahnelerini bulunduran klasördür ve içerisinde ihtiacımız olan gpio kütüphanesi inmiş vaziyette bulunmaktadır. Şimdi sıra geldi ihityacımız olan diğer kütüpaneleri yüklemeye. Aşağıdaki komutları kullanarak yapacağımız web arayüzünde kullanacağımız bazı kütüphaneleri projeye dahil edeceğiz.

npm install express
npm install socket.io

Unutmayın bu komutları “omega_gpio” klasörünün içerisinde çalıştırmalıyız. Aksi taktirde gpio fonksiyonları çalışmayacaktır. Şimdi sıra geldi yazılım kısmına. Yazılım kısmı iki aşamalıdır. Bu kısımda server kısmını anlayıp client kısmının sadece kodlarını vereceğim. Çünkü client(kullanıcı) kısmı web sitesi tasarımı bilgisi gerektiren kısımdır ve oldukça kısadır.

Omega 2′ nin gpio ları resimdeki gibidir.

3e7f0a271802c87cd767069a4ddcde65

Biz yapacağımız uygulamada sadece digital giriş ve çıkış özelliği olan 18 ve 19 numaralı pinleri kullanacağız. Bunları seçmemdeki amaç kendi tasarladığım devrede kullandığım dahili ledlerin bu pinlere bağlamış olmamdır. Siz elbet değiştirebilirsiniz. Kullanacağınız pin ile led arasına 300 – 470 ohm arası direnç bağlamayı unutmayınız. Ancak 13 ve 12 numaralı pinleri herhangi bir giriş çıkış uygulaması için kullanmayın. Çünkü bu pinler Omega 2′ nin debug serial portu olarak görev yapmaktadırlar. Yani siz bu pinlere bir ftdi konverter yardımı ile bağlanırsanız Omega 2′ nin komut arayüzüne erişebilirsiniz.

Öncelikle ihtiyaç duyrduğumuz kütüphaneleri çağıralım.

var express = require('express');		//express framework unu çağırdık
var app = express();					
var http = require('http').Server(app);
var socket = require('socket.io')(http);
var path = require('path');
var port = 3000;                    //socket.io ve sunucu port

var gpio = require('omega_gpio');       //gpio kütüphanesi
var LED = gpio.LED;                     //kütüphaneden led sınıfını çağırdık

Daha sonra led lerin bulunduğu pinlere göre pinleri tutan değişkenleri tanımlayalım.

var myLED1 = new LED(19, {on_when:"low"});      //19 numaralı pinde led tanımladık
var myLED2 = new LED(18, {on_when:"low"});      //18 numaralı pinde led tanımladık

Bu kısımda “on_when” ledin başlangıçtaki durum atamasını yapmak içindir. Bu kısma “high” yazarsanız kod başlangıcında ledler yanık durumda olacaktır.

Şimdi sıra geldi web arayüzünde butonlara basıldığında ledlerin durumunu değiştirmeye. Bu kısımda devreye “socket.io” kütüphanesi giriyor. “socket.io”, server ile client arasındaki haberleşmeyi son derece kolaylaştıran bir kütüphanedir. Daha önceki uygulamalarında da görebileceğiniz üzere sıklıkla kullanırım ve size de tavsiye ederim.

socket.io’ da ‘connection’ eventi server’ a birisi bağlandığında devreye girer. Birisi bağlandığı anda ledlerin ilk durumunu gönderip “led1” ve “led2” isteklerini bekledik. Bu isteklerin gelmesi durumunda da ledlerin durumunu değiştirip yeni led durumlarını web sitesine client’ a geri gönderdik. Böylece yaptığımız web arayüzünde kullancının web sitesinde de değişimi gözlemlemesini sağladık.

socket.on('connection', function(conn){

    //ledlerin ilk durumlarını bağlantı açılınca gönder
    socket.emit('led1res', ledStat1);           
    socket.emit('led2res', ledStat2);

    //led 1 butonuna basılmışsa
    conn.on("led1", function(p_data){
        myLED1.toggle();
        ledStat1 = !ledStat1;
        socket.emit('led1res', ledStat1);
        //console.log("Led1: " + myLED1.isLit());
    });

    //led 2 butonuna basılmışsa
    conn.on("led2", function(p_data){
        myLED2.toggle();
        ledStat2 = !ledStat2;
        socket.emit('led2res', ledStat2);
        //console.log("Led2: " + myLED2.isLit());
    });
});

Bu kısımdan sonra geldi sıra en önemli kısma. Terminal arayüzünde bir işlemi durdurmak için “ctrl + c” tuşlarını kullanırız. Bu da işlemi anında sonlandırarak çıkış demektedir. Yani aktif konumda bıraktığımız led’ leri kapanmaması demektir ki bu da bir sonraki uygulamayı çalıştırmamızda led zaten kullanımda şeklinde bir hata ile karşılacağımızı gösterir. Bu yüzden yazılıma şu şekilde bir ek yapmamız gerekmektedir.

//ctrl c 'ye basılmışsa ledleri deaktif et
process.on('SIGINT', function(){
    console.log("Cleaning up...");
      myLED1.destroy();      //led1 i deaktif et
      myLED2.destroy();      //led2 yi deaktif et
      process.exit();
});

Bu kısım normal şartlar altında düzgünce çalışmaktadır. Ancak server kodunun herhangi bir hatadan dolayı çökmesi durumunda uygulamayı tekrar başlattığınızda şu şekilde bir hata alacaksınız.

Error: Pin 18 is already in use

Bu durumda üst kısımda da gösterdiğimiz ledi deaktif etmek için şu komutu kullanmamız gerekmektedir.

echo [pin numarası] > /sys/class/gpio/gpiochip0/subsystem/unexport

Üstteki hata için bu komut şu şekildedir.

echo 18 > /sys/class/gpio/gpiochip0/subsystem/unexport

Artık ledi deaktif ettiğimiz için server’ i tekrardan çalıştırabiliriz. Uygulamayı çalıştırdığınız tarayıcı üzerinden şu adrese gitmelisiniz.

http://[omega ip]:3000

Yani omega’ nın modeminiz üzerinden aldığı ip 192.168.12.11 ise

http://192.168.12.11:3000

Karşınıza aşağıdaki gibi bir arayüz çıkacaktır. Yazılımın tamamına buradan ulaşabilirsiniz. Ayrıca konu içerisinde bahsettiğim Onion için tasarladığım dock çizimine bağlantıdan ulaşabilirsiniz. (Tasarım Eagle PCB çizim programı ile yapılmıştır.)

Umarım yardımcı olabilmişimdir. İyi çalışmalar dilerim…

asddd

One Comment

Add a Comment

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir