이번시간에는 요청이 많이 들어왔던 문제를 해결하고자 합니다.


사람들이 아두이노를 쓰는 이유에는 여러가지가 있겠지만,

주된 이유중에 하나는 


DAQ (Data Acquisition)


즉 신호 수집을 위해서 사용하는 목적으로 사용합니다.


각종 센서에서 나온 디지털신호나, 아날로그 신호들을 아두이노로 받아와서

PC에서 후처리를 하여 결과를 보는 것이죠~


이러한 구성을 하기위해 가장 필요한 것이 바로

플롯팅 (Plotting)입니다.


실시간으로 들어오는 정보들을 확인하면서 어떤 신호가 들어오는지,

어떤 식으로 데이터를 처리해야 할지를

아두이노 내부에서 처리하는 것이 아니라

PC를 통해 처리하는 것이지요.


이러한 구성을 위해서는 PC와 아두이노간의 


시리얼 통신 (Serial Communication)


을 통해 정보를 주고받아야 합니다.



#1. 아두이노 코딩


우선 아두이노에서 컴퓨터로 어떤 데이터를 전송할지,

어떻게 전송할지를 설정합니다.


여기서는 아날로그 신호의 데이터를

Serial.println(data);

를 통해 매 데이터를 던져줍니다.


  1. /*
      AnalogReadSerial
      Reads an analog input on pin 0, prints the result to the serial monitor.
      Graphical representation is available using serial plotter (Tools > Serial Plotter menu)
      Attach the center pin of a potentiometer to pin A0, and the outside pins to +5V and ground.

      This example code is in the public domain.
    */

    // the setup routine runs once when you press reset:
    void setup() {
      // initialize serial communication at 9600 bits per second:
      Serial.begin(9600);
    }

    // the loop routine runs over and over again forever:
    void loop() {
      // read the input on analog pin 0:
      int sensorValue = analogRead(A0);
      // print out the value you read:
      Serial.println(sensorValue);
      delay(1);        // delay in between reads for stability
    }


위 코드는 아래 예제코드와 동일합니다~




자 그럼 여기서 어떤 신호가 나오는지 보려면 어떻게 해야할까요?


아두이노가 업데이트 되면서 시리얼 플로터 라는 기능을 제공하게 되었습니다~




도구 메뉴에서 툴 -> 시리얼 플로터 를 클릭하시고 

보드레이트(Baud rate, 통신속도) 를 코딩과 동일하게 설정하시면


위와 같이 실시간으로 데이터를 볼 수 있게 된답니다.


하지만 아무래도 제공되는 툴이다 보니 자유롭게 변형하거나,

데이터를 처리하기가 자유롭지 않죠,,


그래서 이번엔 프로세싱을 이용해서 그래프를 그려보겠습니다.



#2 프로세싱 코딩



프로세싱은 생소하신 분들이 많을텐데, 주로 아두이노와 같이 사용하는 툴이랍니다.


UI가 아두이노와 상당히 유사하게 되어있어 맘이 좀 편하기도(?) 할거에요~


프로세싱을 실행하시고 아래 코드를 넣어주세요~!


import processing.serial.*;

Serial myPort;        // The serial port
int xPos = 1;         // horizontal position of the graph
float inByte = 0;
float pre_data = 0;

void setup () {
  // set the window size:
  size(400, 300);

  // List all the available serial ports
  // if using Processing 2.1 or later, use Serial.printArray()
  println(Serial.list());

  // I know that the second port in the serial list on my PC
  // is always my  Arduino, so I open Serial.list()[1].
  // (if first, type Serial.list()[0]).
  // Open whatever port is the one you're using.
  myPort = new Serial(this, Serial.list()[1], 9600);

  // don't generate a serialEvent() unless you get a newline character:
  myPort.bufferUntil('\n');

  // set inital background:
  background(0);
}
void draw () {
  // draw the line:
  stroke(127, 34, 255);
  line(xPos, height-pre_data, xPos, height - inByte);

  // at the edge of the screen, go back to the beginning:
  if (xPos >= width) {
    xPos = 0;
    background(0);
  } else {
    // increment the horizontal position:
    xPos++;
  }
  pre_data = inByte;
}


