Konuyu Oyla:
  • Toplam: 0 Oy - Ortalama: 0
Share Thread:
[Proje] II. Piraba
#1
Merhaba,

Daha önce bu projemden bahsetmiştim. Ancak geçen zaman süresince bazı güncellemeler yaptım ve bunları sizlerle de paylaşmak istiyorum. Öncelikle araç değişti. İlk kullandığım araç oldukça basit bir araç olmakla beraber, öğrenme süresince oldukça işe yaradı. Çok fazla vidaları açıldığından artık pek işlev göremez hale geldi. Bu nedenle 1:10 ölçeğinde bir arazi aracı satın aldım. Bu aracın avantajları kısaca şu şekilde:

1. Yerden yüksek olduğundan, ufak taşlar vb. engellere takılmıyor.
2. İç hacmi dar olduğundan önceki araçta pili aracın üzerine koymam gerekmişti. Bu sorun çözüldü.
3. Yine bu aracın iç hacmi geniş olduğundan motor sürücü kartı ve Raspberry Pi üstüste durmuyor. Bu da ısınma sorununu çözdü.
4. Yeni araç tabi ki daha havalı Smile

Teknik detaylar konusunda ise, aracın kumanda edildiği web arayüzünü videoda görülenden daha çok geliştirmiş ve mobil olarak daha kullanılır hale getirmiştim. Ancak yeni araca yakışacak bir geliştirme yapmak istedim. Artık araç akıllı telefonların eğim ölçer algılayıcıları ile hareket edebiliyor. İnternette yaptığım araştırmada modern bir çok mobil tarayıcının telefonun eğim ölçerini kullanabildiğini gördüm. Ben de bu özelliği kullanarak, salt html ve Javascript kodları ile çalışan bir arayüz yaptım. Sayfa yüklendiğinde doğruda kontrolü size vermiyor. Bu şekilde aracın istemsiz hereket etmesi önlenmiş oldu. İlk gelen ekranda bir kalibrasyon yapıyorsunuz, ekrandaki rakamı sıfıra getirdiğinizde kontrol artık sizde. Yine ekrandaki güç düğmesi ile de bu ekranı tekrar açmanız ve aracı kilitlemeniz mümkün. Ayrıca aracın ön kısmıda yer alan led farlarda web üzerinden kotrol edilebiliyor.

Bunların dışında teknik olarak önemli bir değişiklik ise PWM kontrolü ile ilgili. Benim gibi sorun yaşayan arkadaşlarla paylaşmak açısından belirtmek istiyorum. PWM ile motor hızı kontrolünde sadece ChangeDutyCycle yeterli değil, özellikle düşük hızlar için mutlaka frekansı da daha düşük düzeyde tutmak geekiyor. Hızlanmak için ise aynı zamanda frekans ile de oynamak gerekli. Gelelim kodlara

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 # Bu kısım gereksiz olabilir.
import smtplib
GPIO.setwarnings(False)
GPIO.setmode(GPIO.BCM)
mt1_p1 = 13
mt1_p2 = 19
mt2_p1 = 17
mt2_p2 = 18
led_pin = 2
GPIO.setup(mt1_p1, GPIO.OUT)
GPIO.setup(mt1_p2, GPIO.OUT)
GPIO.setup(mt2_p1, GPIO.OUT)
GPIO.setup(mt2_p2, GPIO.OUT)
GPIO.setup(led_pin, GPIO.OUT)
pwm1 = GPIO.PWM(mt1_p1, 30 )
pwm2 = GPIO.PWM(mt1_p2, 30 )
pwm1.start(0)
pwm2.start(0)
temp_treshold = 67
bhiz = 0
byon = "duz"

def get_strn():
   cikti = os.popen('iwconfig wlan0 ' + ' | grep -i quality ').readline()
   for i in cikti.split(' '):
       if 'Quality' in i:
   print i[8:-3]

