1. 버튼을 누르면 소리내기 (버튼 눌림/올림 감지)



[ 주요 사용 함수 ]
- digitalRead( 핀번호 ) : 지정 핀의 전압을 측정하여
HIGH(=1) 또는 LOW(=0) 상태를 리턴
[ 버튼 눌림 판단 ]
- 평소 버튼이 올려져 열린 상태에서는 입력 값이 HIGH(1, Vcc) 상태임
- 버튼을 눌러 닫힌 상태가 되면 입력 값이 LOW(0, GND) 상태가 됨
2. 버튼을 누르면 소리내기 수정
버튼을 누르면 끊김이 없이 연속적으로 소리를 내도록 수정한 프로그램입니다. 소스를 작성하고 실행하여 1번 소스와의 차이점을 확인해 보시기 바랍니다.
//////////////////// 부저와 버튼 핀 번호
#define pinBuzzer 3 // 부저 핀 번호
#define pinButton A3 // 버턴 핀 번호
//////////////////// 메인 프로그램 (setup & loop)
void setup()
{
pinMode( pinButton, INPUT ); // 버튼은 입력 모드로
pinMode( pinBuzzer, OUTPUT ); // 부저는 출력 모드로
noTone( pinBuzzer ); // 스피커 끄기(음소거)
}
void loop()
{
if( digitalRead(pinButton) == 0 ) // 버튼 눌림?
{
tone( pinBuzzer, 261 ); // "도" 음 연주
//delay( 500 ); // 0.5초 유지
//noTone( pinBuzzer ); // 음소거(mute)
}
else
{
noTone( pinBuzzer ); // 음소거(mute)
}
delay( 10 ); // 10 msec 후에 다시 눌림 체크
}
3. 시리얼 모니터로 변수 값 출력하기

주요 사용 함수
- Serial.begin(통신속도) : 연결된 COM 포트로 통신 시작
- Serial.print(value) : value 내용(값)을 COM 포트로 출력
- Serial.println(value) : Serial.print(value) + 줄 넘김(New Line)
3. RFID(Radio Frequency Identification) Tag 읽기
무선 주파수를 이용하여 RFID 태그 안에 저장된 UID 데이터를 RFID 리더(Reader)로 판독할 수 있는 장치
RFID 장치 = 태그(Tag) + 리더(Reader) …… (MFRC-522, SPI 통신, 13.56MHz)
① 태그(TAG) : 태그 안에는 정보를 송수신하는 안테나, 태그의 정보(UID)를 담고 있는 IC 칩
② 리더(READER) : 태그로 신호를 보내어 태그로부터 수신한 정보(UID)를 판독

4. RFID 태그 읽기 코딩 실습 (1)


5. RFID 태그 읽기 코딩 실습 (2)

카드가 리더기 근처에 접근(태깅)되고, UID 읽기가 성공한 경우
UID를 스트링 변수에 16진수로 저장하고 시리얼 모니터로 출력하는 코드


