svn://으로 접속하게 하네...
일단 집에가서 3690번 포트 열어줘야 할 듯..
'하드웨어 > Storage' 카테고리의 다른 글
synology undelete 시도 T.T (0) | 2015.12.27 |
---|---|
synology port (0) | 2015.12.22 |
microSD 슬롯 락 관련 (2) | 2015.08.06 |
xpenology (0) | 2015.06.30 |
DS213j 하이버네이트 정상작동중! (0) | 2015.06.25 |
svn://으로 접속하게 하네...
일단 집에가서 3690번 포트 열어줘야 할 듯..
synology undelete 시도 T.T (0) | 2015.12.27 |
---|---|
synology port (0) | 2015.12.22 |
microSD 슬롯 락 관련 (2) | 2015.08.06 |
xpenology (0) | 2015.06.30 |
DS213j 하이버네이트 정상작동중! (0) | 2015.06.25 |
동일한 맵에서 유닛만 다르게 하는 거네..
MELT DOWN에서 막혀서 멘붕... 크아앙 ㅠㅠ
슈프림 커맨더 FORGED ALLIANCE - AEON 5 (0) | 2015.10.29 |
---|---|
슈프림 커맨더 FORGED ALLIANCE - AEON 4 (0) | 2015.10.25 |
슈프림 커맨더 FORGED ALLIANCE - UEF OPERAION OVERLORD (0) | 2015.10.11 |
슈프림 커맨더 FORGED ALLIANCE - UEF OPERAION MIND GAMES (0) | 2015.10.11 |
슈프림 커맨더... ㅠㅠ (0) | 2015.10.05 |
스팀 161
오리진 44 - 1
걍 지름 - 위클리 험블번들 (0) | 2015.11.06 |
---|---|
캡콤 험블번들 지름 (0) | 2015.10.23 |
스팀의 선물(?) - 암네시아 (0) | 2015.09.16 |
오리진의 선물... 재탕이라니! (0) | 2015.09.16 |
오리진의 선물 (0) | 2015.07.12 |
balanced 모드(기본값)에서는 N/M (date / range)
When MSEN=0, which is the default mode, data to be sent is interpreted as the value N of the algorithm explained above. Number of clock cycles (range) used to send data is the value M of the algorithm. Pulses are sent within this range so that the resulting duty cycle is N/M. Channel sends its output continuously as long as data register is used, or buffer is used and it is not empty.
mark-space 모드에서는 M/S (data / range)
When MSEN=1, PWM block does not use the algorithm explained above, instead it sends serial data with the M/S ratio as in the picture below. M is the data to be sent, and S is the range. This mode may be preferred if high frequency modulation is not required or has negative effects. Channel sends its output continuously as long as data register is used, or buffer is used and it is not empty.
[링크 : http://www.farnell.com/datasheets/1521578.pdf] 139page
clcd - bona cm04075 / lc1628 (0) | 2015.11.04 |
---|---|
라즈베리 파이 CLCD 라이브러리 (0) | 2015.11.03 |
wiringpi pwm 라이브러리 분석? (0) | 2015.10.16 |
라즈베리 파이 GPIO 유틸 PWM (0) | 2015.10.14 |
DHT-11 DHT-22 RHT-03 (0) | 2015.10.14 |
데이터 시트상으로는 PWM 1과 PWM 2 채널 독립적으로
모드를 설정하여 사용이 가능해야 하나...
wiringPi에서는 편의상.. 걍 묶어 버렸다!!!!
wiringPi/wiringPi $ vi wiringPi.c
void pwmSetMode (int mode) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (mode == PWM_MODE_MS) *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE | PWM0_MS_MODE | PWM1_MS_MODE ; else *(pwm + PWM_CONTROL) = PWM0_ENABLE | PWM1_ENABLE ; } } void pwmSetRange (unsigned int range) { if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { *(pwm + PWM0_RANGE) = range ; delayMicroseconds (10) ; *(pwm + PWM1_RANGE) = range ; delayMicroseconds (10) ; } } void pwmSetClock (int divisor) { uint32_t pwm_control ; divisor &= 4095 ; if ((wiringPiMode == WPI_MODE_PINS) || (wiringPiMode == WPI_MODE_PHYS) || (wiringPiMode == WPI_MODE_GPIO)) { if (wiringPiDebug) printf ("Setting to: %d. Current: 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; pwm_control = *(pwm + PWM_CONTROL) ; // preserve PWM_CONTROL // We need to stop PWM prior to stopping PWM clock in MS mode otherwise BUSY // stays high. *(pwm + PWM_CONTROL) = 0 ; // Stop PWM // Stop PWM clock before changing divisor. The delay after this does need to // this big (95uS occasionally fails, 100uS OK), it's almost as though the BUSY // flag is not working properly in balanced mode. Without the delay when DIV is // adjusted the clock sometimes switches to very slow, once slow further DIV // adjustments do nothing and it's difficult to get out of this mode. *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x01 ; // Stop PWM Clock delayMicroseconds (110) ; // prevents clock going sloooow while ((*(clk + PWMCLK_CNTL) & 0x80) != 0) // Wait for clock to be !BUSY delayMicroseconds (1) ; *(clk + PWMCLK_DIV) = BCM_PASSWORD | (divisor << 12) ; *(clk + PWMCLK_CNTL) = BCM_PASSWORD | 0x11 ; // Start PWM clock *(pwm + PWM_CONTROL) = pwm_control ; // restore PWM_CONTROL if (wiringPiDebug) printf ("Set to: %d. Now : 0x%08X\n", divisor, *(clk + PWMCLK_DIV)) ; } } |
라즈베리 파이 CLCD 라이브러리 (0) | 2015.11.03 |
---|---|
bcm2835 pwm 데이터시트 (0) | 2015.10.16 |
라즈베리 파이 GPIO 유틸 PWM (0) | 2015.10.14 |
DHT-11 DHT-22 RHT-03 (0) | 2015.10.14 |
dSPIN_raspi / L6470 / sparkfun (0) | 2015.10.12 |
오랫만에 홈페이지 갔더니
이상한 요금제가 있어서 114 센터 전화하고 물어봐서 변경!
그대로라고 하더니 음성이 조금 더 싸지고 기본료도 싸지고!
그런데 이런 중요한(!) 정보는 좀 지들이 알려줘야 하는거 아냐!?!?
이제 사라진 4500원 짜리 요금제에서 다른걸로 바꾸라고 해줘야지!!! 버럭
기존은 반값기본요금제로 9000->4500원(VAT별도)
음성 1.8 / 문자 15 / 데이터 20.48
에서
후불1500 (1500 VAT별도)
음성 1.5 / 문자 15 / 데이터 20.48 로 더 나아진 서비스가 되려나?
다음달은 5천원을 목표로!! (0) | 2015.11.13 |
---|---|
smardi GAM.r (0) | 2015.10.24 |
디펜스 성공! (0) | 2015.05.15 |
드디어!! 약정 할부 끝? ㅋㅋ (0) | 2015.03.16 |
안드로이드 asec / apk (0) | 2015.02.15 |
1024 로 설정되면
30 ~ 110 범위로 180도를 오가는지라 해상도가 낮아졌는데
100으로 설정하고 range를 키워주면 상당부분 해소 될듯
기존의 80/180=2.25도에서 320/180=0.56도로 4배 정도 해상도가 향상된다.
$ gpio mode 1 pwm
$ gpio pwm-ms
$ gpio pwmc 400
$ gpio pwmr 1024
$ gpio pwm 1 30
$ gpio pwm 1 70
$ gpio pwm 1 110
$ gpio pwmc 200
$ gpio pwmr 2048
$ gpio pwm 1 60
$ gpio pwm 1 140
$ gpio pwm 1 220
$ gpio pwmc 100
$ gpio pwmr 4096
$ gpio pwm 1 120
$ gpio pwm 1 280
$ gpio pwm 1 440
2015/06/22 - [개소리 왈왈/라즈베리 파이(rpi)] - 라즈베리 파이 2 PWM-MS 모드 servo 제어
bcm2835 pwm 데이터시트 (0) | 2015.10.16 |
---|---|
wiringpi pwm 라이브러리 분석? (0) | 2015.10.16 |
DHT-11 DHT-22 RHT-03 (0) | 2015.10.14 |
dSPIN_raspi / L6470 / sparkfun (0) | 2015.10.12 |
라즈베리 파이 홈페이지 내용 업데이트 - pi 2b (0) | 2015.10.09 |
tpos + ((matchLoc.x - 160) * 60 / (180/60) / 320);
현재 화면의 화각은 60도로
전체 범위(0~100) 에서 1/3 사이즈로 계산한다.
/ (180 / 60)
전체 수식으로는
현재 화면에서의 비율 * 화면 하나의 각도 * 화면 하나의 서보에 대한 비율
( 현재 점 - 중심점 ) 카메라 영상 각도(60')
----------------------- * 카메라 영상 각도(60') * ----------------------------
카메라 영상폭(320px) 서보 이동 각도(180')
이 되려나?
하고 나니 나도 헷갈리네.. ㅠㅠ
---------------
일단은 백업..
한쪽 버전
$ cat cv.cpp
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <wiringPi.h> #define MIN_POS 30 #define MAX_POS 110 using namespace cv; using namespace std; bool bMouse = true; Point mpos(160,120); void CallBackFunc(int event, int x, int y, int flags, void* userdata) { switch(event) { default: break; case EVENT_LBUTTONDOWN: cout << "EVENT_LBUTTONDOWN" << endl; cout << "pos (" << x << "," << y << ")" << endl; mpos.x = x; mpos.y = y; bMouse = true; break; case EVENT_LBUTTONUP: cout << "EVENT_LBUTTONUP" << endl; break; case EVENT_RBUTTONDOWN: cout << "EVENT_RBUTTONDOWN" << endl; bMouse = true; break; } } 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 ); namedWindow("crop", 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); setMouseCallback("cam 1", CallBackFunc, NULL); Mat frame; Mat result; Mat tMat; Mat crop; double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; for(;;) { Point pt[2]; if(!cap.read(frame)) break; pt[0].x = 150; pt[0].y = 110; pt[1].x = pt[0].x + 20; pt[1].y = pt[0].y + 20; if(bMouse) { tMat = frame.clone(); crop = Mat(tMat, Rect(mpos.x - 10, mpos.y - 10, 20, 20)); imshow("crop", crop); } matchTemplate( frame, crop, result, CV_TM_SQDIFF ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchLoc = minLoc; cout << "matchLoc : " << matchLoc << endl; rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2); rectangle(frame, Point(mpos.x - 10, mpos.y - 10), Point(mpos.x + 10, mpos.y + 10), Scalar(0,0,255),2); rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2); #define SERVO_ANG 180 #define CAM_FOV 60 if(bMouse) { int tpos = getTrackbarPos("track 1", "cam 1"); // int value = tpos + (matchLoc.x - 160) * 3 * 2/ 100; // int value = tpos + (100 / (SERVO_ANG / CAM_FOV)) * (matchLoc.x / 320) ; int value = tpos + ((matchLoc.x - 160) * 60 / 3 / 320); cout << "---- calc : " << value << endl; setTrackbarPos("track 1", "cam 1", value); bMouse = false; } imshow("cam 1", frame); /* if(!cap2.read(frame)) break; rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2); matchTemplate( frame, crop, result, CV_TM_SQDIFF ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchLoc = minLoc; cout << "matchLoc : " << matchLoc << endl; rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2); imshow("cam 2", frame); */ if(waitKey(30) >= 0) break; } return 0; } |
두쪽 버전
$ cat cv.cpp
#include <opencv2/core/core.hpp> #include <opencv2/highgui/highgui.hpp> #include <opencv2/imgproc/imgproc.hpp> #include <iostream> #include <wiringPi.h> #define MIN_POS 30 #define MAX_POS 110 using namespace cv; using namespace std; bool bMouse = true; Point mpos(160,120); void CallBackFunc(int event, int x, int y, int flags, void* userdata) { switch(event) { default: break; case EVENT_LBUTTONDOWN: cout << "EVENT_LBUTTONDOWN" << endl; cout << "pos (" << x << "," << y << ")" << endl; mpos.x = x; mpos.y = y; bMouse = true; break; case EVENT_LBUTTONUP: cout << "EVENT_LBUTTONUP" << endl; break; case EVENT_RBUTTONDOWN: cout << "EVENT_RBUTTONDOWN" << endl; bMouse = true; break; } } 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 ); namedWindow("crop", 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); setMouseCallback("cam 1", CallBackFunc, NULL); Mat frame; Mat result; Mat tMat; Mat crop; double minVal; double maxVal; Point minLoc; Point maxLoc; Point matchLoc; for(;;) { Point pt[2]; if(!cap.read(frame)) break; pt[0].x = 150; pt[0].y = 110; pt[1].x = pt[0].x + 20; pt[1].y = pt[0].y + 20; if(bMouse) { tMat = frame.clone(); crop = Mat(tMat, Rect(mpos.x - 10, mpos.y - 10, 20, 20)); imshow("crop", crop); } matchTemplate( frame, crop, result, CV_TM_SQDIFF ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchLoc = minLoc; cout << "matchLoc : " << matchLoc << endl; rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2); rectangle(frame, Point(mpos.x - 10, mpos.y - 10), Point(mpos.x + 10, mpos.y + 10), Scalar(0,0,255),2); rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2); #define SERVO_ANG 180 #define CAM_FOV 60 if(bMouse) { int tpos = getTrackbarPos("track 1", "cam 1"); int value = tpos + ((matchLoc.x - 160) * 60 / 3 / 320); cout << "---- calc : " << value << endl; setTrackbarPos("track 1", "cam 1", value); } imshow("cam 1", frame); if(!cap2.read(frame)) break; rectangle(frame, pt[0], pt[1], Scalar(0,0,0),2); matchTemplate( frame, crop, result, CV_TM_SQDIFF ); normalize( result, result, 0, 1, NORM_MINMAX, -1, Mat() ); minMaxLoc( result, &minVal, &maxVal, &minLoc, &maxLoc, Mat() ); matchLoc = minLoc; cout << "matchLoc : " << matchLoc << endl; rectangle(frame, matchLoc, Point( matchLoc.x + 20 , matchLoc.y + 20 ), Scalar(0,255,0), 2); if(bMouse) { int tpos = getTrackbarPos("track 2", "cam 2"); int value = tpos + ((matchLoc.x - 160) * 60 / 3 / 320); cout << "---- calc : " << value << endl; setTrackbarPos("track 2", "cam 2", value); bMouse = false; } imshow("cam 2", frame); if(waitKey(30) >= 0) break; } return 0; } |
opencv 카메라 왜곡 수정 (0) | 2015.10.20 |
---|---|
opencv sift surf (0) | 2015.10.20 |
openCV + openMP 합치는게 잘 안되네? (0) | 2015.10.11 |
opencv 마우스 이벤트와 빠르게 그리기 (0) | 2015.10.05 |
opencv 마우스 이벤트 관련 2 (0) | 2015.10.05 |
playonlinux - 플레이온 리눅스 (0) | 2016.02.02 |
---|---|
hfs - HTTP file server (0) | 2015.11.23 |
라즈베리 파이 오디오 스트리밍 관련 문서 (0) | 2015.09.18 |
HelpNDoc (0) | 2015.07.29 |
goahead 웹 서버 (0) | 2015.07.19 |
[링크 : http://www-stud.uni-due.de/~sbadpras/...-in-daisy-chain-mode/] 소스코드
[링크 : https://learn.sparkfun.com/tutorials/serial-peripheral-interface-spi/slave-select-ss] SPI daisy chain
[링크 : http://www.st.com/.../application_note/DM00039787.pdf]
하나랑 통신할때는 비트 단위로 보낸다면...
Daisy chain 시에는 바이트 단위로 묶인 순서의 반대대로(먼 순서 부터) 보낸다.
[링크 : http://www.st.com/.../datasheet/CD00255075.pdf]
ti stellarisware에서 32bit 단위로 하면 최대 4대 까지 가능하려나?
어떻게 될지 모르겠네...
---
비교는 해봐야겠다.. 데이지 체인용으로 수정한 코드라는데..
[링크 : http://www.deathbylogic.com/2015/01/daisy-chaining-multiple-autodrivers/]
[링크 : https://github.com/DeathByLogic/L6470-AutoDriver/tree/daisy_chain]
바이폴라 / 유니폴라 - 전기적 결선 방법 (0) | 2015.11.04 |
---|---|
스테핑 모터 회로 구성 (0) | 2015.11.04 |
HS-311 원래 느린거였나.. (0) | 2015.07.01 |
보유중인 스테퍼 모터 칩들 (0) | 2015.06.22 |
스테핑 모터 정리 2 (0) | 2014.08.05 |