Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
Share Thread:
[Proje] Piraba
#1
İnternet üzerinde biraz dolaşmışsanız, bir çok Raspberry Pi temelli araba projesi görmüşsünüzdür. Benimki de aslında onlardan çok farklı bir proje değil. Projem için;

1 Adet Raspberry Pi B+
1 Adet L298N Motor Sürücü Kartı
1 Adet 7,4 V 1750 mAh Li-Po Pil
1 Adet uzaktan kumandalı araba
1 adet Kablosuz adaptör
Çok sayıda Jumper Kablosu

kullandım. Motor sürücü kartı olarak L298N kartı kullanmamın iki temel nedeni var;

1. 2A kadar akım çeken motorlarla kullanılabilmesi
2. Kendi içerisinde regülatör devresi bulunması

özellikle 2. si oldukça önemli, bu sayede ayrıca bir karta gerek kalmadan, Raspberry Pi ve motorları bataryadan beslemeniz mümkün. Öncelikle L298N kartının girişleri şu şekilde:

   

Benim projemde 1. motoru ileri ve geri ilerletmek için, 2. motor ise sağ ve sola dönüşleri kumanda etmek için kullandım. Sağ ve sola dönüşlerde motorun çalışma süresini kullandığımdan bu pinleri PWM pinlerine bağlama gereği duymadım. Ancak, 1. motor için olan pinleri ikisini de Raspberry Pi üzerinde PWM pinlerine bağladım. L298N kartının diğer kartlara göre bir farklılığı var. Araştırdığım bir çok kontrol kartı ya ayrı bir PWM girişine sahip ya da girişlerden bir tanesi PWM'ya bağlamak yeterli oluyor. Ancak ben ancak ikisini de bağlayarak sonuç elde edebildim. Bağlantılarımı aşağıda çizmeye çalıştım.

   

Bağlantılardan sonra sıra, aracı nasıl kontrol edeceğime geldiğinde, ayrıca bir RF modülüne para vermek istemedim. Malum devir internet devri, aracı kablosuz internet ile kontrol etmeye karar verdim. Bunun için Raspberry Pi üzerinde bir web sunucu kurmam gerekiyordu. Bunun Python tabanlı bir web Microframework olan Flask kullandım.
Öncelikle aracı kontrol etmek için hem aracın hemde aracı kontrol edecek sistemin (Laptop, masaüstü, telefon, tablet vs) aynı ağ üzerinde olması gerekli. Bu nednele Raspberry Pi üzerinde kurulu olan rasberian işletim sisteminde birkaç ağ tanımladım. Araç bunlardan birine bağlanıp IP adresi aldığında bana bu adresi e-posta yolu ile iletiyor. Bu aynı zamanda aracın düzgün açılıp açılmadığını kontrol içinde kullanılıyor. Araç ile ilgili belkide en önemli zorluk hem motor kontrol kartının hem de Raspberry Pi'nin ısınması. Bunu düşünerek işlemci sıcaklığı belirli bir düzeyi geçince sistem yine uyarı e-postası atarak kapanıyor.

Bir sonraki aşama, Raspberry Pi'nin bir hotspot oluşturması ve sistemin bu şekilde kumanda edilmesi.

Python Kodu:
Kod:
#!/usr/bin/python
# -*- coding: utf-8 -*-
import time, os
import RPi.GPIO as GPIO
from flask import Flask, render_template, request, jsonify
import socket
import threading
import fcntl
import struct
from email.MIMEMultipart import MIMEMultipart
from email.MIMEText import MIMEText
from email.MIMEImage import MIMEImage
import os.path
import smtplib

app = Flask(__name__)