#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
#include <SPI.h>
#define RFID_SS_PIN 2 // SPI 통신용 SS(Slave Select)
#define RFID_RST_PIN 4 // RESET 핀
MFRC522 mfrc522( RFID_SS_PIN, RFID_RST_PIN ); // 객체 인스턴스 선언
//////////////////// 메인 프로그램 (setup & loop)
void setup()
{
Serial.begin( 9600 );
SPI.begin(); // SPI 통신 초기화
mfrc522.PCD_Init(); // MFRC522 초기화
Serial.println("RFID Reader test: please touch with RFID card.");
}
void loop()
{
if( ! mfrc522.PICC_IsNewCardPresent() )
{
Serial.print("."); // 카드가 태깅(접근)되지 않음, 대기
delay( 500 );
return;
}
if( ! mfrc522.PICC_ReadCardSerial() )
{
Serial.print("!"); // UID 읽기 실패, 다시 대기
delay( 500 );
return;
}
Serial.print("\n\nUID tag: "); // 읽은 UID를 16진수로 출력 (ex) B00EA11B
String strRFID = ""; // RFID TAG를 저장할 문자열 변수
for( byte i=0; i < mfrc522.uid.size; i++ ) // UID size는 4 byte
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
Serial.print(mfrc522.uid.uidByte[i], HEX);
strRFID.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""));
strRFID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.print("\nMessage: "); // (ex) [29B0007F]
Serial.print("[");
strRFID.toUpperCase(); // strRFID에 저장된 UID 문자열을 대문자로 변환
Serial.print(strRFID);
Serial.println("]");
delay(3000); // 출력하고 3초 후에 다시 카드 읽기 반복
Serial.println("\nPlease touch with RFID card again.");
}
다음은 RF Tag ID를 읽어 물건을 이동시킬 위치를 정의하는 예제입니다. 문자열 변수로 ID를 정의하는 문장에서 각자 개인의 RF ID를 위의 소스를 이용하여 확인하신 후 수정 후에 테스트를 진행해 주시기 바랍니다.
#include <deprecated.h>
#include <MFRC522.h>
#include <MFRC522Extended.h>
#include <require_cpp11.h>
#include <SPI.h>
#define RFID_SS_PIN 2 // SPI 통신용 SS(Slave Select)
#define RFID_RST_PIN 4 // RESET 핀
String s_strRFIDUidForSeoul = String("7E8CF703");
String s_strRFIDUidForIncheon = String("1EE1F703");
String s_strRFIDUidForSejong = String("8215F803");
String s_strRFIDUidForDaejeon= String("39D6F703");
String s_strRFIDUidForDaegoo= String("44FAF603");
MFRC522 mfrc522( RFID_SS_PIN, RFID_RST_PIN ); // 객체 인스턴스 선언
//////////////////// 메인 프로그램 (setup & loop)
void setup()
{
Serial.begin( 9600 );
SPI.begin(); // SPI 통신 초기화
mfrc522.PCD_Init(); // MFRC522 초기화
Serial.println("RFID Reader test: please touch with RFID card.");
}
void loop()
{
if( ! mfrc522.PICC_IsNewCardPresent() )
{
Serial.print("."); // 카드가 태깅(접근)되지 않음, 대기
delay( 500 );
return;
}
if( ! mfrc522.PICC_ReadCardSerial() )
{
Serial.print("!"); // UID 읽기 실패, 다시 대기
delay( 500 );
return;
}
Serial.print("\n\nUID tag: "); // 읽은 UID를 16진수로 출력
String strRFID = ""; // RFID TAG를 저장할 문자열 변수
for( byte i=0; i < mfrc522.uid.size; i++ ) // UID size는 4 byte
{
Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? "0" : "");
Serial.print(mfrc522.uid.uidByte[i], HEX);
strRFID.concat(String(mfrc522.uid.uidByte[i] < 0x10 ? "0" : ""));
strRFID.concat(String(mfrc522.uid.uidByte[i], HEX));
}
Serial.print("\nMessage: ");
Serial.print("[");
strRFID.toUpperCase(); // strRFID에 저장된 UID 문자열을 대문자로 변환
Serial.print(strRFID);
Serial.println("]");
char sRFID[8+1];
strcpy( sRFID, &strRFID[0] );
Serial.println( sRFID );
if (strRFID.compareTo(s_strRFIDUidForSeoul) == 0)
{
Serial.println("Move to Seoul");
}
else if (strRFID.compareTo(s_strRFIDUidForIncheon) == 0)
{
Serial.println("Move to Incheon");
}
else if (strRFID.compareTo(s_strRFIDUidForSejong) == 0)
{
Serial.println("Move to Sejong");
}
else if (strRFID.compareTo(s_strRFIDUidForDaejeon) == 0)
{
Serial.println("Move to Daejeon");
}
else if (strRFID.compareTo(s_strRFIDUidForDaegoo) == 0)
{
Serial.println("Move to Daegoo");
}
delay(3000); // 출력하고 3초 후에 다시 카드 읽기 반복
Serial.println("\nPlease touch with RFID card again.");
}
728x90
728x90
'소프트웨어 > Arduino' 카테고리의 다른 글
| 스마트 액츄에이터의 회전 방향과 속도 제어 (0) | 2026.03.18 |
|---|---|
| 주요 센서들의 입력 처리와 디버깅 실습 #2 (0) | 2026.03.12 |
| 스마트 액츄에이터 (0) | 2026.03.12 |
| 모바일베이스(MobileBase) (0) | 2026.03.12 |
| 그리퍼 제어하기 (0) | 2026.03.12 |