블로그 이미지
조이키트 블로그
아두이노, 라즈베리파이, 반도체 센서/모듈 활용

calendar

1 2 3 4 5 6 7
8 9 10 11 12 13 14
15 16 17 18 19 20 21
22 23 24 25 26 27 28
29 30

Notice

250x250
728x90
반응형

LDR(Light Dependent Resistor) 감광저항 센서는 빛의 강도에 따라 저항 값이 변하는 센서이다.

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2bGXl

 

아두이노용 LDR 감광 저항센서 모듈 - 기타측정도구 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

원리 : 

1. LDR의 재료는 빛을 받으면 전자의 이동이 증가하여 전기 전도도가 높아지고, 그에 따라 저항이 낮아진다. 반대로 빛이 줄어들면 전자의 이동이 줄어들고, 저항은 다시 높아진다. 

2. 이 모듈에는 빛의 강도에 따라 출력 신호를 조절하기 위한 가변 저항기를 포함하고 있는데, 이것을 사용하여 센서의 감도를 조절할 수 있다.

3. 디지털, 아날로그 출력을 제공하여 빛의 강도에 대한 연속적인 값을 변환하여, 특정 임계값을 넘으면 디지털 출력을 트리거 할 수 있다.

 

모듈 핀 기능 :  

VCC : 작동 전압 ( DC 3.3 ~ 5V )

GND :  전원 접지( - )

DO (핀) : 디지털 출력

AO (핀) : 아날로그 출력

 

용도 : 

1. 자동 조명 시스템 : 빛의 강도에 따라 조명을 자동으로 조절하는 시스템에 사용된다. 예를 들어 해가 질 때 자동으로 켜지는 가로등 등이 있다.

2. 카메라 노출 조절 : 카메라의 자동 노출 기능에서 조명 상태를 감지하는데 사용된다.

3. 알람 및 보안 시스템 : 빛의 변화로 인해 누군가의 접근을 감지하는 보안시스템에서도 사용된다.

 

실습 예제 : 

LDR 감광센서 모듈과 아두이노, 소리모듈을 사용하여 간단한 프로젝트를 구현하는 방법을 설명하겠다.

LDR 센서를 아두이노에 연결하여 빛의 강도에 따라 데이터를 수집하여 아두이노에 연결된 LED와 소리모듈의 동작을 제어하여 LCD 디스플레이에 출력결과를 표시해보도록 하겠다.

 

준비품 : 

아두이노 우노 R3, LDR 감광저항센서, 개짖는 소리 모듈, LED 다이오드, LCD1602 등이 사용된다.

https://joykit.shop/product/%EC%95%84%EB%91%90%EC%9D%B4%EB%85%B8-%EC%9A%B0%EB%85%B8-r3/13/category/23/display/1/

 

아두이노 우노 R3 - 조이키트

AI 등 분야에서 센서 및 모듈을 제어할 수 있는 개발보드

joykit.shop

 

https://joykit.shop/product/ldr%EA%B0%90%EA%B4%91-%EC%A0%80%ED%95%AD%EC%84%BC%EC%84%9C/73/category/23/display/1/

 

LDR감광 저항센서 - 조이키트

교환 및 반품 주소  -   교환 및 반품이 가능한 경우  - 계약내용에 관한 서면을 받은 날부터 7일. 단, 그 서면을 받은 때보다 재화등의 공급이 늦게 이루어진 경우에는 재화등을 공급받거나

joykit.shop

https://joykit.shop/product/%EA%B0%9C%EC%A7%96%EB%8A%94-%EC%86%8C%EB%A6%AC-%EC%9D%8C%EC%84%B1-%EB%AA%A8%EB%93%88/72/category/23/display/1/

 

개짖는 소리 음성 모듈 - 조이키트

교환 및 반품 주소  -   교환 및 반품이 가능한 경우  - 계약내용에 관한 서면을 받은 날부터 7일. 단, 그 서면을 받은 때보다 재화등의 공급이 늦게 이루어진 경우에는 재화등을 공급받거나

joykit.shop

https://joykit.shop/product/lcd1602-16x2-4%ED%95%80-%EB%94%94%EC%8A%A4%ED%94%8C%EB%A0%88%EC%9D%B4-%EB%AA%A8%EB%93%88/24/category/23/display/1/

 

LCD1602 16x2 4핀 디스플레이 모듈 - 조이키트

교환 및 반품 주소  -   교환 및 반품이 가능한 경우  - 계약내용에 관한 서면을 받은 날부터 7일. 단, 그 서면을 받은 때보다 재화등의 공급이 늦게 이루어진 경우에는 재화등을 공급받거나

joykit.shop

 

아두이노 우노 R3 LDR 감광저항센서 개짖는 소리 모듈
LCD1602 LED 다이오드 300옴 저항

 

구성품이 준비되면 다음과 같이 회로를 연결한다.

 

회로연결 : 

