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.
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.
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…
Merhabalar değerli bilgileriniz için teşekkür ediyorum. Yalnız size ulaşabilme imkanım varsa ykslercann instagram adresimden ya da yukselercan@hotmail.com.tr mail adresimden bana ulaşabilirseniz çok sevinirim.