GPIO.setmode(GPIO.BCM)
GPIO.setmode(GPIO.BCM)
mt1_p1 = 13
mt1_p2 = 19
mt2_p1 = 17
mt2_p2 = 18
GPIO.setup(mt1_p1, GPIO.OUT)
GPIO.setup(mt1_p2, GPIO.OUT)
GPIO.setup(mt2_p1, GPIO.OUT)
GPIO.setup(mt2_p2, GPIO.OUT)
pwm1 = GPIO.PWM(mt1_p1, 300 )
pwm2 = GPIO.PWM(mt1_p2, 300 )
pwm1.start(0)
pwm2.start(0)
temp_treshold = 67
shiz = 0

def motor_bir(hiz):
    if hiz > 0:
        pwm1.ChangeDutyCycle(0)
        pwm2.ChangeDutyCycle(hiz)
    elif hiz == 0:
        pwm1.ChangeDutyCycle(0)
        pwm2.ChangeDutyCycle(0)
    elif hiz < 0:
        pwm2.ChangeDutyCycle(0)
        pwm1.ChangeDutyCycle(abs(hiz))
    #time.sleep(1)
    global shiz
    shiz = hiz

def motor_iki(yon, miktar):

    if yon == 1:
        GPIO.output(mt2_p1, True)
        GPIO.output(mt2_p2, False)
        time.sleep(miktar)
        GPIO.output(mt2_p1, False)
        GPIO.output(mt2_p2, False)
    else:
        GPIO.output(mt2_p1, False)
        GPIO.output(mt2_p2, True)
        time.sleep(miktar)
        GPIO.output(mt2_p1, False)
        GPIO.output(mt2_p2, False)
    
def getCPUtemperature():
    res = os.popen('vcgencmd measure_temp').readline()
    if float(res.replace("temp=","").replace("'C\n","")) < temp_treshold:
    else:
        send_mail('Aşırı ısınma nedeniyle kapandı')
        os.popen('poweroff')


def get_interface_ip(ifname):
    s = socket.socket(socket.AF_INET, socket.SOCK_DGRAM)
    return socket.inet_ntoa(fcntl.ioctl(s.fileno(), 0x8915, struct.pack('256s',
                                ifname[:15]))[20:24])


def do_every (interval, worker_func, iterations = 0):
  if iterations != 1:
    threading.Timer (
      interval,
      do_every, [interval, worker_func, 0 if iterations == 0 else iterations-1]
    ).start ();

  worker_func ();
  
  
  
def send_mail(subject):
    fromaddr = 'gonderen_eposta'
    toaddrs  = 'alici_eposta'
    msg = MIMEMultipart()
    username = 'xxxxxx'
    password = 'xxx'
    server = smtplib.SMTP('smtp.gmail.com:587')
    server.starttls()
    server.login(username,password)
    msg['Subject'] = subject
    server.sendmail(fromaddr, toaddrs, msg.as_string())
    server.quit()

def get_ssid(ifname):
    cikti = os.popen('iwconfig ' + ifname).readline()
    for i in cikti.split(' '):
        if 'ESSID' in i:
        return i[7:-1]

@app.route("/")
def index(name=None):
    return render_template('index.html', name=name)
    
@app.route('/kontrol')
def kontrol():
    yon = request.args.get('yon', type=int)
    miktar = request.args.get('sure', type=float)
    hiz = request.args.get('hiz', type=int)
    roket = request.args.get('roket', type=int)

    if yon:
        print shiz
        if abs(shiz) > 70:
            motor_iki(yon, 0.2)
        else:
            motor_iki(yon, miktar)

    if hiz:
        motor_bir(hiz)
    if roket:
        if shiz >= 0:
        pwm2.ChangeFrequency(1000)
        pwm1.ChangeDutyCycle(0)
            pwm2.ChangeDutyCycle(100)
            time.sleep(3)
            pwm2.ChangeFrequency(300)
        pwm1.ChangeDutyCycle(0)
            pwm2.ChangeDutyCycle(0)
    else:
        pwm1.ChangeFrequency(1000)
        pwm2.ChangeDutyCycle(0)
            pwm1.ChangeDutyCycle(100)
            time.sleep(3)
            pwm1.ChangeFrequency(300)
        pwm2.ChangeDutyCycle(0)
            pwm1.ChangeDutyCycle(0)
    dur = request.args.get('dur', 0, type=int)
    if dur:
        pwm1.ChangeDutyCycle(0)
        pwm2.ChangeDutyCycle(0)
        global shiz
        shiz = 0


