Elektrik Elektronik Projeleri

Elektrik Elektronik Projeleri

Post Top Ad

Post Top Ad

19 Mart 2017 Pazar

Raspberry Pi - GPIO İşlemleri

3/19/2017 6
Raspberry Pi’ı yalnızca bir mini bilgisayar olarak değil, elektronik devrelerde kontrol kartı olarak da kullanabilmekteyiz. Bunu Raspberry Pi üzerinde bulunan GPIO pinlerini programlayarak sağlamaktayız.
Raspberry Pi 2 Model B kartı üzerinde 40 tane GPIO pini bulunmaktadır. Bunlardan 2 tanesi 5V, 2 tanesi 3.3V, 8 tanesi GND ve 2 tanesi EEPROM için ayrılmış pinlerdir. Geriye kalan 26 pin Input/Output pinidir. Bu Input/Output pinlerinden 5 tanesi SPI haberleşmesini, 2 tanesi I2C haberleşmesini ve 2 tanesi de UART haberleşmesini desteklemektedir.

GPIO pinlerinin GPIO numaraları ve fiziksel sıralaması
Raspberry Pi üzerinde bulunan GPIO pinlerini programlamada Raspbian işletim sistemiyle birlikte gelen Python derleyicisini kullanmaktayız.

1.      GPIO Kütüphanesinin Eklenmesi

Programlamada GPIO komutlarını kullanabilmek için öncelikle GPIO kütüphanesinin eklenmesi gerekmektedir. Raspberry Pi’da GPIO kütüphanesinin ismi Rpi.GPIO olarak geçmektedir. Python’da kütüphane eklemek için import komutunu kullanmaktayız.
import RPi.GPIO

RPi.GPIO kütüphanesini programda kısaca GPIO ismiyle çağırmak için aşağıdaki kod kullanılır:
import RPi.GPIO as GPIO

2.      GPIO Pin Diziliminin Ayarlanması

Raspberyr Pi’ın GPIO pinlerini isimlendirirken iki farklı dizilimle karşılaşırız. Bunlar BCM dizilimi ve BOARD dizilimidir. BCM dizilimi pinlere verilen GPIO numaralarından oluşmaktadır. Bunlar sıralı numaralar değildir. BOARD dizilimi ise pinlerin fiziksel numaralandırılmasıdır. 1’den başlayıp 40’a kadar devam eden sıralı sayılardan oluşur. Her iki pin dizilimi de Şekil 44’te görülmektedir.
GPIO pinlerini programlarken öncelikle GPIO pin dizilimini ayarlamalıyız. Bunun için aşağıdaki kod kullanılır:
GPIO.setmode(GPIO.BCM)
veya
GPIO.setmode(GPIO.BOARD)

3.      Bir Pinin Giriş veya Çıkış Olarak Ayarlanması

Dijital giriş/çıkış işlemlerinde öncelikle pinin giriş mi çıkış mı olacağını tanımlamalıyız. Bu tanımlama işlemini GPIO kütüphanesi içerisinde yer alan setup fonksiyonu ile gerçekleştirmekteyiz.
Bir pini giriş olarak ayarlamak için aşağıdaki kod kullanılır:
GPIO.setup(pin_numarasi,GPIO.IN)
Bir pini çıkış olarak ayarlamak için aşağıdaki kod kullanılır:
GPIO.setup(pin_numarasi,GPIO.OUT)

4.      Bir Pinin Lojik-1 veya Lojik-0 Yapılması

Pinleri lojik-1 veya lojik-0 yapmak için GPIO.output() komutu kullanılmaktadır. Bu komutun kullanımı aşağıdaki gibidir:
GPIO.output(pin_numarasi,True)
veya
GPIO.output(pin_numarasi,False)

5.      Programa Gecikme Verilmesi

Raspberry Pi programlarken zaman komutlarını kullanabilmek için öncelikle time kütüphanesini eklemeliyiz. Kütüphaneyi ekledikten sonra time.sleep() fonksiyonu ile programa gecikme verebiliriz.
import time
time.sleep(saniye)

6.      PWM Sinyallerinin Oluşturulması

PWM (Pulse Width Modulation), sinyal genişlik modülasyonu olarak ifade edilmektedir. Bu yöntemle güç kontrolü yapmak mümkündür. PWM tekniği ile üretilen pulseların yalnızca genişlikleri ayarlanarak istenilen analog değer üretilir. PWM tekniğinde sinyallerin frekans ve periyotları değişmez.

