2013년 2월 12일 화요일

무선랜 기술

IEEE 802.11은 흔히 무선랜, 와이파이(Wi-Fi)라고 부르는 좁은 지역(Local Area)을 위한 컴퓨터 무선 네트워크에 사용되는 기술로, IEEE의 LAN/MAN 표준 위원회 (IEEE 802)의 11번째 워킹 그룹에서 개발된 표준 기술을 의미한다.

IEEE 802.11은 현재 주로 쓰이는 유선 LAN 형태인 이더넷의 단점을 보완하기 위해 고안된 기술로, 전파(RF)나 빛(적외선) 등을 이용하여서 무선으로 랜(근거리통신망) 환경을 구축하는 것이다.


전송방식표준


종류(승인연도)
속도
접속/변조방식
주파수대역
특징

802.11b

(1999)

11 Mbps

CSMA/CA DSSS(Direct Sequence Spread Spectrum)

ISM대역

2.4GHz

가장 많이 사용되고 있음

전송 속도가 느림

802.11a

(1999)

54 Mbps

CSMA/CA OFDM

5 GHz

주파수 대역이 구별되어 전파간섭이 적은 편

주파수 대역이 달라 호환성 없음

802.11g

(2003)

54 Mbps

CSMA/CA OFDM

ISM대역 2.4GHz

802.11b와 호환 가능

2.4GHz 기기들로부터 간섭이 있을 수 있음

802.11n

(2009)

600 Mbps

CSMA/CA OFDM

2.4GHz/

5GHz

다중 안테나 기술과 채널본딩을 통한 성능 증가
 

















 

※ ISM 대역(Industrial Scientific Medical band)
이 주파수 대역을 사용하는 통신 장비는 ISM 기기들과 이 대역을 사용하는 통신 장비 간에 간섭을 용인한다는 조건에서 사용할 수 있다. 특히 2.4GHz 대역은 공중 무선 LAN 서비스, 블루투스, 무선 식별 시스템(RFID), 디지털 코드 없는 전화 등 다양한 통신에 사용되고 있다.

※ CSMA/CA - Carrier sense multiple access with collision avoidance
블루투스 - 무선 랜(802.11b/g)과 같이 2.4Ghz대의 주파수를 사용한다. 첫째, 블루투스는 저렴한 가격에 저전력(100㎽)으로 사용할 수 있다는 점이 장점이다. 둘째, 블루투스는 주파수 대역을 나누기 때문에 데이터 전송을 여러 주파수에 걸쳐서 분할해 보낼 수 있다.(주파수 도약 확산 스펙트럼, FH-SS) 그렇기 때문에 무선 전송에 따른 보안 위협에서도 상대적으로 안전하다.
무선랜과 블루투스 두 기능을 동시에 가지고 있는 기기의 경우에는 두 장비가 하나의 안테나를 사용하게 되는데, 서로 번갈아가며 데이터를 전송하는 사용하는 방식을 이용하여 애초부터 그 간섭을 최대한 줄이게끔 되어 있다.
블루투스 3.0은 2009년 4월 21일에 발표되었다. 전송속도는 24Mbps로 향상되었다.

적외선 통신 - 전파 대신 파장이 수 ㎜부터 수 100㎚까지의 적외선을 사용하여 수행하는 통신. 적외선의 투과율은 가시광선에 비해 훨씬 좋고, 파장은 마이크로파에 비해 훨씬 짧으므로 초다중 회선을 만들 수 있다. 적외선의 증폭이나 발진에는 적외선 영역의 메이저를 사용하는데 이것은 현저하게 저잡음이고, 주파수 안정도가 좋으며, 또 단방향으로만 집중하여 강력한 방사를 할 수 있는 등의 이점이 있다. 적외선 통신은 빛(光)을 매체로 이용하므로 제품 생산 시 주파수 사용 허가를 받을 필요가 없고 소비 전력이 적은 것이 특징이다.
1993년에 IBM, HP, 마이크로소프트 등이 주축이 되어 ‘IrDA(Infrared Data Association)’라는 규격 단체를 설립, 적외선 통신의 표준 규격을 정함. IrDA DATA 1.4 규격을 준수하는 기기끼리는 1미터 이내의 거리에서 최대 16Mbps의 속도로 무선 데이터 통신이 가능하다.

※ Zigbee - 저속 전송 속도를 갖는 홈 오토메이션 및 데이터 네트워크를 위한 표준 기술. 버튼 하나로 하나의 동작을 잡아 집안 어느 곳에서나 전등 제어 및 홈보안 시스템 VCR on/off 등을 할 수 있고, 인터넷을 통한 전화 접속으로 홈 오토메이션을 더욱 편리하게 이용하려는 것에서부터 출발한 기술이다. IEEE 802.15.4에서 표준화가 진행되며, 듀얼 PHY 형태로 주파수 대역은 2.4GHz, 868/915MHz를 사용하고, 모뎀 방식은 직접 시퀀스 확산 스펙트럼(DS-SS)이며, 데이터 전송 속도는 20~250kbps이다.


802.11a


OFDM 방식의 통신시스템에서는 OFDM신호의 직교성이 유지되어 ISI와 ICS가 방지되도록 정확한 carrier recovery(잡음과 무관하더라도 송수신기간의 거리와 발진기주파수의 차이, 전력계통/송전선로 주파수의 영향)와 symbol synchronization(time recovery)가 이루어져야 한다.

