Cartoon: Raspberry Pi Based RC Toy

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

Screenshots

Web Interface

image

image

Android App

image

image

Tkinter App

image

image

2 Beğeni

Ellerinize sağlık… Başarılı olmuş :smile:

1 Beğeni