Duty cycle değerlerine göre PWM sinyalleri
Şekilde görüldüğü gibi PWM tekniğinde sinyallerin Duty Cycle değerleri değiştirilerek 0V-5V ve arasındaki gerilim değerleri üretilir.
Raspberry Pi’da PWM sinyalleri aşağıdaki gibi oluşturulur:
import RPi.GPIO as GPIO            # GPIO kütüphanesi import edilir.
GPIO.setmode(GPIO.BCM)             # Pin Şeması BCM olarak ayarlanır. 
GPIO.setup(25, GPIO.OUT)           # 25 numaralı pin çıkış  olarak ayarlanır.
pwm_sinyal = GPIO.PWM(25, 100)     # PWM sinyali 100 Hertz olarak ayarlanır.
pwm_sinyal.start(50)               # PWM  %50 duty cycle ile başatılır.
Duty Cycle değeri değiştirilmek istenirse şu kod kullanılır:
pwm_sinyal.ChangeDutyCycle(70)     # duty cycle değeri %70 yapılır.
PWM sinyali durdurulmak istenirse şu kod kullanılır:
pwm_sinyal.stop()         # PWM  sinyali durur.


Kaynak: Gerçek Zamanlı Nesne Takip Eden Robot – Mehmet Akbaş

Devamı

15 Nisan 2016 Cuma

Lineer Regresyon

4/15/2016 0
Lineer regresyon, makine öğrenmesinin en eski yöntemlerinden olup, bir bağımlı değişken ile bir veya birden çok bağımsız değişken arasında ki ilişkiyi formülize etmek için kullanılan bir yöntemdir. Burada ki amacımız, minimum hataya sahip, bağımsız değişkenlerin bağımlı değişkenler üzerinde ki etkisini bulmaktır. Gerçek verilerden oluşan eğitim verisi kullanılarak, her bir değişkenin sonuç üzerindeki ağırlığı belirlenir ve daha sonra yeni gelen verilerle bir sonraki durum tahmin edilebilir. Örneğin, marketler zincirinizin olduğunu ve birçok şehirde şubelerinizin olduğunu düşünün. Yeni bir şube açacaksınız ama hangi şehirde? Karınızın o şehrin nüfusu ile bağlantılı olduğunu varsayarsak, elinizdeki eğitim verisini (şubelerinizin olduğu şehirlerin nüfusu ve kar oranlarının olduğu bir liste) regresyon metodundan geçirerek nüfusun kar üzerindeki ağırlığını bulabilirsiniz. Daha sonra şube açmak istediğiniz şehrin nüfusuna bağlı olarak o şehirde kar mı, yoksa zarar mı edeceğinizi kestirebilirsiniz.

Şimdi bu eğitim verisini Python da nasıl göstereceğimize bakalım. Bunun için Python da numpy ve matplotlib kütüphanesini kullanacağız. Eğer gerekli kütüphaneleri indirmediyseniz aşağı linklerden indirip kurabilirsiniz. Kurulum ile ilgili kütüphanelerin kendi dökümantasyonu içerisinde anlatımları mevcuttur.

Yukarıdaki kütüphaneleri kurduysanız Python ile veri kümesini aşağıdaki gibi görselleştirebilirsiniz:
1:  import numpy as np  
2:  import matplotlib.pyplot as plt  
3:  import random  
4:  def f(x): return 2*x + 4  
5:  trainX=[]  
6:  trainY=[]  
7:  for i in range(0, 50):  
8:    y = f(i)  
9:    x = random.choice([i+2, i+1, i, i-0, i-2])  
10:    trainX.append(x)  
11:    trainY.append(y)  
12:    print str(x) + " " + str(y)  
13:  fig, ax = plt.subplots()  
14:  ax.plot(trainX, trainY, "r*")  
15:  plt.show()  

Lineer regresyona iki çeşit yaklaşım vardır: Tek Değişkenli Lineer Regresyon ve Çok Değişkenli Lineer Regresyon. Biz burada tek değişkenli lineer regresyondan bahsedeceğiz. Tek değişkenli lineer regresyon aşağıdaki gibi ifade edebiliriz:


Çok değişkenli lineer bir denklemi aşağıdaki gibi ifade edebiliriz:

Burada:

              : Bağımlı değişken
             : Bağımsız değişken
          : Sabit
           : ’nin  üzerindeki ağırlığı 
           : Değişken sayısı

  Olmak şartı ile yukarıdaki denklemi kısaca:

Lineer regresyonda ki amacımız,  değerlerini hesaplamak.  Değerleri öyle bir seçilmeli ki   fonksiyonun da hesaplanan tahmin ile gerçek değer olan   arasında ki fark(hata) minimum olmalı. Daha teknik bir deyim ile  ve   rasındaki farkı gösterecek maliyet fonksiyonunu(cost function) minimum olmalıdır. Maliyet fonksiyonu, şu şekilde ifade edilebilir:


Burada:
            : ’inci satırdaki özellik listesi. Yani, 
          : ’inci satırdaki gerçek değer.
          : ’inci satırdaki tahmin edilen değer.