void serialEvent (Serial myPort) {
  // get the ASCII string:
  String inString = myPort.readStringUntil('\n');

  if (inString != null) {
    // trim off any whitespace:
    inString = trim(inString);
    // convert to an int and map to the screen height:
    inByte = float(inString);
    println(inByte);
    inByte = map(inByte, 0, 1023, 0, height);
  }
}


자 코드를 복붙한다음에 아래 순서에 따라 조금 바꿔줍시다.




1. 먼저 코드를 실행한 뒤, 아래 콘솔창에 뜨는 포트넘버를 기억해둡니다.

아두이노에서 포트넘버를 알 수 있으시죠?


2. 포트넘버가 안나오거나 이상한 문자가 나온다면 2번 박스에서

보드레이트를 9600이 아닌, 아두이노에서 코딩한 숫자와 동일하게 입력해줍니다.


3. 지금 제 경우에는 COM3이 두번째 포트이므로 1을 입력합니다.

만일 COM1이 아두이노 포트라면 0 을 입력해야겠지요? 



그렇게 제대로 입력하고나면 왼쪽과 같이 그래프가 그려지게 됩니다.



그 후에 받아진 데이터를 어떻게 처리할지는 위 코드를 기반으로 해서

작업하시면 됩니다~!



궁금한점이 있으시다면 언제든 댓글 달아주세요~^^



이번 시간에는 조이스틱으로 서보모터의 각도를 조절해보도록 하겠습니다~


# 준비물


조이스틱 모듈, 서보모터, 아두이노



먼저 모터에는 구동방식에 따라 DC모터, 스텝모터, BLDC모터, 서보모터 등으로 나뉩니다.

그 중에서 서보모터(Servo Motor)는 지정된 각도 내에서,

원하는 각도로 움직일수 있게 제어가 가능한 모터입니다.


주로 0~180도의 움직임 각도를 가지며, 제어는 PWM 신호에 따라 각도가 바뀝니다.

PWM신호는 Pulse Width Modulation의 약자로, 

펄스 신호의 폭의 길이를 조절하는 신호를 통해 제어한답니다.



위 사진에서 보다싶이 모든 PWM 신호는 고정된 주기를 가지고 있으며,

유일하게 변하는 것은 한 주기 내에서 HIGH상태와 LOW 상태의 비율이 변하게 됩니다.


이러한 비율 변화가 각도의 변화가 되도록 서보모터 내부에서 신호처리가 된답니다~


그럼 이제 만들어봅시다!



먼저 저는 Adafruit사의 조이스틱 모듈을 구매해서 사용했습니다.



그리고 핀헤더를 수직으로 납땜하니 사용이 불편해서.. 이렇게 수평으로 납땜했어요~



회로는 위와같이 연결하시면 돼요!


조이스틱 모듈          아두이노

Vcc                       5V

 GND                     GND

Xout                       A0

Yout                       A1

Sel                         8


Xout은 X 축방향의 움직임 값을 나타내구요,

Yout은 Y 축 방향의 값을,

Sel는 눌렸을때 버튼 값을 의미합니다.

여기서 버튼 값의 경우는 단순히 연결한다고 끝이 아니라, Pull-up resistor 세팅을 해주셔야 합니다.

Pull-up resistor가 뭔지 궁금하시면 http://geronimob.tistory.com/19 참고!


  1. int Xval, Yval, Sel;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      pinMode(8,INPUT);

      //Digital input needs Pull-up resistor setting.
      digitalWrite(8,HIGH);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      Xval = analogRead(A0);
      Yval = analogRead(A1);
      Sel = digitalRead(8);

      Serial.print(Xval);
      Serial.print('\t');
      Serial.print(Yval);
      Serial.print('\t');
      Serial.println(Sel);

      delay(100);
    }


위 코드를 업로드 하고나면 순차적으로 X값, Y값, 버튼 값 이 업데이트 될거에요!




자 그럼 이제 서보모터를 연결해봅시다.


먼저 서보모터는 위에서 언급했다싶이,

PWM신호로 제어가 된답니다.


때문에 Vcc, GND, Signal 이 세 핀이 필요하겠지요~


그럼 연결을 하고 코딩을 해봅시다.


위에 코드를 그대로 살리면서 추가합시다.

먼저 서보모터 함수를 사용하기위해 Servo.h를 불러옵니다.


그 다음 Servo 클래스를 선언하고, 셋업에서 3번핀에 서보를 할당합니다.

