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

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 31

Notice

250x250

'아두이노 활용'에 해당되는 글 3

  1. 2025.05.13 아두이노 Mega2560 R3 종합 프로젝트
  2. 2023.07.11 128x64 LCD를 활용한 디지털 시계 및 온도계
  3. 2020.08.07 아두이노 음성인식
2025. 5. 13. 18:47 아두이노 활용
728x90
반응형

아두이노 mega2560 R3은 아두이노 플랫폼의 고급형 마이크로 컨트롤러 보드이다. 일반적인 아두이노 보다 많은 입출력 핀과 강력한 메모리 및 처리 성능을 제공한다. 메가 2560은 대형 프로젝트, 특히 많은 센서, 모터, LED 등을 연결해야 하는 복잡한 프로젝트에 적합하다.

 

 

주요 사양 : 

작동 전압 : 5V

디지털 입출력 핀 : 54개

아날로그 입력 핀 : 16개

PWM 출력 핀 15개

플래쉬 메모리 : 256KB

SRAM : 8KB

EEPROM : 4KB

클럭 속도 : 16MHz

USB 인터페이스 : USB 타입 B 커넥터를 통해 PC와 연결 가능

ICSP 헤더 : 외부 프로그래머로 펌웨어 업로드 가능

통신 포트 : UART(4개), I2C, SPI 지원

 

 

 

 

실습 예제 :

오늘은 아두이노 Mega2560 R3에 다양한 센서 및 모듈들을 사용하여 종합 프로젝트를 만들어 보겠다.

 

프로젝트 작동은  온도감지, 열감지, 가스감지, 거리측정, 조이스틱으로 방향 제어, 색상감지 등이다.

1. 온도감지는 DHT11 온도감지센서로 측정된 값을 LCD 디스플레이에 현시하여 준다.

2. 열감지는 열감지 센서에 열을 가하면 빨간색 LED 다이오가 켜지면서 부저모듈로 삑 소리를 출력한다.

3. 가스감지는 MQ-135 가스감지 센서를 사용하여 가스가 감지되면 경고음이  출력된다.

4. 거리 측정은 HC-SR04 초음파 센서를 사용하여 측정된 거리를 LCD 디스플레이에 출력한다.

5. 조이스틱 모듈로는 방향에 따라 LED 다이오드를 켜줌으로 방향을 제시하여 준다.

6. 색상감지는 GY-31 TCS230 TCS3200 색상인식 센서를 사용하여 감지된 색상에 따라 3색 LED에 색을 출력하여 준다.

 

사용된 부품

아두이노 Mega2560 R3 2004 20X4 LCD 디스플레이  GY-31 TCS230 TCS3200 색상인식 센서
조이스틱 모듈  HW-072 화염감지 센서 HC-SR04 초음파 센서
DHT11 온습도 센서 부저 모듈 MQ-135 가스감지 센서

 

 

회로도 :

 

Arduino Mega2560 PROJECT

 

회로 연결은 위의 회로도와 아래 표를 참고하여 아두이노 Mega2560에 모든 센서들을 연결한다.

 

회로 연결 : 

아두이노 Mega 2560 2004 20X4 LCD 디스플레이  GY-31 TCS230 TCS3200 색상인식 센서 조이스틱 모듈  HW-072 화염감지 센서 HC-SR04 초음파 센서 DHT11 온습도 센서 부저 모듈 MQ-135 가스감지 센서
+5V VCC VCC VCC VCC VCC VCC +5V VCC
GND GND GND GND GND GND GND GND GND
D2               DO
D3                
D4             S  
D5         TRIG      
D6         ECHO      
D7       DO        
D8           S    
D9   S0            
D10   S1            
D11   S2            
D12   S3            
D13   OUT            
A0               AO
A1       AO        
A2     VRx          
A3     VRy          
D22     SW          
D20 SDA SDA              
D21 SCL SCL              

 

아두이노 Mega 2560 조이스틱 방향등 RED 조이스틱 방향등 BLUE 조이스틱 방향등 GREEN 조이스틱 방향등 YELLOW 색감지 출력 LED 경고등 LED
D46       +핀    
D48     +핀      
D50 +핀          
D52   +핀        
             
D14         RED  
D15         GREEN  
D16         BLUE  
D3           +핀

 

 

