Raspberry Pi Robotik Raspberry Pi Zero W ile İnternet Üzerinden Kameralı Araç Kontrol Projesi By Umut Kazanç Posted on 8 Temmuz 2017 16 min read 10 2 15,029 Paylaş ! Facebook Paylaş ! Twitter Paylaş ! Google+ Paylaş ! Reddit Paylaş ! Pinterest Paylaş ! Linkedin Paylaş ! Tumblr 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: Raspberry Pi Zero Wireless Raspberry Pi Kamera Raspberry Pi Zero Kamera Kablo 2 Tekerlekli (2WD) Akıllı Robot Araba Kiti L298N Çift Kanallı Motor Sürücü Kartı (Voltaj Regülatörlü) Mini Servo Motor Ultrasonik Mesafe Sensörü (HC-SR04) Powerbank (En Az 2600mA) (Pi için) DS18B20 6lı AAA Kalem Pil Yuvası Ön Far, Sinyal için 3mm LED ler. (isteğe bağlı) İ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…