carrier recovery는 주로 정기적으로 삽입된 pilot symbol이나 PRS(Phase Reference Symbol)를 이용한 correlator, PLL 및 협대여필터, tuner 등으로 구성된 장치에 의해 반송주파수 및 위상을 추적하는 것으로 수행되고,

symbol synchronization(time recovery)는 preamble이라 불리우는 trainingg symbol(훈련심볼) 나 CP(Cyclic Prefiz) 또는 null symbol을 이용해서 구현하기도 한다.







이외에 동기화가 잘 수행되기 위해서는 STO(Symbol Timing Offset, δ)와 CFO(Carrier Ferquency Offset, ε)를 잘 보상해주어야 한다. CFO가 발생하는 이유는 발진기의 특성이 안정적이지 못하여 발생되는 위상잡음과 단말의 이동에 따라 도플러주파수 천이(파원이 다가오는 경우 주파수가 높아지는 것)가 발생하기 때문이다.
수신단에서 동기가 이루어지지 않은 경우 이산시간에서 기저대역 신호는 다음과 같이 주어진다.

y[n]=Σ(k=0~N-1) H[k]X[k]exp(j2π(k+ε)(n+δ)/N)+z[n]

※ z는 채널 임펄스응답

초기동기를 위한 OFDM심벌에서, the initial 4.0 µs interval is the idle time when the transmitter sends no signal, and follows the short preamble(8.0 µs), long preamble(8.0 µs), SIGNAL, and DATA fields.

 

 <802.11a 프리앰블 구조>


프리앰블에는 주기가 각각 16(short 훈련심볼), 64(long) 샘플인 두 종류의 훈련심볼이 정의되어 있다. 한 샘플의 주기는 50ns이므로 프리앰블 전체 주기는16us 의 길이를 갖는다.
※ 1 OFDM 심볼(80샘플)=T_gaurd_interval(16샘플)+T_fft(64샘플)


1. CFO 동기
훈련심볼의 반복주기가 D로 주어질 경우에 수신된 시간영역 신호 y[n]와 y[n+D]사이에는 반송파 주파수 옵셋에 의해 각각 exp(j2π*ε*n/N), exp(j2π*ε*(n+D)/N) 만큼의 위상변화가 발생한다. 이경우 두 신호의 위상차이와 반송파 주파수 옵셋의 추정범위는 다음과 같이 주어진다.

∠2π(n+D)/N-∠2πn/N=2πD/N
|2πD/N|=π

짧은 훈련심볼을 사용할 경우에 N=64, D=16 이므로 1FFT주기에 신호가 4번 반복하게 되어 추정할 수 있는 주파수 옵셋 범위가 부반송파 간격의 4배가 되며(|ε|<2),
긴 훈련심볼을 사용할 경우 N=D=64이므로 부반송파 간격 이내의 주파수 옵셋만 추정할 수 있다.(|ε|<0.5).
따라서 IEEE 802.11a에서는 추정 범위를 넓히기 위하여 짧은 훈련심볼을 한 후, 긴 훈련심볼을 이용하여 정확하고 미세한 주파수 추정을 하게된다.

x[n+D]*x[n]=X*exp(2πεD/N)


2. STO 동기
수신단에서 알고 있는 short 훈련신호와 수신신호의 correlation을 취해서 그 크기가 임게치보다 큰 시점으로부터 16 샘플포인트 전의 시점을 심볼의 시작시점으로 인식하는 과정

2013년 1월 21일 월요일

아두이노 시리얼통신

전파를 이용한 통신과 같이 이론적인것만 공부하다보니,

보여지고 체감할 수 있는,

통신이후에 전송된 정보를 처리하는 밑바닥의 하드웨어 원리가 궁금해졌다.

또한 기기들간의 통신에서 가장 기초가되는 시리얼통신 과정도 궁금했다.

그러던 와중에 우연히 인터넷을 통해 '아두이노'에 대해서 알게되었다.

마이크로프세서와 마이크로콘트롤러는 학부시절 갈피를 못 잡고 어렵게 느껴졌는데,

저렴한 가격에 보드와 간단한 키트(약 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㎃)



< 회로도 >
 
 [아두이노 GND] --- [330Ω] --- [LED] --- [아두이노 12]
 
 
 
 [아두이노 Power GND] --- [10KΩ] --- [Thermistor] --- [아두이노 Power 5V]
                      ㄴ[아두이노 A0]
 
 

 [아두이노 Power GND] --- [10KΩ] --- [광센서] --- [아두이노 Power 5V]

                      ㄴ[아두이노 A0]



 
// Arduino Sketch //

//  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 에 연결한다.

 
// Arduino Sketch //

#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 하자!


< 가변저항 회로도 >
 
 [아두이노 Power GND] --- [가변저항] --- [아두이노 Power 5V]
  |
[아두이노 A0]
 


 
// Arduino Sketch //

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를 켜보자!


< 피에조 회로도 >
 
 [아두이노 Power GND] --- [피에조] --- [아두이노 A0]



 
// Arduino Sketch //
 
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','-.-....');   % 매트랩에서 아두이노로 모스코드 전송

out = fscanf(arduino, '%s');  % 아두이노에서 전송한 모스코드 되 얻음

fclose(a);   % end communication with arduino

 결과 동영상을 촬영했는데, 소리도 거의 안들리고 너무 허접하다.ㅋㅋㅋㅋ



나중에 공부해서 라디오키트도 붙이고, wifi도 연결해 보면 재밌겠다.