위와같이 회로를 연결하면 다음과 같은 모습을 볼 것이다.

 

회로 연결이 모두 완성되면 아두이노 IED에 다음과 같이 코드를 작성한다.

 

전체 코딩 : 

#include <Adafruit_LiquidCrystal.h>
#include <Wire.h>
#include <LiquidCrystal_I2C.h>
#include <DHT.h>

#define DHTPIN 8
#define DHTTYPE DHT11
#define TRIG 5
#define ECHO 6
#define S0 9 // 컬러센서 D9
#define S1 10 // 컬러센서 D10
#define S2 11 // 컬러센서 D11
#define S3 12 // 컬러센서 D12
#define sensorOut 13 // 컬러센서 출력 D13
#define redPin 14 // LED red
#define greenPin 15 // LED green
#define bluePin 16 // LED blue

int redFrequency = 0;
int blueFrequency = 0;
int greenFrequency = 0;

DHT dht(DHTPIN, DHTTYPE);

// 주소는 보통 0x27 또는 0x3F입니다.
LiquidCrystal_I2C lcd(0x27, 20, 4);

const int analogPin = A0; //아날로그 핀
const int digitalPin = 2; // 디지털 
int gasLevel = 0; // 가스농도 변수
int gasDetected = 0; // 가스감지 변수

const int ledPin = 3; // LED 핀
const int buzzerPin = 4; // 부저핀

int flameSensorDigitalPin = 7;  // 디지털 핀
int flameSensorAnalogPin = A1;  // 아날로그 핀
int flameDetectedDigital;
int flameValueAnalog;

//조이스틱
const int VRx = A2;  // X축 아날로그 핀
const int VRy = A3;  // Y축 아날로그 핀
const int SW = 22;    // 버튼 디지털 핀

const int redLED = 50;     // 빨간 LED 핀
const int blueLED = 52;    // 파란 LED 핀
const int greenLED = 48;   // 녹색 LED 핀
const int yellowLED = 46;  // 노란 LED 핀



void setup() {
    lcd.init(); // LCD 초기화
    lcd.backlight(); // 백라이트 켜기

   // 컬러센서 핀모드 설정
    pinMode(S0, OUTPUT);
    pinMode(S1, OUTPUT);
    pinMode(S2, OUTPUT);
    pinMode(S3, OUTPUT);
    pinMode(sensorOut, INPUT);
    pinMode(redPin, OUTPUT);
    pinMode(greenPin, OUTPUT);
    pinMode(bluePin, OUTPUT);

    pinMode(TRIG, OUTPUT);
    pinMode(ECHO, INPUT);
    pinMode(ledPin, OUTPUT);  // LED 핀을 출력 모드로 설정
    pinMode(flameSensorDigitalPin, INPUT);  // 디지털 핀 입력 모드 설정

    // 주파수 스케일링을 20%로 설정
    digitalWrite(S0,HIGH);
    digitalWrite(S1,LOW);

    //조이스틱 LED
    pinMode(SW, INPUT_PULLUP);  // 버튼 핀을 풀업 저항과 함께 입력으로 설정
    pinMode(redLED, OUTPUT);  // LED 핀을 출력으로 설정
    pinMode(blueLED, OUTPUT);
    pinMode(greenLED, OUTPUT);
    pinMode(yellowLED, OUTPUT);


    Serial.begin(9600); // 시리얼 통신 시작
    pinMode(digitalPin, INPUT); //디지털핀 입력
    dht.begin();
}

