개발자 노트
[M.Diary]CNC Coil Winding Machine [3]
[M.Diary] 세번째 시간입니다.
이번시간에는 VB.NET 제어프로그램 작성에 대해 알아보겠습니다.
아래 사진이 http://www.cncdudez.co.uk애 공개되어있는 프로그램입니다.
가장간단한 기능만 구현되어있는데요 간략하게 설명하자면
PIC16F2550에 11Byte의 데이터를 보내고 2Byte의 데이터를 응답받습니다.
1번째 바이트는 각축(X,Y,Z)에 대한 [방향]과 [이동]에 대한 설정 비트 입니다.
2,3,4 바이트는 [X-Axis]에 대한 기본 펄스값으로 1mm를 이동하기 위해 스텝모터에 인가해 주어야 하는 펄스 값입니다.
5,6,7 바이트는 [Y-Axis]에 대한 기본 펄스값으로 1mm를 이동하기 위해 스텝모터에 인가해 주어야 하는 펄스 값입니다.
8,9 바이트는 [Z-Axis]에 대한 기본 펄스값으로 1mm를 이동하기 위해 스텝모터에 인가해 주어야 하는 펄스 값입니다.
10,11 바이트는 펄스 길이에 관한 Delay값입니다.
이데이터를 USB 연결된 PIC16F2550에 데이터를 send 하게 되면 컨트롤러에 연결된 각축을 제어 할수 있게 되는거죠
먼저 공개 프로그램에보면 아래 사진에 Calculate버튼을 누르면
바이트 별로 입력해준 셋팅값을 계산하여 아래에 텍스트 박스에 11Byte의 데이터 형으로 만들어 줍니다
그리고 send버튼을 누르면 이데이터를 컨트롤러에 보내게 되죠
이때 앞서 기구설계에서 설명했던 스텝모터의 선정과 볼스크류의 리드 값에 맞춰 각축에 펄스값을 잘셋팅해 주어야 하는데요
예를 들자면 스텝모터의 스텝각이 1.8도 이면 360도를 회전하기 위해서는
360/1.8=200 에서 200펄스가 나옵니다.
이 펄스값을 볼스크류의 리드가 5라면 360도 회전했을때 5mm 이동하는 것이므로
200/5=40 의 식에 의해 40펄스를 주면 1mm를 이동하게 됩니다.
마이크로 스텝의 경우는 각각의 분해능에 맞추어 펄스값을 계산해 주면 좀더 정밀한 움직임을 가지게 되구요.
아무튼 요렇게 값을 셋팅해주면 각축을 제어할수 있게 됩니다.
기본적인 프로그램에 대한 동작이해는 되셨을텐데요
그럼 본격적으로 소스 코드를 살펴 보겠습니다.
아래 소스코드가 send버튼을 눌렀을때 실행되는 코드입니다.
BufferOut(1) = Val(byte1value.Text) 요런 부분이 반복되는 걸 보실수 있는데요
BufferOut(1)이 첫번째 데이터 바이트,2번이 2번 3번이 3번의 순으로 컨트롤러에 보내게될 데이터 버퍼입니다.
Val(byte1value.Text) 이부분은 앞서 입력했던 각각의 바이트에 대한 값들로 Calculate버튼을 눌렀을때 계산되게 되죠
그리고 바로 요부분 hidWriteEx(VendorID, ProductID, BufferOut(0))가 직접적으로 USB를 통해 데이터를 쏘게 되는 부분입니다.
이부분소스를 찾아가보면 쓰레드로 작성되어있는데요 이미잘(?) 구현된부분이라 특별히 수정하지 않고 이용만 하면됩니다.
그럼 먼저 각축을 1mm씩 움직일수 있도록 코딩을 한번 해봐야겠죠?
먼저 아래 그림처럼 버튼을 만들어 줍니다.
그리고 아래 처럼 코딩을 했습니다.
check_box_scan(0) 요런 함수를 만들어서 첫번째 바이트의 각축의 [방향] 및 [이동]에 대한 바이트 계산 함수를 만들어 줬습니다.
함수의 내용은 아래 와 같습니다.
아무튼 요렇게 해서 1번째 Byte인 [방향]과 [이동]설정을 해주었습니다
그 다음의 Byte 2,3,4 부분이 X축에 보낼 펄스값을 계산해주는 부분입니다.
'Convert data for Byte 2,3,4
binaryresult1.Text = (DecToBin(Val(xpulses.Text)).ToString.PadLeft(24, "0"))
byte2 = BinToDec(Val(Mid$(binaryresult1.Text, 1, 8)))
byte3 = BinToDec(Val(Mid$(binaryresult1.Text, 9, 8)))
byte4 = BinToDec(Val(Mid$(binaryresult1.Text, 17, 8)))
xaxis_2b = Val(byte2)
xaxis_3b = Val(byte3)
xaxis_4b = Val(byte4)
그다음 코드는 10,11번 바이트 값으로 텍스트 박스에 입력해준 펄스폭 딜레이 값을 읽어와 버퍼에 저장하는 부분입니다.
'Convert data for Byte 10,11
binaryresult4.Text = (DecToBin(Val(pw.Text)).ToString.PadLeft(16, "0"))
byte10 = BinToDec(Val(Mid$(binaryresult4.Text, 1, 8)))
byte11 = BinToDec(Val(Mid$(binaryresult4.Text, 9, 8)))
pulse_10b = Val(byte10)
pulse_11b = Val(byte11)
이부분은 코드 그대로 X축만 이동해야 하기에 제로값(0)으로 버퍼를 채워 줍니다.
yaxis_5b = zero_b
yaxis_6b = zero_b
yaxis_7b = zero_b
zaxis_8b = zero_b
zaxis_9b = zero_b
그리고 앞서 send 버튼을 눌렀을때 실행되는 코드를 아래처럼 코딩해 주었습니다.
BufferOut(0) = 0
BufferOut(1) = Val(byte1value.Text)
BufferOut(2) = xaxis_2b
BufferOut(3) = xaxis_3b
BufferOut(4) = xaxis_4b
BufferOut(5) = yaxis_5b
BufferOut(6) = yaxis_6b
BufferOut(7) = yaxis_7b
BufferOut(8) = zaxis_8b
BufferOut(9) = zaxis_9b
BufferOut(10) = Val(byte10)
BufferOut(11) = Val(byte11)
' write the data (don't forget, pass the whole array)...
hidWriteEx(VendorID, ProductID, BufferOut(0))
요렇게 코딩해 주면 X축을 +방향으로 1mm이동하는 코드가 완성 되죠
그다지 어렵지 않게 1축을 제어에 성공 했습니다~!!!
이제 기본적인 구동에 성공했으니 다음시간엔 요걸 좀더 응용해서
코일 권선을 하려면 어덯게 해야 할지 알아보도록 하겠씁니다
그럼 다음시간에 만나요~^^