Arduino tabanlı servo kontrollü webcam.

Model uçağıma kamera bağlayabilmek için dönebilen bir kamera platformuna ihtiyacım oldu.
Arduino kullanarak prototiplersem, daha sonra gerçeğini yapmak da çok kolay olur diye düşündüm, gece gece can sıkıntısının da etkisi ile, ortaya aşağıdaki arduino kodu çıktı.

Daha sonra, madem üzerine webcam bağladım, webden de kontrol edebileyim ben bunu derken, yazdığım kısa python programı ile web sayfası üzerinden kontrol edebileceğim servo motor ile hareket edebilen webcam platformu yapmış oldum.

Çalışmasına ilişkin resimler ve videoları da zamanım olursa bu gün buraya eklemeyi düşünüyorum.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
#include <Servo.h>
Servo servo;
static int i =0;
void setup()
{
  servo.attach(9);
  servo.write(90);
  Serial.begin(9600);
}
void loop()
{
    if ( Serial.available()) {
        char ch = Serial.read();
        switch(ch) {
                case '0'...'9':
                        i = i * 10 + ch - '0';
                        break;
                case 's':
                        servo.write(i);
                        i = 0;
                        break;
                case 'd':
                        servo.write(90);
                        i = 0;
                        break;
                }
        }
}

python kodu ise aşağıdaki gibi. Kameradan resim alabilmek icin OpenCV kütüphanesini kullandım.

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
'''
Created on Jan 21, 2010
 
@author: koray
'''
from BaseHTTPServer import BaseHTTPRequestHandler, HTTPServer
import opencv
from opencv import highgui
import serial
 
global camera
camera=highgui.cvCreateCameraCapture(0)
 
class HTTPHandler(BaseHTTPRequestHandler):
 
    def get_image(self):
 
        opencvimage = highgui.cvQueryFrame(camera)
        image=opencv.adaptors.Ipl2PIL(opencvimage)
        return image
 
    def do_POST(self):
        length = int(self.headers.getheader('content-length'))
        qstring = self.rfile.read(length)
        try:
 
            degree = int(qstring.split('=')[1])
 
            if (degree>14 and degree<181):
                print (degree)
                ser = serial.Serial('/dev/ttyUSB0',9600)
                ser.open()
                ser.write(str(degree)+"s")
                ser.close()
 
            self.send_response(301)
            self.send_header("Location", "html")
            self.end_headers()
        except:
            self.wfile.write("Adam gibi bir sayi girin");
    def do_GET(self):
        if self.path.endswith("jpg"):
            image = self.get_image()
            image.save("/tmp/test.jpg")
            self.send_response(200)
            self.send_header("Content-Type", "image/jpg")
            self.end_headers()
            f=open("/tmp/test.jpg")
 
            self.wfile.write(f.read())
            f.close()
        if self.path.find("html")>0:
 
            self.send_response(200)
            self.send_header("Content-Type", "text/html")
            self.end_headers()
            self.wfile.write("<html><head><title>KorayCam</title></head><body>")
            self.wfile.write('<div align="center"><h1>Arduino + Servo + Python</h1>');
            self.wfile.write('<img src="test.jpg">')
            self.wfile.write('<form action="html" method="POST"><input type="text" id="val" name="val"><input type="Submit" value="Ayarla"></form>')
            self.wfile.write("</div></body></html>")
def main():
    try:
 
        server = HTTPServer (('',8080),HTTPHandler)
        server.serve_forever()
    except KeyboardInterrupt:
        server.socket.close();
if __name__ == '__main__':
    main()
Bu yazı Genel kategorisine tarihinde tarafından gönderildi.