void loop() {


  //조이스틱
  int xValue = analogRead(VRx);  // X축 값 읽기
  int yValue = analogRead(VRy);  // Y축 값 읽기
  int buttonState = digitalRead(SW);  // 버튼 상태 읽기

    if (buttonState == HIGH) {  // 버튼이 눌렸을 때
    digitalWrite(redLED, HIGH);
    digitalWrite(blueLED, HIGH);
    digitalWrite(greenLED, HIGH);
    digitalWrite(yellowLED, HIGH);
     
  } else {
    // 버튼이 눌리지 않았을 때 조이스틱 방향에 따라 LED 제어
    if (xValue < 400) {  // 왼쪽
      digitalWrite(greenLED, HIGH);
      
    } else {
      digitalWrite(greenLED, LOW);
    }

    if (xValue > 600) {  // 오른쪽
      digitalWrite(yellowLED, HIGH);
      
    } else {
      digitalWrite(yellowLED, LOW);
    }

    if (yValue < 400) {  // 위쪽
      digitalWrite(redLED, HIGH);
       
    } else {
      digitalWrite(redLED, LOW);
    }

    if (yValue > 600) {  // 아래쪽
      digitalWrite(blueLED, HIGH);
      
    } else {
      digitalWrite(blueLED, LOW);
    }
  }


    // 컬러감지 센서
    // 빨간색 포토다이오드 설정
    digitalWrite(S2, LOW);
    digitalWrite(S3, LOW);
    redFrequency = pulseIn(sensorOut, LOW);
    Serial.print("R = ");
    Serial.print(redFrequency);
    delay(100);

    // 파란색 포토다이오드 설정
    digitalWrite(S2, LOW);
    digitalWrite(S3, HIGH);
    blueFrequency = pulseIn(sensorOut, LOW);
    Serial.print("B = ");
    Serial.print(blueFrequency);
    delay(100);

    // 초록색 포토다이오드 설정
    digitalWrite(S2, HIGH);
    digitalWrite(S3, HIGH);
    greenFrequency = pulseIn(sensorOut, LOW);
    Serial.print("G = ");
    Serial.print(greenFrequency);
    delay(100);

     // 검출된 색상을 기반으로 한 LED 제어
  if (redFrequency > greenFrequency && redFrequency > blueFrequency) {
    // Red LED 출력
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);

  } else if (greenFrequency > redFrequency && greenFrequency > blueFrequency) {
    // Green LED 출력
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, LOW);
  } else if (blueFrequency > redFrequency && blueFrequency > greenFrequency) {
    // Blue LED 출력
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, HIGH);
  } 
  
  else if (redFrequency == greenFrequency && redFrequency == blueFrequency) {
    // 모든 LED 출력
    digitalWrite(redPin, HIGH);
    digitalWrite(greenPin, HIGH);
    digitalWrite(bluePin, HIGH);
  } else {
    // 모든 LED 전부 꺼짐
    digitalWrite(redPin, LOW);
    digitalWrite(greenPin, LOW);
    digitalWrite(bluePin, LOW);
  }

    // 열감지 센서
    // 디지털 값 읽기
    flameDetectedDigital = digitalRead(flameSensorDigitalPin);
    if (flameDetectedDigital == HIGH) {
        digitalWrite(ledPin, HIGH);
        tone(buzzerPin, 1000);    // 부저를 1kHz로 설정하여 소리 출력
        lcd.setCursor(0, 0);            // LCD 1행 2열에 출력
        lcd.print("Flame : detection");
    }
    else {
        digitalWrite(ledPin, LOW);
        noTone(buzzerPin);        // 부저 소리를 끔
        lcd.setCursor(0, 0);            // LCD 1행 2열에 출력
        lcd.print("Flame : nodetection");
    }

    lcd.setCursor(0, 0);            // LCD 1행 1열에 출력
    lcd.print("Flame : ");
    lcd.print(flameValueAnalog);      // LCD에 센서값 출력

   // MQ135 가스감지 센서
    gasLevel = analogRead(analogPin); // 아날로그 값

    lcd.setCursor(0, 1);
    lcd.print("GAS LEVEL : ");
    lcd.print(gasLevel);
/*
    gasDetected = digitalRead(digitalPin);
    if (gasDetected == LOW) {
        digitalWrite(ledPin, HIGH);
        tone(buzzerPin, 1000); // 부저를 1kHz로 설정하여 소리 출력
        lcd.setCursor(0, 2);
        lcd.print("detection");
    }
    else {
        digitalWrite(ledPin, LOW);
        noTone(buzzerPin); // 부저소리를 끔
        lcd.setCursor(0, 2);
        lcd.print("notetection");
    }
    */
    
    // DHT11 온습도 센서 측정
    float h = dht.readHumidity();    // 습도 측정
    float t = dht.readTemperature(); // 온도 측정(섭씨)

    lcd.setCursor(0, 2);
    lcd.print("T:");
    lcd.print(t);
    lcd.print("C");
    lcd.setCursor(10, 2);
    lcd.print("H:");
    lcd.print(h);
    lcd.print("%");

    //초음파 센서 측정
    // 초음파센서의 Trig에서 초음파를 발사하는 코드
    digitalWrite(TRIG, LOW);
    delayMicroseconds(2);
    digitalWrite(TRIG, HIGH);
    delayMicroseconds(10);
    digitalWrite(TRIG, LOW);

    // pulseIn 명령어를 통해 Echo핀에 초음파가 들어오는 시간 계산
    // 반환된 값에 58.2를 나누어 시간을 cm로 변경
    long distance = pulseIn(ECHO, HIGH) / 58.2;

    lcd.setCursor(0, 3);
    lcd.print("DISTANCE : ");
    lcd.print(distance);
    lcd.print(" Cm");

    delay(1000);
    lcd.clear();
}

 

