Ana Sayfa Raspberry Pi Raspberry Pi Zero W ile İnternet Üzerinden Kameralı Araç Kontrol Projesi

Raspberry Pi Zero W ile İnternet Üzerinden Kameralı Araç Kontrol Projesi

16 min read
4
2
987

Merhaba Arkadaşlar;

Bu uygulamamda sizlere bir proje paylaşacağım. Bu Proje aslında sadece evimi internet üzerinden kamera ile görebilmekti fakat tasarım aşamasında biraz daha geliştirmek istedim ve işin içine küçük bir araç kontrolü girince ortaya bu proje çıktı.

Raspberry i seçmem hem C yazılım hemde kamera aktarım konusunda benim işimi kolaylaştırdı. Tabi Zero W ile bu iş az yer kapladı.

Projenin içinde çeşitli konular yer almaktadır:

  • PWM ile DC motor sürme
  • yine PWM ile servo motor kontrolü
  • TCP IP Server uygulaması
  • MIT App Inventor 2 ile Android telefon ile veri transferi.
  • Raspberry Pi yi Netbeans ile Programlama
  • Wiring Pi ile GPIO kontrolü
  • Multi Threading
  • DQ ile DS18B20 okuma

Projede Kullanılan Malzemeler:

İlk Olarak Raspberry Pi Zero W ya imaj atıp kurulur hale getirdikten sonra kamera kablosunu bağlayıp PUTTY  ile bağlanarak gerekli ayarları yapalım.

Motion programını kuralım.

  • sudo apt-get update
  • sudo apt-get upgrade
  • sudo apt-get install motion

Kurulum işlemi tamamlandıktan sonra motion programın gerekli ayarlarını yapalım. Bunun için belirtilen dosyanın içeriğini aşağıdaki gibi değiştirmeniz gerekiyor.

  • sudo nano /etc/motion/motion.conf
(Dosyayı yukarıdaki komut ile açarak aşağıdaki değişkenleri kontrol ederek değiştirin)

daemon = off
process_id_file = /var/run/motion/motion.pid
setup_mode = off
logfile = (not defined)
log_level = 6
log_type = all
videodevice = /dev/video0
v4l2_palette = 17
input = -1
norm = 0
frequency = 0
rotate = 0
width = 640
height = 480
framerate = 25
minimum_frame_time = 0
netcam_url = (not defined)
netcam_userpass = (not defined)
netcam_keepalive = off
netcam_proxy = (not defined)
netcam_tolerant_check = off
auto_brightness = off
brightness = 0
contrast = 0
saturation = 0
hue = 0
roundrobin_frames = 1
roundrobin_skip = 1
switchfilter = off
threshold = 1500
threshold_tune = off
noise_level = 32
noise_tune = on
despeckle_filter = EedDl
area_detect = (not defined)
mask_file = (not defined)
smart_mask_speed = 0
lightswitch = 0
minimum_motion_frames = 1
pre_capture = 0
post_capture = 0
event_gap = 0
max_movie_time = 600
emulate_motion = off
output_pictures = off
output_debug_pictures = off
quality = 50
picture_type = jpeg
ffmpeg_output_movies = off
ffmpeg_output_debug_movies = off
ffmpeg_timelapse = 0
ffmpeg_timelapse_mode = daily
ffmpeg_bps = 500000
ffmpeg_variable_bitrate = 0
ffmpeg_video_codec = msmpeg4
ffmpeg_deinterlace = off
use_extpipe = off
extpipe = (not defined)
snapshot_interval = 0
locate_motion_mode = off
locate_motion_style = box
text_right = %Y-%m-%d\n%T-%q
text_left = (not defined)
text_changes = off
text_event = %Y%m%d%H%M%S
text_double = off
exif_text = (not defined)
target_dir = /home/pi/Videos
snapshot_filename = %v-%Y%m%d%H%M%S-snapshot
picture_filename = %v-%Y%m%d%H%M%S-%q
movie_filename = %v-%Y%m%d%H%M%S
timelapse_filename = %Y%m%d-timelapse
ipv6_enabled = off
stream_port = 8090
stream_quality = 50
stream_motion = off
stream_maxrate = 100
stream_localhost = off
stream_limit = 0
stream_auth_method = 0
stream_authentication = (not defined)
webcontrol_port = 8091
webcontrol_localhost = off
webcontrol_html_output = on
webcontrol_authentication = admin:1234
track_type = 0
track_auto = off
track_port = (not defined)
track_motorx = 0
track_motorx_reverse = off
track_motory = 0
track_motory_reverse = off
track_maxx = 0
track_minx = 0
track_maxy = 0
track_miny = 0
track_homex = 128
track_homey = 128
track_iomojo_id = 0
track_step_angle_x = 10
track_step_angle_y = 10
track_move_wait = 10
track_speed = 255
track_stepsize = 40
quiet = on
on_event_start = (not defined)
on_event_end = (not defined)
on_picture_save = (not defined)
on_motion_detected = (not defined)
on_area_detected = (not defined)
on_movie_start = (not defined)
on_movie_end = (not defined)
on_camera_lost = (not defined)
sql_log_picture = on
sql_log_snapshot = on
sql_log_movie = off
sql_log_timelapse = off
sql_query = sql_query insert into security(camera, filename, frame, file_type, time_stamp, event_time_stamp) values(‘%t’, ‘%f’, ‘%q’, ‘%n’, ‘%Y-%m-%d %T’, ‘%C’)
database_type = (not defined)
database_dbname = (not defined)
database_host = localhost
database_user = (not defined)
database_password = (not defined)
database_port = 0
sqlite3_db = (not defined)
video_pipe = (not defined)
motion_video_pipe = (not defined)
thread = No threads

