오늘은 아두이노에서 서보모터 (TG9e) 를 작동시켜 보도록 하겠습니다.

 

서보모터는 회전각도를 제어할 수 있는 모터입니다.

제가 가지고있는 서보모터 TG9e 입니다.

 

 

 

각도제어를 하는 서보모터는 내부에 가변저항이 포함되어 있어 회전에 따라 저항값이 변하게 됩니다. 이를 사용하여 서보모터는 비교적 정확한 회전각을 출력하게 됩니다.

 

서보모터의 제어에는 PWM 파형이 사용됩니다. 서보모터 제어의 주기는 20 ms 마다 이루어지며 펄스의 길이로 각도제어를 하게 됩니다.

이때 보통의 서보모터는 1 ms 일때 반시계 방향의 최대각을 출력하고, 2 ms 일때 시계방향의 최대각을 출력합니다.

 

 

 

※아두이노 구현

 

보드는 아두이노 우노(UNO)를 사용하여 구현하였습니다.

 

서보모터 ( TG9e )의 선을 보면 3개의 선을 볼 수 있습니다. 검정색, 빨강색, 노란색으로 이루어져 있는데

검정색은 Gnd, 빨강색은 5V에 연결하여 전원을 공급하는 선이며, 노란색은 아두이노를 통해 서보모터를 제어하는 선으로 아두이노의 9번핀을 사용하였습니다.

또한 서보의 각도를 조절할 수 있도록 하기 위해 가변저항을 하나 사용하여 이를 통해 서보모터의 각도를 결정하였습니다. 가변저항의 출력은 전압값을 입력받기 위해 A0 핀에 연결하였습니다.

 

 

- 아두이노 소스 코드

 

#include <Servo.h>

Servo servo1;
int angle;

void setup() {
  servo1.attach(9);
  servo1.write(90);
  Serial.begin(9600);
}

void loop() {
  angle = map(analogRead(0),0,1023,0,180);
  servo1.write(angle);
  delay(10);
}

 

아두이노에서는 서보모터를 구동하기위한 라이브러리를 제공하고 있습니다. <Servo.h> 라이브러리로 이를 사용하면 간단하게 서보모터를 제어할 수 있습니다. 또한 서보모터의 각도는 가변저항의 출력을 통해 결정하는데, analogRead 함수는 0~1023으로 반환합니다. 서보모터의 제어는 0~180으로 이루어지므로 0~1023을 0~180으로 변환해주는 함수인 map 함수를 사용하고 서보모터에 입력하였습니다.

 

- 아두이노 동작

 

 

 

블로그 이미지

1lime

아두이노와 프로그래밍, 전자공학 학생의 개인적 프로젝트 모음

,

오늘은 조이스틱 모듈의 사용법에 대해 알아보겠습니다.

 

우선 제가 가지고 있는 조이스틱 모듈입니다.

 

기본적인 X, Y축 측정 외에도 스위치가 하나 달려있어 조이스틱을 누르면 스위치가 눌리게됩니다.

 

 

 

조이스틱 모듈은 생각보다 간단한 원리로 동작하는 모듈입니다.

조이스틱 모듈의 내부는 2개의 가변저항으로 이루어져 있고 각각 수직과 수평 축에 맞춰져 있습니다. 따라서 조이스틱을 한쪽 방향으로 밀게되면 해당하는 축의 저항값이 변하고 전압분배법칙에 의해 출력되는 전압이 바뀌게됩니다.  

따라서 조이스틱 모듈의 출력 전압을 측정하면 조이스틱이 어느 위치에 있는지 알 수 있게됩니다.

 

※아두이노 구현

 

보드는 아두이노 우노(UNO)를 사용하여 구현하였습니다.

 

조이스틱 모듈의 V 핀은 전압값을 측정해야 하므로 아두이노의 아날로그 입력 핀인 A0에 연결하고 H 핀은 아두이노 A1에 연결하였습니다. 또한 스위치 입력을 받기위해 KEY 핀은 아두이노 9번 핀에 연결하였습니다.

 

 

- 아두이노 소스 코드

 

#define V 0
#define H 1
#define key 9

int x_axis, y_axis;


void setup() {
  Serial.begin(9600);
  pinMode(key,INPUT);
}

void loop() {
  x_axis = analogRead(V);
  y_axis = analogRead(H);
 
  Serial.print( "X : ");
  Serial.print(x_axis);
  Serial.print( "\t");
  Serial.print( "Y : ");
  Serial.print(y_axis);
  if(digitalRead(key)==LOW){
    Serial.print("   Key_Push");
  }
  Serial.print( "\n");
  delay(20);
}

 

조이스틱의 입력값을 컴퓨터 화면에 출력하기 위해 시리얼 통신을 사용하였습니다.

X축, Y축 데이터를 아두이노 내장함수인 analogRead 함수를 사용하여 입력받습니다. analogRead함수는 0~1023의 값을 반환하고, 그 값을 그대로 시리얼 통신을 통해 컴퓨터 화면에 출력하도록 하였습니다. 또한 스위치가 눌린경우 메시지를 출력하도록 구현하였습니다.

 

 

- 아두이노 동작

 

 

 

 

 

 

블로그 이미지

1lime

아두이노와 프로그래밍, 전자공학 학생의 개인적 프로젝트 모음

,

오늘은 초음파 센서 (HC-SR04)의 사용법에 대해 알아보겠습니다.

 

초음파 센서(HC-SR04)란 초음파를 발생시키고 초음파가 장애물에 부딪히고 돌아오는 시간을 측정하여 거리를 측정할 수 있는 센서입니다.

 

아래는 초음파 센서 종류중 하나인 HC-SR04 입니다. 2cm~400cm 까지의 거리를 측정할 수 있는 모듈입니다.

 

 

초음파 센서(HC-SR04) 에는 두개의 스피커 비슷하게 생긴것이 달려있는데 하나는 초음파를 발생시키는 부분이고, 나머지 하나는 장애물에 부딪히고 돌아온 초음파를 감지하는 부분입니다.

 

HC-SR04 모듈의 동작은 아래 타이밍과 같이 이루어집니다.

우선 HC-SR04 모듈을 동작하기 위해서는 Trig 핀에 10uS 길이의 펄스를 넣어주어야 합니다. 펄스가 들어오면 HC-SR04 모듈은 초음파를 발생시키고, 초음파가 돌아오기 까지의 시간을 측정하게 됩니다. 초음파가 돌아오면 ECHO 핀으로 펄스를 출력하는데 이 펄스의 길이는 초음파가 돌아오는데 걸린 시간에 비레하게 됩니다. 따라서 이 펄스의 길이를 측정하여 길이를 측정할 수 있습니다. 

 

초음파가 돌아오는데 걸리는 시간을 거리로 바꾸는 식은

( 거리 = 속력 * 시간 ) 을 통해 구하게 되는데 속력은 소리의 속력인 340 m/s 와 시간을 곱하여 구하게 됩니다.

 

HC-SR04의 데이터 시트에 따르면 ECHO 핀으로 출력된 펄스의 uS 시간을 58로 나누면 cm가 된다고 언급하고 있습니다.

따라서 cm = uS / 58

 

 

※아두이노 구현

 

보드는 아두이노 우노(UNO)를 사용하여 구현하였습니다.

 

초음파 센서(HC-SR04)의 Trig에 펄스를 인가하고, Echo로 출력된 펄스를 입력받기 위해서 Trig는 아두이노 8번핀, Echo는 9번핀에 연결하도록 하겠습니다.

 

아두이노 우노를 사용한 회로 구현은 아래와 같습니다.

 

 

- 아두이노 소스 코드

 

#define TRIG 8
#define ECHO 9

int us;   // microsecond time
int cm;   //

 

void setup() {
  Serial.begin(9600);
  pinMode(TRIG,OUTPUT); 
  pinMode(ECHO,INPUT);
}

 

void loop() {
  digitalWrite(TRIG,HIGH);   //send Pulse
  delayMicroseconds(10);
  digitalWrite(TRIG,LOW); 

  us = pulseIn(ECHO,HIGH,50000);    //get return time
  cm = us/58;

  Serial.print("cm : ");
  Serial.print(cm);
  Serial.print("\n");
  delay(60);
}

 

측정된 거리를 컴퓨터로 출력하기 위해 시리얼 통신을 사용하였습니다.

ECHO 핀을 통해 출력된 펄스의 길이를 측정하는데에는 아두이노 내장함수인 pulseIn 함수를 사용하였습니다. pulseIn 함수는 펄스가 입력되면 그 시간을 측정하여 반환하는 함수입니다. pulseIn(ECHO,HIGH,50000) 와 같이 사용하면 ECHO(9번)핀에 HIGH가 되었다가 LOW가 되는 펄스의 길이를 측정하여 uS 단위로 반환하며, 이때 50000 uS가 초과해도 펄스가 들어오지 않으면 0을 반환하여 측정이 실패하였음을 알리게 됩니다.

 

초음파 센서(HC-SR04)는 2cm~400cm까지 측정이 가능하므로 400cm를 초과하는 거리는 측정이 불가능합니다. 따라서 400cm이상의 거리에서는 ECHO핀에 펄스가 입력되지 않아 0이 출력될 것입니다.

 

입력된 펄스의 시간을 58로 나누어 cm단위의 거리로 바꾸고 이를 시리얼포트를 통해 출력하는 코드를 구현하였습니다.

 

- 아두이노 동작

 

 

 

블로그 이미지

1lime

아두이노와 프로그래밍, 전자공학 학생의 개인적 프로젝트 모음

,

오늘은 RGB LED 모듈에 대해 알아보겠습니다.

RGB LED 모듈은 입력에 따라 원하는 색을 만들어 낼 수 있는 장점이 있습니다.

 

RGB LED의 동작원리는 우선 기본적인 RGB 원리와 동일합니다. 빛의 3원색인 Red(빨강), Green(초록), Blue(파랑)을 적절히 섞어 원하는 색을 만들어 내는것입니다.  RGB LED 모듈에는 빨강, 초록, 파랑의 3개의 LED가 같은 위치에 내장되어 있습니다. 이 RGB 세개의 빛 세기를 조절하여 동시에 키면 빛이 섞여 나오게 됩니다.

 

RGB 세 LED의 빛의 세기 조절은 아두이노에서는 PWM을 사용하여 조절하게 됩니다.

 

아두이노를 통해 실제 동작을 알아보도록 하겠습니다 .

 

 

제가 가지고 있는 RGB LED 모듈입니다.

 

RGB LED 모듈 앞   

 

 RGB LED 모듈 뒤   

 

※ 핀 설명

GND : Ground

RED : 빨강 LED

GREEN : 초록 LED

BLUE : 파랑 LED

 

 

 

※아두이노 구현

 

보드는 아두이노 UNO를 사용하여 구현하였습니다.

우선 3개의 RGB LED에 PWM을 통해 세기를 조절할 것이므로 아두이노 보드에서 3개의 PWM 출력이 가능한 핀을 사용해야 합니다.

저는 11번 핀을 Blue에, 10번 핀을 GREEN에, 9번 핀을 Red에 연결해 제어하도록 하겠습니다.

 

PWM 제어를 위해서 아두이노 내장함수인 analogWrite를 사용하였습니다.

 

빨강 ( RGB = 255, 0, 0 ) ,  초록 ( RGB = 0, 255, 0),  파랑( RGB = 0, 0, 255 ), 주황 ( RGB = 255, 187, 0),  보라 ( RGB = 95, 0, 255) 순서대로 1초씩 출력하도록 구현하였습니다.

 

 

1) 아두이노 코드 

 

void setup() {
  pinMode(11,OUTPUT);
  pinMode(10,OUTPUT);
  pinMode(9,OUTPUT);
}

void loop() {
  analogWrite(9 ,255);  //Red
  analogWrite(10,0);
  analogWrite(11,0);
  delay(1000);

 

  analogWrite(9 ,0);  //Green
  analogWrite(10,255);
  analogWrite(11,0);
  delay(1000);

 

  analogWrite(9 ,0);  //blue
  analogWrite(10,0);
  analogWrite(11,255);
  delay(1000);

 

  analogWrite(9 ,255);  //Orange
  analogWrite(10,187);
  analogWrite(11,0);
  delay(1000);

 

  analogWrite(9 ,95);  //Purple
  analogWrite(10,0);
  analogWrite(11,255);
  delay(1000);

}

 

 

 

2) 아두이노 회로 구현

 

 

 

 3) 아두이노 실행 결과

 

 

 

 

 

 

 

 

 

 

블로그 이미지

1lime

아두이노와 프로그래밍, 전자공학 학생의 개인적 프로젝트 모음

,

1. AES 란?

 

AES (Advanced Encryption Standard) 란 표준 암호화 알고리즘으로 Rijmen과 Daemen이 개발한 Rijndael 알고리즘이 AES 공모에서 선정되면서 AES로 암호화 표준이 되었다.

 

AES 알고리즘은 128비트 단위로 이루어 지며, AES 알고리즘은 Add Round Key , Sub Byte, Shift Row, Mix Column 이 반복 되어 이루어진다. AES 암/복호화의 전체적인 알고리즘은 아래 그림과 같다. AES 알고리즘 중 각각 부분의 알고리즘은 아래에서 설명하겠다.

 

 

AES 암호화 알고리즘            AES 복호화 알고리즘

 

 

2. AES 암호화 알고리즘

 

 ※ AES 알고리즘의 설명 전에 알아야 할점 

 

(1) AES 알고리즘의 연산은 GF(Galois Field) 중  GF(2^8) 에서 이루어지며, AES 에서 사용하는 기약다항식은 m(x)=x^8+x^4+x^3+x+1로 정해져 있다. 

 

(2). AES 알고리즘에서 덧셈 연산은 XOR로 대체된다. 따라서 AES 내에서 뺄셈도 동일하게 XOR로 연산된다. 

 

(3). AES 알고리즘에서 8비트 곱셈 연산이 등장하는데, AES에서는 곱셈 연산을 (x2) 연산과 (+1) 연산을 통해 구한다. 이때 (x2) 연산을 AES에서는 보통 xtime 이라 부른다.
이때 xtime 연산은 8비트 입력값을 왼쪽으로 1비트 쉬프트하여 구현되는데, 이때 최상위 비트가 1인 경우 0x1b(00011011)를 XOR 한다. 이는 우선 2진수에서 왼쪽으로 1비트 쉬프트하면 곱하기2 연산이 된다는점과 AES에서 사용하는 기약다항식이 x^8+x^4+x^3+x+1이기 때문이다 기약다항식을 최상위 비트인 x^8을 제외하고 8비트 바이너리로 표현하면  0x1b가 된다. 
AES 알고리즘에서 (x2) 연산과 (+1)을 통해 곱셈을 구현하는 법은 예를 들어 표현하겠다. a 에 9를 곱한다고 가정하겠다. 이는 a*(2^3) + a 로 쓸수있다.(x2)연산이 xtime이므로 a를 xtime에 3번 통과시킨 결과와 a를 XOR 하면 a에 9를 곱한 결과가 나오는 식이다.  

 

(4) AES 알고리즘에서는 아래와 같이 128비트를 4x4 행렬로 표현하며, 행렬의 한칸은 1바이트(8비트)를 뜻하며 각각은 16진수로 표현하였다.
아래는 AES 암호화에서 입력값 00112233445566778899aabbccddeeff을 나타낸것으로 왼쪽 위에서부터 세로로 배열된다.

 

 

1) Add round key

 

데이터와 키를 XOR 한다.

 

 

 

2) Sub byte

 

Sub byte 연산은 8비트 단위로 데이터를 치환하는 연산으로서, 실제 연산은 1바이트를 GF(2^8) 상에서의 역원을 구한후 아핀 변환을 하는 연산이다.  8비트씩의 연산을 반복하여 128비트 모두를 치환한다.  

 

메모리의 여유가 있다면 모든 입력에 대한 연산을 계산한 표인 S-Box를 만들고 이를 사용해 치환하는 방법도 많이 사용한다. S-Box를  사용한 치환 방법은 그림을 통해 설명하겠다.

아래 그림은 S-box를 사용하여 0x7a을 치환하는 것을 나타낸 그림이다. 아래 표에서 X부분에 16진수의 앞자리를 선택하고, Y부분에 뒷자리를 선택하여 만나는 곳이 Sub Byte 연산의 결과가 된다. 따라서 0x7a의 연산 결과는 0xda가 된다.

 

S-Box Table

 

 

※ GF(2^8)에서의 역원은 확장된 유클리드 호제법을 사용하여 구할 수 있다.

 

※ AES 에서 아핀 변환은 아래와 같이 연산된다. 이때 b0~b7이 입력되는 데이타로, 상위비트가 아래 위치한다.

 

 

 

 

3) Shift row

 

행단위로 Shift 연산을 한다.

 

 

 

4) Mix column

 

각각의 바이트에 특정행렬과 곱연산을 가하여 변환한다.  아래 그림에서 왼쪽의 2311 행렬부분이 암호화에 쓰이는 행렬이며, 곱해지는 것은 예시로 입력한 32비트 입력이다. 연산은 행렬의 곱연산과 동일하게 이루어진다. 따라서 2*d4 + 3*bf + 5d + 30이 될것이다. 이때 곱연산은 '알고리즘의 설명 전에 알아야 할점' 에서 소개한 방식으로 xtime으로 구현하고, 덧셈은 XOR로 바꾸만 하면 된다. 이와 같이 연산하면 아래그림과 같이 04가 나올것이다. 각 행에 대해 연산하여 32비트를 모두 연산한다.

 

 

 

3. Key Schedule

 

AES 암복호화에 쓰이는 전체 알고리즘을 보면 Add Round Key에 Round Key 1부터 Round key 9까지가 입력되는 것을 볼 수 있다. 이때 AES 알고리즘에 사용되는 Round Key들을 입력된 key를 통해 생성하는 알고리즘을 Key Schedule 이라 한다.

 

AES 모듈에 아래와 같이 Key가 입력되었다고 가정하겠다.

 

 

우선 가장 마지막 4바이트를 뽑아 한칸 쉬프트하고 Sub Byte 연산을 한다.

 

 

그 후 R Con과 XOR 연산을 하는데 R Con은 아래와 같은 행렬로 1 라운드마다 하나씩 앞에서 부터 순서대로 사용한다. 그 다음 Key의 첫번째 열과 XOR 한 결과가 첫번째 Round Key의 첫번째 열이 된다.  

 

R-Con

 

 

다음으로는 이렇게 계산된 첫번째 열과 Key의 두번째 열을 XOR하여 Round Key의 두번째 열을 계산한다.

 

 

이 방식으로 세번째, 네번째 행을 계산하면 첫번째 Round Key가 생성된다. 또한 첫번째 Round Key로 처음부터 다시 반복하면 두번째 Round Key를 생성할 수 있다.

 

 

 

 

 

 

 

 

 

 

 

 

 

                       

 

 

      

 

 

블로그 이미지

1lime

아두이노와 프로그래밍, 전자공학 학생의 개인적 프로젝트 모음

,