25 Aralık 2015 Cuma

TERMINALDEN LCD DISPLAY’E YAZIM

TERMINALDEN LCD DISPLAY’E YAZIM
Amaç
Linux terminalde çalışdırtığımız program ile lcd display de yazılan yazıyı bastırmak.
Kullanılan Malzemeler
·         1x Arduino Uno
  •          1x LCD Display(16x2) Hitachi HD44780 driver uyumlu
  •          1x Breadboard
  •          1x Potansiyometre
  •          1x 220ohm resistor
  •          Bağlantı kabloları


LCD özellikleri
register select (RS) pin’i  LCD ‘nin belleğini kontrol ederek datayı nereye yazacağını belirliyor. Data register veya instruction register arasındaki seçimi yapıyor.
Read/Write (R/W) pin’i ise okuma veya yazma modu seçimini sağlıyor.
Enable pini registera yazmayı aktif hale getiriyor.
8 data pins (D0 -D7). Bu bit lerin durumu(yüksek veya alçak) o anki yazım veya okuma için değerleri tutuyor.
display constrast pin (Vo), power supply pins (+5V and Gnd) ve LED Backlight (Bklt+ and BKlt-) pinleri ile sırasıyla,LCD’ye güç verebilir. Contrast’ı ayarlaya bilir ve Led’in arka ışığını açıp kapatabiliriz.

Devre

LCD’yi arduino’ya bağlamak için gereken pinleri birbirine bağlamamız gerekli.
·      LCD RS pin -> digital pin 12
·      LCD Enable pin -> digital pin 11
·      LCD D4 pin -> digital pin 5
·      LCD D5 pin -> digital pin 4
·      LCD D6 pin -> digital pin 3
·      LCD D7 pin -> digital pin 2
Ek olarak 10k potansiyometre yi +5V ve 0V bağlayıp outputunu LCD’nin V0 pin’ine bağlıyoruz.  220 ohm resistor ise arka ışığı ayarlamada kullanıldı. LCD nin 15. Pini
Şematik

KOD
Öncelikle character device’ a yazı yazacak bir program kodu yazıyoruz.

Arduino’nun Serial port’u /ttyACM0
Bu program gerekli parametreyi alıp arduino’ya göndererek işlemini tamamlamış olacak. LCD’ye yazım kısmı ise arduino programında olacaktır.

Arduino’ya yazacağımız kod ise öncelikle LiquidCrystal kütüphanesini kullanacağımızı belirtiyoruz.
#include <LiquidCrystal.h”>


lcd.begin ile lcd’yi hazırlıyoruz. Ve lcd.print ile yazacağımız yazıyı yazdırmış oluyoruz.

Loop kısmı ise sürekli dönen bir fonksiyon olduğu için herhangi bir Serial input var mı yok mu kontrol ediyoruz. Eğer varsa onu LCD’de yazdırıyoruz.

Kullanım ve Test

Devreyi oluşturduktan sonra bilgisayara bağladığımızda herşeyin çalıştığını görüyoruz.


Arduino programımızı upload ettikten sonra

Yazdığımız kodu derliyoruz ve


Defendersoflinux ekranda çıkıyor.





Ek olarak
Bir önceki ödevde yaptığımız character device uygulaması ile yazıyı tersten yazdırıyorduk. Eğer istersek ilk önce o character device’a yazıp ve tekrar o device’dan okuduktan sonra arduino device’ına gönderdiğimizde yazıyı tersten yazdırmış olurduk.


Defenders of Linux

Test Videosu





Kaynaklar:
https://www.arduino.cc/en/Tutorial/HelloWorld

13 Aralık 2015 Pazar

Character Device uygulamasi

Karakter aygıtları(character device) karakter akımlarını kabul eder yada dağıtırlar.Adreslenemezler ve bu aygıtlarda arama işlemi gerçekleştirilemez.Yazıcılar, ağ aygıtları, mouse bu aygıtlara örnek verilebilir.
İşletim sisteminin dosya sistemi bu aygıtların hepsi ile soyut aygıtlar olarak ilgilenir. Aygıtların arka planında aygıta özel olan olaylar ile ilgilenmezler.


myDevice.c koduna ulasmak icin http://pastebin.com/tP9uxhf6

 
 


Kodumuz içinde yazılan aygıtı kernel’a yüklemek için init_module ve cleanup_module fonksiyonları bulunmakta. Bu iki fonksiyon konsoldan verilecek komutlar vasıtası ile çalışacak.
struct file_operations fops ifadesi ile tanımladığımız yapının içine aygitimizin kullancağı fonksiyonları tanıttık. Örneğin aygıtın okunması işlemi sırasında dev_read fonksiyonu çalışacak.
dev_open ve aygit_close fonksiyonları aygıt ile işlem yapıldığında çalışacaklar. Bizim asıl işimizi üstlenecek fonksiyonlarımız ise dev_write ve dev_read fonksiyonları.
Konsoldan aygıt dosyasına yazılmak üzere bir string verildiğinde bu string aygit_yaz fonksiyonun buff parametresine düşüyor. String’in uzunluğuda len parametresi içinde tutuluyor. Biz de bu parametredeki değeri 100 boyutlu olarak tanımladığımız mesaj dizisine tersten atıyoruz.
aygit_oku fonksiyonu da çekirdek ile kullanıcı katmanı arası iletişimi sağlayan metotlardan biri olan put_user metodu ile aygıt dosyası içindeki veriyi konsola basıyor.


