30 Aralık 2017 Cumartesi

Arduino ile Mesafe Sensöründen Veri Okumak

Arduino, çeşitli sensörlerle rahatlıkla iletişim kurabilen, programlanabilir bir G/Ç kartıdır. Bu projenin amacı Linux işletim sisteminde bir character device oluşturarak, Arduino ile bağlantısı yapılmış bir sensör üzerindeki verileri yazdırmaktır.







Arduino Kodu


Arduino tarafında “NewPing” adlı kütüphane kullanılarak sensörden gelen elektrik akımları santimetre cinsine çevrildikten sonra seri bağlantı aracılığı ile bilgisayara transfer edilir.





Bilgisayar Kodu

Bilgisayarda ise character device, Arduinodan gelen veriyi okuyup kullanıcıya veriyor.






Kurma – Çalıştırma


make komutu ile derleyip insmod ile kurulduktan sonra dmesg e yazılmış olan major numarasıyla /dev/ dizininde dosya oluşturulur.






Bundan sonra cat /dev/uzak komutu ile sensörün verisi okunabilir.




Grup Arkadaşlarım

Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci

8 Aralık 2017 Cuma

Klavye LED'lerini Açıp Kapatan Character Device Uygulaması

Bu uygulamada bir character device oluşturarak, yazdığımız komutlar sayesinde klavyedeki LED’leri kapatıp açarak LED’in durumunun loga kaydedilmesini sağlayacağız.

      1.   Uygulama için öncelikle bir metin düzenleyici açarak aşağıdaki kodları yazıp klavyeled.c ismiyle kaydediyoruz.

#include <linux/module.h>
#include <linux/kernel.h>
#include <linux/init.h>
#include <linux/tty.h>
#include <linux/kd.h>
#include <linux/vt.h>
#include <linux/console_struct.h>

#define NAME "klavyeled"
#define BUFFERSIZE 128
#define RESTORE 0xFF


struct tty_driver *my_driver;
unsigned int state = 0x00;

extern int fg_console;

static void isiklar(char key);

char buffer[BUFFERSIZE];

static ssize_t dev_yaz(struct file *filp, const char *buff, size_t len, loff_t * off){
      if(len > BUFFERSIZE){return -EFAULT;}
      copy_from_user(buffer, buff, len);

      isiklar(buffer[0]);
      return BUFFERSIZE;
     
}

static ssize_t dev_oku(struct file *fp, char *buf, size_t len, loff_t * off){
      static int finished=0; if(finished) {finished=0;return 0;} finished=1;
     
      copy_to_user(buf, buffer, sizeof(buffer));
      return sizeof(buffer);
}


static int major;
static struct file_operations fops = {
      .read = dev_oku,
      .write = dev_yaz,
      //.open = dev_ac,
      //.release = dev_kapat
};


static void isiklar(char key){
      memset(buffer, '\0', BUFFERSIZE);

      switch(key){
            case 'C':
                  state = state & 0xFB;
                  state = state | 0x04;
                  strcpy(buffer, "Caps Lock isigi acildi.\n");
                  break;
            case 'c':
                  state = state & 0xFB;
                  strcpy(buffer, "Caps Lock isigi kapatildl.\n");
                  break;
            case 'N':
                  state = state & 0xFD;
                  state = state | 0x02;
                  strcpy(buffer, "Num Lock isigi acildi.\n");
                  break;
            case 'n':
                  state = state & 0xFD;
                  strcpy(buffer, "Num Lock isigi kapatildi.\n");
                  break;
            case 'S':
                  state = state & 0xFE;
                  state = state | 0x01;
                  strcpy(buffer, "Scroll Lock isigi acildi.\n");
                  break;
            case 's':
                  state = state & 0xFE;
                  strcpy(buffer, "Scroll Lock isigi kapatildi.\n");
                  break;
            default:
                  strcpy(buffer, "Caps lock => 'C' acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock => 'S' acik 's' kapali\n");
                  break;
      }

      ((my_driver->ops)->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, state);
}



static int __init mdl_init(void){
      major = register_chrdev(0, NAME, &fops);

      if(major < 0){
            printk(KERN_ALERT "Character device olusturulamadı! Hata kodu: %d\n", major);
            return major;
      }

      my_driver = vc_cons[fg_console].d->port.tty->driver;

      printk(KERN_INFO "Character device olusturuldu. Major = %d\n", major);
      printk(KERN_ALERT "mknod /dev/%s c %d 0\n", NAME, major);

      strcpy(buffer, "Caps lock => 'C' acik 'c' kapali\nNum lock => 'N' acik 'n' kapali\nScroll lock => 'S' acik 's' kapali\n");

      return 0;
}

void mdl_exit(void){
      printk(KERN_ALERT "Removing module\n");
      ((my_driver->ops)->ioctl) (vc_cons[fg_console].d->port.tty, KDSETLED, RESTORE);
}

module_init(mdl_init);
module_exit(mdl_exit);




/*


0000 0CNS
---------------------
caps on
1111 1011
& 0xFB      //off
| 0x04
---------------------
num on
1111 1101
% 0xFD      //off
| 0x02
---------------------
scroll on
1111 1110
& 0xFE      //off
| 0x01

*/

      2.   Kodların derlenmesini sağlayacak olan Makefile adında yeni bir dosya oluşturup aşağıdaki kodları yazarak kaydediyoruz.


Oluşturduğumuz dosyaların aynı klasörde olmasına dikkat edelim.

      3.    Komut terminalini açarak $make komutu ile kodların derlenmesini sağlıyoruz.

      4.    $sudo insmod klavyeled.ko komutu ile modülün eklenmesini sağlıyoruz.


      5.    $dmesg komutu ile kernel tarafında oluşturulan iletileri kontrol ediyoruz. Eğer character device başarılı bir şekilde oluşturulmuşsa en altta yazan komutu başına sudo ekleyerek yazıyoruz. $sudo mknod /dev/klavyeled c 245 0  Böylece /dev (Linux hiyerarşisinde donanım dosyalarının bulunduğu klasör) klasörünün içine klavyeled adında bir device oluşturulmuş olur.

      6.   $cat /dev/klavyeled komutu ile oluşturulan device’ın nasıl kullanılacağını görüntüleyebiliriz.

    
      7.    $sudo su komutu ile root olarak giriş yapıyoruz. $cd /dev komutu ile device’ların bulunduğu klasöre gidiyoruz.

      8.       Bundan sonra LED’leri yakıp söndürecek olan komutları yazabiliriz. 
      Örnek : $echo N>klavyeled komutu NumLock LED’ini açar. $cat klavyeled komutu ile yapılan işlemi kontrol edebiliriz.


   
       9.    Modülü kaldırmak için rmmod klavyeled komutunu, device dosyasını kaldırmak için ise 
       rm /dev/klavyeled komutunu kullanabiliriz.


Grup Arkadaşlarım
Merve Akıncı (Grup Lideri)
Selin Aksoy
Hüsnü Taş
Ahmet Furkan Arvas
Semra Alomeroviç
Merve Deveci

VHDL Dijital Saat Tasarımı

MOD-60 DEVRESİ Saatin saniye ve dakikası için mod-60 sayıcı devresi kullanıldı. Devre için 6 adet JK tipi Flip-Flop kullanıldı. Bu sayaca ...