def motor(hiz, yon):
   if abs(float(hiz)) == 33:
       pwm1.ChangeFrequency(20)
       pwm2.ChangeFrequency(20)
   elif abs(float(hiz)) == 66:
       pwm1.ChangeFrequency(60)
       pwm2.ChangeFrequency(60)
   elif abs(float(hiz)) == 99:
       pwm1.ChangeFrequency(600)
       pwm2.ChangeFrequency(600)
   if float(hiz) > 0:
       pwm2.ChangeDutyCycle(0)
       pwm1.ChangeDutyCycle(float(hiz))
   elif float(hiz) < 0:
       pwm1.ChangeDutyCycle(0)
       pwm2.ChangeDutyCycle(float(hiz)*-1)
   else:
       pwm1.ChangeDutyCycle(0)
       pwm2.ChangeDutyCycle(0)
   if yon == "sol":
       GPIO.output(mt2_p1, True)
       GPIO.output(mt2_p2, False)
   elif yon == "sag":
       GPIO.output(mt2_p1, False)
       GPIO.output(mt2_p2, True)
   else:
       GPIO.output(mt2_p1, False)
       GPIO.output(mt2_p2, False)
   
def getCPUtemperature():
   res = os.popen('vcgencmd measure_temp').readline()
   #return(res.replace("temp=","").replace("'C\n",""))
   if float(res.replace("temp=","").replace("'C\n","")) < temp_treshold:
       print "Soguk"
   else:
       print "sicak"
       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 = ''
   toaddrs  = ''
   msg = MIMEMultipart()
   username = ''
   password = ''
   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 = Flask(__name__)
@app.route("/")
def index(name=None):
   return render_template('index.html', name=name)

@app.route("/gyr")
def mello(name=None):
   return render_template('gyr.html', name=name)
   
@app.route('/isleme')
def yello():
   miktar = request.args.get('sure', type=float)
   hiz = request.args.get('hiz', type=str)
   roket = request.args.get('roket', type=int)
   yon = request.args.get('yon', type=str)
   dur = request.args.get('dur', 0, type=int)
   led = request.args.get('led', type=int)
   if led:
       if led == 1:
           GPIO.output(led_pin, True)
       elif led == 2:
           GPIO.output(led_pin, False)        
 
   if hiz:
       #GPIO.output(led_pin, True)
       if hiz == "0":
   pwm1.ChangeDutyCycle(0)
           pwm2.ChangeDutyCycle(0)
           #GPIO.output(led_pin, False)
           ghiz = hiz
           global bhiz
           bhiz = ghiz
       else:
           ghiz = hiz
           bhiz = ghiz
   else:
       ghiz = bhiz
       
   if yon:
       global byon
       byon = yon
       gyon = yon
   else:
       gyon = byon
   
   motor(ghiz, gyon)

   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)

   if dur:
       pwm1.ChageDutyCycle(0)
       pwm2.ChangeDutyCycle(0)

   return "Ok"

if __name__ == "__main__":
   GPIO.output(led_pin, False)
   #do_every (10, getCPUtemperature)
   send_mail(get_interface_ip('wlan0') + ', ' + get_ssid('wlan0'))
   app.debug = True
   app.run(host=get_interface_ip('wlan0'))
gyr.html


Kod:
<!DOCTYPE html>
<html lang="tr">
<head>
   <meta http-equiv="content-type" content="text/html; charset=UTF-8">
   <meta content='width=device-width, initial-scale=1.0, maximum-scale=1.0, user-scalable=0' name='viewport' />
   <meta charset="UTF-8">
   <title>II. Piraba Web Kumanda Arayüzü</title>
   <script src="http://ajax.googleapis.com/ajax/libs/jquery/1.11.0/jquery.min.js"></script>
   <script type=text/javascript>
       var $SCRIPT_ROOT = "";
   </script>
   <style type="text/css">
       body {
           font-family: sans-serif;
           background: url(/static/bg.gif);
       }
 
       .main {
           border: 1px solid black;
           box-shadow: 10px 10px 5px #888;
           border-radius: 12px;
           padding: 20px;
           background-color: #ddd;
           margin: 5px;
           width: 450px;
           margin-left:auto;
           margin-right:auto;
           margin-top:auto;
       }

       #cover {
           background-color: gray;
           opacity: .5;
           width: 100%;
           height: 700px;
           z-index: 990;
           position: absolute;
           display: table;
       }

       #calib {
           background-color: gray;
           opacity: 1;
           display: table-cell;
           vertical-align: middle;
           border-radius: 50%;
           background: black;
           border: 3px solid red;
           position: absolute;
           top: 20%;
           left: 50%;
           height: 200px;
           width: 200px;
           margin-right: -50%;
           transform: translate(-50%, -50%)
       }
 
       .hiz_y {
           position: absolute;
           top: 40%;
           left: 40%;
           color: white;
           font-size: 44px;
       }
       #led {
           float: right;
       }
   </style>