아두이노 우노 R3 LDR 감광센서 소리 모듈 LED 다이오드 LCD 1602
VCC VCC     VCC
GND GND GND GND GND
D3   VCC    
D8 DO      
D9     +전원  
A0 AO      
A4       SDA
A5       SCL

 

회로도 :

LDR 감광 측정기 회로도

 

 

아래 그림은 실지 회로를 연결한 모습이다.

 

회로 연결이 전부 끝나면 다음과 같이 코드를 작성한다.

 

#include <LiquidCrystal_I2C.h>

int sensorPin = A0;       // LDR 연결 핀
int ledPin = 9;           // LED 연결 핀
int dogPin = 3;
int threshold = 750;      // 임계값 (0~1023 범위) 

 

먼저 LCD1602 라이브러리를 설치하고 변수 sensorPin, ledPin, dogPin, threshold 를 선언한다.

여기서 threshold 변수의 임계 값이 750을 넘으면 아두이노에 연결된 LED와 소리모듈을 제어할 수 있다.

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설정

LCD 1602는 16행 2열로 설정한다.

 

void setup() {
  lcd.init();    // LCD 초기화 
  lcd.backlight();  // LCD 백라이트 켬
  pinMode(ledPin, OUTPUT);  // LED 핀을 출력 모드로 설정
  pinMode(dogPin, OUTPUT);  // dog 핀을 출력 모드로 설정
  Serial.begin(9600);       // 시리얼 통신 시작
}

LCD 모듈을 초기화하고, 백라이트를 켜준다.

ledPin, dogPin을 출력모드로 설정하고, 시리얼 통신은 9600으로 시작한다.

 

void loop() {
  int sensorValue = analogRead(sensorPin);  // LDR에서 아날로그 값 읽기
  Serial.println(sensorValue);              // 시리얼 모니터에 값 출력

  // 밝기가 임계값 이하이면 LED 켜기
  if (sensorValue > threshold) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(dogPin, HIGH);
    lcd.setCursor(0,0);   
    lcd.print("LED : ON");
    lcd.setCursor(0,1);  
    lcd.println(sensorValue);
  } else {  // 밝기가 임계값 이상이면 LED 끄기
    digitalWrite(ledPin, LOW);
    digitalWrite(dogPin, LOW);
    lcd.setCursor(0,0);   
    lcd.print("LED : OFF");
    lcd.setCursor(0,1);  
    lcd.println(sensorValue);
  }

 

sensorValue 변수로 sensorPin의 아날로그 값을 읽어드리고, sensorValue 값에 따라 아두이노에 연결된 모듈을 제어한다.

 

전체 코드 : 

#include <LiquidCrystal_I2C.h>

int sensorPin = A0;       // LDR 연결 핀
int ledPin = 9;           // LED 연결 핀
int dogPin = 3;
int threshold = 750;      // 임계값 (0~1023 범위)

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설정

void setup() {
  lcd.init();    // LCD 초기화 
  lcd.backlight();  // LCD 백라이트 켬
  pinMode(ledPin, OUTPUT);  // LED 핀을 출력 모드로 설정
  pinMode(dogPin, OUTPUT);  // dog 핀을 출력 모드로 설정
  Serial.begin(9600);       // 시리얼 통신 시작
}

void loop() {
  int sensorValue = analogRead(sensorPin);  // LDR에서 아날로그 값 읽기
  Serial.println(sensorValue);              // 시리얼 모니터에 값 출력

  // 밝기가 임계값 이하이면 LED 켜기
  if (sensorValue > threshold) {
    digitalWrite(ledPin, HIGH);
    digitalWrite(dogPin, HIGH);
    lcd.setCursor(0,0);   
    lcd.print("LED : ON");
    lcd.setCursor(0,1);  
    lcd.println(sensorValue);
  } else {  // 밝기가 임계값 이상이면 LED 끄기
    digitalWrite(ledPin, LOW);
    digitalWrite(dogPin, LOW);
    lcd.setCursor(0,0);   
    lcd.print("LED : OFF");
    lcd.setCursor(0,1);  
    lcd.println(sensorValue);
  }

  delay(100);  // 100ms 대기 (출력 속도 조절)

  lcd.clear();
}

 

 

코드를 전부 작성한 후 컴파일 하고 업로드 하면 다음과 같은 출력 결과를 볼 수 있다.

 

출력 결과 :

https://www.youtube.com/watch?v=LeMFeUzghe8

 

728x90
반응형
posted by 조이키트 블로그
728x90
반응형

YX5300 UART TTL 직렬 MP3 음악 플레이어 모듈은 다양한 기능을 제공하는 강력한 오디오 모듈이다.

 

1. 오디오 형식 : MP3, WAV, WMA 형식의 오디오 파일을 지원한다.

2. 직렬 통신 : UART TTL 직렬 인터페이스를 통해 마이크로컨트롤러에 쉽게 통신할 수 있다.

