라즈베리 파이 2에는 PWM 2채널이 사용이 가능해서
2채널 Servo와
2채널 USB webcam(v4l)을 통해서 비디오를 받아 서보로 제어하도록 해봄
$ g++ cv.cpp -lopencv_core -lopencv_video -lopencv_highgui -lwiringPi |
$ cat cv.cpp #include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <iostream> #include <wiringPi.h> #define MIN_POS 30 #define MAX_POS 110 using namespace cv; using namespace std; void init_wiringpi() { if(wiringPiSetup() == -1) exit(0); pinMode(1, PWM_OUTPUT); pwmSetMode(PWM_MODE_MS); // pwmSetRange(1024); // pwmSetClock(400); pinMode(23, PWM_OUTPUT); pwmSetMode(PWM_MODE_MS); pwmSetRange(1024); pwmSetClock(400); pwmWrite(1, MIN_POS + (MAX_POS - MIN_POS) / 2); pwmWrite(23, MIN_POS + (MAX_POS - MIN_POS) / 2); } void setPWM_1(int val) { pwmWrite(23, val); } void setPWM_2(int val) { pwmWrite(1, val); } void on_trackbar_1(int pos, void *ptr) { int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100; setPWM_1(val); cout << "pos 1 [" << pos << ":" << val << "]" << endl; } void on_trackbar_2(int pos, void *ptr) { int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100; setPWM_2(val); cout << "pos 2 [" << pos << ":" << val << "]" << endl; } void on_trackbar_3(int pos, void *ptr) { int val = MIN_POS + pos * (MAX_POS - MIN_POS) / 100; // setPWM_1(val); // setPWM_2(val); setTrackbarPos("track 1", "cam 1", pos); setTrackbarPos("track 2", "cam 2", pos); cout << "pos 3 [" << pos << ":" << val << "]" << endl; } int main(int argc, char** argv) { // opencv 2 style VideoCapture cap(0); int pos[2]; init_wiringpi(); if(!cap.isOpened()) { cout << "No camera detected" << endl; return -1; } else { cout << "In capture ..." << endl; cap.set(CV_CAP_PROP_FRAME_WIDTH, 320); cap.set(CV_CAP_PROP_FRAME_HEIGHT, 240); } VideoCapture cap2(1); if(!cap2.isOpened()) { cout << "No camera detected" << endl; return -1; } else { cout << "In capture ..." << endl; cap2.set(CV_CAP_PROP_FRAME_WIDTH, 320); cap2.set(CV_CAP_PROP_FRAME_HEIGHT, 240); } namedWindow("cam 1", WINDOW_AUTOSIZE ); namedWindow("cam 2", WINDOW_AUTOSIZE ); namedWindow("control", WINDOW_AUTOSIZE ); createTrackbar("track 1", "cam 1", &pos[0], 100, on_trackbar_1 ); createTrackbar("track 2", "cam 2", &pos[1], 100, on_trackbar_2 ); createTrackbar("track 3", "control", &pos[0], 100, on_trackbar_3 ); setTrackbarPos("track 1", "cam 1", 50); setTrackbarPos("track 2", "cam 2", 50); setTrackbarPos("track 3", "control", 50); for(;;) { Mat frame; if(!cap.read(frame)) break; imshow("cam 1", frame); if(!cap2.read(frame)) break; imshow("cam 2", frame); if(waitKey(30) >= 0) break; } return 0; } |
이제...
다음 목표는 오른쪽 카메라 중앙을 ROI 로 설정하여
왼쪽의 카메라와 같은 곳을 바라보도록 서보를 제어하는 것!
'embeded > raspberry pi' 카테고리의 다른 글
webiopi - rpi IoT (2) | 2015.10.01 |
---|---|
라즈베리 파이 v4l2-ctl 관련 (0) | 2015.10.01 |
라즈베리 파이 PWM 데이터 시트 (0) | 2015.09.28 |
wiring pi PWM / c 코드 (0) | 2015.09.28 |
뻘짓은 하긴 했는데... (카메라 + 서보)*2 (0) | 2015.09.24 |