</head>
<body>
   <div id="cover">
       <div id="calib">
           <div class="hiz_y" id="hdeg" style="float:left;"> </div>
       </div>
   </div>
   <div class="main">
       <img id ="kilit" src="/static/pwr.png">
       <img id ="led" src="/static/bulb.png">
       <h2>II. Piraba Yönlendirme Arayüzü</h2>
       <table>
           <tbody>

               <tr>
                   <td>Hareket Yönü:</td>
                   <td id="doTiltLR"></td>
               </tr>
               <tr>
                   <td>Dönüş Yönü:</td>
                   <td id="doTiltFB"></td>
               </tr>
           </tbody>
       </table>
   </div>
 
   <script type="text/javascript">
       init();
       var count = 0;
       var calib = 0;
       var hiz = 0;
       var byon = 0;
       var led = 0;
       function init() {
           $("#kilit").click(function() {
               calib = 0;
               $.ajax({
                   type: "GET",
                   url: $SCRIPT_ROOT + "/islem",
                   contentType: "application/json; charset=utf-8",
                   data: { hiz: 0, yon: "duz" }
               });
               $('#cover').show();
           });
           
           $("#led").click(function() {
               if (led == 1) {
                   led = 2;
                   src = "/static/bulb1.png";
               } else {
                   led = 1;
                   src = "/static/bulb.png"
               }
             
               $(this).attr("src", src );
               $.ajax({
                   type: "GET",
                   url: $SCRIPT_ROOT + "/islem",
                   contentType: "application/json; charset=utf-8",
                   data: { led: led }
               });
           });

           if (window.DeviceOrientationEvent) {
               document.getElementById("doEvent").innerHTML = "DeviceOrientation";
               // Listen for the deviceorientation event and handle the raw data
               window.addEventListener('deviceorientation', function(eventData) {
                   // gamma is the left-to-right tilt in degrees, where right is positive
                   var tiltLR = eventData.gamma;
                   // beta is the front-to-back tilt in degrees, where front is positive
                   var tiltFB = eventData.beta;
                   // alpha is the compass direction the device is facing in degrees
                   var dir = eventData.alpha
                   // call our orientation event handler
                   deviceOrientationHandler(tiltLR, tiltFB, dir);
               }, false);
           } else {
               document.getElementById("doEvent").innerHTML = "Not supported on your device or browser.  Sorry."
           }
       }
 
       function deviceOrientationHandler(tiltLR, tiltFB, dir) {
           document.getElementById("hdeg").innerHTML = 45 - Math.round(tiltLR);
           if (document.getElementById("hdeg").innerHTML == 0 || calib ==1) {
               $('#cover').hide();
               calib =1;
               if (Math.round(tiltLR) == 60 && hiz != -33) {
                   hiz = -33;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               } else if (Math.round(tiltLR) == 70 && hiz != -66) {
                   hiz = -66;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               } else if (Math.round(tiltLR) == 85 && hiz != 99) {
                   hiz = -99;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });    
               } else if (Math.round(tiltLR) == 40 && hiz != 33) {
                   hiz = 33;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               } else if (Math.round(tiltLR) == 20 && hiz != 66) {
                   hiz = 66;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               } else if (Math.round(tiltLR) == 10 && hiz != 99) {
                   hiz = 99;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               } else if ((Math.round(tiltLR) < 55 && Math.round(tiltLR) > 45) && hiz != 0) {
                   hiz = 0;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       contentType: "application/json; charset=utf-8",
                       data: { hiz: hiz }
                   });
               }
               document.getElementById("doTiltLR").innerHTML = hiz;

               if (Math.round(tiltFB) > 10 && byon != 1) {
                   document.getElementById("doTiltFB").innerHTML = "Sol";
                   yon = 1;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       data: { yon: "sol" }
                   });
                   byon = 1;
               } else if (Math.round(tiltFB) < -10 && byon != 2) {
                   document.getElementById("doTiltFB").innerHTML = "Sag";
                   yon = 2;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       data: { yon: "sag" }
                   });
                   byon = 2;
               } else if (Math.round(tiltFB) > -10 && (Math.round(tiltFB) < 10) && byon != 0) {
                   document.getElementById("doTiltFB").innerHTML = "Düz";
                   yon = 0;
                   $.ajax({
                       type: "GET",
                       url: $SCRIPT_ROOT + "/islem",
                       data: { yon: "duz" }
                   });
                   byon = 0;
               }
      // document.getElementById("doDirection").innerHTML = Math.round(dir);
     
           }
       }    
   
   // Some other fun rotations to try...
   //var rotation = "rotate3d(0,1,0, "+ (tiltLR*-1)+"deg) rotate3d(1,0,0, "+ (tiltFB*-1)+"deg)";
   //var rotation = "rotate("+ tiltLR +"deg) rotate3d(0,1,0, "+ (tiltLR*-1)+"deg) rotate3d(1,0,0, "+ (tiltFB*-1)+"deg)";
   </script>