3. TF 카드 지원 : 최대 32GB의 Micro TF 카드를 지원하여 대용량의 오디오 파일을 저장하고 재생할 수 있다.

4. 내장형 오디오 디코더 : 내장된 오디오 디코더를 사용하여 오디오 파일을 고음질로 재생할 수 있다.

5. 다양한 재생 제어 : 재생, 일시정지, 정지, 다음트랙, 이전트랙, 볼륨_UP, 볼륨_DOWN, 등의 명령을 통해 오디오 재생을 제어할 수 있다.

6. 스피커 연결 : 모듈에 직접 스피커를 연결할 수 있는 단자를 제공하여 외부 앰프 없이도 오디오 출력을 제공한다.

 

실습 예제 :

YX5300 UART TTL 직렬 MP3 음악 플레이어 모듈을 아두이노와 함께 사용하여 MP3 플레이어를 만들어 보겠다.

구성품으로는 YX5300 MP3 플레이어 모듈, 아두이노 우노 R3, 0.91인치 128X32pixel 디스플레이 모듈, 푸시버튼 등이 사용된다.

 

구성품 : 

YX5300 MP3 모듈 아두이노 우노 R3 0.91인치 OLED 모듈 푸시버튼

 

 

회로도 : 

mp3 플레이어 회로도

 

mp3 플레이어 실물

 

위와 같이 회로를 연결하고 다음과 같이 코딩을 작성한다.

코딩 설명으로는 먼저 OLED와 YX5300 모듈을 위해 라이브러리를 설치해주어야 한다.

OLED 디스플레이 라이브러리 : Adafruit SSD1306, Adafruit GFX Library

YX5300 mp3 모듈 라이브러리 : DFRobotDFPlayerMini

I2C 통신을 위해 Wire 라이브러리를 포함한다.

#include <Wire.h>: I2C

 

 다음 디스플레이 너비 : 128,  높이 : 32로 정의하여 준다. 

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32

YX5300 mp3 모듈의 TX, RX를 디지털핀  D2, D3번으로 설정한다.

버튼설정 : 플레이/정지, 다음, 이전, 볼륨+, 볼륨-, 전원 ON/OFF 버튼을 디지털핀 D4, D5, D6, D7, D8, D9 순서대로 설정하여 준다.

// 버튼 핀 설정
const int playPauseButtonPin = 4;
const int nextButtonPin = 5;
const int prevButtonPin = 6;
const int volumeUpButtonPin = 7;
const int volumeDownButtonPin = 8;
const int powerButtonPin = 9;

 

초기 볼륨을 0~30 중 10으로, 트랙은 1번으로 변수 volume, trackNumber로 정의하여 준다. 

int volume = 10; // 초기 볼륨 (0-30)
int trackNumber = 1; // 재생할 트랙 번호

 

버튼 입력 모드를  INPUT_PULLUP으로 설정한다.

  pinMode(playPauseButtonPin, INPUT_PULLUP);
  pinMode(nextButtonPin, INPUT_PULLUP);
  pinMode(prevButtonPin, INPUT_PULLUP);
  pinMode(volumeUpButtonPin, INPUT_PULLUP);
  pinMode(volumeDownButtonPin, INPUT_PULLUP);
  pinMode(powerButtonPin, INPUT_PULLUP);

 

디스플레이의 I2C 주소를 0X3C로 설정한다. 

if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);

 

전원 버튼 설정 : 

