본문 영역

개발2017. 4. 6. 19:10



그림을 그리다보면 캔버스를 돌려서 써야되는 경우가 간간히 생깁니다

집에 굴러다니던 아두이노로 만들어봅시다






시작에 앞서 클립스튜디오에 회전단축키는 -과 ^입니다

^키는 한국키보드 기준으로 숫자6에 시프트키를 조합해야나오는 조합이죠

어째서 단축키 배열이 왜저러나했더니


클립스튜디오는 일본프로그램입니다

당연히 만들때도 자국을 기준으로 했을것

한국 키보드에서 - =를 가르키는곳이

일본 키보드에서는 - ^를 가르킵니다


그러므로 일단 바꾸고 시작합시다




파일(F) -> 단축 키 설정(H)...




표시 -> 회전/반전 -> 오른쪽 회전

선택후 우측에 단축 키 추가로

=를 추가해줍시다 하지만 화면상에는 ;(세미콜론)으로 나올텐데

일본으로 기준잡혀있다보니 부작용인것같습니다 작동은 잘됩니다



이제 다음은 하드웨어입니다






아두이노우노(R3) (구입처) + USB B타입 케이블 (구입처)

로터리엔코더(EC12E24204A9) (구입처)

노브 - 일반형 (구입처)

브레드보드(빵판) (구입처)

점퍼선 (구입처)



이글을 쓴 시점으로 주인장은 노브만 구매했습니다

있던거 쓰는것이라 옆에 구입처들은 검색해서 잡히는것으로 넣어뒀습니다

이글을 찾아들어오신분들은 아마 노브랑 로터리엔코더 말고는 있을거라 생각됩니다







배치는 저렇게


로터리엔코더에 좌우 쇠부분을 힘으로 벌려버리고

꽂으시면 중간턱부분에 잘걸립니다

글루건으로 고정까지해주면 퍼펙트


자 이제 아두이노에 업로드할 소스





제 소스는 encoder 라이브러리를 필요로 요구합니다



스케치 -> 라이브러리 포함하기 -> 라이브러리 관리...

까지 가셔서


타입은 All, 토픽 All, 필터창에는 encoder 입력하시면

3번째줄쯤에 Paul Stoffregen에서 만든 Encoder라이브러리 있습니다

선택 한번하고 버전은 높은걸로 설치



아두이노

#include 

Encoder nov(2, 3);

void setup() {
  Serial.begin(9600);
}
long nlp = -999;

void loop() {
  long newLeft;
  newLeft = nov.read();

  if (newLeft/4 != nlp/4)
  {
    if (newLeft/4 > nlp/4)
    {
      //Serial.println("R");
      Serial.write("R");
    }
    else
    {
    //Serial.println("L");
     Serial.write("L");
    }
    nlp = newLeft;
  }
  delay(1);
}





32번째줄에 </encoder.h>는 지워주세요


우노는 아두이노 레오나르도 처럼 바로 키입력을 넣어줄수있는 라이브러리가 없습니다

그래서 시리얼통신으로 값넘겨서 다른프로그램에서 처리해줄겁니다

아두이노 역활은 여기서 끝, 기기로 컴파일후 업로드해줍시다


비주얼스튜디오를 키고 C#프로젝트 하나만듭시다




레이아웃은 대충 요렇게

이름은 그대로 썼으니 위부터 

textBox1, textBox2, button1


serialPort는 좌측 도구상자에서 한번 끌어와서 추가 해줘야합니다


C#

using System;
using System.Collections.Generic;
using System.ComponentModel;
using System.Data;
using System.Drawing;
using System.Linq;
using System.Text;
using System.Threading.Tasks;
using System.Windows.Forms;
using System.Runtime.InteropServices;
using System.IO.Ports;




namespace serialportKEY
{
    
    public partial class Form1 : Form
    {
        [DllImport("user32.dll")]
        public static extern void keybd_event(uint vk, uint scan, uint flags, uint extraInfo);

        [DllImport("user32.dll")]
        private static extern uint MapVirtualKey(int wCode, int wMapType);
        SerialPort sp;

        public Form1()
        {
            InitializeComponent();
        }

        private void Form1_Load(object sender, EventArgs e)
        {
            textBox1.Text = "COM6";
            textBox2.Text = "9600";


        }

        private void button1_Click(object sender, EventArgs e)
        {
            try
            {
                if (null == sp)
                {
                    sp = new SerialPort();
                    sp.DataReceived += new SerialDataReceivedEventHandler(sp_DataReceived);


                    sp.PortName = textBox1.Text.ToString();
                    sp.BaudRate = Convert.ToInt32(textBox2.Text);
                    sp.DataBits = (int)8;
                    sp.StopBits = StopBits.One;
                    sp.ReadTimeout = (int)500;
                    sp.WriteTimeout = (int)500;
                    sp.Open();
                }
                if (sp.IsOpen)
                {
                    MessageBox.Show("연결성공");
                }
            }
            catch (System.Exception ex)
            {
                MessageBox.Show(ex.Message);
            }
        }

        void sp_DataReceived(object sender, SerialDataReceivedEventArgs e)
        {
            int intRecSize = sp.BytesToRead;

            if (intRecSize != 0)
            {

                
                byte[] buff = new byte[intRecSize];
                sp.Read(buff, 0, intRecSize);
                
                for (int iTemp = 0; iTemp < intRecSize; iTemp++)
                {
                    if(buff[iTemp] == 0x52)
                    {
                        //MessageBox.Show("R");
                        keybd_event(0xbb, 0, 0x00, 0);
                        keybd_event(0xbb, 0, 0x02, 0);
                    }
                    else if(buff[iTemp] == 0x4C)
                    {
                        //MessageBox.Show("L");
                        keybd_event(0xbd, 0, 0x00, 0);
                        keybd_event(0xbd, 0, 0x02, 0);
                    }
                }

            }
        }

        private void Form1_FormClosed(object sender, FormClosedEventArgs e)
        {
            if(null != sp)
            {
                if(sp.IsOpen)
                {
                    sp.Close();
                    sp.Dispose();
                    sp = null;
                }
            }
        }
      
    }
}




중간쯤 Form1_Load에서

COM6은 각자 아두이노 포트로 바꿔주세요

아까 아두이노 소스 업로드하실때 우측아래 포트번호 적혀있습니다

장치 관리자로 가셔서 찾으셔도되고요



serialportKEY.zip

컴파일 해둔것 올려뒀습니다.

넷프레임워크 요구하면 4.5.2 설치하세요

첨부파일내 파일로 진행하시는분은

키시면 기본이 COM6, 9600으로되어있습니다

9600은 냅두고 COM6부분만 수정하시고 시작 누르세요



프로젝트자체를 포함한 풀소스는 깃허브쪽에 업로드해뒀습니다

https://github.com/dansunmi/CLSrotationtool






작동이 잘되는지 확인하러 클립스튜디오로 가서 돌려봅시다




잘되네요 굿굿


이 뒤에 하실작업은 글루건으로 적당히 잘 고정하시면됩니다




소스코드 도움

시리얼통신 http://son10001.blogspot.kr/2015/07/c-winfrom.html
키보드 신호입력 http://11cc.tistory.com/21




작성자

account_circle
단순미

댓글 영역