Burada mknod ozel dosyalar yaratmak icin kullaniliyor. c ise character device olusturacagimiz icin kullaniyoruz. Major ve minor numaralari ise ayirt edici olarak kullaniliyor.
chmod ile dosya permissionlarini belirliyoruz.
Burada yazdigimiz myDevice.c modulunu derliyoruz. Kernel based oldugu icin bu sekil derleyebiliyoruz. 

derledikten sonra myDevice.ko ve diger lib dosyalari olusuyor.
insmod ile olusturdugumuz modulu  load ediyoruz.


Modul sorunsuz sekilde yuklendikten sonra echo ile yazdigimiz character device'i test ediyoruz.
roottan  hemen yaninda ters yazilmis yazi geliyor.

test.c koduna ulasmak icin : http://pastebin.com/Ce5GKWtB
sirada user based character device'imiza yazi yazip okuyan bir c programi yazmak.
yazdigimiz programi derliyoruz.
-r komutuyla calistirdigimizda yazimizi reverse olarak yaziyor. 
normal olarak calistirdigimizda bir degisiklik olmadan outputu veriyor.


Kaynaklar: http://www.tldp.org/LDP/lkmpg/2.4/html/c577.htm
https://appusajeev.wordpress.com/2011/06/18/writing-a-linux-character-device-driver/





15 Kasım 2015 Pazar

İki farklı modul uygulaması arasında iletişim yapabilen metodlar

helloworld.c dosyasini yaziyoruz.


helloworld.h dosyasini  export edecegimiz metodlari yaziyoruz.
helloworld2.c modulumuzu yaziyoruz. helloworld.h i include ederek o modulu kullanacagimizi soyluyoruz. ve foo fonksiyonunu kullanarak 5 datasini diger module gonderiyoruz. Istersek o fonksiyonda gerekli islemler yaparak sonucu dondurebiliriz. helloworld modulunden ayni zamanda getModuleId fonksiyonunu cagirarak helloworld modulunden bir data cekiyoruz.



      Makefile dosyasi modulleri modulleri derlerken kullanilan bir dosyadir. bu dosyaya hangi modulleri derleyecegimizi yazarak.

make komutu ile modullerimizi derliyoruz.

Sonuc olarak bize helloworld.mod.o  , helloworld.ko,  helloworld2.mod.o,  helloworld2.ko dosyalarini olusturuyor.


sudo insmod helloworld.ko komutu ile helloworld modulumuzu yukluyoruz.
Ayni sekilde helloworld2 icinde yapiyoruz.
ardindan lsmod komutu ile modullerimizi listeliyoruz.

dmesg | tail komutu ile log u konsola printliyoruz. ve orada modullerimizin loglari bulunuyor ve calisiyor.




9 Ekim 2015 Cuma

Kernel Güncelleme





Kernel.org’dan son stable versiyonu indiriyoruz.
Bu adımların hepsini yapıyoruz.
sudo passwd root
Root olarak login oluyoruz.
su
Update i yapıyoruz
sudo apt-get update


Ubuntuda, /bin/sh  symlink  /bin/dash default olarak geliyor.  kerneli derlerken problem yapıyor gibi gözüküyor. O yüzden. /bin/sh yerine /bin/bash symlink yapalım.
rm -f /bin/sh
ln -s /bin/bash /bin/sh
Uname –r komutuyla kernel versiyonumuza bakıyoruz.

Gerekli paketleri yüklüyoruz.
apt-get install kernel-package libncurses5-dev fakeroot wget bzip2

Sonra linux kernelini indirip çıkarttığımız klasöre giderek şu komutları yazıyoruz.
make-kpkg clean
fakeroot make-kpkg --initrd --append-to-version=-custom kernel_image kernel_headers
append-to-version yerine istediğimiz ayrıt edici bişey yazabiliriz.
Şimdi uzun bir işlem bizi bekliyor.

 
Başarılı bir derlemeden sonra Downlaods klasörüne girerek.
cd Downloads
ls 
dosyaları listeliyoruz.
benim sistemimde iki tane .deb uzantılı dosya görünüyor. Bitanesi ilerdeki kernelleri build edeceğimde gerekli olan dosyaları bulunduruyor.
Bu iki dosyayı şu şekil yükleyebiliriz.

Son olarak shutdown -r now komutuyla restart atıyoruz ve sonucu kontrol ediyoruz.