if __name__ == "__main__":
    do_every (10, getCPUtemperature)
    send_mail(get_interface_ip('wlan0') + ', ' + get_ssid('wlan0'))
    app.debug = True
    app.run(host=get_interface_ip('wlan0'))

index.html

Kod:
<!doctype html>
<meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
  <script type="text/javascript">
    function updateTextInput(val) {
      document.getElementById('textInput').value=val;
    }
  </script>

        <meta http-equiv="content-type" content="text/html; charset=utf-8">
        <script type=text/javascript
          src="http://ajax.googleapis.com/ajax/libs/jquery/1.8.2/jquery.min.js"></script>
        <script type=text/javascript>
          var $SCRIPT_ROOT = {{ request.script_root|tojson|safe }};
        </script>
<STYLE type="text/css">
body {
    font-size:100%;
}
button {
margin:20px;
}

input {
margin:20px;
font-size:200%;
}
<style>
    input[type='range'] {
        -webkit-appearance: none;
        border-radius: 5px;
        box-shadow: inset 0 0 5px #333;
        background-color: #999;
        height: 30px;
        vertical-align: middle;
    }
    input[type='range']::-moz-range-track {
        -moz-appearance: none;
        border-radius: 5px;
        box-shadow: inset 0 0 5px #333;
        background-color: #999;
        height: 30px;
    }
    input[type='range']::-webkit-slider-thumb {
        -webkit-appearance: none !important;
        border-radius: 20px;
        background-color: #FFF;
        box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
        border: 1px solid #999;
        height: 30px;
        width: 50px;
    }
    input[type='range']::-moz-range-thumb {
        -moz-appearance: none;
        border-radius: 20px;
        background-color: #FFF;
        box-shadow:inset 0 0 10px rgba(000,000,000,0.5);
        border: 1px solid #999;
        height: 30px;
        width: 50px;
    }
</style>
</STYLE>

<script type=text/javascript>
  $(function() {
    $("#sol").click(function() {
         $.ajax({
            type: "GET",
            url: $SCRIPT_ROOT + "/kontrol",
            data: { yon: 1, sure: 0.5 }
        });    
    });
    $("#sag").click(function() {
         $.ajax({
            type: "GET",
            url: $SCRIPT_ROOT + "/kontrol",
            contentType: "application/json; charset=utf-8",
            data: { yon: 2, sure: 0.5 }
        });    
    });
    $("#dur").click(function() {
         $.ajax({
            type: "GET",
            url: $SCRIPT_ROOT + "/kontrol",
            contentType: "application/json; charset=utf-8",
            data: { dur: 1 }
        });
         $("input[type=range]").val(0);
         $("#textInput").val(0);
    });
    $("#roket").click(function() {
         $.ajax({
            type: "GET",
            url: $SCRIPT_ROOT + "/kontrol",
            contentType: "application/json; charset=utf-8",
            data: { roket: 1 }
        });
         $("input[type=range]").val(0);
         $("#textInput").val(0);
    });

    $("[type=range]").change(function() {
         $.ajax({
            type: "GET",
            url: $SCRIPT_ROOT + "/kontrol",
            contentType: "application/json; charset=utf-8",
            data: { hiz: $("input[type=range]").val() }
        });    
    });
  });
</script>


<script type=text/javascript src="{{
  url_for('static', filename='jquery.js') }}"></script>

  
  
