2Bu yazımda okulum KOÜ ELOHAB öğrencilerinden Melih Yıldırım ‘ın ders projesi olan Beaglebone Black ile Webcam Streaming ve Servo Kontrolü’nün nasıl yapılacağı hakkında arkadaşım yerine ben aktarmaya çalışacağım.

 

 

Giriş

Bu çalışmada Beaglebone Black kullanılarak yerel ağ tabanlı Webcam streaming ve servo kontrolü
yapılmıştır. Temel gereksinimler :
–  Beaglebone Black
–  Webcam (Logitech C120 kullanılmıştır.)
–  Servo (Futaba S3003 kullanılmıştır.)
–  Arayüz Program
–  Board
–  Direnç
–  5Volt Harici güç kaynağı
–  Bağlantı Telleri

 

BBB’de harici 16GB microSD karta kurulu Angstrom GNU/Linux v2012.12 işletim sistemi mevcuttur.
Webcam stream için MJPG-Streamer kurulumu yapılmıştır. Servo kontrolü için Python programlama dili
kullanılmıştır ve Adafruit_BBIO kütüphanesi Python’a dahil edilmiştir. Arayüz program için C# programlama
dili kullanılmıştır. Üstü çizili dosya yolları kullanıcıdan kullanıcıya göre değişebilmektedir. BBB terminal
üzerinde sırasıyla aşağıdaki adımlar takip edilmiştir.

 
MJPG-Streamer Kurulumu
1- opkg install subversion libjpeg-dev imagemagick
2- svn checkout svn://svn.code.sf.net/p/mjpg-streamer/code/ mjpg-streamer-code

Başarılı kurulum sonrasında dosyamız /home/root dizini altında mjpg-streamer-code adıyla oluşur.

3- cd /home/root/mjpg-streamer-code/mjpg-streamer

4- make

/home/root/ mjpg-streamer-code dizini altındaki mjpg-streamer uygulamamız kullanıma hazırdır.

Adafruit_BBIO Kütüphanesi Kurulumu

1- git clone git://github.com/adafruit/adafruit-beaglebone-io-python.git
2- /usr/bin/ntpdate -b -s -u pool.ntp.org
3- opkg update && opkg install python-distutils python-smbus
4- cd adafruit-beaglebone-io-python
5- python setup.py install
Kurulumu test etmek için;
1- python -c “import Adafruit_BBIO.GPIO as GPIO; print GPIO”
Ekran çıktısı böyle olmalıdır :
<module ‘Adafruit_BBIO.GPIO’ from ‘/usr/local/lib/python2.7/dist-packages/Adafruit_BBIO/GPIO.so’>
veya

<module ‘Adafruit_BBIO.GPIO’ from ‘/usr/lib/python2.7/site-packages/Adafruit_BBIO-0.0.19-py2.7-linuxarmv7l.egg/Adafruit_BBIO/GPIO.so’>

MJPG-Streamer Kullanımı

Kullanıma başlamadan önce webcam kontrol edilmelidir.

1- cd /dev
2- ls

“video0” isimli dosya varsa webcam kullanılabilirdir. mjpg-streamer uygulamasını başlatmak için
kütüphane dosyaları dosya yolu verilerek ortaya çıkarılmalıdır.

1- export LD_LIBRARY_PATH=”/home/root/mjpg-streamer-code/mjpg-streamer”

Kütüphane dosyaları çıkarıldıktan sonra “mjpg_streamer” uygulaması kullanıma hazırdır.

2- cd /home/root/mjpg-streamer-code/mjpg-streamer

“mjpg_streamer” uygulaması bazı ayarlamalara izin vermektedir. Bu uygulamada aşağıdakiler
kullanılmıştır.

o –f frame sayısı

o –r çözünürlük
o –c kullanıcıadı:şifre

Tercihe göre aşağıdaki iki kod parçasından herhangi biri ile stream başlamaktadır. Uygulamada
3.adım için kullanıcı adı ve şifre gerekmeyen, 30 frame, 640×480 çözünürlük ayarları seçilerek
yapılmıştır.