위와 같이 코드 작성이 끝나면 아두이노 MEGA2560에 파일을 컴파일 후 업로드 하여준다.

그러면 다음과 같은 출력 결과를 볼 수 있다.

 

출력 결과 :

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

 

 

728x90
반응형

'아두이노 활용' 카테고리의 다른 글

128x64 LCD를 활용한 디지털 시계 및 온도계  (0) 2023.07.11
아두이노 음성인식  (0) 2020.08.07
posted by 조이키트 블로그
2023. 7. 11. 19:20 아두이노 활용
728x90
반응형

하드웨어 구성품

아두이노 나노 R3, 10k옴 가변저항, 푸시버튼, W031 128x64 LCD, DS3231 RTC 리얼타임 클럭 모듈

회로 구성도

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

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

 

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

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

www.coupang.com

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

 

TFT 디스플레이 1.3인치 IPS 풀컬러 LCD 모듈 - 액세서리 | 쿠팡

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

www.coupang.com

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

 

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

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

www.coupang.com

 

 

코딩 : 

#include <U8glib.h>
#include <DS3232RTC.h>
#include <Streaming.h>
#include <Time.h>
#include <Wire.h>

U8GLIB_ST7920_128X64_1X u8g(6, 5, 4 , 7); //Enable, RW, RS, RESET

int X2 = 0;
int Y2 = 0;
int X3 = 0;
int Y3 = 0;
float angulo = 0;
int posicao = 0;
int posicaoh = 0;
int temperatura =0;
int min_temp = 500;
int max_temp = -500;

int ScreenWith = 128;
int ScreenWithC = 96;
int ScreenHeight = 64;
int ScreenHeightC = 32;
#define botao 3

int estado_botao = 0;

char* dia_da_semana[]={
  "Sun", "Mon", "Tue", "Wed", "Thu", "Fri", "Sat"};

void tela_1()
{
  u8g.drawRFrame(0, 0, 128, 64, 3);
  u8g.setPrintPos(20, 30);
  u8g.print(temperatura);
  u8g.drawStr( 42, 30, "C");
  u8g.drawCircle(37, 34, 2);
  mostra_relogio_digital();
  fundo_relogio();
  desenha_ponteiro(hour()-1, 12.0, 10);
  desenha_ponteiro(minute()-5, 60.0, 19);
  desenha_ponteiro(second()-5, 60, 21);
}
void tela_2()
{
  u8g.drawRFrame(0, 0, 128, 64, 3);
  u8g.drawRFrame(68, 4, 55, 56, 2);
  mostra_relogio_digital();
  u8g.setFont(u8g_font_5x8);
  u8g.drawStr( 78, 35, "MIN");
  u8g.drawStr( 78, 53, "MAX");
  u8g.setFont(u8g_font_6x13);
  u8g.setPrintPos(25, 41);
  u8g.print(dia_da_semana[(weekday()-1)]);
  u8g.setPrintPos(83, 19);
  u8g.print(temperatura);
  u8g.drawStr( 105, 19, "C");
  u8g.drawCircle(100, 12, 2);
  u8g.setPrintPos(98, 36);
  u8g.print(min_temp);
  u8g.drawCircle(113, 29, 2);
  u8g.setPrintPos(98, 54);
  u8g.print(max_temp);
  u8g.drawCircle(113, 47, 2);
}

