Cartoon: Raspberry Pi Based RC Toy
Bir süredir Cartoon
adını verdiğim bir proje üzerinde uğraşıyorum. Bu proje, Raspberry Pi üzerine kurulmuş bir RC araba projesidir. Internette Raspberry Pi ya da farklı geliştirme kartları kullanarak RC araba yapanlar bulunmakta. Elimede bir Raspberry Pi olduğundan ben de bir tane yapmak istedim.
İnternette örnek projeler ararken bulduklarım içersinden beni en çok rahatsız eden şey, kullandıkları yazılımın bir başkasına ait olması ya da ciddi anlamda basit projeler olmalarıydı. Bu yüzden oturup kendi yazılımımı yazmak istedim.
GitHub: https://github.com/r0ark/cartoon
Hardware kısmında olanlar:
- Raspberry Pi 3
- Li-Po batarya
- L298N motor sürücü kartı
- Kamera (Webcam, her ne kadar kötü olsa da ucuz bir tane kullanıyorum)
Yazılımı yazarken en çok iletişim ve live stream kısımlarında sorun yaşadım. Bir çok kere denedikten sonra Flask ile bir web uygulaması yazmaya karar verdim, bu sayede bir web tarayıcısı olan her cihazdan kontrol edilebilir oldu araba. Web arayüzünün yanında, Android (Kivy) ve PC platformu (Tkinter) için birer uygulama yazdım.
Camera
En başta webcam üzerinden görüntü almak için PyGame kullandım ama projede ileride image processing ile bir şeyler yapabileceğimi düşününce OpenCV kullanmaya karar verdim. Kameradan yayın yaparken hızı arttırabilmek için fotoğrafın boyutunu ciddi oranda düşürmeyi başardım.
Bunun yanında, kamera sınıfı tanımlandıktan sonra size, quality ve diğer parametrelerini değiştirmek bir post requeste bakıyor.
def update_vals(self, **kwargs):
for key, value in kwargs.items():
setattr(self, key, value)
@app.route('/camera', methods=['POST'])
def camera_control():
if is_logged(session):
cam.update_vals(**requests.json.get('data', {}))
return 'OK.', 200
return render_template('index.html')
Bu fonksiyona aşağıda Camera
bölümünde bulunan parametreleri değiştirip verebilirsiniz (src hariç):
[Server]
username = r0ark
password = 827ccb0eea8a706c4c34a16891f84e7b
[Car]
IN1 = 13
IN2 = 11
IN3 = 15
IN4 = 32
power_control = 33
[Camera]
w = 320
h = 240
src = 0
quality = 50
take_grayscale = False"
Ana Uygulama
Projedeki en temel sınıf, burada bulunan Motor
sınıfıdır.
(...)
class Motor:
def __init__(self, pin1, pin2, speed=0):
(...)
Bu sınıf, görevi arabayı kontrol etmek olan Car sınıfı tarafından aldığı parametreler ile örneklenir ve arabayı şase yapısına göre kontrol edilebilmesini sağlar. (bkz: Car(…) .forward, .back, .turn_left, .turn_right)
(...)
import motor
class Car:
def __init__(self, IN1, IN2, IN3, IN4, power_control, speed=100):
(...)
self.motor1 = motor.Motor(IN1, IN2, speed)
self.motor2 = motor.Motor(IN3, IN4, speed)
(...)
Proje dizini:
% tree cartoon
cartoon
├── apps
│ ├── android
│ │ ├── buildozer.spec
│ │ └── main.py
│ ├── raspberry
│ │ ├── templates
│ │ │ ├── controller.html
│ │ │ └── index.html
│ │ └── webserver.py
│ └── tkinter
│ └── tkinter_app.py
├── cartoon
│ ├── android.py
│ ├── basecar.py
│ ├── camera.py
│ ├── __init__.py
│ └── motor.py
├── LICENSE
└── README.md
6 directories, 13 files