Yukarıdaki maliyet fonksiyonunu  kodlayacak olursak şu şekilde olacaktır:
1:  def compute_cost(X, y, theta):  
2:        m = y.size  
3:        hx = (X.dot(theta).flatten() - y)**2  
4:        J = ( 1.0 / (2*m)) * hx.sum()  
5:        return J  
Maliyet fonksiyonu ile seçtiğimiz  değerinin sonuç üzerindeki hatasını bulduk. Ancak amacımız minimum hataya sahip  değerlerini belirlemek. Bunun için Gradient Descent metodunu kullanarak fonksiyondaki minimum değeri bulabiliriz. GradientDescent, belirlenen oransal adım büyüklüğü (biz buna öğrenme oranı diyeceğiz.) ile yerel minimum ya da maksimum noktayı hızlı bir şekilde elde etmeye yarayan bir yöntemdir. Genel olarak gradient descent fonksiyonu aşağıdaki gibidir:
Gradient descent metodunu maliyet fonksiyonuna uyarladığımızda aşağıdaki fonksiyonu elde ederiz:
Gradient Descent algoritmasını python ile kodladığımızda aşağıdaki sonucu elde edeceğiz:

1:  def gradient_descent(X, y, alpha, theta, iter):  
2:        m = y.size  
3:        J_history = np.zeros(shape= (iter, 1))  
4:        for i in range(iter):  
5:              hx0 = (X.dot(theta).flatten() - y)  
6:              hx1 = (X.dot(theta).flatten() - y) * X[:, 1]  
7:              theta[0,0] = theta[0,0] - alpha * (1.0 / m) * hx0.sum()  
8:              theta[1,0] = theta[1,0] - alpha * (1.0 / m) * hx1.sum()  
9:              J_history[i, 0] = compute_cost(X, y, theta)  
10:        return theta, J_history  

  Çok küçük  belirlendiğinde   Gradient Descent algoritması yavaş çalışacaktır.


Eğer ki değerini çok büyük belirlersek, algoritma hedeflenen minimum değeri atlayabilir. Bu sebepten minimum noktaya yakınsamak yerine uzaklaşabilir.


Eğitim verisinin okunması ve başlangıç parametreleri verilerek Regresyonun çalışması aşağıda verilmiştir:
1:  data_set = np.loadtxt('x01.txt')  
2:  X = data_set[:, 0]  
3:  y = data_set[:, 1]  
4:  m = y.size  
5:  XX = np.ones(shape=(m,2))  
6:  XX[:, 1] = X  
7:  alpha = 0.01  
8:  theta = np.zeros(shape = (2,1))  
9:  iter = 2000  
10:  theta, J = gradient_descent(XX, y, alpha, theta, iter)  
11:  result = XX.dot(theta).flatten()  
12:  py.scatter(X, y, marker= 'x', c='r')  
13:  py.plot(X, result)  
14:  py.show()  

Kodu çalıştırdığımızda minimum hataya sahip denklemimiz aşağıda ki gibi olacak:





Kodların tamamını https://github.com/sahinmustafa/makinaogrenmesi linkinden indirebilirsiniz.

Devamı

23 Mart 2016 Çarşamba

Makine Öğrenmesi Nedir?

3/23/2016 1


Öğrenme, canlının yaşantıları sonucu hayatın da meydana gelen sürdürülebilir değişikliklerdir. Çevreye uyum sürecidir. Makine öğrenmesi (Machine Learning) ise geçmişteki verileri inceleyerek gelecek için tahminlerde bulunma ve olası problemlere çözümler üretme amacıyla ortaya çıkmış, otomatik olarak kendisini geliştiren bilgisayar programlarını nasıl elde ederiz sorusuyla ilgilenen, bilgisayarın öğrenme işlemini gerçekleşmesini sağlayacak algoritma ve tekniklerin gelişmesini sağlayan bir çalışma alanıdır. Makine öğrenmesi, bir çok alanda kullanımı mevcuttur. Örneğin, Spam/Spam değil, Youtube video önerisi, el yazısı tanıma, tıbbi tanı, borsa çözümleyicisi, DNA dizileri sınıflandırılması, bilgisayarla görme gibi ...
Devamı

22 Şubat 2016 Pazartesi

Arduino & Android - Bluetooth Üzerinden Sesli Komutlarla Led Kontrolü

2/22/2016 9
Bu uygulamamızda MIT APP INVENTOR 2 ile hazırladığımız Android uygulama ve HC-06 (veya HC-05) bluetooth modülü ile sesle komut vererek led yakıp söndüreceğiz. Uygulamamızda “yak” dediğimizde led yanmakta, “söndür” dediğimizde led sönmektedir.

Tasarladığımız Android uygulama ses çözümleyerek,  sesi yazıya dökmektedir. Eğer “yak” demişsek uygulamamız Arduinoya 1 sayısını göndermekte, “söndür demişsek 0 sayısını göndermektedir. Arduinomuz ise bluetooth modülden 1 sayısı geldiğinde ledi yakmakta, 0 sayısı geldiğinde ledi söndürmektedir.

Devre:

Devamı

20 Şubat 2016 Cumartesi

Raspberry Pi Görsel Masaüstüne Erişim

Post Top Ad