반응형

【 레오나르도활용#3】 온도& 밝기값 PC비주얼화 하기 (Leonardo

 아두이노 레오나르도(Leonardo)를 통해 온도 센서와 광센서(CDS)의 데이터를 실시간으로 PC로 수집도 하고, 이 데이터를 프로세싱(Processing) IDE를 통해 보기 좋게 비주얼화 해보자.  물론 이렇게 수집된 데이터는 엑셀로 차트를 만들어 볼 수 있어 이번 프로젝트는 활용도가 매우 높다.  코딩도 생각만큼 길지 않으니 차근차근 해보면 어렵지 않다. 
그럼 재미있게 즐겨보자~!    Let's go~!

 

▶ 선수 학습 :
      1. [레오나르도 활용#1] 레오나르도 보드 사용법(보드 스펙& 설치-연결 참조) ☜(클릭)

      2. [레오나르도 활용#2] 온도와 밝기 값 PC로 수집하기(회로 연결 참조) ☜(클릭)
      3. [아두이노 센서#3] TMP36 온도 센서 (온도센서 참조)  ☜ (클릭)
      4. [아두이노 센서#3] 포토레지스터(CDS) 제어(cds 광센서 참조)  ☜ (클릭)

▶ 실습 목표 :  
 1. [ 레오나르도 보드에 온도센서(Tmp36)와 광센서(cds) 회로를 연결하고 동작시킬 수 있다.
 2. [ 온도센서와 광센서로 부터의 데이터 값을 PC메모장을 통해 전송시킬 수 있다.]
 3. [ 전송된 데이터를 엑셀 등을 이용해서 활용해 볼 수 있다 ]
 

 4. [ 전송된 데이터를 프로세싱 IDE 코딩을 통해 보기 좋게 비주얼화 시킬 수 있다. ] 

 

▶ 실습 회로도면 :  앞선 실습1과 회로 연결은 동일합니다.
  (이미지 클릭하면 확대 가능)

 

▶ 실행 결과 이미지 :

온도 밝기 센싱값 출력화면

【아두이노 코딩】  : 
/* Leonardo 보드로 온도 & 밝기 데이터 수집하기 */

#include <Keyboard.h>   
const int TEMP = 0;    // A0 포트 
const int CDS = 1;    // A1 포트  
const int LED = 12; 
const int BUTTON = 11; 
boolean lastBtn = LOW; 
boolean currentBtn = LOW; 
boolean running = false; 
int counter = 1;

void setup ( ) {  
  pinMode(LED, OUTPUT);
  Keyboard.begin();
}

void loop ( )  {
  currentBtn = debounce (lastBtn); 
  if (lastBtn == LOW && currentBtn == HIGH) //버튼 누름 
  { 
     running = !running;   // 상태 값 반대로 변경 
   } 
  lastBtn = currentBtn; // 버튼 상태값 업뎃 
  if (running) // 데이터 기록 중 
  { 
     digitalWrite(LED, HIGH); 
     // millis() 함수는 데이터를 ms 단위로 반환해 줌, 백그라운드 동작 
     // delay() 함수를 사용할 수 없을 때 사용 
   if (millis()%1000 == 0) // 1초마다 if문을 실행 
   { 
      int temperature = analogRead(TEMP); 
      int  brightness = analogRead(CDS);
      float mVoltage = temperature*5000.0/1024.0; //섭씨온도 값 변환 
      float TempDotC = (mVoltage - 500) / 10.0;   //섭씨온도값 변환 
      Keyboard.print(counter);  // 데이터 앞줄마다 번호 매김 
      Keyboard.print(",");
      Keyboard.print(TempDotC);  // 온도 데이터
      Keyboard.print(",");
      Keyboard.print(brightness);   // 밝기 데이터
      Keyboard.print("\n");
      counter++;
    }     
  } 
  else 
  { 
    digitalWrite(LED, LOW); 
  } 
}

//버튼의 체터링 현상 방지를 위한 서브 함수 생성 
boolean debounce (boolean last) 
{ 
  boolean current = digitalRead (BUTTON); 
  if(last != current) 
  { 
    delay(5); 
    current = digitalRead(BUTTON); 
  } 
  return current;     
}

▶ 아두이노 파일다운 :
(다운로드하여서 압축을 풀어 사용하세요)

Leo_2_TMP36_CDS_LED_LIGHT.zip
0.00MB

 【프로세싱 코딩】  : 
/* Leonardo 보드의 온도 & 밝기 데이터 비주얼화 하기 */

PImage imgCDS;
PImage imgTemp;
PFont font;
import processing.serial.*; 
Serial port;
String temp ="";
String br ="";
String data="";
int index=0;
void setup () {
  size(800, 600);    // 출력 화면 크기 설정
  background(255);
  port =new Serial(this, "COM21", 9600);  //보드와 통신 포트 번호를 일치시킴
  port.bufferUntil('.');
  font=loadFont("Arial-Black-50.vlw");   // 출력에 표시할 폰트 지정
  textFont(font, 200);                        // 출력 폰트 사이즈 조절  

}
void draw() {
  background(255,255,255);
  imgTemp = loadImage("Temp1.png");   // 온도 이미지 삽입 
  imgCDS = loadImage("cds1.png");       // cds 이미지 삽입 
  image(imgTemp, 0, 0);                 // ('이미지 이름', '위치 x', '위치 y')
  image(imgCDS, 450, 10, 250,250); //('이미지 이름', '위치 x', '위치 y', '폭', ;높이') 
  fill(150, 150, 10);
  text(temp, 70, 500);            // ('데이터 변수명', '위치 x', '위치 y')
  fill(50, 0, 200);
  text(br, 450, 500);  

}
  void serialEvent(Serial port) {   // 통신 데이터가 있을 경우 실행
  data=port.readStringUntil('.');   // 마침표를 읽을 때까지 이벤트를 실행 
  data=data.substring(0, data.length()-1); // 첫 번째 데이터 값 저장
  index=data.indexOf(",");           // 데이터를 '콤마' 기준으로 구분
  temp=data.substring(0, index);  
  br=data.substring(index+1, data.length());  // 두 번째 데이터 값 저장
}

 

▶ 프로세싱 코드 다운로드 :
(다운로드하여서 압축을 풀어 사용하세요)

imageTempCDS (Ras).zip
4.87MB

▶ 프로세싱에서 글꼴 생성
(프로세싱 출력 화면에서 윈도의 폰트를 사용하기 위해서는 아래와 같은 과정을 통해 , 프로세싱에서 사용할 수 있는 비트맵 형태의 폰트로 변환하는 과정이 필요하다)

[ 도구 메뉴 》 글꼴 생성 》 폰트(크기) 선택 》 OK클릭 》 파일 이름 복사 》 프로세싱 코드에 붙여 넣기 ]

 

▶ 영상강좌 :  
(전체 화면 & 고화질 보기로 보세요)

https://youtu.be/Hdi8QHBYS2I

 

(카카오로 TV로 보기)

 

▶ 에러 대처 :  
【 아두이노 IDE에서 스케치를 실행할 때 아래와 같은 에러가 나타날 경우 

 'Keyboard' 가 없습니다. 스케치에서 '#include '를 포함했나요?

 분명, 'Keyboard.h 헤더 파일을 추가하였지만 에러가 나게 되는데  
만약 위와 같은 에러가 나타난다면, 아두이노 스케치에서 툴 메뉴 아래 보드 메뉴에서 보드를 Leonardo 보드로 선택을 하였는 확인이 필요하다.  보드 선택이 Leonardo로 선택이 되어 있지 않다면, 컴파일만 하더라도 실행이 되지 않고 이와 같이 'Keyboard' 에러를 발생시키게 된다.  

 

반응형
반응형

【 Leonardo #1 Let's collect Temperature & Brightness value to PC!

Welcome to RasINO~!   
In this chapter, we will learn how to use Arduino Leonardo board.    Let's go~!

▶ The Goal : 
 1. You can see how to use the Leonardo board.
 2. You can transfer the data from the temperature sensor & optical sensor (CDS) to the PC.
 3. You can make your data into Excel charts or use them in a variety of ways.

▶ Connection diagram :
  ( Click image to enlarge )

 

▶ Coding and annotation : 
/* Leonardo board Transfer temperature & brightness data to PC with Leonardo board */

#include <Keyboard.h>   
const int TEMP = 0;    // A0 port 
const int CDS = 1;    // A1 port  
const int LED = 12; 
const int BUTTON = 11; 
boolean lastBtn = LOW; 
boolean currentBtn = LOW; 
boolean running = false; 
int counter = 1;

void setup ( ) {  
  pinMode(LED, OUTPUT);
  Keyboard.begin();
}

void loop ( )  {
  currentBtn = debounce (lastBtn); 
  if (lastBtn == LOW && currentBtn == HIGH) // Click the button
  { 
     running = !running;   // Change state values backwards
   } 
  lastBtn = currentBtn; // Update button state values 
  if (running) // Writing data
  { 
     digitalWrite(LED, HIGH); 
     // The 'millis()' function returns the data in ms. 
     // So this function is used when the 'delay()' function is not available 
   if (millis()%1000 == 0) // Execute if statement every second
   { 
      int temperature = analogRead(TEMP); 
      int  brightness = analogRead(CDS);
      float mVoltage = temperature*5000.0/1024.0; // Converted to Celsius temperature 
      float TempDotC = (mVoltage - 500) / 10.0;   // Converted to Celsius temperature 
      Keyboard.print(counter);  // Data numbering before each line 
      Keyboard.print(",");
      Keyboard.print(TempDotC);  // Temperature data
      Keyboard.print(",");
      Keyboard.print(brightness);   // Brightness data
      Keyboard.print("\n");
      counter++;
    }     
  } 
  else 
  { 
    digitalWrite(LED, LOW); 
  } 
}

// Generate subfunctions to prevent button bouncing 
boolean debounce (boolean last) 
{ 
  boolean current = digitalRead (BUTTON); 
  if(last != current) 
  { 
    delay(5); 
    current = digitalRead(BUTTON); 
  } 
  return current;     
}

▶ Code download : 
( The code is zip compressed.)

Eng_TMP36_CDS_to_PC.zip
0.00MB

 

▶ Video lecture :  
(Look in full screen view)

 

(You can watch it on YouTube.)
https://youtu.be/K-Dc5MqBYaI

 

반응형
반응형

【 레오나르도활용#2】 온도밝기 값 PC로 수집하기 팁 #2(Leonardo

 아두이노 레오나르도(Leonardo)가 있으면 온도 센서와 광센서(CDS)등의 데이터를 실시간으로 PC로 수집할 수 있다. 이렇게 수집된 데이터는 엑셀로 차트를 만들어 볼 수 있고, 프로세싱(Processing) IDE를 통해 비주얼 하게 그래픽 처리해서 볼 수 있다.  그리고 파이썬으로 데이터를 정리하고 다듬어 준다면 활용할 수 있는 영역은 매우 많다.  한 번 해보면 어렵지 않으니 재미있게 즐겨보자~!    Let's go~!

▶ 선수 학습 :
      1. [레오나르도 활용#1] 레오나르도 보드 사용법(보드 스펙& 설치-연결 참조)  ☜ (클릭)
      2. [아두이노 센서#3] TMP36 온도 센서 (온도센서 참조)  ☜ (클릭)
      3. [아두이노 기초#3] 포토레지스터(CDS) 제어 (cds 광센서 참조)  ☜ (클릭)

▶ 실습 목표 :  
 1. [ 레오나르도 보드에 온도센서(Tmp36)와 광센서(cds) 회로를 연결하고 동작시킬 수 있다.
 2. [ 온도센서와 광센서로 부터의 데이터 값을 PC메모장을 통해 전송시킬 수 있다.]
 3. [ 전송된 데이터를 엑셀 등을 이용해서 활용해 본다 ]
 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)



▶ 프로그램 코드 및 설명 1 : 
/* Leonardo 보드로 온도 & 밝기 데이터 수집하기 */

#include <Keyboard.h>   
const int TEMP = 0;    // A0 포트
const int CDS = 1;    // A1 포트 
const int LED = 12;
const int BUTTON = 11;
boolean lastBtn = LOW;
boolean currentBtn = LOW;
boolean running = false;
int counter = 1;

void setup ( ) {  
  pinMode(LED, OUTPUT);
  Keyboard.begin();
}

void loop ( )  {
  currentBtn = debounce (lastBtn);
  if (lastBtn == LOW && currentBtn == HIGH) //버튼 누름
  {
     running = !running;   // 상태 값 반대로 변경
   }
  lastBtn = currentBtn; // 버튼 상태값 업뎃
  if (running) // 데이터 기록 중
  {
     digitalWrite(LED, HIGH);
     // millis() 함수는 데이터를 ms 단위로 반환해 줌, 백그라운드 동작
     // delay() 함수를 사용할 수 없을 때 사용
   if (millis()%1000 == 0) // 1초마다 if문을 실행
   {
      int temperature = analogRead(TEMP);
      int  brightness = analogRead(CDS);
      float mVoltage = temperature*5000.0/1024.0; //섭씨온도 값 변환
      float TempDotC = (mVoltage - 500) / 10.0;   //섭씨온도값 변환
      Keyboard.print(counter);  // 데이터 앞줄마다 번호 매김
      Keyboard.print(",");
      Keyboard.print(TempDotC);  // 온도 데이터
      Keyboard.print(",");
      Keyboard.print(brightness);   // 밝기 데이터
      Keyboard.print("\n");
      counter++;
    }    
  }
  else
  {
    digitalWrite(LED, LOW);
  }
}

//버튼의 체터링 현상 방지를 위한 서브 함수 생성
boolean debounce (boolean last)
{
  boolean current = digitalRead (BUTTON);
  if(last != current)
  {
    delay(5);
    current = digitalRead(BUTTON);
  }
  return current;    
}

▶ 아두이노 파일다운 :
(다운로드하여서 압축을 풀어 사용하세요)

Leo_2_TMP36_CDS_LED_LIGHT.zip
0.00MB


▶ 영상강좌 :  
(전체 화면 보기로 보세요)

(아래는 유튜브로 시청하기)
https://youtu.be/ViP64mGwv-I

 

 

반응형
반응형

【 레오나르도활용#1】 아두이노 레오나르도 보드 사용법 #1(Leonardo

▶ 아두이노 Leonardo보드는 아두이노 우노(Uno) 계열의 보드로서, 특징은 PC와 연동하여 활용하기 좋은 보드이다. 기본적인 기능이나 스펙은 우노 보드와 유사하다.  하지만, 우노 보드와 달리 PC와 연결하면 마우스, 키보드와 같은 가상 직렬 포트로 인식되어  PC 제어가 쉬운 특징이 있다.  우노에서의 USB 시리얼 통신(FTDI) 담당 칩인 Mega16u2를 제거하고 그 대신, USB 처리 기능이 있는 프로세서 칩인 ATmega32U4를 사용하였다. 

※ Leonardo는 PC 연결 시, 가상 직렬포트(CDC)로 인식되어, 키보드나 마우스와 같은 HID(Human Interface Device) 장치로 작동 가능한 특징이 있어 키보드 또는 마우스 클래스를 이용하여, PC를 제어하는 용도의 프로젝트에 강점이 있다.

우선, 먼저 레오나르도(Leonardo)에 대해 자세히 알아보고 연결해보도록(드라이버 설치) 하겠다 

아두이노 레오나르도

▶ 레오나르도 사양 :     

Leonardo 상세 사양

▶ 레오나르도 연결(드라이버 설치) :    

 레오나르도를 처음 연결하게 되면 장치가 인식되지 않는데, 
윈도 시작메뉴시작 메뉴로 가서,  제어판 》 장치 관리자 》 기타 장치  쪽을 살펴봐야 한다.

 아래처럼 주의 표시나, 알 수 없는 장치 표시가 뜨게 된다.

그럼 이제 마우스 우클릭하여 드라이버 설치를 진행해보자.

 그럼 아래처럼 드라이브 업데이트 방법에 대한 선택 창이 뜨는데, 
검색으로 찾지 말고, 컴퓨터에서 드라이버 소프트웨어 검색을 눌러준다.

그다음, '찾아보기(R)' 버튼을 눌러,  드라이버의 위치를 아두이노가 설치되어 있는 폴더 아래에 보면 drivers라는 폴더가 있는데, 그 폴더로 선택해준다. (아두이노가 설치된 위치는 다를 수 있음)
 그런데, 이렇게 지정하여도 드라이버 설치가 제대로 안 되는 경우가 있는데, 아두이노 IDE를 너무 오래전 버전을 사용하게 되면 그럴 수 있다.  따라서, 아두이노 사이트에서 아두이노IDE를 최신 버전으로 업데이트해보면 잘 될 것이다. 

 

그러면 드디어 아래처럼, 'Arduino Leonardo(COMxx)' 라며 선명하게 잡히는 것을 볼 수 있을 것이다.


▶ 
레오나르도 특징 :

 아두이노 우노 보드에서는,  보드와 PC 사이 통신(USB to Serial)을 담당해주는 보조 칩인 "mega 16u2"가 따로 존재한다.
하지만, 아두이노 레오나르도 보드에서는 메인칩을 'ATmega32 U4'로 바꾸면서 그 기능까지 담당하게 하였다. 
덕분에 레오나르도 보드의 가격이 우노보다 저렴해진 장점이 있다.  하지만, PC와 연결된 상태에서 리셋 버튼을 누르게 되면 PC와 연결이 끊겼다가 다시 연결되는데, 이 과정에서 장치 목록이 리프레쉬되고 시리얼 통신 중인 연결(데이터)이 끊기게 된다.  별도의 칩이 있어 리셋 버튼에 영향을 받지 않는 우노와 다른 점이다.   
 그래서 
스케치(IDE) 코드를 업로드하거나, 통신을 할 때 영향을 줄 수 있으니 레오나르도 보드를 사용할 때는 약간의 주의가 필요하다.  예를 들면,  레오나르도 보드에서는 PC에서 직렬(Serial) 포트를 열어도 스케치를 다시 시작하지 않는다. 즉, 보드에 의해 PC로 이미 전송된 시리얼 데이터는 (예, Setup { } 문의 내용들) 처음 순간 금방 전송되어 버리고 나면, 다시 확인할 수 없다.  이후 루프(loop { }  ) 안에 있는 내용만 시리얼 창을 통해 확인 가능하게 된다.

 하지만, 큰 장점도 있다. 하나의 메인 CPU로 스케치를 실행하고 USB 연결도 담당하니, 컴퓨터와의 유연성이 증가하게 되고, 펌웨어를 통해서 USB의 다양한 기능을 사용할 수 있어서 강력한 제어가 가능해진다. 

 그리고, 레오나르도 보드의 ATmega32U4 칩에는 D0(RX)핀, D1(TX)핀에서 사용할 수 있는 USB를 통한 UART TTL(5V) 시리얼 통신 기능을 지원한다.  이 것은 PC로 하여금 레오나르도 보드를 USB(2.0) (가상) 장치로 인식할 수 있게 해 준다. 
이는 아두이노(레오나르도) 보드를 이용해서 마우스나 키보드와 같은 기능을 구현할 수 있음을 뜻한다. 

 또한, 물리적인 시리얼 포트와 가상 COM 포트가 분리되어 있기 때문에, RX, TX단자에 블루투스와 같은 통신 모듈을 연결하여 사용하더라도, 스케치에 데이터를 업로드할 때 장치를 분리하지 않고도 업로드가 가능하다. (우노에서는, 블루투스가 연결되어 동작(통신)되고 있는 상태에서는 스케치를 통해서 업로드가 되지 않기 때문에 PC↔우노↔블루투스 형태의 통신을 위해 우노와 블루투스는 일반 포트를 이용한 소프트웨어 시리얼 통신을 이용하게 된다)

또 하나의 장점으로 위 테이블 표에서도 알 수 있듯이, 레오나르도 보드는 소프트웨어적으로 아두이노 보다 더 많은 총, 20 개의 Digital 입출력 핀과,  12개의 Analog 입력 핀을 설정하여 사용할 수 있다.  (물리적인, 핀 수는 우노와 동일하다)

레오나르도 보드의 뒷면을 살펴보라

위 이미지들은 사용할 수 있는 포트를 명기해 놓은 이미지이며, 보기에 편한 이미지를 사용하면 된다. 

많이 복잡해 보여도 실제 코딩에서는 관련 헤더 파일의 함수와 클래스를 이용하면 쉽게 다룰 수 있다.

그럼, 다음 회차부터는 본격적으로 레오나르도 보드를 사용해 재미나는 회로를 만들어 보려고 한다. 

 

반응형
반응형

【 아두이노Proj#6 조이스틱 미니카 만들기~! 

 조이스틱을 이용하여 아두이노 미니카(mini car)를 만들어 보려 한다. 

물론 무선으로 제어가 가능한 방법들도 많이 있지만, 구성이 간단하고 쉽게 조립해서 바로 실행시켜 볼 수 있어 유선으로 제어를 해보려 한다. 아두이노를 배우는 단계에 있다면, 쉬운것 부터 차근 차근 만들어 보는 경험을 쌓는 것이 매우 도움이 되기 때문이다. 또한 조이스틱과 소형의 L9110s 모터 드라이버를 활용해보는 공부도 될 것이다. 

▶ 선수 학습 :

    1. [아두이노 모듈#14] 조이스틱 Joystick 사용하기 #1 ☜ (클릭)

    2. [아두이노 모듈#15] L9110S 모듈 사용하기 #1 (모터 드라이버 참조)  ☜ (클릭)

 

 미니카 제작 재료

 

▶ 실습 목표 :  

 1. [ L9110S 모터 모듈을 활용하는 방법에 대해 이해 할 수 있다.

 2. [ 조이스틱으로 유선 제어를 응용해 볼 수 있다. ]

 3. [ Step up 컨버터를 이용해 낮은 입력 전압을 5V전압으로 승압해 주는 컨버터를 다룰 수 있다. ]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

※ 위 회로 연결에서 모터의 회전 방향이 반대가 될 경우 연결선을 서로 바꾸어 주면 된다. 

  (예를 들어, Motor A 가 반대 방향으로 회전 할 경우 A1-A 와 A1-B 에 연결한 선을 서로 바꾸어 연결한다)

 속도제어를 위해서는 디지털 포트 중에서 PWM신호 출력이 가능한 아두이노 포트(숫자앞 '~'표시) 를 연결해야 한다.

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

   -  미니카의 베이스 판은 아크릴 판 혹은 MDF 등 주변에서 쉽게 구할 수 있는 것으로 한다.

   -  조이스틱과 연결 되는 케이블은 유연성이 있는 연선(4선 혹은 3선)으로 연결한다.

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  코딩1은 조이스틱으로 상하좌우 제어만 가능한 기본 코드로 먼저 적용해 본다.

4.  코딩2는 조이스틱의 대각선 방향을 제어 해볼 수 있는 코드로, 필요한 경우 시리얼모니터링을 통해 데이터 값을 참고하여 코드 속 수치 값을 변경해주거나  자신만의 알고리즘으로 변경해본다. 

 

 

 

※  선수학습 1(조이스틱 편) 을 참고하여, 조이스틱을 상하좌우, 대각선방향 등 작동시켰을 때 나오는 값을 참고 하여, 아래 코딩에서 사용 되는 Jox, Joy의 좌표값을 적당한 값으로 수정할 필요가 있을 수 있다. 

(예를 들어, " if (Joy >= 90 && Jox < 20) ..." 에서  '90' 이나 '20'과 같은 수치 값 조정)

 

▶ 프로그램 코드 및 설명 (코드1) : 

/* 조이스틱 미니카 제어 (방향 : 상하좌우) */

/* L9110s 모터드라이버
   오른쪽모터
   L9110s A_1A 9 
   L9110s A_1B 10 
   왼쪽모터
   L9110s B_1A 5
   L9110s B_1B 6
*/
int A_1A = 9;
int A_1B = 10;
int B_1A = 5;
int B_1B = 6;
int speed = 250;   // speed: 0~ 255

void setup ( ) {  
  //핀을 초기화 하고, 출력설정
  pinMode(A_1A, OUTPUT);
  pinMode(A_1B, OUTPUT);
  pinMode(B_1A, OUTPUT);
  pinMode(B_1B, OUTPUT);
  digitalWrite(A_1A, LOW);
  digitalWrite(A_1B, LOW);
  digitalWrite(B_1A, LOW);
  digitalWrite(B_1B, LOW);
  Serial.begin(9600);  
}

void loop ( )  {
  int Jox = map(analogRead(A0), 0, 1023, -100, 100);
  int Joy = map(analogRead(A1), 0, 1023, -100, 100);
  Serial.print(" JoX : ");
  Serial.print(Jox);
  Serial.print("    JoY : ");
  Serial.println(Joy);
   
  if (Jox >= 90 && Joy <= 20 && Joy >= -20)  {
    // 모터 전진
    //모터A
    analogWrite(A_1A, speed);
    analogWrite(A_1B, 0);    
    //모터B
    analogWrite(B_1A, speed);
    analogWrite(B_1B, 0);
  }
  else if (Jox <= -90 && Joy <= 20 && Joy >= -20) {
    // 모터 후진
    //모터A
    analogWrite(A_1A, 0);
    analogWrite(A_1B, speed);    
    //모터B
    analogWrite(B_1A, 0);
    analogWrite(B_1B, speed); 
  }
  else if (Joy >= 90 && Jox < 20)  {
    //모터 우회전
    // 모터A 
    analogWrite(A_1A, 0);
    analogWrite(A_1B, speed);    
    // 모터B 
    analogWrite(B_1A, speed);
    analogWrite(B_1B, 0);
  }   
  else if (Joy <= -90 && Jox < 20) {
    // 모터 좌회전
    // 모터A 
    analogWrite(A_1A, speed);
    analogWrite(A_1B, 0);    
    // 모터B 
    analogWrite(B_1A, 0);
    analogWrite(B_1B, speed);  
  }

    // 모터 정지
  else {
    analogWrite(A_1A, 0);  
    analogWrite(A_1B, 0);    
    analogWrite(B_1A, 0);
    analogWrite(B_1B, 0);
  }
}

 

▶ 프로그램 코드 및 설명 (코드2): 

/* 조이스틱 미니카 제어 (방향 : 상하좌우 & 대각선 제어) */

/* L9110s 모터드라이버 
   오른쪽모터 
   L9110s A_1A 9 
   L9110s A_1B 10 
   왼쪽모터 
   L9110s B_1A 5 
   L9110s B_1B 6 
*/ 
int A_1A = 9; 
int A_1B = 10; 
int B_1A = 5; 
int B_1B = 6; 
int speed = 250;   // speed: 0~ 255 

void setup ( ) {  
  //핀을 초기화 하고, 출력설정 
  pinMode(A_1A, OUTPUT); 
  pinMode(A_1B, OUTPUT); 
  pinMode(B_1A, OUTPUT); 
  pinMode(B_1B, OUTPUT); 
  digitalWrite(A_1A, LOW); 
  digitalWrite(A_1B, LOW); 
  digitalWrite(B_1A, LOW); 
  digitalWrite(B_1B, LOW); 
  Serial.begin(9600);   
} 

void loop ( )  {
  int Jox = map(analogRead(A0), 0, 1023, -100, 100); 
  int Joy = map(analogRead(A1), 0, 1023, -100, 100); 
  Serial.print(" JoX : "); 
  Serial.print(Jox); 
  Serial.print("    JoY : "); 
  Serial.println(Joy); 
    
  if (Jox >= 90 && Joy <= 20 && Joy >= -20)  { 
    // 모터 전진 
    //모터A 
    analogWrite(A_1A, speed); 
    analogWrite(A_1B, 0);     
    //모터B 
    analogWrite(B_1A, speed); 
    analogWrite(B_1B, 0); 
  } 
  else if (Jox <= -90 && Joy <= 20 && Joy >= -20) { 
    // 모터 후진 
    //모터A 
    analogWrite(A_1A, 0); 
    analogWrite(A_1B, speed);     
    //모터B 
    analogWrite(B_1A, 0); 
    analogWrite(B_1B, speed);  
  } 
  else if (Joy>=90 && Jox<20 Jox<=20 && Jox>=-20 && Joy>=90)  { 
    //모터 우회전 
    // 모터A  
    analogWrite(A_1A, 0); 
    analogWrite(A_1B, speed);     
    // 모터B  
    analogWrite(B_1A, speed); 
    analogWrite(B_1B, 0); 
  }    
  else if (Joy<=-90 && Jox<20 Jox<=20 && Jox>=-20 && Joy<=-90) { 
    // 모터 좌회전 
    // 모터A  
    analogWrite(A_1A, speed); 
    analogWrite(A_1B, 0);     
    // 모터B  
    analogWrite(B_1A, 0); 
    analogWrite(B_1B, speed);   
  }

   // 동북방향
  else if ( Jox >= 90 && Joy >= 90 ) {
    analogWrite(A_1A, 120);
    analogWrite(A_1B, 0);    
    analogWrite(B_1A, speed);
    analogWrite(B_1B, 0);  
  }

   // 서북방향
  else if ( Jox >= 80 && Joy <= -80) {    
    analogWrite(A_1A, speed);
    analogWrite(A_1B, 0);    
    analogWrite(B_1A, 140);
    analogWrite(B_1B, 0);  
  }
  
  // 동남방향
  else if ( Jox <= -90 && Joy >= 80) {    
    analogWrite(A_1A, 0);
    analogWrite(A_1B, 120);    
    analogWrite(B_1A, 0);
    analogWrite(B_1B, speed);  
  }
  // 서남방향
  else if ( Jox <= -80 && Joy <= -80) {    
    analogWrite(A_1A, 0);
    analogWrite(A_1B, speed);    
    analogWrite(B_1A, 0);
    analogWrite(B_1B, 140);  
  }

   // 모터 정지
  else { 
    analogWrite(A_1A, 0);   
    analogWrite(A_1B, 0);     
    analogWrite(B_1A, 0); 
    analogWrite(B_1B, 0); 
  } 
}

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

# 1.  <코딩 1>

L9110_miniCar_JoyII.zip
0.00MB

# 2.  <코딩 2>

L9110_miniCar_JoyIII.zip
0.00MB

 

조립 과정 및 동작 영상 :

아두이노 미니카 제작 영상

[ ▶ 유튜브에서 보기 ]

https://youtu.be/GbwqPd2gi_s

 

반응형
반응형

【 아두이노모듈#15 L9110S #1(모터 드라이버) 모듈 사용하기

 

 아두이노로 스텝모터나 DC 모터를 제어하기 위해서는 TR이나 IC를 사용하여, H-bridge (h-브릿지) 회로를 구성하여 정역(정회전, 역회전) 제어를 하게 된다. 직접 TR이나 IC를 이용해서 따로 구성할 수 있지만 다소 번거롭다. 이를 해결해 줄 수 있는 모터 구동 모듈이 있어서 사용법을 간단히 소개하려 한다.  바로 L9110S 모듈이며, DC모터는 2개를 , 스텝모터는 1개(4선 2상)를 각각 제어 할 수 있다. 

L298 드라이버 모듈에 대해서도 포스팅 하였지만, 이 모듈보다 가격이 저렴(700원대)하고, 크기와 부피가 작아서 작은 크기의 작품을 만들려고 할 때 적합하다고 할 수 있겠다.

 

 

▶ 선수 학습 :

      1. [아두이노 기초#24] DC모터 제어하기 4 (H-bridge 참조)  ☜ (클릭)

 

 L9110S 모듈 세부 스팩

 

▶ 실습 목표 :  

 1. [ L9110S 모터 모듀을 이용하여 2개의 DC모터 방향을 제어 할 수 있다

 2. [ 아두이노의 아날로그 출력 함수를 이용하여 속도를 조절 해 볼 수 있다.]

 

▶ 실습 회로도면 :  L9110S 모터드라이버 모듈 연결도
  (이미지 클릭하면 확대 가능)

L9110S 모터드라이버 모듈 연결도

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  먼저 디지털 포트를 사용하여 방향제어를 해본다. (코딩1)

4.  코딩2를 참고하여 속도제어 실습도 해본다. (코딩2)

 

▶ 프로그램 코드 및 설명 1 : 

/* L9110S 모듈 제어 해보기  (방향제어 : 코딩1) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT);
  pinMode( motorA2 , OUTPUT);
  pinMode( motorB1 , OUTPUT);
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);

  delay(2000);

// 후진
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);

  delay(2000);

 

 // 좌회전
  digitalWrite( motorA1 , HIGH);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , HIGH);
  delay(2000);

 

 // 우회전
  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , HIGH);
  digitalWrite( motorB1 , HIGH);
  digitalWrite( motorB2 , LOW);
  delay(2000);

 

 // 정지

  digitalWrite( motorA1 , LOW);
  digitalWrite( motorA2 , LOW);
  digitalWrite( motorB1 , LOW);
  digitalWrite( motorB2 , LOW);
  delay(2000);

}

 

 

▶ 프로그램 코드 및 설명 2: 

/* L9110S 모듈 제어 해보기   (방향과 속도 제어 : 코딩2) */

int motorA1 =  5; 
int motorA2  = 6; 
int motorB1 =  9; 
int motorB2 =  10; 

int  speed = 255 ;   // speed :  0 ~ 255

 

void setup ( ) {  

  pinMode( motorA1 , OUTPUT); 
  pinMode( motorA2 , OUTPUT); 
  pinMode( motorB1 , OUTPUT); 
  pinMode( motorB2 , OUTPUT);

}

void loop ( )  {

  // 필요한경우 아래 코드에 따라 모터의 연결을 조정해야한다. 

  // <전진>

  analogWrite( motorA1 , 150);  // 숫자 값으로 속도 조절
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 , 150);
 
analogWrite( motorB2 , 0);

  delay(2000);

// <후진>
  analogWrite( motorA1 , 0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <좌회전>
 
 analogWrite( motorA1 ,  speed);
 
analogWrite( motorA2 , 0);
 
analogWrite( motorB1 ,  0);
 
analogWrite( motorB2 , speed);

  delay(2000);

 // <우회전> 
 
 analogWrite( motorA1 ,  0);
 
analogWrite( motorA2 , speed);
 
analogWrite( motorB1 ,  speed);
 
analogWrite( motorB2 , 0);

  delay(2000);

 // <정지>

  digitalWrite( motorA1 , 0);
 
digitalWrite( motorA2 , 0);
 
digitalWrite( motorB1 , 0);
 
digitalWrite( motorB2 , 0);
  delay(2000);

}

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

# 1.  <코딩 1>

L9110S_Basic_OK.zip
0.00MB

 

# 2.  <코딩 2>

L9110S_Speed_OK.zip
0.00MB

반응형
반응형

【 아두이노모듈#14 Joystick #1(Keyes SJoys) 조이스틱! 사용해보기

 

 조이스틱은 직관적인 인터페이스 덕분에 활용성이 높으면서도 복잡않아 여러가지 응용 작품을 만들때 자주 사용된다. 

주로 움직임 동작이 필요한 RC카 제어나, 드론, 게임기 제어 등에 사용된다.

따라서 조이스틱의 기본 사용법을 익혀보면 여러가지 프로젝트에 도움이 많이 될 것이다. 

이번 시간은 조이스틱 모듈의 기본적인 동작원리에 대해 다루어 보도록 하겠다.

 

 

▶ 선수 학습 :

      없음.

 조이스틱 모듈 (Keyes SJoys) 세부 스팩

Joystick 핀 배열
Keyes SJoys 상세 스팩

  조이스틱은 사실 포텐셔미터(Potentiometer) 라고 말 할 수 있다.

입력된 전압 값을 기계적인 스틱의 위치 변화(저항값)로 인해 조절하여 출력해주기 때문이다. 

그래서, 아두이노 에서는 아날로그 포트(A0~A6)를 통해서 입력받아야 조이스틱으로서의 기능적인 부분들을 처리 할 수 있다.  왜냐하면, 조이스틱의 경우 상하좌우 끝점의 값(디지털 1, 0)만 사용이 되는 것이 아니라, 조이스틱이 움직이는 중간 값들이 존재하고, 또 그 값들이 필요하기 때문이다.  아래 교육 영상을 보면 무슨 말인지 잘 이해 될 것이다. 

아날로그 출력 값은 조이스틱에 입력된 전압값(5V)을 기준으로 최소값(0V)~최대값(5V)이 출력되는데, 

조이스틱을 움직이지 않은 상태에서는 정 가운데 위치하기 때문에 VRx 와 VRy 출력 값이 약 2.5V가 출력 된다. (스틱의 기계적이 부분이 있어, 약간의 오차가 있을 수 있다)  

즉, 조이스틱 모듈의

1.  VRx 단자 출력값 :  0V(맨아래) ~ 2.5V(가운데)  ~ 5V(맨위)    

2.  VRy 단자 출력값 :  0V(맨왼쪽) ~ 2.5V(가운데)  ~ 5V(맨오른쪽)     

형태로 전압이 출력이 된다.   (물론, 상하좌우나 대각선등의 중간(전압)값도 존재한다.)

 

이런 전압을 아두이노에서 아날로그 포트로(A0~A6) 값을 입력받으면 아날로그 전압값을 디지털 수치값으로 변환시켜주는 ADC(컨버터)로 인해 ,  0V~5V 전압이 0~1023 수치값으로 변환된다. ( analogRead() 함수 사용)  

그러면, 아두이노에서 쉽게 데이터 처리가 가능해지는 것이다. 

 

▶ 실습 목표 :  

 1. [ 조이스틱 모듈의 구조와 동작원리에 대해 이해 할 수 있다.

 2. [ 조이스틱 모듈에서 사용하는 함수에 대해 이해하고 활용할 수 있다.]

 3. [ 기본 회로를 연결하여 조이스틱의 움직임에 따른 데이터 값을 시리얼모니터로 확인 할 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)
[ 회로1 - SW 를 아날로그 단자에 연결 -영상과 같은 회로]
스위치 눌림에 따라 값이 입력되도록 하였으며,  따라서 눌림의 정도가 일정하지 않음

회로1: SW를 아날로그 입력으로 처리한 회로

 

[ 회로2 - SW 를 디지털 단자 D2에 연결 ]
스위치를 디지털 단자에 연결하여 입력의 HIGH / LOW 신호값 구분을 확실하게 하였음,  단, 1㏀~10㏀ 사이의 풀업저항 연결이 필요함.  

 

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아래 코드를 작성하고 프로그램을 로딩 후 실행시킨다.(혹은 첨부파일 다운)

3.  시리얼 모티터 창을 띄운 후 조이스틱을 움직여 보면서 데이터 값이 올바르게 출력이 되는 지 확인한다.

4.  이렇게 컨트롤 되는 값으로 무엇을 가지고 제어를 해볼지 생각해본다.

 

▶ 프로그램 코드 및 설명 : 

/* 조이스틱의 SW를 아날로그 입력으로 처리한 코드 1 */

/* 조이스틱 컨트롤 해보기  */
/* Rasino.tistory.com   */ 

void setup() {
  Serial.begin(9600);  
}
void loop() {
  // 입력 값을 -100~ 100 사이의 값으로 맵핑(치환)한다
  int Jox = map(analogRead(A0), 0, 1023, -100, 100);
  int Joy = map(analogRead(A1), 0, 1023, -100, 100);
  Serial.print(" Joy X : ");
  Serial.print(Jox);
  Serial.print("    Joy y : ");
  Serial.println(Joy);
  // 조이스틱의 스위치 기능에 대한 정의 
  if (digitalRead(A2)) {
    Serial.println("Off");    
  } else {
    Serial.println("On");
  }
  delay(500);
}

 

/* 조이스틱의 SW를 디지털 입력으로 처리한 코드 2 */

/* 조이스틱 컨트롤 해보기  */
/* Rasino.tistory.com   */ 
#define SW 2

void setup() {
  Serial.begin(9600);  
  pinMode(SW,INPUT);
}
void loop() {
  // 입력 값을 -100~ 100 사이의 값으로 맵핑(치환)한다
  int Jox = map(analogRead(A0), 0, 1023, -100, 100);
  int Joy = map(analogRead(A1), 0, 1023, -100, 100);
  Serial.print(" Joy X : ");
  Serial.print(Jox);
  Serial.print("    Joy y : ");
  Serial.println(Joy);
  // 조이스틱 SW에서는 눌렀을때 0 ,  떼었을 때 1 이 출력되나,
  // 반대가 되도록 '!'로 반전을 시켰음
  Serial.println(!digitalRead(SW)); //  
  delay(300);
}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)
※ 영상에서는 SW를 눌리는 정도에 따라 반응하도록 아날로그 단자로 연결하였으나,  바로 위 코드처럼 디지털 단자 2번에 연결하여 활용하면 확실한 On Off 신호를 활용할 수 있습니다

조이스틱 아두이노 컨트롤

(아래는 유튜브로 시청하기)

https://youtu.be/0QVI3LmfNfc

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

(파일 1 : SW를 아날로그 A3번 단자에 연결한 코드 입니다)

Ras_JoyStick_01.zip
0.00MB

(파일 2 : SW를 Digital 2번 단자에 연결한 코드 입니다)

Ras_JoyStick_02_sw.zip
0.00MB

 

반응형
반응형

【 아두이노모듈#13 RFID #3(RC522) 도어락 만들기!

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 RFID모듈을 연결하고 특정 ID카드의 ID를 등록하여 시리얼모니터를 통해 승인 또는 거부 표시를 해보았다.  이번에는 좀더 실제적으로 응용이 가능하도록 서보모터와 LED를 이용해서 도어락 기능을 구현해보려 한다. 선수학습을 잘 따라왔다면, 크게 어렵지않고 더욱 흥미가 생길 것이다. 

 

▶ 선수 학습 :

      1. [아두이노 기초#30] 서보모터 제어하기 응용 ☜ (클릭)

      2. [아두이노 센서#3] TMP36 온도센서 #1 (RGB LED 부분 참조) ☜ (클릭)

      3. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

      4. [아두이노 모듈#12] RFID(RC522) 사용하기 #2 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

   세부스팩은 위 선수학습 내용을 참조.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 5. [ '서보 모터'와 , 'RGB LED'를 적용하여 RFID모듈 제어를 할 수 있다.] 

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID Rc522모듈을 활용한 도어락 회로도

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 

     ( 라이브러리 설치는 위 선수학습내용 참조)

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

4.  문으로 사용될 미이어쳐나 모형 등을 준비한다.  (RGB LED가 없으면 일반 LED를 사용)

5. 동작확인이 되면(실제 도어 등에 적용할 방법에 대해 고민해본다, 릴레이 사용 등등)

 

▶ 프로그램 코드 및 설명 : 

/* RFID 도어락 만들어 보기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

#include <Servo.h>    // 서보 라이브러리를 지정

#define servoPin 8     // 서보 모터핀을 지정

Servo servo;      // 서보 라이브러리 변수를 선언

int pos=0;      // 현재 각도를 저장할 변수를 지정한다

int RLED=7;     // 빨간색 LED단자를 아두이노 7번과 연결

int GLED=6;     // 초록색 LED단자를 아두이노 6번과 연결

 

void setup ( ) {  

  pinMode(RLED, OUTPUT);      // RED LED를 출력으로 지정

  pinMode(GLED, OUTPUT);      // GREEN LED를 출력으로 지정

  servo.attach(servoPin);     // 서보모터 핀을 설정한다

  servo.write(0);                // 서보모터 0도 위치로 초기화

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
  
Serial.println();  

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
  {

      return;

  }

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

  {

      return;

  }

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
  
String content= "";
  
byte letter;    
  
for (byte i = 0; i < rfid.uid.size; i++) 
  
{   
     
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
     
Serial.print(rfid.uid.uidByte[i], HEX);
     
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
     
content.concat(String(rfid.uid.uidByte[i], HEX));
  
}

  Serial.println();
  
Serial.print("Message : ");
  
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록

  {

   // 인증이 되면 Green LED와 함께 서보모터를 작동시킨다.
    Serial.println("Authorized access");
   
Serial.println();

    digitalWrite(GLED,HIGH);

    servo.write(180);   // 서보모터의 각도를 변경한다     

    delay(3000);  // 서보 모터의 각도가 변하는 것을 기다려 준다

    servo.write(0);     // 시간지연 후 문을 닫는다 

    digitalWrite(GLED,LOW);   // 시간지연 후 LED 끈다

  }

 

   // 승인 목록에 없는 UID 처리는

   // 서보모터의 작동 없이 Red LED만 켜고 끈다

  else   {

    Serial.println(" Access denied");
    digitalWrite(RLED,HIGH);

    delay(3000);

    digitalWrite(RLED,LOW);

   }

}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)

RFID 도어락 만들어 보기

(아래는 유튜브로 시청하기)

https://youtu.be/6nBu0obCx5Q

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

 

ko_arduino_code_Servo_LED.zip
0.00MB

 

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#12 RFID (RC522) 사용하기 #2

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 지난 실습에서 아두이노와 연결하는 기본회로 만들어 보았는데, 시리얼모니터를 통해 특정 ID카드의 고유값(UID)을 확인한 승인 처리 및 거부 처리 해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

      1. [아두이노 모듈#11] RFID(RC522) 사용하기 #1 ☜ (클릭)

 

 RFID 모듈 (RC522) 세부 스팩

※ RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 잃고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 4. [ 특정 UID를 지정하여 승인 및 거부 처리를 할 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID RC522 모듈 연결 회로도

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다. 
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  첨부된 아두이노 파일을 다운 받아 코드를 실행시킨다. 

 

4. 프로그램을 동작시키고 승인처리할 카드키 값을 읽어 프로그램에 적용한다.

5. 승인 및 거부 처리가 잘 되는지 확인한다. 

 

▶ 프로그램 코드 및 설명 : 

/* ID 카드의 UID값에 따라 승인 또는 거부 처리하기 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정 
MFRC522 
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언

void setup ( ) {

  Serial.begin(9600);
  
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  Serial.println("Approximate your card to the reader...");
 
Serial.println();

  }

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
    
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함  

  Serial.print("UID tag :");
 
String content= "";
 
byte letter;   
 
for (byte i = 0; i < rfid.uid.size; i++)
 
{  
    
Serial.print(rfid.uid.uidByte[i] < 0x10 ? " 0" : " ");
    
Serial.print(rfid.uid.uidByte[i], HEX);
    
content.concat(String(rfid.uid.uidByte[i] < 0x10 ? " 0" : " "));
    
content.concat(String(rfid.uid.uidByte[i], HEX));
 
}

  Serial.println();
 
Serial.print("Message : ");
 
content.toUpperCase();
  // UID값이 아래 값과 같으면 승인 처리
  if (content.substring(1) == "85 7C FB D1") // 승인 하고자하는 UID 기록
 {
   
Serial.println("Authorized access");
   
Serial.println();
   
delay(3000);      // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }
 // UID값이 다르다면 엑세스 거부 처리
  else   {
   
Serial.println(" Access denied");
   
delay(3000);     // 카드 접촉 및 연속체크 시간에 대한 딜레이 주기
  }

}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)

(아래는 유튜브로 시청하기)

https://youtu.be/I9uYJHTNAzA

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

RFID_Access_Denaied_ok.zip
0.00MB

 

 

 컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형
반응형

【 아두이노모듈#11RFID (RC522) 사용하기 #1

 

 RFID(Radio Frequancy Identification)는 무선 주파수를 이용하여 RFID 태그와 RFID리더간 데이터를 교환하는 장치이다.

 교통카드, 학생신분증 겸용카드, 연구실 및 회사 출입문카드, 구내식당 카드, 마트 등의 상품 진열 및 관리 등등 다방면에서 이용되고 있다. 

 이번 실습에서는 아두이노와 연결하는 기본회로를 구성하고 시리얼 모니터를 통해 카드별로 UID를 확인해보는 실습을 진행하려고 한다. 

 

▶ 선수 학습 :

   없음.

 

RFID 모듈 (RC522) 세부 스팩

 RFID 모듈 개요 

 - RC522모듈은 RFID 범주에 속하는 NFC통신 방식을 사용한다. NFC는 13.56MHz의 주파수 대역을 사용하고 10cm 이내 가까운 거리의 비첩촉 통신을 뜻한다.

 - RC522의 모듈 구성은 RFID 데이터를 읽고 기록 할 수 있는 본체가 있으며, RFID 고유데이터(UID) 코드가 저장되어 있는 카드키와 열쇠고리형키가 포함 되어 있다. 

 - 본 실습에서는 아두이노와 통신하기 위해 SPI통신 방식으로 연결하여 사용한다.

 

▶ 실습 목표 :  

 1. [ RFID 구동원리, 통신 방식에 대해 이해할 수 있다. 

 2. [ SPI통신과 회로 연결에 대해 이해 할 수 있다.]

 3. [ 카드별 고유넘버(UID)를 알아 낼 수 있다.]

 

▶ 실습 회로도면 :
  (이미지 클릭하면 확대 가능)

RFID 기본 회로도

 

▶ 실습 절차  : 

 

1.   부품을 준비하여 위와 같은 회로를 구성한다. 

2.   아두이노IDE에서 MFRC522 라이브러리를 검색후 설치한다.
  (메뉴 : 스케치 》 라이브러리 포함하기 》 라이브러리 관리 》 라이브러리 메니저 )
  

3.  설치된 라이브러리가 제공하는 예제파일을 열어 실행시킨다. (ReadNUD : UID 스캔 프로그램)

  (메뉴 : 파일 》 예제 》 MFRC522 》 ReadNUD 클릭)  

라이브러리 설치후 제공되는 예제파일 실행

4. 프로그램을 동작시키고 카드키를 RC522본체에 접촉시킨 후 시리얼 모니터창을 통해 UID값을 확인한다.

 

▶ 프로그램 코드 및 설명 : 

/* RC522.h 라이브러리에 포함된 ReadNUID 예제 참조 */

#include <SPI.h>
#
include <MFRC522.h>
#
define SS_PIN 10    // spi 통신을 위한 SS(chip select)핀 설정
#define RST_PIN 9    // 리셋 핀 설정
MFRC522
rfid(SS_PIN, RST_PIN); // 'rfid' 이름으로 클래스 객체 선언
MFRC522::MIFARE_Key key;
byte
nuidPICC[4];   // 카드 ID들을 저장(비교)하기 위한 배열(변수)선언

void setup ( ) {

  Serial.begin(9600);
 
SPI.begin();           // SPI 통신 시작

  rfid.PCD_Init();       // RFID(MFRC522) 초기화

  // ID값 초기화 

  for (byte i = 0; i < 6; i++) {

    key.keyByte[i] = 0xFF;

  }

// MIFARE 타입의 카드키 종류들만 인식됨을 표시

  Serial.println(F("This code scan the MIFARE Classsic NUID."));

  Serial.print(F("Using the following key:"));

  printHex(key.keyByte, MFRC522::MF_KEY_SIZE);

}

void loop ( )  {

 // 새카드 접촉이 있을 때만 다음 단계로 넘어감

  if ( ! rfid.PICC_IsNewCardPresent())
   
return;

 // 카드 읽힘이 제대로 되면 다음으로 넘어감
  if ( ! rfid.PICC_ReadCardSerial())

    return;

  // 현재 접촉 되는 카드 타입을 읽어와 모니터에 표시함

  Serial.print(F("PICC type: "));

  MFRC522::PICC_Type piccType = rfid.PICC_GetType(rfid.uid.sak);

  Serial.println(rfid.PICC_GetTypeName(piccType));

  // MIFARE 방식의 카드인지 확인 루틴

  if (piccType != MFRC522::PICC_TYPE_MIFARE_MINI && 

    piccType != MFRC522::PICC_TYPE_MIFARE_1K &&

    piccType != MFRC522::PICC_TYPE_MIFARE_4K) {

    Serial.println(F("Your tag is not of type MIFARE Classic."));

    return;

  }

 // 이전 인식된 카드와 다른, 혹은 새카드가 인식되면

  if (rfid.uid.uidByte[0] != nuidPICC[0] ||

    rfid.uid.uidByte[1] != nuidPICC[1] ||

    rfid.uid.uidByte[2] != nuidPICC[2] ||

    rfid.uid.uidByte[3] != nuidPICC[3] ) {

    Serial.println(F("A new card has been detected."));

 // 고유아이디(UID) 값을 저장한다.

    for (byte i = 0; i < 4; i++) {

      nuidPICC[i] = rfid.uid.uidByte[i];

    }

 // 그 UID 값을 16진값으로 출력 한다.

    Serial.println(F("The NUID tag is:"));

    Serial.print(F("In hex: "));

    printHex(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

 // 그 UID 값을 10진값으로 출력 한다.

    Serial.print(F("In dec: "));

    printDec(rfid.uid.uidByte, rfid.uid.size);

    Serial.println();

  }

 // 연속으로 동일한 카드를 접촉하면 다른 처리 없이

 // '이미 인식된 카드'라는 메세지를 출력한다.

  else Serial.println(F("Card read previously."));

  rfid.PICC_HaltA();

  rfid.PCD_StopCrypto1();

}

// 16진 값으로 변환 해주는 함수 정의

void printHex(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], HEX);

  }

}

// 10진 값으로 변환 해주는 함수 정의

void printDec(byte *buffer, byte bufferSize) {

  for (byte i = 0; i < bufferSize; i++) {

    Serial.print(buffer[i] < 0x10 ? " 0" : " ");

    Serial.print(buffer[i], DEC);

  }

}

 

▶ 실행영상 :  

(전체화면 보기로 보세요)

(아래는 유튜브로 시청하기)

https://youtu.be/uwi1Uk9U64w

RFID 회로 조립과 최초 동작확인

 

▶ 아두이노 파일다운 :

(다운받아서 압축을 풀어 사용하세요)

01_ReadNUID.zip
0.00MB

 

 

컴파일 에러 발생시 해결 방법 참고 :  아래 최신글을 참고해 보세요.

rasino.tistory.com/321

 

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기!( feat. RFID

【 MFRC522 RFID with Nano 33 iot #1】 아두이노 나노(33 IoT) 보드에 RFID 카드 모듈 사용해 보기! ( feat. RFID 컴파일 오류 있는 경우도 보세요! ) Nano 33 every(또는 33 iot 등)에서 RFID를 사용해보려 하..

rasino.tistory.com

 

반응형