[42호]Outline CNC Plotter With ATmega128 & OpenCV
2016 ICT 융합 프로젝트 공모전 우수상
Outline CNC Plotter With ATmega128 & OpenCV
(Portable electrospinning device and fine fiber)
글 | 국민대학교 정구영
심사평
JK전자 PC용 제어 소프트웨어, 8비트 마이크로프로세서용 펌웨어, 완벽한 기계 파트까지 전체적으로 완성도가 높은 작품 입니다. 기술적으로도 이미 공개되어 있는 G-Code를 사용하지 않고, 자체적인 알고리즘을 개발한 노력이 엿보이네요. 하지만 이미 유사한 프로젝트가 많이 공개되어 있는 기능이고 창의성이 부족한 부분이 아쉽네요.
뉴티씨 실제로 CNC를 구현 완료하여 이를 통한 데모를 유튜브 등을 통하여 보여주고 있으며, 이를 모두 알고리즘으로 처리하여 실제로 구현한 점 등이 큰 점수를 받았다. 또한, 윈도우 소프트웨어 등도 모두 직접 구현하였으며, 기계적인 부분들도 모두 처리하였고, 두꺼운 선이나, 다양한 터치 방법 등도 매우 창의적으로 구현한 점 등이 높은 점수를 받았다. 창의성도 매우 좋고, 바로 시제품을 만들어서 실용적으로 판매도 할 수 있을 것으로 생각된다. 이 작품은 실제 구현이 완벽히 되었고, 기술성, 작품완성도, 작품성 등 대부분 최고 점수를 받았다.
칩센 킥스타터 등에서 본 듯하나, 학생들이 직접 이미지 외곽선 검출부터 제어까지 구현했다는 점에서 높은 평가를 주고 싶다.
위드로봇 단순히 X-Y 플로터가 아닌 윤곽선을 추출하는 부분까지 구현한 점이 전체 작품의 완성도를 끌어올리는 멋진 부분이라 생각합니다. YouTube에 올린 동영상으로 작품의 완성도가 높다는 것을 한 눈에 파악할 수 있어 좋았습니다. 전반적인 부분을 스스로의 힘으로 해결하였기에 실력 향상에 많은 도움이 되는 작품이었을 것으로 보입니다.
작품 개요 및 내용
· X, Y의 2축과 Z의 1축으로 구성된 8방향 정밀제어 평면 제도 플로터의 구현
· 윈도우즈 기반 프로그램과 플로터의 유선 연결을 통한 직접 지령 전달 및 양방향 통신의 구현
· C#과 OpenCV를 이용한 이미지 파일의 분석 및 픽셀 추적 알고리즘의 구현
본 작품은 직접적으로 외곽선을 그리게 될 하드웨어(프레임 및 마이크로 컨트롤러 ATmega128 펌웨어 제작)부문과 일반 그림파일의 픽셀을 분석, 추적하여 프린트 가능한 데이터로 변환해 주는 소프트웨어(윈도우즈 기반 C# 및 OpenCV 영상처리 개발)부문으로 나눠지게 되고, PC의 C# Windows Form 프로그램을 통해 특정 지령으로 변환된 외곽선 데이터를 전송받아 정확한 치수에 기반을 두어 펜으로 그림을 그려주는 기능을 가집니다.
개발 동기
본 프로젝트의 개발 동기는 하드웨어와 소프트웨어의 융합 개발에 그 의의를 두고 있습니다. 상기 본인이 소속한 국민대학교 전자공학부 학술동아리에서는 1년에 1회 개인 작품 제작을 통한 전시회를 개최하고 있습니다. 해당 전시회에서의 개인 전시를 위한 작품에 대해 생각하던 중, 그동안 배워왔던 아날로그 수동 소자들을 이용한 실제 전자회로의 설계, 그리고 C 언어 프로그래밍, 마이크로 컨트롤러를 이용한 임베디드 시스템의 설계 등을 응용한 좋은 작품이 없을까 고민을 하였습니다. 그 결과 하드웨어에만 치중하지 않는 하드웨어 – 소프트웨어 융합 개발에 대해 크게 흥미를 느꼈고 개인적으로 관심이 많았던 치수제어 분야와 복합적으로 개발할 수 있는 것을 찾아보았습니다. 그리고 머지않아 그 대상은 그리 먼 곳에 있지 않다는 것을 깨달았습니다. 그것은 바로 누구나가 사용하고 있는 일반 잉크젯 프린터였습니다.
본 개발의 핵심 알고리즘은 기존의 상용화된 G-CODE 알고리즘을 참조하지 않고 직접 구현을 통해 이루어졌으며, 하드웨어와 소프트웨어의 융합개발로 실제 치수에 기반을 둔 하드웨어 제작(물리적)과 프로그래밍에 기반을 둔 소프트웨어 제작(논리적)의 융합으로 개인 실력 향상에도 도움이 많이 되었다고 생각합니다.
개발 목적
CNC 머신은 우리 생활과 그리 먼 곳에 있지 않습니다. 전문적인 운용에 있어선 CNC 밀링(절삭)머신이나 3D프린터(적층) 등이 있으나, 우리가 평소에 사용하는 프린터 또한 컴퓨터 수치제어로 움직이는 하나의 CNC 머신입니다. 옛날에 PCB를 자작하기 위해서 에칭을 하는 과정 중 도선이 될 부분을 코팅시키기 위해 동판에 잉크를 전사시키는 작업이 필수로 행해졌는데, 이 과정에서 사용됐던 것이 레이저 프린터로 OHP 필름에 회로 패턴을 인쇄한 다음 다리미를 이용하여 동판에 인쇄물을 부착해서 잉크를 녹여 그대로 전사시키는 방법이었습니다. 패턴의 경우 펜으로 직접 그려도 상관이 없었으나, 정밀한 패턴의 경우 최대한의 패턴 정밀도를 유지하기 위해 전사방식을 사용하였던 것입니다. 하지만 그 과정을 한 번에 단축시킬 수 있는 것이 CNC를 이용한 패턴 직접 인쇄였습니다. CNC 제어로 동판에 직접 인쇄를 하면 정밀도를 유지하면서 전사시키는 과정이 필요가 없어지기 때문이지요. 물론 정확한 데이터를 바탕으로 머신을 움직여, 원하는 결과물을 얻는 과정은 매우 까다롭고 어렵습니다. 하지만 자동화 시스템을 완성하여 여러가지 입력 데이터에 대한 정확한 결과물을 얻는다면 작업시간이 단축되는 효과를 얻을 수 있습니다.
작품 설명
본 작품은 하드웨어 파트와 소프트웨어 파트로 나뉘어져 있습니다. 하드웨어 파트로는 알루미늄 프로파일을 이용한 플로터 프레임 제작과 ATmega128을 실장시킬 기판 제작, 그리고 전원공급을 위한 12V-5V 레귤레이팅 회로 제작, ATmega128로부터 출력을 담당할 포트의 모듈화(PCB 아트워크), 프레임을 뼈대로 한 Stepper Motor 2개의 X, Y축 운반시스템 장착 및 Motor 제어 알고리즘 개발 등이 있으며 소프트웨어 파트로는 PC의 윈도우즈 환경을 기반으로 한 C# Windows Form 프로그래밍을 이용하여 임의의 이미지파일을 불러와 OpenCV를 거쳐 외곽선을 출력하고, 출력된 외곽선을 분석, 픽셀 트래킹 알고리즘을 적용하여 개발된 플로터에서 인쇄할 수 있는 데이터로 변환하고 전송하는 기능까지가 되겠습니다.
주요 동작 및 특징
1) 하드웨어 동작 및 특징
하드웨어 제작의 경우 타 작품의 참고없이 프레임의 사이즈부터 도면 설계, 회로에 사용될 각종 소자들과 마이크로 컨트롤러의 선별, 모터드라이버와 모터의 선별 모두 직접 실시하였습니다. PCB기판 제작에는 만능기판을 사용하였으며 전원을 안정적으로 공급하기 위해 7805 정전압 회로를 구현하였고 축의 운반을 위해 2개의 Stepper Motor를 사용하였으며 각 축이 직각을 이루도록 Motor를 배치, 풀리와 타이밍 벨트를 사용하여 정밀한 제어가 가능하게 하였습니다. 모터제어의 경우 센서에 의한 피드백없이 개발하기 위해 1:1 제어가 가능한 Stepper 모터를 사용하였으며 중심점을 기준으로 8방향 제어를 완벽하게 구현하여 원이나 대각선, 포물선 등을 그릴 수 있게 되었습니다.
2) 소프트웨어 동작 및 특징
PC <-> ATmega128간의 양방향 통신을 구현하였으며 소프트웨어 상으로는 자동 픽셀 추적 알고리즘을 개발하여 출력된 외곽선을 (0, 0)에서 가장 가까운 지점을 찾아 지속적으로 추적, 데이터화 하였습니다. 실용화 되어있는 방식(G-Code)을 따르지 않고 독자적으로 개발한 제어 프로토콜을 따르고 있으며 피드백이 없는 제어방식이지만 비교적 높은 정확성을 보이고 있어 피드백 알고리즘을 구현하여 추가할 시 2D CNC 머신이 아닌 3D 정밀 절삭, 적층 머신까지도 본 알고리즘을 통하여 독자적으로 개발할 수 있을 것으로 생각합니다.
3) 동작 시나리오 – 시스템 아키텍처
4) 동작 시나리오
플로터를 제어할 컴퓨터 시스템에서는 이미지를 외곽선으로 변환한 후 직접 제작한 픽셀 추적 알고리즘을 통해 (0, 0)에서 제일 가까운 픽셀을 추적하여 기준점으로 삼고, 해당 픽셀에서부터 다음 픽셀을 추적하여 그 방향을 데이터화 하여 저장합니다. 최종적으로 남아있는 외곽선이 없으면 추적을 중단하게 되고 저장된 데이터를 바탕으로 ATmega128로 지령을 보냅니다. ATmega128에서는 받은 지령을 모터제어를 위한 PWM 파형으로 변환하는 해석기(interpreter)역할을 하며 모터드라이버로 PWM을 출력하는 역할을 합니다. 일정 데이터만큼 지령을 보내면 플로터를 제어할 컴퓨터 시스템으로 완수신호를 보내 그 다음으로 인쇄할 데이터를 요구합니다. 이미지 상에서 보이듯이, 피드백 시스템은 존재하지 않으며 1:1 대응의 제어 신호를 통해 X, Y축을 제어하게 됩니다. Z-축의 서보는 펜을 들었다 놓는 기능이 있으며 서로 떨어져 있는 픽셀을 감지하여 펜을 들었다가 픽셀이 시작되는 위치에서 다시 펜을 내려놓는 기능을 하게 됩니다.
전체 시스템 구성
1) 시스템 흐름 순서도
2) 소프트웨어 구성 및 처리 과정
3) 하드웨어 구성 및 처리 과정
4) 소프트웨어 세부 구성
소프트웨어는 C#와 OpenCV를 이용해 제작되었고 ATmega128과의 통신을 위해 시리얼 포트를 설정할 수 있으며 임의의 이미지파일을 불러와 외곽선을 추출합니다. 추출된 외곽선으로부터 영점을 기준으로 최단거리에 있는 픽셀을 다음 기준점으로 잡으며, 기준점으로부터 가장 가까이 있는 픽셀을 자동으로 추적합니다. 만약 추적 후 외곽선이 남아있다면 계속해서 추적을 하게 되며 남아있는 외곽선이 없다면 추적을 종료하게 됩니다. 픽셀 트래킹 알고리즘은 직접 개발하였으며 기준점을 중심으로 우선순위를 두어 주위 8방향에 존재하는 픽셀을 추적하게 됩니다. 만들어진 인쇄 데이터는 일정 간격으로 잘라 플로터로 전송합니다.
1. CNC 제어 프로그램 초기 실행 시 이미지를 불러오게 됩니다.
2. 불러온 이미지는 프로그램 좌상단에 표시가 되며 이미지의 크기는 제한이 없습니다.
3. 이미지를 불러온 후 “포트설정”을 클릭하여 Outline CNC Plotter와 통신할 포트를 설정합니다.
4. 포트와 연결합니다.
5. 포트와 연결되면 우상단의 작업창이 활성화 되며 하단의 메시지가 작업 가능으로 변경됩니다.
6. 프린트 할 그림의 이진화 Threshold를 정해주고 외곽선 버튼을 누릅니다.
7. OpenCV의 그레이스케일 ▶ 이진화 ▶ 케니엣지를 거쳐 외곽선을 추출하여 중앙에 출력합니다.
8. 출력된 외곽선을 보고 적당히 다듬어질 때 까지 Threshold를 조절하며 외곽선을 추출합니다.
9. 원하는 모양의 외곽선이 추출 되면 “픽셀체크” 버튼을 클릭합니다.
10. “픽셀체크” 버튼을 클릭하면 추출된 외곽선 데이터 중 좌상단(0, 0)으로부터 ‘가장 근접한 거리’에 있는 픽셀을 추적하게 되며 좌측 중앙에 X2+Y2의 거리 값이 표시되고 우측 텍스트박스에 Xvalue Yvalue X2+Y2가 표시됩니다. 좌측 하단에는 총 픽셀의 개수가 표시됩니다.
public int PixelAccess2(IplImage src)
{
int length = 1121000;
int xshort = 0;
int yshort = 0;
//byte* img = (byte*)src.ImageData;
for (int y = 0; y < 950; y++)
{
for (int x = 0; x < 1180; x++)
{
if (Cv.Get2D(src, y, x) == 0)
{
if (length > y * y + x * x)
{
length = y * y + x * x;
xshort = x;
yshort = y;
//img[(y) * 950 + x] = 255;
}
}
}
}
Cv.Set2D(result, yshort, xshort, 255);
Commandbox.Text += ” ” + xshort.ToString() + ” ” + yshort.ToString() + ” ” + length.ToString();
trackx = xshort;
tracky = yshort;
for (; xshort > 0; xshort–)
Fill_image_data(4);
for (; yshort > 0; yshort–)
Fill_image_data(2);
return length;
}
11. 거리추적의 경우 표시된 외곽선의 데이터(x, y)에 직접 접근하여 화면상에 표시되는 모든 픽셀을 스캔하고, 최종적으로 (0, 0)에서 가장 가까운 거리에 있는 픽셀만큼의 거리(xmin, ymin)를 저장합니다.
12. 저장된(xmin, ymin) 값을 기반으로 프로그램이 자동적으로 데이터를 플로터에 내릴 지령으로 변환합니다.
13. 첫 픽셀을 추적한 후 그 다음으로, 8방향 중 최소 한 방향으로 이어진 하나의 픽셀을 추적하는 “다음픽셀” 과 더 이상 이어진 픽셀이 없을 경우 끊겨진 지점에서 최소거리에 있는 픽셀을 자동으로 추적하는 “최소거리” 기능을 사용하여 픽셀을 계속 추적합니다.
14. “추적전송” 버튼의 경우 “다음픽셀” 기능을 더 이상 이어지지 않는 구간까지 자동반복 합니다.
15. 픽셀추적의 경우 Raster식 이미지는 도트로 이루어져있다는 점으로부터 착안하였으며 모터제어의 8방향 제어와 부합하는 알고리즘을 구상하였습니다.
16. 모든 도트는 중심점(x, y)을 기준으로 8방향 내에서 정의가 되며 추적된 결과 값을 제어문으로 변환 후 데이터로 저장하여 반환합니다.
17. 저장된(xdir, ydir) 값을 기반으로 프로그램이 자동적으로 데이터를 플로터에 내릴 지령으로 변환합니다.
18. 외곽선 픽셀이 성공적으로 추적됨에 따라 자동적으로 추적된 픽셀은 0(Zero Fill)으로 바뀌며, 모든 픽셀의 추적이 완료되면 외곽선 픽셀은 모두 사라지게 되고 좌측 중앙에 모든 구간에서 픽셀이 발견되지 않아 이미지의 X2width + y2height 값이 출력되게 됩니다.
19. 모든 픽셀을 추적하여 추출된 외곽선이 남아있지 않게 되면, 자동적으로 C# Windows Form 프로그램은 마지막 픽셀 값인 (Xnow, Ynow)값을 기반으로 프로그램이 자동적으로 펜을 다시 원점(0, 0)으로 되돌리는 데이터를 플로터에 내릴 지령으로 변환합니다.
20. 인쇄 버튼을 클릭하면 초기에 연결한 포트를 통해 Outline CNC Plotter로 데이터를 전송합니다.
21. Outline CNC Plotter의 ATmega128과 UART 양방향 통신을 통해 C# Windows Form 프로그램에서 인쇄 지령 데이터를 전송하게 되며, 역방향으로 ATmega128에서는 일정 구간의 데이터를 인쇄 완료했다는 완수신호를 보내게 됩니다.
22. C# Windows Form 프로그램에 저장된 인쇄 데이터는 모든 지령을 담고 있어 8bit-Processor인 ATmega128은 한 번에 많은 양의 데이터를 받을 수 없으므로 일정 구간의 데이터를 보내게 되며, Polling 방식의 자동화 시스템에서 착안하여 일정 구간 데이터의 처리를 완료하면 Master에게 완수신호를 보내어 그 다음으로 처리해야 할 Data를 받는 형식의 프로토콜을 가지고 있습니다.
void EventDataReceived(object sender, SerialDataReceivedEventArgs e)
{
//if (printdata[processing] == 0)
//return;
byte[] buff = new byte[1];
serialPort1.Read(buff, 0, 1);
if (Convert.ToChar(buff[0]) == ‘l’)
{
serialPort1.Write(“r”);
for (int temp = 0; temp < 1024; temp++)
{
//serialPort1.Write(PixelAccess3(result).ToString());
serialPort1.Write(printdata[processing + temp].ToString());
//Commandbox.Text += printdata[processing + temp].ToString();
}
processing += 1024;
serialPort1.Write(“p”);
}
}
23. 좌측은 프로그램 내부의 통신 이벤트 핸들러 함수입니다. 데이터의 보냄과 요청이 Interrupt에 의해 이루어지며, 한 번에 1024개의 지령이 전송되는 것을 볼 수 있습니다. 이는 픽셀 1024개만큼의 8방향 제어 지령 데이터가 ATmega128이 완수신호를 보낼 때 마다 자동으로 그 다음 데이터를 보내는 것을 의미합니다. 결과적으로 인쇄버튼 클릭 후 Outline CNC Plotter가 인쇄를 끝낼 때까지의 모든 과정이 자동적으로 이루어지는 것을 말합니다.
5) 하드웨어 세부 구성
Outline CNC Plotter의 하드웨어는 전송된 데이터를 바탕으로 ATmega128에서 8방향 제어 알고리즘을 통해 모터를 구동하게 됩니다.
1. 2개의 Stepper Motor(NEWTC SE-SM243 Stepper Motor)을 X, Y축으로 구성하였습니다.
2. Stepper Motor를 제어하기 위해 NEWTC AM-CS2(P) Stepping Motor Driver를 사용하였습니다.
3. 펜의 상승, 하강을 제어하는 1개의 Z축을 HS-422 Servo Motor로 구성하였습니다.
4. LM7805를 이용한 5V 정전압 출력 회로 및 ATmega128 회로를 제작하였으며 2개의 STEP 모터 구동을 위한 GPIO의 소켓을 장착하고 1개의 Servo 모터 출력을 지원하며 6개의 인터럽트 스위치를 장착하였습니다.
5. PC와의 양방향 통신을 위해 UART 시리얼 통신을 구현하고, 지령의 해석을 통한 하드웨어의 직접 제어를 위해 8방향 제어 알고리즘을 구현하여 정밀도를 최대화 합니다.
하드웨어 및 소프트웨어 개발 환경
하드웨어 개발 환경
· AVR Studio Version 4.17
· WinAVR – 20100110
· ATmega128 * 1
· Windows 7(64bit)
소프트웨어 개발 환경
· Microsoft Visual Studio 2010
· C# Winform, OpenCV Sharp
· Windows 7(64bit)
하드웨어 제작 과정
하드웨어 제작 환경
· 원가절감 및 제작편의성 고려, 알루미늄 프로파일사용 하드웨어 프레임 제작
· 전원공급 회로 기판 제작 및 ATmega128 실장, GPIO 및 각종 입출력 회로 제작
· AVR ATmega128을 이용한 Stepper Motor PWM 제어 및 유선 UART 통신 구현
하드웨어 프레임 제작
· 알루미늄 프로파일 프레임 제작 및 구조물 장착
· 도면작성 후 알루미늄 프로파일 발주 및 재단 의뢰
프레임은 알루미늄 프로파일을 도면대로 재단하여 만들어졌습니다. 축 운반 시스템은 원가절감을 위해 책상 레일을 롤러로 사용하였으며, 모터의 회전을 동력으로 이용하기 위해 모터에 풀리와 타이밍 벨트를 달아 정밀한 제어가 가능하도록 하였습니다. 하판은 아크릴로 제작되어 인쇄될 대상을 지지해주고 있습니다.
· 각 축 Stepper Motor 선별 및 구동 확인
· 풀리 및 타이밍 벨트 장착, 운반 점검
하드웨어 기판 제작
· ATmega128 장착을 위한 컨트롤러 기판 제작
· MCU 및 스위치, 서보모터를 위한 정전압 회로 설계
· I/O 소켓 배치 및 만능기판 납땜, 최종 조립
Stepper Motor 선별 및 Motor Driver, ATmega128 PWM 출력 테스트 |
ATmega128 펌웨어 개발
· ATmega128기반의 Stepper Motor제어 펌웨어 개발
· Interrupt, UART통신을 이용한 PC와의 양방향 통신 실시
· Stepper Motor X, Y축 동시제어(대각선 제어) 방법 연구 및 Servo Motor Z축 제어
· Stepper Motor X, Y축 동시제어(대각선 제어) 방법 연구 및 Servo Motor Z축 제어
소프트웨어 제작 과정
소프트웨어 제작 환경
· Windows 기반 Outline CNC Plotter 제어 C# Windows Form 프로그램 개발
· PC <-> ATmega128 양방향 UART 시리얼 통신 구현 및 프로토콜 정의
· OpenCV를 이용한 이미지 외곽선 검출 및 이미지 픽셀 직접 제어를 통한 픽셀 추적 알고리즘 작성
Windows 기반 C# Windows Form 프로그램 개발
1. 소프트웨어는 UART 시리얼통신 프로그램과 영상처리 프로그램을 따로 제작한 후 통합하였습니다.
2. 1차적으로 ATmega128과의 UART 통신을 테스트하기 위한 프로그램을 제작하였습니다.
3. UART 단방향 통신(PC ▶ ATmega128) 프로그램을 제작하여 모터제어를 테스트하였습니다.
위는 최초 제작된 프로그램이며 #1의 넘버링을 가지고 있습니다. ATmega128 과의 UART 시리얼 통신을 위해 제작되었으며 ATmega128의 펌웨어와 연동하여 특정 LED를 OFF하거나 ON하고 모터를 움직여 축을 전개 혹은 축소할 수 있는 지령을 전달하는 기능이 있습니다. 또한 펌웨어로 미리 정의되어 있는 기능(지그재그)을 클릭하면 Outline CNC Plotter의 축이 자동적으로 움직여 지그재그로 선을 그려주는 기능이 시작됩니다. 이 기능은 모터의 직접 제어에서 오는 오차를 측정하기 위해 반복적으로 왕복운동을 하는 기능입니다. 스텝모터의 경우 1 Step당 움직이는 각이 정해져 있어 1방향 단순 제어가 용이합니다.
4. 펌웨어 제작과 동시에 모터제어 테스트를 진행하여 축 제어 속도 및 적정 토크를 찾아 정합니다.
2) Windows 기반 C# Windows Form 프로그램 개발
3) 양방향 UART 시리얼 통신 구현 및 프로토콜 정의
ISR(USART0_RX_vect)
{
j = 0;
receive = 1;
data = UDR0;
if (data != ‘p’ && data != ‘o’ && data != ‘r’)
{
if (serial_count < 256)
{
serialdata[serial_count] = data;
serial_count++;
}
else if (serial_count >= 256 && serial_count < 512)
{
serialdata2[serial_count-(256)] = data;
serial_count++;
}
else if (serial_count >= 512 && serial_count < 768)
{
serialdata3[serial_count-(512)] = data;
serial_count++;
}
else if (serial_count >= 768 && serial_count < 1024)
{
serialdata4[serial_count-(768)] = data;
serial_count++;
}
if (serial_count == SERIALSIZE)
serial_count = 0;
}
}
unsigned char get_data(void)
{
while(!(UCSR0A&0×80)); // 수신완료될때까지 대기
return UDR0;
}
void send_data(unsigned char data)
{
while(!(UCSR0A&0×20)); // 송신데이터를 받을 준비가 될 때까지 대기
UDR0 = data;
}
UCSR0A = 0×00; // ready flag clear
UCSR0B = 0×98; // rx, tx enable
UCSR0C = 0×06; // tx data len : 8bit
UBRR0H = 0;
UBRR0L = 103; // boudrate 9600
AVR코드소스 : 데이터 수신 인터럽트 및 USART 레지스터 설정
1. 일부 문자를 제어문자로 지정하고(인쇄, 리셋, 데이터 재전송)그 이외의 문자를 지령으로 받습니다.
2. PC의 C# Windows Form 프로그램에서 받은 데이터를 완수하면 완수신호를 지정하여 전송합니다.
3. 최종적으로 C# Windows Form 프로그램과 ATmega128간 양방향 통신이 완성됩니다.
4) 이미지 처리 프로그램 제작
· OpenCV를 활용한 이미지 이진화 및 케니엣지 외곽선 검출
· 픽셀간 최소거리 및 연속 픽셀 추적 알고리즘 구현
public int PixelAccess3(IplImage src) // 픽셀 추적하는 알고리즘
{
if (Cv.Get2D(src, tracky – 1, trackx) == 0) // 위로한칸
{
//Commandbox.Text += “8″;
Cv.Set2D(result, tracky – 1, trackx, 255);
tracky = tracky – 1;
return 8;
}
else if (Cv.Get2D(src, tracky – 1, trackx + 1) == 0) // 위로, 우로한칸
{
//Commandbox.Text += “7″;
Cv.Set2D(result, tracky – 1, trackx + 1, 255);
Cv.Set2D(result, tracky, trackx + 1, 255);
tracky = tracky – 1;
trackx = trackx + 1;
return 7;
}
else if (Cv.Get2D(src, tracky, trackx + 1) == 0) // 우로한칸
{
//Commandbox.Text += “4″;
Cv.Set2D(result, tracky, trackx + 1, 255);
trackx = trackx + 1;
return 4;
}
else if (Cv.Get2D(src, tracky + 1, trackx) == 0) // 아래로한칸
{
//Commandbox.Text += “2″;
Cv.Set2D(result, tracky + 1, trackx, 255);
tracky = tracky + 1;
return 2;
}
else if (Cv.Get2D(src, tracky + 1, trackx + 1) == 0) // 우측 아래로 한칸
{
//Commandbox.Text += “1″;
Cv.Set2D(result, tracky + 1, trackx + 1, 255);
Cv.Set2D(result, tracky, trackx + 1, 255);
tracky = tracky + 1;
trackx = trackx + 1;
return 1;
}
else if (Cv.Get2D(src, tracky – 1, trackx – 1) == 0) // 좌측 위로 한칸
{
//Commandbox.Text += “9″;
Cv.Set2D(result, tracky – 1, trackx – 1, 255);
Cv.Set2D(result, tracky, trackx – 1, 255);
tracky = tracky – 1;
trackx = trackx – 1;
return 9;
}
else if (Cv.Get2D(src, tracky, trackx – 1) == 0) // 좌로한칸
{
//Commandbox.Text += “6″;
Cv.Set2D(result, tracky, trackx – 1, 255);
trackx = trackx – 1;
return 6;
}
else if (Cv.Get2D(src, tracky + 1, trackx – 1) == 0) // 좌측 아래로 한칸
{
//Commandbox.Text += “3″;
Cv.Set2D(result, tracky + 1, trackx – 1, 255);
Cv.Set2D(result, tracky, trackx – 1, 255);
tracky = tracky + 1;
trackx = trackx – 1;
return 3;
}
else
{
//Commandbox.Text += “5″;
return 5;
}
}
C# 소스코드 : 8방향 픽셀 추적 소스코드
조건이 True인 반복문에서, 픽셀 추적 중 중단점에 봉착시 특정 값을 반환하며 Break됩니다.
5) 프로그램 통합
· UART 양방향 통신 프로그램과 OpenCV 이미치 처리 프로그램 통합
기타 사항
1) 회로도
2) 참고문헌
· [ITC] AVR ATmega128 마이크로컨트롤러 – 프로그래밍과 인터페이싱
· NEWTC Stepper Motor 구동모듈 (CS2P) Spec 페이지(http://www.newtc.co.kr/dpshop/shop/item.php?it_id=1314666703)
· NEWTC Stepper Motor (SE-SM243) Spec 페이지(http://www.newtc.co.kr/dpshop/shop/item.php?it_id=1314664246)
· ATmel ATmega128 Datasheet 페이지(http://www.atmel.com/images/doc2467.pdf)
3) 시연영상
https://www.youtube.com/watch?v=xquj91EeptA
https://www.youtube.com/watch?v=r8UjbZxuiPQ
https://www.youtube.com/watch?v=0zRe_e5YE6g