3- ./mjpg_streamer -i “input_uvc.so -f 30 -r 640×480 ” -o “output_http.so “
./mjpg_streamer -i “input_uvc.so -f 30 -r 640×480 ” -o “output_http.so -c BBBwebcam:1234”

Stream TCP ile 8080 portundan olmaktadır. Uygulama başladıktan sonra

–   Webbrowser veya
–   VLC Player ile görüntülenebilir.

Dikkat edilmesi gerekilen husus Webbrowser olarak Mozilla Firefox seçilmelidir. Diğer browserlar
desteklenmemektedir. VLC player ile görüntü alımında az da olsa gecikme olmaktadır.
Adres olarak http://<BeagleBoneBlack_IP>:8080/?action=stream takip edilir.

11

UYGULAMA

Stream ve servo kontrolünü başlatmak için “start_stream.sh” ve “start_servo.sh” isimli shell scriptleri
oluşturulmuştur. Tercihe göre bu scriptler startup application olarak kullanılabilir ve BBB başlatılırken
otomatik olarak arka planda çalıştırılabilir. Uygulamada terminal üzerinde manuel olarak çalıştırılmıştır.

./shell_script_dosyası.sh
komutu ile bir script çalıştırılır.
python python_code_dosyası.py komutu ile bir python kodu çalıştırılır.

Dikkat edilmesi gerekilen nokta dosyaların çalıştırılabilir olarak kaydedilmesidir.
Stream Uygulaması

start_stream.sh

1- cpufreq-set –f 1000MHz
2- python /home/root/Desktop/start_control.py
3-export LD_LIBRARY_PATH=”/home/root/mjpg-streamer-code/mjpg-streamer”
4-/home/root/mjpg-streamer-code/mjpg-streamer/mjpg_streamer -i “input_uvc.so -f 30 -r 640×480 ” -o “output_http.so -w ./www”

start_control.py streamden önce UDP üzerinden veri beklemektedir. Burada şifre gibi bazı spesifik verilere göre
stream başlatılır.
start_control.py

import socket # socket nesnesi dahil edilir
 
PASS = "BBB_MELYIL:123456" # kullanici adi sifre
UDP_IP = "192.168.1.255" # yerel agda broadcast adresi
UDP_TARGET = "192.168.1.21" # hedef IP
UDP_LISTEN = 50505 # gelen verinin dinlendigi port
UDP_PSEND = 50504 # verinin gonderildigi port
MESSAGE = "beagleboneblack connection is completed" # hedef IPye gonderilen veri
sock_listen = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # sock adinda UDP soketi olusturulur
sock_listen.bind((UDP_IP, UDP_LISTEN)) # soket ilgili adres ve porta baglanir
print "Waiting for connection..." #verinin beklendigi ekrana yazdirilir
while True: # sonsuz dongu baslatilir
data, addr = sock_listen.recvfrom(1024) # gelen veri data degiskeninde tutulur
print "Received message:", data # gelen veri ekrana yazdirilir
if (data == PASS) : # veri dogru ise 
print "The password is correct" # ekrana sifrenin dogru oldugu yazdirilir
sock_listen.sendto(MESSAGE,(UDP_TARGET,UDP_PSEND)) # hedef IP ye MESSAGE verisi gonderilir
data2, addr = sock_listen.recvfrom(1024) # gelen veri data2 degiskeninde tutulur
if (data2 == " ") : # eger gelen veri ise Start Stream Start Stream
print "Received message:", data2 # gelen veri ekrana yazdirilir
print "Streaming is starting..." # streamin basladigi yazilir
sock_listen.close(); # soket kapatilir
break # sonsuz dongu kirilir ve programdan cikilir
else : # eger sifre yanlis ise 
print "Password is wrong" # eger sifre yanlis ise 
sock_listen.sendto("Password is wrong",(UDP_TARGET,UDP_PSEND)) # eger sifre yanlis ise

 

Servo Uygulaması :

start_servo.sh