void desenha_ponteiro(float valor, float rotacao, int Radius)
{
  angulo = valor * 2.0 * 3.1415 / rotacao - 1,5707;
  X2 = ScreenWithC + Radius * cos(angulo);
  Y2 = ScreenHeightC + Radius * sin(angulo);
  u8g.drawLine(ScreenWithC, ScreenHeightC, X2, Y2);
}
void fundo_relogio()
{
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 27);
  u8g.drawCircle(ScreenWithC, ScreenHeightC, 1);
  u8g.setFont(u8g_font_6x13);
  u8g.setFontPosTop();
  u8g.drawStr(90, 9, "12");
  u8g.drawStr(114, 25, "3");
  u8g.drawStr(94, 44, "6");
  u8g.drawStr(74, 25, "9");

  for(int traco_minuto = 0; traco_minuto<12; traco_minuto++)
  {
    angulo = traco_minuto / 12.0 * 2 * 3.1415;
    X2 = ScreenWithC + 25 * cos(angulo);
    Y2 = ScreenHeightC + 25 * sin(angulo);
    X3 = ScreenWithC + 25 * cos(angulo);
    Y3 = ScreenHeightC + 25 * sin(angulo);
    u8g.drawLine(X2, Y2, X3, Y3);
  }
}


void mostra_relogio_digital()
{
  u8g.setFont(u8g_font_5x8);
  u8g.setPrintPos(8, 55);
  u8g.print(day());
  u8g.drawStr( 19, 55, "/");
  u8g.setPrintPos(24, 55);
  u8g.print(month());
  u8g.drawStr( 35, 55, "/");
  u8g.setPrintPos(41, 55);
  u8g.print(year());
  u8g.drawRBox(3, 4, 62, 21,2);
  u8g.setColorIndex(0);
  u8g.setFont(u8g_font_fub17);
  u8g.drawStr(29,21,":");
  if (hour() < 10)
  {
    u8g.drawStr(3,23,"0");
    posicaoh = 16;
  }
  else posicaoh = 3;
  u8g.setPrintPos(posicaoh, 23);
  u8g.print(hour());
  if (minute() < 10)
  {
    u8g.drawStr(38,23,"0");
    posicao = 51;
  }
  else posicao = 38;
  u8g.setPrintPos(posicao ,23);
  u8g.print(minute());
  u8g.setColorIndex(1);
}
void setup()
{
  pinMode(3, INPUT_PULLUP);
  Serial.begin(9600);
  if ( u8g.getMode() == U8G_MODE_R3G3B2 )
    u8g.setColorIndex(255);     // white
  else if ( u8g.getMode() == U8G_MODE_GRAY2BIT )
    u8g.setColorIndex(3);         // max intensity
  else if ( u8g.getMode() == U8G_MODE_BW )
    u8g.setColorIndex(1);         // pixel on
  setSyncProvider(RTC.get);
  Serial << F("RTC Sync");
  if (timeStatus() != timeSet) Serial << F(" FAIL!");
  Serial << endl;
}

void loop()
{
  temperatura = RTC.temperature() / 4.;
  if (temperatura >= max_temp)
  {
    max_temp = temperatura;
  }
  if (temperatura <= min_temp)
  {
    min_temp = temperatura;
  }
  static time_t tLast;
  time_t t;
  tmElements_t tm;

  if (Serial.available() >= 12) {
    int y = Serial.parseInt();
    if (y >= 100 && y < 1000)
      Serial<<F("Erro: Ano deve ter dois ou quatro digitos!") <<endl;
    else {
      if (y >= 1000)
        tm.Year = CalendarYrToTm(y);
      else    //(y < 100)
      tm.Year = y2kYearToTm(y);
      tm.Month = Serial.parseInt();
      tm.Day = Serial.parseInt();
      tm.Hour = Serial.parseInt();
      tm.Minute = Serial.parseInt();
      tm.Second = Serial.parseInt();
      t = makeTime(tm);
      RTC.set(t);
      setTime(t);
      Serial << F("Horario modificado para: ");
      printDateTime(t);
      Serial << endl;
      while (Serial.available() > 0) Serial.read();
    }
  }
  t = now();
  if (t != tLast) {
    tLast = t;
    printDateTime(t);
    Serial << endl;
  }

  boolean valor_botao = digitalRead(3);
  if (valor_botao != 1)
  {
    while(digitalRead(3) != 1)
    {
      delay(100);
    }
    estado_botao = !estado_botao;
  }

  u8g.firstPage();
  do {
    if (estado_botao == 0)
    {
      tela_1();
    }
    if (estado_botao == 1)
    {
      tela_2();
    }
  }
  while( u8g.nextPage() );
  delay(10);
}