if (digitalRead(powerButtonPin) == LOW) {
    delay(50); // 디바운스
    if (digitalRead(powerButtonPin) == LOW) {
      powerOn = !powerOn;
      if (powerOn) {
        myDFPlayer.start();
        isPlaying = true;
        Serial.println(F("Power ON"));
      } else {
        myDFPlayer.pause();
        isPlaying = false;
        Serial.println(F("Power OFF"));
      }
      updateDisplay();
      while (digitalRead(powerButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

재생/ 정지 버튼 설정 : 

if (digitalRead(playPauseButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(playPauseButtonPin) == LOW) {
      if (isPlaying) {
        myDFPlayer.pause();
        Serial.println(F("Paused"));
      } else {
        myDFPlayer.start();
        Serial.println(F("Playing"));
      }
      isPlaying = !isPlaying;
      updateDisplay();
      while (digitalRead(playPauseButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

다음곡 버튼 설정 : 

if (digitalRead(nextButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(nextButtonPin) == LOW) {
      myDFPlayer.next();
      trackNumber++;
      Serial.print(F("Next track: "));
      Serial.println(trackNumber);
      updateDisplay();
      while (digitalRead(nextButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

이전곡 버튼 설정 : 

 if (digitalRead(prevButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(prevButtonPin) == LOW) {
      myDFPlayer.previous();
      if (trackNumber > 1) trackNumber--;
      Serial.print(F("Previous track: "));
      Serial.println(trackNumber);
      updateDisplay();
      while (digitalRead(prevButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

볼륨 증가 버튼 설정 : 

if (digitalRead(volumeUpButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(volumeUpButtonPin) == LOW) {
      if (volume < 30) volume++;
      myDFPlayer.volume(volume);
      Serial.print(F("Volume increased to "));
      Serial.println(volume);
      updateDisplay();
      while (digitalRead(volumeUpButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

볼륨 감소 버튼 설정 :

if (digitalRead(volumeDownButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(volumeDownButtonPin) == LOW) {
      if (volume > 0) volume--;
      myDFPlayer.volume(volume);
      Serial.print(F("Volume decreased to "));
      Serial.println(volume);
      updateDisplay();
      while (digitalRead(volumeDownButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

 

자동재생 처리 설정 :

자동재생처리는 음악 재생시 첫 곡이 끝나면 다음곡으로 자동재생하는 기능이다. 

if (myDFPlayer.available() && powerOn) {
    uint8_t type = myDFPlayer.readType();
    if (type == DFPlayerPlayFinished) {
      Serial.println(F("Track finished, playing next track"));
      myDFPlayer.next();
      trackNumber++;
      updateDisplay();
    }
  }

 

디스플레이 업데이트 설정 :

void updateDisplay() {
  display.clearDisplay();
  display.setCursor(0, 0);
  if (powerOn) {
    display.print(F("Power: ON"));
    display.print(F("  Volume: "));
    display.println(volume);
    display.print(F("Track: "));
    display.println(trackNumber);
    display.print(F("Status: "));
    display.println(isPlaying ? "Playing" : "Paused");
  } else {
    display.println(F("Power: OFF"));
  }
  display.display();
}

 

전체 코딩 : 

#include <Wire.h>
#include <Adafruit_GFX.h>
#include <Adafruit_SSD1306.h>
#include <SoftwareSerial.h>
#include <DFRobotDFPlayerMini.h>

#define SCREEN_WIDTH 128
#define SCREEN_HEIGHT 32
#define OLED_RESET    -1
Adafruit_SSD1306 display(SCREEN_WIDTH, SCREEN_HEIGHT, &Wire, OLED_RESET);

SoftwareSerial mySerial(2, 3); // RX, TX
DFRobotDFPlayerMini myDFPlayer;

// 버튼 핀 설정
const int playPauseButtonPin = 4;
const int nextButtonPin = 5;
const int prevButtonPin = 6;
const int volumeUpButtonPin = 7;
const int volumeDownButtonPin = 8;
const int powerButtonPin = 9;

// 볼륨과 트랙 상태 변수
int volume = 10; // 초기 볼륨 (0-30)
int trackNumber = 1; // 재생할 트랙 번호
bool isPlaying = false;
bool powerOn = true;

void setup() {
  Serial.begin(9600);
  mySerial.begin(9600);

  // 버튼 입력 모드 설정
  pinMode(playPauseButtonPin, INPUT_PULLUP);
  pinMode(nextButtonPin, INPUT_PULLUP);
  pinMode(prevButtonPin, INPUT_PULLUP);
  pinMode(volumeUpButtonPin, INPUT_PULLUP);
  pinMode(volumeDownButtonPin, INPUT_PULLUP);
  pinMode(powerButtonPin, INPUT_PULLUP);

  // OLED 디스플레이 초기화
  if (!display.begin(SSD1306_SWITCHCAPVCC, 0x3C)) {
    Serial.println(F("SSD1306 allocation failed"));
    while (true);
  }
  display.clearDisplay();
  display.setTextSize(1);
  display.setTextColor(SSD1306_WHITE);
  
  // DFPlayer 초기화
  if (!myDFPlayer.begin(mySerial)) {
    Serial.println(F("Unable to begin:"));
    Serial.println(F("1. Please recheck the connection!"));
    Serial.println(F("2. Insert the SD card!"));
    while (true);
  }
  Serial.println(F("DFPlayer Mini online."));
  
  // 초기 볼륨 설정
  myDFPlayer.volume(volume);
  Serial.print(F("Volume set to "));
  Serial.println(volume);

  // 첫 번째 트랙 재생
  myDFPlayer.play(trackNumber);
  isPlaying = true;
  Serial.print(F("Playing track "));
  Serial.println(trackNumber);

  // OLED 디스플레이에 초기 정보 표시
  updateDisplay();
}

void loop() {
  // 전원 버튼 읽기
  if (digitalRead(powerButtonPin) == LOW) {
    delay(50); // 디바운스
    if (digitalRead(powerButtonPin) == LOW) {
      powerOn = !powerOn;
      if (powerOn) {
        myDFPlayer.start();
        isPlaying = true;
        Serial.println(F("Power ON"));
      } else {
        myDFPlayer.pause();
        isPlaying = false;
        Serial.println(F("Power OFF"));
      }
      updateDisplay();
      while (digitalRead(powerButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 재생/정지 버튼 읽기
  if (digitalRead(playPauseButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(playPauseButtonPin) == LOW) {
      if (isPlaying) {
        myDFPlayer.pause();
        Serial.println(F("Paused"));
      } else {
        myDFPlayer.start();
        Serial.println(F("Playing"));
      }
      isPlaying = !isPlaying;
      updateDisplay();
      while (digitalRead(playPauseButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 다음곡 버튼 읽기
  if (digitalRead(nextButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(nextButtonPin) == LOW) {
      myDFPlayer.next();
      trackNumber++;
      Serial.print(F("Next track: "));
      Serial.println(trackNumber);
      updateDisplay();
      while (digitalRead(nextButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 이전곡 버튼 읽기
  if (digitalRead(prevButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(prevButtonPin) == LOW) {
      myDFPlayer.previous();
      if (trackNumber > 1) trackNumber--;
      Serial.print(F("Previous track: "));
      Serial.println(trackNumber);
      updateDisplay();
      while (digitalRead(prevButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 볼륨 증가 버튼 읽기
  if (digitalRead(volumeUpButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(volumeUpButtonPin) == LOW) {
      if (volume < 30) volume++;
      myDFPlayer.volume(volume);
      Serial.print(F("Volume increased to "));
      Serial.println(volume);
      updateDisplay();
      while (digitalRead(volumeUpButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 볼륨 감소 버튼 읽기
  if (digitalRead(volumeDownButtonPin) == LOW && powerOn) {
    delay(50); // 디바운스
    if (digitalRead(volumeDownButtonPin) == LOW) {
      if (volume > 0) volume--;
      myDFPlayer.volume(volume);
      Serial.print(F("Volume decreased to "));
      Serial.println(volume);
      updateDisplay();
      while (digitalRead(volumeDownButtonPin) == LOW); // 버튼이 릴리스될 때까지 대기
    }
  }

  // 자동재생 처리
  if (myDFPlayer.available() && powerOn) {
    uint8_t type = myDFPlayer.readType();
    if (type == DFPlayerPlayFinished) {
      Serial.println(F("Track finished, playing next track"));
      myDFPlayer.next();
      trackNumber++;
      updateDisplay();
    }
  }
}

void updateDisplay() {
  display.clearDisplay();
  display.setCursor(0, 0);
  if (powerOn) {
    display.print(F("Power: ON"));
    display.print(F("  Volume: "));
    display.println(volume);
    display.print(F("Track: "));
    display.println(trackNumber);
    display.print(F("Status: "));
    display.println(isPlaying ? "Playing" : "Paused");
  } else {
    display.println(F("Power: OFF"));
  }
  display.display();
}

 

위와 같이 코딩을 작성한 후 아두이노에 업로드 하면 다음과 같이 MP3 플레이어가 작동하는 결과를 볼 수 있다.

 

출력 결과 : 

https://www.youtube.com/watch?v=iIHMpeOKoBc

 

YX5300모듈을 사용하여 기본적인 MP3 플레이어를 만들어 보았다. 여기서 조금만 더 기능을 추가하면 다양한 형태의 플레이어를 만들 수 있다. 

728x90
반응형
posted by 조이키트 블로그
728x90
반응형

 

압전진동 타진센서는 기계나 구조물의 진동을 감지하고 측정하는 센서이다.

"압전"은 전기적 변환을 나타내며, 압전 센서는 압력이나 변위와 같은 물리적인 변화를 전기적 신호로 변환한다.

"진동 타진"은 기계의 운전 중 발생하는 진동과 타진을 의미한다. 따라서 압전진동 타진센서는 이러한 진동 및 타진을 감지하여 전기적 신호로 변환하여 측정한다.

이러한 센서는 기계의 상태 모니터링, 구조물의 건축 안전 감시, 자동차 엔진의 진동 진단 등 다양한 응용 분야에서 사용된다.

기계 상태 모니터링 구조물 건축 안전 감시 자동차 엔진의 진동 진단

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2FjjH

 

압전진동 타진센서 모듈 - 기타측정도구 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2E5Xq

 

액티브/패시브 버저 모듈 - 기타전기설비부자재 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

 

실습 : 
아두이노와 압전진동 타진센서를 함께 사용하여 진동을 감지하고 데이터를 수집할 수 있다.

이번 실습은 아두이노에 압전진동 센서를 사용하여 어느한 임계값에 도달하면 LED 다이오드가 켜지면서 부저모듈에서 신호음음 울리는 측정기를 만들어 보겠다.

 

아래는 압전진동 타진센서를 아두이노와 연결하는 간단한 방법이다:

  1. 센서 연결: 일반적으로 압전진동 타진센서에는 세 개의 핀(전원, 지상, 신호)이 있다. 아두이노의 아날로그 입력 핀에 센서의 신호 핀을 연결하고, 전원 핀을 5V에, 지상 핀을 GND에 연결한다.

준비품 : 

아두이노 우노 R3 압전진동 타진센서 LCD1602 디스플레이
부저 모듈 LED 다이오드  300옴 저항

 

회로 연결 : 

아두이노 우노  R3 압전진동 센서 LCD1602 부저 모듈 LED 다이오
+5V V VCC    
GND G GND G G
A0 AO      
D13       +핀
A4   SDA    
A5   SCL    
D9     S  

 

 

위와 같이 회로를 연결하고 아두이노 IDE에  다음과 같이 코딩을 작성한다.


#include <LiquidCrystal_I2C.h>
const int sensorPin = A0; // 압전진동 타진센서가 연결된 아날로그 핀
const int ledPin = 13;    // LED가 연결된 핀
const int buzzerPin = 9;     // 부저 모듈이 연결된 디지털 핀
int sensorValue = 0;      // 센서 값 저장 변수
int threshold = 13;        // LED를 켜기 위한 임계값

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설정

void setup() {
  lcd.init();    // LCD 초기화 
  lcd.backlight();  // LCD 백라이트 켬
  Serial.begin(9600);    // 시리얼 통신 시작
  pinMode(sensorPin, INPUT); // 센서 핀을 입력으로 설정
  pinMode(ledPin, OUTPUT);   // LED 핀을 출력으로 설정
}

void loop() {
  sensorValue = analogRead(sensorPin); // 센서 값을 읽음
  Serial.println(sensorValue);         // 시리얼 모니터에 출력

    if (sensorValue > threshold) {   // 센서 값이 임계값을 초과하면
    digitalWrite(ledPin, HIGH);    // LED를 켬
    tone(buzzerPin, 1000);         // 부저를 1kHz로 설정하여 소리 출력
  } else {                         // 그렇지 않으면
    digitalWrite(ledPin, LOW);     // LED를 끔
    noTone(buzzerPin);             // 부저 소리를 끔
  }

  lcd.setCursor(0,0);            // LCD 1행 1열에 출력
  lcd.print("Value : ");
  lcd.print(sensorValue);      // LCD에 센서값 출력
  delay(1000);                          // 1초 간격으로 반복

  lcd.clear();  // LCD 클리어
}

 

이 코드는 압전진동 타진센서로 감지된 진동이 임계값을 초과할 때 LED를 켜고 부저 모듈로 소리를 출력한다. 임계값 및 소리의 높이와 패턴을 조정하여 원하는 동작을 얻을 수 있다.

 

출력 결과 :

https://www.youtube.com/watch?v=oK-CpmWpkWM

 

출력결과는 진동센서가 거의 움직임이 없을 때 값이 13정도가 되었으므로 센서의 임계값을 13으로 설정하였고, 그 이상 초과하면 LED와 부저모듈에서 경고음이 울리도록 설계하였다.

728x90
반응형
posted by 조이키트 블로그
728x90
반응형

아두이노에서 키패드와 LCD 디스플레이, 5V 릴레이를 사용하여 키패드 도어락을 만드는 법을 알아보겠다.

 

구성요소 : 아두이노 우노 R3, 4X4키패드, LCD1602 디스플레이 듈, 5V릴레이 모듈

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2vTO0

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FDaB

 

4X4 매트릭스 키보드 배열 모듈 16 키 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FEbX

 

아두이노 릴레이 1채널 5V 모듈 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

아두이노에 다음과 같이 회로를 구성한다.

회로 구성도

 

회로 결선도

아두이노 우노 R3 4X4 키패드 LCD 1602 릴레이 모듈
+5V   VCC VCC
GND   GND GND
D2 colPin2    
D3 colPin3    
D4 colPin4    
D5 colPin5    
D6 rowPin6    
D7 rowPin7    
D8 rowPin8    
D9 rowPin9    
A4   SDA  
A5   SCL  
D12     IN

 

위와 같이 회로를 구성한 다음 아두이노 IED에 LCD 및 키패드 라이브러리를 설치해야 한다.

설치 방법은 Sketch/Include Library/Manage Libraries에 들어간 다음 검색창에 LiquidCrystal_I2C 와 Keypad를 입력한 다음 설치하여 주면 된다.

 

 

코딩 :

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

#define Password_Length 6 // 패스워드 길이 설정

int signalPin = 12;  

char Data[Password_Length]; 
char Master[Password_Length] = "1234*";   
byte data_count = 0, master_count = 0;
bool Pass_is_good;
char customKey;

const byte ROWS = 4;  // 키패드 행수 설정
const byte COLS = 4;  // 키패드 열수 설정

char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {9, 8, 7, 6};  // 키패드 행핀 D6 ~ D9 설정
byte colPins[COLS] = {5, 4, 3, 2};  // 키패드 열핀 D2 ~ D5 설정

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd (0x27,16,2);   // LCD1602 hexa값, 2행 16열 설

void setup(){

  lcd.init(); 
  lcd.backlight();
  pinMode(signalPin, OUTPUT);
  digitalWrite(signalPin, LOW);
}

void loop(){

  lcd.setCursor(0,0);
  lcd.print("PASSWORD_INPUT");

  customKey = customKeypad.getKey();
  if (customKey){
    Data[data_count] = customKey; 
    lcd.setCursor(data_count,1); 
    lcd.print(Data[data_count]); 
    data_count++; 
    }

  if(data_count == Password_Length-1){
    lcd.clear();

    if(!strcmp(Data, Master)){
      lcd.print("DOOR_OPEN");
      digitalWrite(signalPin, HIGH); 
      delay(3000);
      digitalWrite(signalPin, LOW);
      }
    else{
      lcd.print("ERROR");
      delay(3000);
      }
    
    lcd.clear();
    clearData();  
  }
}

void clearData(){
  while(data_count !=0){
    Data[data_count--] = 0; 
  }
  return;
}

 

코딩 중 char Master[Password_Length] = "1234*";   에서 1234*대신 자신의 비밀번호로 대체하여 변경할 수 있다.

암호 길이는 #define Password_Length 6에서 예를 들면 비밀번호 길이가 7자이면 길이를 8으로 입력하면 된다.

 

결과 화면

https://www.youtube.com/watch?v=EOxbbC2z40s

 

 

 

아두이노 우노 R3 : https://smartstore.naver.com/allbrands/products/7641474076

 

아두이노 우노 R3 : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

4X4키패드 : https://smartstore.naver.com/allbrands/products/7791417895

 

4X4 매트릭스 키보드 배열 모듈 16 키 : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

16x1 12c LCD 디스플레이 : https://smartstore.naver.com/allbrands/products/7649718878

 

아두이노 LCD1602 16x2 4핀 디스플레이 모듈/ Arduino LCD1602 Module : All Brands

[All Brands] 전자부품 전문쇼핑몰입니다

smartstore.naver.com

5V릴레이 모듈 : https://smartstore.naver.com/allbrands/products/7640778967

 

All Brands : All Brands

릴레이 모듈

smartstore.naver.com

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:39 아두이노 기초
728x90
반응형

아두이노와 초음파센서를 사용하여 거리에 따라 LED 색을 변하는 프로젝트를 만들 수 있다.

아래는 간단한 예시 코드이다. 이 코드는 초음파센서로 측정된 거리에 따라 RGB LED의 색상을 변화시킨다.

거리가 가까워지면 빨간색에서 시작하여 멀어질수록 파란색으로 변화한다.

 

코딩 

// 초음파 센서 핀 정의
#define trigPin 13
#define echoPin 12

// RGB LED 핀 정의
#define redPin 9
#define greenPin 10
#define bluePin 11

// 초음파 센서 변수
long duration;
int distance;

// RGB LED 변수
int redValue = 255;
int greenValue = 0;
int blueValue = 0;

void setup() {
  // 핀 모드 설정
  pinMode(trigPin, OUTPUT);
  pinMode(echoPin, INPUT);
  pinMode(redPin, OUTPUT);
  pinMode(greenPin, OUTPUT);
  pinMode(bluePin, OUTPUT);
  
  // 시리얼 통신 시작
  Serial.begin(9600);
}

void loop() {
  // 초음파 센서로 거리 측정
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  
  duration = pulseIn(echoPin, HIGH);
  distance = duration * 0.034 / 2;
  
  // 거리에 따라 LED 색상 변경
  if (distance <= 30) {
    redValue = 255;
    greenValue = 0;
    blueValue = 0;
  } else if (distance > 30 && distance <= 60) {
    redValue = 0;
    greenValue = 255;
    blueValue = 0;
  } else {
    redValue = 0;
    greenValue = 0;
    blueValue = 255;
  }
  
  // LED에 색상 적용
  analogWrite(redPin, redValue);
  analogWrite(greenPin, greenValue);
  analogWrite(bluePin, blueValue);
  
  // 시리얼 모니터에 거리 출력
  Serial.print("Distance: ");
  Serial.println(distance);
  
  // 500ms 대기
  delay(500);
}

 

준비품 : 아두이노uno R3, 초음파센서, 3색 LED, 300옴 저항 3개

아두이노 UNO
초음파 센서
3색 LED
300옴 저항
아두이노 우노 R3 초음파 센서 3색 LED 300옴 저항

 

 

다음과 같이 회로에 요소들을 연결한다

 

먼저 3색 LED의 RED를 아두이노 9번핀, GREEN을 10번핀, BLUE를 11번핀에 300옴 저항을 각각 연결하여 아두이노에 연결한다.

다음 초음파센서의 TRIG를 아두이노 2번핀에 연결하고, ECHO를 아두이노 3번핀에 연결한다.

센서의 VCC를 아두이노 +5V에 연결하고, 센서의 GNE는 아두이노 GND에 똑같이 연결한다.

그리고 3색 LED의 2번 다리를 +5V에 연결하고 USB케이블을 아두이노 포트에 연결한다.

 

 

다음 아두이노 IDE를 실행하여 다음과 같이 코딩한다.

초음파센서 거리측정

초음파 센서의 TRIG, ECHO핀을 매크로 상수로 TREG는 2로, ECHO는 3으로 선언한다.

삼색 LED의 RED를 9, GREEN은 10, BLUE은 11로 정의한다.

void setup문에서 핀모드를 TRIG는 OUTPUT로, ECHO는 INPUT로 설정한다.

다음 void loop문에서 digitalWrite(TRIG, LOW/HIGH)는 초음파센서의 TRIG에서 초음파를 발사하는 부분이다. 

long distance = pulseIn(ECHO, HIGH)/58.2; 는 pulseIn 명령어를 사용하여 ECHO에 초음파가 들어오는 시간을 계산한다. 여기서 58.2는 시간을 cm단위로 변환하여 주는 역활을 한다.

삼색 LED의 R, G, B를 모두 255로 설정하여 초기상태에서는 LED를 끄게한다.

여기서 255로 설정하는 이유는 삼색LED의 공동다리가 "+" 이기 때문이다. 만일 LED의 공동다리가 "-"이라면 R, G, B의 값을 모두 0으로 해주어야 한다.

다음 if문에서 distance < 10은 거리 10cm이하에서는 RED가 켜지고, 거리 20cm 이하에서는 GREEN을 켜며, 30cm이하에서는 BLUE가 켜진다. 여기서 analogWrite값을 0으로 정해주어야만 LED가 켜진다. 위에서 얘기한것처럼 LED의 공동핀이 "-"인 경우는 analogWrite값을 255로 정해주어야 할 것이다.

위와 같이 전부 코딩을 끝낸 후 업로드 시켜주면 초음파에 어떠한 물체가 감지되면 거리에 따른 값이 LED에 현시될 것이다.

 

출력 결과

https://www.youtube.com/watch?v=jP6X4kVFmto&t=20s

 

 

 

 

728x90
반응형
posted by 조이키트 블로그
2020. 7. 28. 10:36 아두이노 기초
728x90
반응형

준비품 : 아두이노uno, 3색 LED 1개, 300옴 저항 3개

3색 LED : 왼쪽으로부터 1번 - 빨강색, 2번 -(+단자), 3번 - 초록색, 4번 - 파랑색
아두이노 우노
300옴 저항

 

 

"이 포스팅은 쿠팡 파트너스 활동의 일환으로, 이에 따른 일정액의 수수료를 제공받습니다."

https://link.coupang.com/a/b2vSOT

 

ATmega328P 마이크로 컨트롤러가 있는 아두이노 우노 R3 개발 보드 - 액세서리 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

https://link.coupang.com/a/b2FRps

 

HC-SR04 초음파 거리 측정 모듈 - 기타측정도구 | 쿠팡

쿠팡에서 0.0 구매하고 더 많은 혜택을 받으세요! 지금 할인중인 다른 0 제품도 바로 쿠팡에서 확인할 수 있습니다.

www.coupang.com

 

위와 같은 부품들이 준비되면 아래와 같이 빵판에 요소들을 연결한다.

 

LED 1번을 아두이노 11핀, 3번을 10핀, 4번을 9핀에 300옴 저항을 각각 거쳐 연결한다.

그리고 LED 2번을 아두이노 +5V핀에 연결한다.

참고 : LED 2번이 "+"인 경우

만일 LED 2번이 "-"인 경우는 아두이노 GND에 연결해야 한다.

 회로에 연결하기 전에 반드시 확인하기 바란다.

 

다음은 아두이노 IDE에  아래와 같이 코딩을 한다.

 

 

void loop()문에서 analogWrite변수는 0~255사이의 값을 지정할 수 있는데 0은 0V, 255는 +5V가 출력된다고 보면 된다.

따라서 빨간색 항목에서 red: 0는 0V 출력, green: 255는 5V 출력, blue: 255는 +5V가 출력된다.

LED의 공동단자가 +이므로 빨간색을 켜려면 red를 0V로 해주어야 하고, 나머지는 255로 해주어야 한다.

초록색도 마찬가지로 green을 0으로 해주어야 하고 파판색도 역시 blue를 0으로 해주고 나머지는 255값으로 해주어야 선택한 한가지 색만 켜질수 있다. 

그리고 delay 값을 3000으로 지정하였는데 이는 3초에 한번씩 색이 바뀜을 의미한다. 

지연시간을 늘이거나 줄이려면 이값을 임의로 변경하여 주면 된다.

 

아래에 3색 LED가 3초에 한번씩 색이 변화는 결과이다.

 

출력 결과

https://www.youtube.com/watch?v=-7bRSu0hSQc&t=8s

 

728x90
반응형
posted by 조이키트 블로그
prev 1 next