Aynı şekilde bu dosyayı da aşağıdaki gibi değiştirin.

  • sudo nano /etc/default/motion

start_motion_daemon=yes

Raspberry Pi nin donanım ayarlarından kamera modülünü açacağız.

  • sudo raspi-config

Camera seçeneğini enable yaptıktan sonra Pi ye restart yapılır.

Ayarlar düzgün yapıldıktan sonra ve pi nin restart işleminden sonra kameranın otomatik devreye girdiğini yani kamera ledin yandığını göreceksiniz. Pi mizi kapatıp bağlantı ayarlarını yaptıktan sonra yazılım aşamasına geçeceğiz.

Araç şasesine montajı ben resimdeki gibi yaptım, sizler istediğiniz şekilde yapabilirsiniz.

Servo Motorun bağlantısı:

Pi için Kullandığım Powerbank bağlantısı: (Şase altına yapılmıştır.)

Genel Bağlantı Şeması:

*Bağlantı için WiringPi Pin:

 

Bağlantıları bitirdikten sonra kodlamaya geçebiliriz. C kodu olarak NetBeans proje dosyasını paylaşıyorum. Kodun içindeki bölümleri aşağıda açıklayacağım.

Proje Dosyası: RCcarcont

NetBeans ile proje nasıl oluşturulur ve derlenir önceki yazımı inceleyebilirsiniz. Tıklayın

Program İncelemesi:

  • İlk olarak değişkenleri göreceksiniz. Buradaki pin numaralarını DQ hariç diğerlerini değiştirip kendi istediğiniz pinlere bağlayabilirsiniz.

//pinler
#define Motor1_1 0
#define Motor1_2 1
#define Motor2_1 2
#define Motor2_2 3
#define Motor1_E 4
#define Motor2_E 5
#define LedSag 21
#define LedSol 22
#define LedOnFar 23
#define LedArkaFar 24
#define LED1 25
#define TRIG 13
#define ECHO 12
#define Servo1 11

  • Bağlayacağınız DS18B20 için ROM kodunu  yazmalısınız bunun için önceki yazıma bakabilirsiniz. Tıklayın

char DStempfile[] = {“/sys/devices/w1_bus_master1/28-041502394cff/w1_slave”};

  • main kısmı aşağıda gördüğünüz gibi wiringPi, GPIO, MultiThreading, ve servo initlerinden oluşmaktadır. Her aşamada çıktı olarak bize bilgi vermektedir. While döngüsüne herhangi bir kod yazılmadı çünkü işlemler MultiThreading ile yapılmaktadır.

int main(int argc, char** argv)
{
   //init

   printf(“\r\n——————————\r\n”);
   printf(“RC CAR Uygulamasi DEMO test…\r\n”);

   wiringPiSetup();
   Gpio_init();
   MultiThreading_init();
   TCPserver_init();
   ServoShow();

   delay(50);

   //main while
   while(1)
   {
      //MultiThreading olduğu için main boş kalacak 🙂
      delay(250);
   }

   return (EXIT_SUCCESS);
}

  • TCP server thread i istenilen port da buffer dolumu kontrol eder dolu ise Gelen komutlar pars edilir ve gelen data çıktıya yazdırılır.