<div style='width:1000px; border: solid blue 1px; height: 300px; padding: 4px;'>
    <div style='width: 190px; height: 190px; border: black solid 1px; float: left;'>Kamera için ayrıldı </div>
    <div style='float: left; margin-left: 5px; border: black 1px solid; width:800px'>
<input type="text" id="textInput" value="" disabled style='width: 90px;'>
<input type="range" value="0" step="5"  min="-100" max="100" onchange="updateTextInput(this.value);" style="width:500px; heigth: 50px;" /><br>
    <center> <button id="sol" value="1" type="button" style="height:50px; width: 100px; font-size: 250%">Sol</button> <button id="sag" type="button" style="width:100px; height:50px; font-size: 250%">Sağ</button><button id="dur" type="button" style="width:100px; height:50px; font-size: 250%">Dur</button><button id="roket" type="button" style="width:100px; height:50px; font-size: 250%">R</button></center>

</div>
</div>
<title>PiRaba Kumanda Merkezi</title>

Bu iç kısmı:
   
Bu da son hali
   

Buda videosu:
Ara
Cevapla
#2
Hocam süpersin. Uğraşınca neler yapılabildiğinin göstergesi bu.
Mail sistemi kullanımı açısından da güzel bir örnek oldu.
Truva Linux - Türkiye'nin Linux Dağıtımı
http://www.truvalinux.org.tr
http://truvalinux.blogspot.com
---------------------------------------------
Raspberry Pi Model B 256 Mb
Raspberry Pi Model B+
Cevapla
#3
@lonicera tebrikler hocam güzel konu olmuş inşallah sizler gibi bende projemi bitirip yayınlarım Smile çok az kaldı
I Raspi You Blush
Ara
Cevapla
#4
Elinize sağlık Smile
Lütfen özel mesajla soru sormayın arkadaşlar. Cevaplamayacağım. Bu forumdaki ben de dahil herkese sorabilecekken neden bir kişiyle yetinesiniz ki?

-Dubito, Ergo Cogito, Ergo Sum
Ara
Cevapla
#5
Çok güzel!!!
Gerçek arabayla denemen lazım Smile
Ara
Cevapla
#6
@Arda teşekkür ederim. Çok orjinal birşey değil ama uğraşması zevkli. @Jesus o biraz beni aşar sanırım Smile
Ara
Cevapla
#7
@lonicera raspberry ile kontrol cihazını(bilgisayar, telefon) internet üzerinden nasıl birbirine bağladınız? Ben bir kaç gündür bununla uğraşıyorum ama beceremedim bir türlü.
Teşekkürler.
Ara
Cevapla
#8
@iskenderoguz aslında sorunuzu tam anlayamadım. Bu nedenle anladığım iki şekli ile de cevap vereyim. Birinci olarak eğer aradaki internet bağlantısı nasıl kuruldu diyorsanız, Raspberry Pi ye bir kablosuz internet adaptörü bağladım. Sonrasında Pi'nin ve kontrol edeceğim aygıtın aynı ağa bağlanmasını sağladım. Böylece birbirleri ile iletişime geçebildiler. Ama sorunuz kontrol edecek aygıtın Pi üzerindeki kontrol arayüzüne nasıl bağlandığı ise, o noktada hazır bir python kütüphanesi olan Flask yardımcı oluyor. Bu kütüphane aynı apache sunucusu gibi pi üzerinde bir web sunucusu oluşturuyor. Telefon yada bilgisayar ile pi'nin IP numarasını tarayıcıya yazarak iletişime geçebiliyorum.

Umarım yardımcı olabilmişimdir.
Ara
Cevapla
#9
Hocam paylaşımınız çok güzel. Emeklerinize sağlık.
Ara
Cevapla
#10
Hocam bu projede kullandiginiz kablosuz adaptorun marka ve modelini syleyebilir misiniz?
Tesekkurler.
Ara
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [Proje] II. Piraba lonicera 26 22,725 05-27-2016, 01:27 PM
Son Yorum: Yunus YAMANER

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi