보여지고 체감할 수 있는,
통신이후에 전송된 정보를 처리하는 밑바닥의 하드웨어 원리가 궁금해졌다.
또한 기기들간의 통신에서 가장 기초가되는 시리얼통신 과정도 궁금했다.
그러던 와중에 우연히 인터넷을 통해 '아두이노'에 대해서 알게되었다.
마이크로프세서와 마이크로콘트롤러는 학부시절 갈피를 못 잡고 어렵게 느껴졌는데,
저렴한 가격에 보드와 간단한 키트(약 5만원)를 구입하여 이것저것 만들다 보니 하드웨어에 대해서 조금 알게 되었다.
몇일만에 책한권을 다 뗄수 있을 정도로 쉽게 접근할 수 있고, 쉬운 것도 최고의 장점이라 생각한다.
어두곳에 한 줄이 빛을 발견했다고 할까?ㅎ
그럼 내가 공부했던것을 정리해보자!!
먼저 위키백과를 인용해서 용어 정리부터,,,
마이크로컨트롤러(Microcontroller)는 칩 위의 컴퓨터를 말한다. PC에 쓰이는 일반 목적의 마이크로프로세서와는 반대로 높은 집적, 낮은 전력 소비, 비용 절감, 자동 처리를 강조하는 마이크로프로세서의 일종이다. 일반 목적의 마이크로프로세서의 일반 산술, 논리 요소뿐 아니라 데이터 저장을 위한 읽기 쓰기 메모리, 코드 저장을 위한 플래시와 같은 읽기 전용 메모리, 계속적인 데이터 저장을 위한 EEPROM, 주변 기기, 입출력 인터페이스 등의 부가 요소를 통합한다. 마이크로컨트롤러는 현대에 쓰이는 마이크로프로세서보다 매우 낮은 속도로 동작하며 일반적인 응용 프로그램들에 적절한 편이다. 마이크로컨트롤러는 자동차 엔진 제어 시스템, 리모컨, 사무 기기, 전자 기기, 전원 도구, 장난감과 같은 자동 조정 제품과 장치에 쓰인다. |
아두이노(Arduino)는 오픈소스를 기반으로 한 피지컬 컴퓨팅 플랫폼으로, AVR을 기반으로 한 보드와 소프트웨어 개발을 위한 통합 환경(IDE)를 제공한다. 아두이노는 많은 스위치나 센서로부터 값을 받아들여, LED나 모터와 같은 것들을 통제함으로써 환경과 상호작용이 가능한 물건을 만들어낼 수 있다. 또한 플래시, 프로세싱, Max/MSP와 같은 소프트웨어를 연동할 수 있다. 아두이노의 가장 큰 장점은 마이크로컨트롤러를 쉽게 동작시킬 수 있다는 것이다. 일반적으로 AVR 프로그래밍이 WinAVR로 컴파일하여, ISP장치를 통해 업로드를 해야하는 등 번거로운 과정을 거쳐야하는데 비해, 아두이노는 USB를 통해 컴파일 및 업로드를 쉽게 할 수 있다. 또한 아두이노는 다른 모듈에 비해 비교적 저렴하고, 윈도를 비롯해 맥 OS X, 리눅스와 같은 여러 OS를 모두 지원한다. 아두이노 보드의 회로도가 CCL에 따라 공개되어 있으므로, 누구나 직접 보드를 직접 만들고 수정할 수 있다. |
1. 먼저 아두이노의 기본 설정과 매트랩과의 연동을 잘 설명한 사이트를 소개한다.
http://www.matlabinuse.com/index.php?mid=Arduino_with_MATLAB&document_srl=2395
2. 아두이노 LED, 써미스터, 광센서의 회로를 구성하라!
(최대 I/O핀 당 DC 전류 40㎃, Vcc와 GND 핀들 DC 전류 200㎃)
< 회로도 >
|
// Thermistor // int sensor = A0; void setup() { Serial.begin(9600); } void loop() { int reading = analogRead(sensor); float srV = reading*5.0/1024.0; // float srV = map(reading,0,1023,0,5); float srR = (( 5.0 * 10000.0 )/ srV ) - 10000.0; float kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (srR / 10000.0)); float temp = kT-273.15; Serial.println(temp); delay(500); } // 광센서 // const int lightPin = A0; int lightValue; int brightness; void setup() { Serial.begin(9600); } void loop() { lightValue = analogRead(lightPin); Serial.println(lightValue); //0~1023값을 0에서 255값으로 환산한다. } |
3. 써미스터 온도 측정값을 1602 IIC I2C LCD로 출력하라!
가지고 있는 LCD 모듈은 IIC & I2C(Inter-Integrated Circuit) 모듈이 추가된 제품으로
기존의 16핀이 아닌 4핀으로 사용가능한 대신에 I2C 라이브러리를 추가해야한다!
그 다음 LCD의 GND, VCC, SDA(Serial Data Line), SCL(Serial CLock) 를 순서대로
아두이노의 GND, 5V, A4, A5 에 연결한다.
#include <Wire.h> #include <LiquidCrystal_I2C.h> LiquidCrystal_I2C lcd(0x27,16,2); // set the LCD address to 0x20 for a 16 chars and 2 line display void setup() { lcd.init(); // initialize the lcd // Print a message to the LCD. lcd.backlight(); lcd.print("Hello, Friends!"); } void loop() { int a = analogRead(A0); float srV = a*5.0/1024.0; float srR = (( 5.0 * 10000.0 )/ srV ) - 10000.0; float kT = 1.0 / ((1.0 / (273.15 + 25.0)) + (1.0 / 4200.0) * log (srR / 10000.0)); float temp = kT-273.15; lcd.setCursor(0, 1); lcd.print("Temp:"); lcd.setCursor(6, 1); lcd.print(temp); delay(500); } |
4. 다음으로,,,
가변저항의 전압을 시리얼통신으로 전송하고,
수신한 데이터를 매트랩에서 실시간 Plot 하자!
< 가변저항 회로도 >
|
int LED = 13; // LED 핀번호 int VR = A0; // 가변저항 void setup() { Serial.begin(9600);
pinMode(LED, OUTPUT);
pinMode(VR, INPUT); }
void loop() {
int v = analogRead(VR);
Serial.println(String(v));
delay(100);
}
|
% Matlab %
a=serial('COM4','BaudRate',9600);
fopen(a);
n=0; x=300;
for i=1:x n(i)=fscanf(a,'%d'); plot(n) axis([1 x 0 1024]); drawnow end |
5. 마지막으로,,,
PC의 매트랩에서 모스부호를 시리얼통신으로 전송하고,
수신한 모스부호에 따라 아두이노의 피에조와 LED를 켜보자!
< 피에조 회로도 >
|
int led = 13;
int speaker=A0;
char code[10];
int duration=120;
char strValue[10];
int index = 0; // 수신된 숫자를 저장할 배열의 인덱스
void setup()
{
Serial.begin(9600);
pinMode(led, OUTPUT);
pinMode(speaker, OUTPUT);
}
void loop()
{
if( Serial.available()){
char ch = Serial.read();
if(ch==10){
strValue[index] = 0; // 0을 추가하여 문자열을 종료한다.
morse(strValue);
index = 0;
}
else{
strValue[index] = ch; // ASCII 문자를 문자열에 추가한다.
index++;
}
}
}
void morse(char *code)
{
int codeLen=strlen(code);
Serial.println(code);
for (int i=0; i<codeLen; i++)
{
if (code[i]=='-')
{
digitalWrite(led, 1);
tone(speaker, 2000,3*duration);
delay(3*duration);
}
if (code[i]=='.')
{
digitalWrite(led, 1);
tone(speaker, 2000,duration);
delay(duration);
}
digitalWrite(led, 0);
delay(duration);
}
}
|
다음으로 매트랩에서 모스코드 입력(예 '-.-.....')
% Matlab %
a=serial('COM3','BaudRate',9600);
fopen(a);
fprintf(a,'%s\n','-.-....'); % 매트랩에서 아두이노로 모스코드 전송
fclose(a); % end communication with arduino
|
결과 동영상을 촬영했는데, 소리도 거의 안들리고 너무 허접하다.ㅋㅋㅋㅋ
나중에 공부해서 라디오키트도 붙이고, wifi도 연결해 보면 재밌겠다.