PI_THREAD (TCPserver)
{
   while(1)
  {

      if((newsockfd = accept(sockfd, (struct sockaddr *)&cli_addr, &clilen))>=0)
   {
   n = read( newsockfd,buffer,sizeof(buffer));
   buffer[n] = ‘\0’;
   printf(“\r\nGelen Data:(%d) %s\r\n”,n,buffer);

  • Mesafe ölçümü için de thread kullanıldı. HC-SR04 Ultrasonic sensör için önceki yazımı inceleyebilirsiniz. Tıklayın. Bu Thread de mesafe ölçümü yapıldıktan sonra define ile girilmiş min mesafe den küçük ise motorları durduruyor.

piLock (DIST_KEY) ;
FrontDist = getForntCM();
piUnlock (DIST_KEY) ;

if((FrontDist<=ForntMinDist) && (FrontDistAlert==0))
{
   FrontDistAlert=1;
   Motor_dur();
}
if(FrontDist>ForntMinDist)
{
   FrontDistAlert=0;
}

  • Program akışında bir sorun yada duraklama işlemini takip etmek için LEDFlash thread i açıldı.

PI_THREAD (LEDflash)
{
   while(1)
   {
      LedToggle();
      delay(250);
   }
}

  • DC ve Servo motor kontrolleri ise, istemciden yani android uygulamadan gelen değerlerin pars ederek istenilen işlemlerin yapılması ile olur

Artık NetBeans ile derleyip çalıştırabiliriz. Program detayı hakkında yorumlarınızı alabilirim.

 

Gelelim Android uygulamaya, RCcarcontrol (1.2.8)

Uygulamayı kurup çalıştırdığınızda şöyle bir ana ekran gelecektir.

Buradan Raspberry pi nin IP adresini yazıp Bağlantı Kur a basılır. (ilk önce pi den program derlenip çalıştırılır.) Daha sonra aşağıdaki kontrol ekranı gelecektir.

Artık Arabamızı görüntü eşliğinde kontrol edebiliriz. ileri, geri, sağ ve sol butonları basılı tuttuğunuzda ilgili komutu gönderir, bıraktığınızda ise durdur işlemini gönderir. Ön Far butonu ise bastıkça toggle yapar. İnfo ise size araç hakkında CPU ve DS 148B20 nin sıcaklığını, anlık ölçülen mesafeyi ve derlenen programın versiyonunu gösterir.

Programlar demo sürümü olduğu için üzerine eklemeler ve düzenlemeler yapılabilir. Eksik gördüğünüz kısımlar yada hatalar için geri bildirimlerinizi bekliyorum.

Soru yada görüşlerinizi bekliyorum. İyi Çalışmalar,

Bir sonraki uygulama yada projede görüşmek üzere…

Buna Benzer Yazılar Göster !
Daha Fazlasını Yükle - Umut Kazanç
Daha Fazla Göster -  Raspberry Pi

4 Yorumlar

  1. zafer

    8 Temmuz 2017 at 16:10

    Selamlar. Ellerinze salık projeniz çok başarılı. Bşarılarınızın devamını dilerim. Bende şöyle birşey yapmıştım. https://github.com/zafersn/WiFi-RC-Controller-With-Camera raspberry pi üzerinde. Bu uygulamayı Raspberry Pi Zero W üzerinde de denemeyi istiyorum açıkcası. Eğer yapmak isteyen olursa proje android uygulamasını ücrestsiz vereceğim. Hatta geliştirmek isteyen olursa hertürlü yardımdada bulunurum. Ulaşmak isterseniz githup sayfasında iletişim bilgilerim mevcut.

    iyi çalışmalar

    Reply

  2. Semih

    9 Temmuz 2017 at 09:49

    Merhaba uygulama üzerinde değişiklik için .aip dosyasını paylaşabilirmisiniz

    Reply

  3. Umut Kazanç

    9 Temmuz 2017 at 17:15

  4. Umut Kazanç

    25 Temmuz 2017 at 19:00

Bir Cevap Yazın

E-posta hesabınız yayımlanmayacak. Gerekli alanlar * ile işaretlenmişlerdir

Bak Bakalım ?

Raspberry Pi ile ADC ve DAC Uygulaması

Merhaba Arkadaşlar, Bu yazımda sizlere Raspberry Pi ile ADC ölçümünden bahsedeceğim. Bildi…