지금은 모터가 한개이므로,,, 한 축으로만 제어를 할게요;;


우선 서보모터를 움직이는 함수는 servo.write() 인데, 

안에 들어가야할 값은 0~180도 까지의 각도 값입니다.


하지만 analogRead를 통해 받아온 값은 0~1023의 값이 나오죠.


즉, 0~1023의 값을 0~180 사이의 값으로 맵핑을 해줘야 하는데,

바뀐 변수 = map(바꿀 변수, 바꿀 변수의 최소값, 바꿀 변수의 최대값, 바뀐 변수의 최소값, 바뀐 변수의 최대값)

으로 바꿀수 있습니다!


그리고 명령이 수행되는데 시간이 걸리므로 delay()함수를 넣어줍니다.


  1. #include <Servo.h>

    Servo servo;  // create servo object to control a servo

    int Xval, Yval, Sel,pos;

    void setup() {
      // put your setup code here, to run once:
      Serial.begin(9600);
      pinMode(8,INPUT);

      //Digital input needs Pull-up resistor setting.
      digitalWrite(8,HIGH);

      //Servo setup with pin3
      servo.attach(3);
    }

    void loop() {
      // put your main code here, to run repeatedly:
      Xval = analogRead(A0);
      Yval = analogRead(A1);
      Sel = digitalRead(8);

      Serial.print(Xval);
      Serial.print('\t');
      Serial.print(Yval);
      Serial.print('\t');
      Serial.println(Sel);

      pos = map(Xval,0,1023,0,180);
      servo.write(pos);              // tell servo to go to position in variable 'pos'

      delay(15);
    }


그럼 위와같은 코딩이 되지요!



구동을 하면 스틱 움직임의 각도에 따라 모터도 움직여요~


아무래도 조이스틱의 축이 2개니, 모터를 2개써서 제어도 가능하겠지요?


그리고 버튼값을 잘 이용한다면 위치 고정(Lock)과 같은 기능도 넣을수 있을듯 하네요ㅋㅋ


궁금한 점은 댓글로 남겨주세요!


이번엔 실루엣 포트레이트 제품에 대해 보겠습니다~

실루엣 포트레이트(Silhouette Portrait)란 도면 재단을 위한 프린터로,

기존 프린터의 잉크 카트리지 대신에 칼날이 삽입되어

원하는 형태로 종이나 시트지 등을 자르는 프린터 입니다.



현재 구매한 모듈을 포트레이트로, A4 사이즈 크기의 종이를 자를수 있고

무게도 1.6kg 정도라 들고다니기도 편합니다~


사실 원래 사려고 했던 기종은 실루엣 카메오 제품으로,

추가적인 기능이 상당히 많이 들어가있어요!

무선으로 프린팅할수도 있고, 칼날이 소프트웨어에 따라 자동조정되고,

프린팅 크기도 꽤 커요ㅋㅋ


그치만 그만큼 기능들이 필요없고, 단순 반복작업을 할것 같아

포트레이트로 결정했답니다.


다만 아래처럼 칼날을 세팅하는게 조금 귀찮고, 

용지에 따라 적정값을 찾는게 힘들지요..



요 칼날이 기본 수동 조절 칼날입니다.

카메오3부터는 자동조절 칼날은 별도 판매를 한다네용~



우선 동봉된 칼날 조절기(?)로 원하시는 깊이의 칼날을 설정해줍니다.

0이 가장 얕은칼날, 10이 가장 깊은 칼날입니다~



보통 시트지의 경우 1~2정도 놓고 쓰시면 뒷면의 비닐은 잘리지 않고

윗면의 접착면만 잘리게 됩니다.

세팅을 하셨으면 홀더에 넣어주시고,



벨브를 돌려서 고정해줍니다!



그리고 동봉된 접착 커팅매트에 종이를 올려두시고,

맨 위에 눈금 커팅매트 삽입 버튼을 눌러주세요!



그리고 실루엣 스튜디오를 이용해서 원하는 문양을 컷팅하면 끝~!


확실히 반듯하게 인쇄가 되니 엄청편합니다ㅋㅋㅋ

아직까진 많이 사용하진 않았지만,

칼날도 오래간다고 하니 기대하고 써봐야겠습니다!

+ Recent posts