</body>
</html>

Aslında web sayfasında kullandığım görseller var ancak internetten onları alırken lisanslarına dikkat etmediğimde buraya koymadım. Belki ileride github üzerinden paylaşabilirim. Son olarak kKodlama konusunda iyi değilim. Bu nedenle acemiliklerim olursa affedin.

Bu aracın fotosu
   
Videosu:
Ara
Cevapla
#2
Gerçekten çok güzel olmuş. Eline sağlık. Bu işi sonunda nereye varacak merak ediyorum. Umarım bu iş daha ilerilere taşınır.
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
Teşekkür ederim. Aslında biraz proje etrafımdakiler ile şekilleniyor. Eğim ölçer ile hareket inanmayacaksınız ama arkadaşımın 3 yaşındaki çocuğundan ortaya çıktı. Eski arabayı kullanması için telefomu elince verince ilk olarak telefonu döndürerek kullanmaya çalıştı. Bu nedenle ileride neler olabilir sizlerden de öneri alabilirsem, çok sevinirim.
Ara
Cevapla
#4
Çocukların hayal gücü inanılmaz.
Bundan sonrası için önerim sesli kontrol olabilir. İleri-geri , sağ-sol gibi Big Grin
Uçuşa geçtim.
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
#5
Düşünmedim değil, ama gerçekten zor, hazır kütüphaneler de genelde ingilizce için. Şimdi aklımda sisteme kamera ekleyip yüzü takip etmesi var. Aslında 4WD bir robot ile daha kolay olur ama denemekten zarar gelmez Smile
Ara
Cevapla
#6
O da aklıma geldi ama ses ilk başta daha kolay olur diye düşündüm.
Ayrıca projelerimizi github a aktarmak herkes için faydalı olacaktır. En azından kalıcı olur.
Ben kendi projelerimde aşama kaydedemediğim için paylaşamadım henüz.
Hem teknik hem de zaman sorunu yaşıyorum.
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
#7
Kolay gelsin. Bu arada sizin DHT11 sensörü ile kodlarınızı bir başka projemde kullandım. Ancak sanırım sensörün kalitesi ile ilgili bir sorun var. Sorun çıkaıp duruyor. Benimde sizin projenize yardımım olabilirse sevinirim.
Ara
Cevapla
#8
Sağol. Anlatmaya çalıştığım şeyde buydu. Sensörler bir çalışıyor bir çalışmıyor. Bende oturup adam akıllı yazamadım kodu. Github üzerinden belki daha sağlam seviyelere getirebiliriz. Big Grin
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
#9
Gerçekten çok başarılı umarım istediğin gibi ve güzel bir proje ortaya çıkar.Amacını bilmiyorum belki eğitim belki ürünü satıcaksın belkide eğlence amaçlı ama bu yolda devam et Wink
I Raspi You Blush
Ara
Cevapla
#10
@MrShellby teşekkür ederim. Amaç sadece eğlenmek Smile.
Ara
Cevapla


Konu ile Alakalı Benzer Konular
Konular Yazar Yorumlar Okunma Son Yorum
  [Proje] Piraba lonicera 14 16,200 06-23-2016, 10:21 PM
Son Yorum: lonicera

Hızlı Menü:


Konuyu Okuyanlar: 1 Ziyaretçi