1- python /home/root/Desktop/servo_cont.py
Servo kontrolü uygulama kodu Python programlama dili ile yazılmıştır. Hesaplamalar 0°ile180° arasında
konum kontrolü yapabilecek şekilde deneyerek bulunmuştur.
Servo 20ms’lik periyotta 0,4226ms – 2,1914ms arasında 0-180 derece dönmektedir. Buna göre;
duty_min = 0,4226/20*100 = 2.113 ve
duty_max = 2,1914/20*100 = 10.957 olarak bulunur.
Servo control ugulama kodları aşağıdaki gibidir:

servo_cont.py

import Adafruit_BBIO.PWM as PWM # BB PWM nesnesi dahil edilir
import socket # socket nesnesi dahil edilir
 
UDP_IP = "192.168.1.255" # yerel agda broadcast adresi
UDP_PORT = 50007 # dinlenecek port 
 
sock = socket.socket(socket.AF_INET, socket.SOCK_DGRAM) # sock adinda UDP soketi olusturulur
8- sock.bind((UDP_IP, UDP_PORT)) # soket ilgili adres ve porta baglanir
 
servo_pin = "P9_14" # BBB P9 portunun 14. Pini pwm cikisi olarak kullanilacaktir
duty_min = 2.113 # servonun 0 derece konumu icin minimum duty degeri 
duty_max = 10.957 # servonun 180 derece konumu icin minimum duty degeri
duty_start= 6.5 # 90derece # servonun 90 derece konumu icin minimum duty degeri
duty_span = duty_max - duty_min # duty suresi
PWM.start(servo_pin, duty_start, 50) # P9_14 pininden 20 mslik periyotta 6.5 doluluk oraninda pwm cikisi baslatilir
print "PWM is started on ", servo_pin # ekrana pwm pini yazdirilir
print "Waiting for angle ( 0 - 180 )" # 0 ile 180 derece arasi giris beklenir
while True: #sonsuz dongu baslatilir
data, addr = sock.recvfrom(1024) # 5007 portundan gelen bilgi data degiskenine atanir
if data == 'stop PWM': # eger gelen veri ‘stop PWM’ ise 
PWM.stop(servo_pin) # PWM cikisi durdurulur
PWM.cleanup() # PWM modulu temizlenir
print “PWM is stopped.” # ekrana pwmin durdurulduğu yazdirilir
break # program durdurulur ve cikilir
 
angle_f = float(data) # gelen veri floata donusturulur
duty = ((angle_f / 180) * duty_span + duty_min) # doluluk orani hesaplanir
PWM.set_duty_cycle(servo_pin, duty) # doluluk orani ilgili pin icin ayarlanir
print "Received angle : ", data # girilen aci degeri ekranda yazdirilir

 

Arayüz Program

Arayüz program Visual Stduio Ultimate 2012 /C# Form Application ile hazırlanmıştır. 1
Form-1 üzerinde kullanıcı adı ve şifre girilip bağlan butonu tıklandıktan sonra giriş değerleri doğru
ise bu değerler UDP üzerinden BBB’ye gönderilir. BBB tarafından alınan veri “beaglebone black connection
is completed” ise BBB’ye “Start Stream” verisi gönderilir ve Form-2’ye geçiş sağlanır.
Form-2 üzerinde Webcam butonu tıklandığında form2ye gömülü vlc player tarafından stream
görüntülenir ve scroolbarlar aktif duruma gelir. Yatay scroolbar hareket ettirildikçe BBB’ye UDP üzerinden
0-180 derece arasında değerler gönderir ve BBB üzerindeki webcam’in 180 derecelik yatay eksen konum
kontrolü yapılmış olur. Uygulama tek eksenli servo kontrolü içerdiği için dikey scroolbarın bir işlevi yoktur.

Bağlantı Devresi

2

Kaynaklar

http://analogdigitallab.org/articles/beaglebone-black-webcam
http://learn.adafruit.com/setting-up-io-python-library-on-beaglebone-black/installation
http://learn.adafruit.com/controlling-a-servo-with-a-beaglebone-black/writing-a-program
http://www.tutorialspoint.com/python/index.htm

Uygulama Görüntüleri

3

4

Proje dökümanı : BBB_proje

______

Gökhan TARIM

tarim.gokhan@gmail.com