void printDateTime(time_t t)
{
  printI00(day(t), 0);
  Serial << monthShortStr(month(t)) << _DEC(year(t));
  Serial << ' ';
  printI00(hour(t), ':');
  printI00(minute(t), ':');
  printI00(second(t), ' ');
}

void printI00(int val, char delim)
{
  if (val < 10) Serial << '0';
  Serial << _DEC(val);
  if (delim > 0) Serial << delim;
  return;
}
728x90
반응형

'아두이노 활용' 카테고리의 다른 글

아두이노 Mega2560 R3 종합 프로젝트  (0) 2025.05.13
아두이노 음성인식  (0) 2020.08.07
posted by 조이키트 블로그
2020. 8. 7. 00:23 아두이노 활용
728x90
반응형

도트 매트릭스를 음성인식 모듈로 제어하는 예제

준비품 : 아두이노UNO, 음성인식 모듈(SZH-SM001), USB to TTL컨버터 모듈, 도트 매트릭스, 마이크

아두이노UNO
음성인식 모듈(SZH-SM001)

 

USB to TTL
도트매트릭스
마이크

 

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

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

 

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

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

www.coupang.com

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

 

PL2303HX USB-RS232 TTL 컨버터 모듈 - USB허브 | 쿠팡

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

www.coupang.com

 

 

음성인식 모듈은 최대 15개의 음성 명령을 저장할 수 있다.

음성 명령은 3개의 그룹으로 나뉘며, 각 5개의 음성 명령이 저장된다.

먼저 그룹별로 음성 명령어를 모듈에 저장한 후 사용할 그룹을 선택해야 한다.

1) 음성인식 모듈을 PC와 연결하기 위해 USB to TTL 컨버터와 음성인식 모듈을 연결해준다.

음성인식 모듈 USB to TTL 컨버터
VCC 5V
GND GND
RXD TXD
TXD RXD

음성인식 모듈과 USB to TTL 컨버터를 연결한 후 PC의 장치관리자에서 포트 번호를 확인할 수 있다.

여기서 Silicon Labs CP210x USB to UART Bridge(COM4)가 음성인식 모듈을 인식한 결과이다.

다음 AccessPort라는 시리얼 통신 프로그램을 사용하여 음성인식 명령어를 녹음하다.

아래 압축 프로그램을 컴퓨터에 설치하여 실행하면 된다.

AccessPort137.zip
0.46MB

해당 프로그램을 실행시킨 후 왼쪽 상단을 보면 노란색과 초록색의 톱니바퀴 모양의 Configuration아이콘을 눌러준다. 

Options 창에서 USB to TTL 컨버터와 연결된 Port 번호를 입력하고, Baud Rate는 9600으로 맞춰준다. (장치 관리자에서 확인한 포트 번호를 입력해준다. COM4)

Send display는 Hex format으로 Receive display는 Char Format으로 설정해준 후, OK 버튼을 눌러준다. 이 후 Hex 명령어로 ‘AA36’을 Send 버튼을 통해 보내주었을 때, Common Mode라는 답변이 온다면, 제대로 연결된 것이다

Hex 명령어로 ‘AA11’을 보내주시면, 음성 명령어 녹음이 시작된다.

음성인식 모듈의 마이크에 대고 명령어를 녹음해주시면 된다.

각 명령의 길이는 최대 1300ms(1.3초)이므로, 단어로 명령을 넣는 게 좋다.

녹음을 시작하면, 한 그룹의 5가지 음성 명령 녹음을 끝내기 전까지 녹음 과정을 멈출 수 없는 점 유의해 주시기 바란다.

START라는 답변이 오면 명령어를 녹음해주시면 된다.

No Voice, Different등을 통해 이전 녹음과 다른지, 녹음이 되고 있는지 확인 가능하다.

Finish one이 나오면 1개의 명령어가 녹음 되었다는 뜻이다.

순차 적으로 5개 모두 녹음 완료되면, Group 1 finish라고 답변이 온다.

이후 Hex 명령어로 ‘AA21’을 보내주시면, Group1 Imported라는 답변이 온다.

첫 번째 그룹의 5개의 명령어 입력이 끝났다.

첫 번째 그룹의 명령어만 입력 완료해도 5개의 명령어로 제어할 수 있다.

 

명령어 리스트

Common Mode는 음성 명령 값을 ‘Result:11’과 같은 ASCII 코드값으로 전달해 주지만,

Compact Mode는 음성 명령 값을 ‘11’과 같은 Hex 값으로 전달해준다.

따라서 처음 PC와 음성인식 모듈을 연결하여 음성 명령을 녹음할 때는, Common Mode로 녹음 하는게 좋고 아두이노 등의 플랫폼에서 사용할 때는, Compact Mode로 사용해야 한다.

음성 명령어는 녹음할 때 사용자의 목소리 위주로 인식하기 때문에, 다른 사람이 명령어를 넣으면 제대로 작동하지 않을 수 있다.

 

다음 아두이노와 음성인식 모듈, 도트매트릭스를 아래와 같이 연결한다.

 

아두이노 음성인식 모듈 도트매트릭스 모듈
5V VCC VCC
GND GND GND
D2 TxD  
D3 RxD  
D5    
D10   CS
D11   CLK
D12   DIN

 

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

#include "LedControl.h" // 라이브러리 사용 선언
#include <SoftwareSerial.h> // 소프트웨어 Serial 통신 라이브러리 사용
// Serial 통신핀으로 D11번핀을 Rx로, D10번핀을 Tx로 선언
SoftwareSerial mySerial(2, 3); // 모듈 TX=11번핀 , RX=10번핀 연결
// Din 핀을 12번, ClK핀을 11번 CS핀을 10번에 연결
// 매트릭스는 1개를 사용 선언
LedControl lc=LedControl(12,11,10,1);
int voice_recogn=0;
byte data[5][8]=
{
// 숫자 1 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10000001,
B10111101,
B10000001,
B11111111
},
// 숫자 2 출력
{
B11111111,
B10000001,
B10100101,
B10000001,
B10100101,
B10111101,
B10000001,
B11111111
},

// 숫자 3 출력
{
B00011000,
B00011000,
B00011000,
B11111111,
B11111111,
B00011000,
B00011000,
B00011000
},
// 숫자 4 출력
{
B00000000,
B01100110,
B11111111,
B11111111,
B11111111,
B01111110,
B00111100,
B00011000
},
// 숫자 5 출력
{
B00111100,
B01000010,
B10100101,
B10000001,
B10100101,
B10011001,
B01000010,
B00111100
}
};
void setup()
{
Serial.begin(9600); // 통신 속도 9600bps로 PC와 시리얼 통신 시작
mySerial.begin(9600); // 통신 속도 9600bps로 모듈과 시리얼 통신 시작
lc.shutdown(0,false); // 0~3번까지 매트릭스 절전모드 해제
lc.setIntensity(0,8); // 매트릭스의 밝기 선언 0~15의 수
lc.clearDisplay(0); // 매트릭스 led를 초기화
Serial.println("wait settings are in progress");
delay(1000);
mySerial.write(0xAA); // compact mode 사용
mySerial.write(0x37);
delay(1000);
mySerial.write(0xAA); // 그룹1 음성 명령어 imported
mySerial.write(0x21);
Serial.println("The settings are complete");
}
void loop()
{
while(mySerial.available())
{
Serial.println("voice input");
voice_recogn=mySerial.read();
switch(voice_recogn)
{
case 0x11:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[0][j]); // 숫자 1 출력
}
Serial.println("숫자 1 출력");
break;
case 0x12:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[1][j]); // 숫자 2 출력
}
Serial.println("숫자 2 출력");
break;
case 0x13:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[2][j]); // 숫자 3 출력
}
Serial.println("숫자 3 출력");
break;
case 0x14:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[3][j]); // 숫자 4 출력
}
Serial.println("숫자 4 출력");
break;
case 0x15:
for(int j=0; j<8; j++)
{
lc.setRow(0,j,data[4][j]); // 숫자 5 출력
}
Serial.println("숫자 5 출력");
break;
}
}
}
 

 

다음 아래와 같이 음성명령에 따라 토트매트릭스에 숫자가 출력되는 것을 볼 수 있다.

 

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