본문 바로가기
카테고리 없음

iot(모터, 블루투스, 부저)

by 뱅뱅뱅뱅뱅 2024. 12. 14.
  • 모터란
    • 고정자로 영구자석 사용
    • 회전자로 코일을 사용
    • 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발
    • 흡인력으로 회전력을 생성

 

  • 서보 모터 (Servo)
    • 무선 조종비행기, 자동차
    • PWM 신호의 펄스 폭으로 조정
    • 각도로 조정
    • 선이 3개 간단한 조작 (전원 2, 신호선 1)


    • void attach(pin): 서보 모터의 신호선이 연결된 핀을 지정
    • void attach(pin. min_us, max_us): 펄스폭 A의 최소, 최대값까지 지정
    • void write(angle) : 각도를 지정
    • void writeMicroseconds(us) : 펄스폭 A를 us 단위로 지정
    • int read() : 현재 각도 읽음 (반환 값 정수)
    • boolean attached() : 서보 모터 핀이 지정되어 있는지 검사
    • void detach() : 서보모터의 지정된 핀을 내부적으로 제거

아두이노

#include<Servo.h>
Servosm;
intpos=0;//서보의 위치

voidsetup(){
	sm.attach(9);    //디지털 입출력 9번 핀연결
	Sm.write(0);     // 0도 중심 각도로 회전

}

voidloop(){
    for(pos=0;pos<=180;pos+=1){    //0~180도 회전
    sm.write(pos);
    delay(15);//15ms대기
	}

    for(pos=180;pos>=0;pos-=1){    //180~0도 회전
    sm.write(pos);
    delay(15);
    }
}



 

#include <Servo.h>
	Servo sm;

void setup() 
{
sm.attach(9);  // 9번 핀에 서보 모터의 신호선을 연결 
Sm.write(90);  // 90도 중심 각도로 회전
}

void loop()
{
sm.write(0);
delay(2000);
sm.write(180);
delay(2000);
}

 

 

 


  • 스텝 모터
    • 스텝 모터는 여러 개의 코일(상)을 가지고 있으며, 코일에 순차적으로 전기를 공급하여 회전합니다.
    • 스텝 모터는 각 코일에 전원을 주입하는 순서를 조작함으로써 정밀하게 각도를 조절하며 움직입니다.
    • 스텝 모터는 자기장의 힘으로 고정된 자석과 코일이 상호작용하여 회전
    • 코일에 전기를 주면 전자석이 되어 밀고 당기며 동작
    • 코일을 돌리면서 전원을 가하면서 모터 동작

    • 1상 제어 방식
    • 2상 제어 방식

1상 제어 방식

  • 동작 원리:
    • 한 번에 하나의 상에만 전원을 공급하는 방식입니다.
    • 예를 들어, 4상 스텝 모터가 있다면, A → B → C → D 순서로 각 상이 순차적으로 활성화됩니다.
    • 코일 하나가 자화되어 스테이터(고정자)가 특정 위치에서 로터(회전자)를 당기고, 다음 상이 활성화되면 로터가 그 방향으로 움직입니다.
  • 특징:
    1. 단계별 회전 각도(스텝 각):
      • 설명에 따르면 7.5°씩 움직이므로 한 번의 1상 전환으로 로터가 7.5° 회전합니다.
      • 360° ÷ 7.5° = 48 스텝으로 한 바퀴를 완성합니다.
    2. 속도 제어:
      • 한 번의 스텝 사이에 딜레이를 주어 속도를 조절할 수 있습니다.
      • 딜레이가 짧아지면 빠르게 회전하고, 딜레이가 길어지면 천천히 회전합니다.
    3. 장점:
      • 전원 소비가 적고 회로가 단순합니다.
    4. 단점:
      • 로터의 위치가 정확히 고정되지 않고 진동이 발생할 수 있습니다.
      • 토크가 상대적으로 낮습니다.

2상 제어 방식

  • 동작 원리:
    • 한 번에 두 개의 상(A, B)을 동시에 활성화하여 전원을 공급합니다.
    • 예를 들어, A와 B를 동시에 활성화한 뒤, B와 C를 활성화하는 식으로 두 상을 중첩시켜 회전합니다.
  • 특징:
    1. 단계별 회전 각도(스텝 각):
      • 한 번의 2상 전환으로 3.75° 회전합니다(1상에서의 회전 각도 7.5°의 절반).
      • 360° ÷ 3.75° = 96 스텝으로 한 바퀴를 완성합니다.
    2. 장점:
      • 두 상을 동시에 사용하기 때문에 위치 고정성이 높아지고 진동이 감소합니다.
      • 더 높은 토크를 제공합니다.
    3. 단점:
      • 전력 소비가 1상보다 더 높습니다.
      • 회로가 복잡해질 수 있습니다.
구분 1상 제어 2상 제어
활성화된 상의 개수 1개 2개
스텝 각도  7.5° 3.75°
정확성 상대적으로 낮음 상대적으로 높음
토크 낮음 높음
전력 소비 낮음 높음
진동 더 큼 더 적음

 

 

#include <Stepper.h>
// #define STEPS 200  // 1.8 deg/step, 360/1.8 = 200 
int STEPS = 200 ;
Stepper stepper(STEPS, 8, 9, 10, 11);

void setup()
{
  stepper.setSpeed(30);  // How fast
  Serial.begin(9600) ;
}

void loop()
{
  Serial.println(" + direction") ;
  stepper.step(200);   // 200 step = 1 revolution
  delay(500) ;

  Serial.println(" - direction") ;
  stepper.step(-200);
  delay(500) ;
}

step == 단계

모터가 1회전하는데 200단계를 거친다..

stepper.setSpeed(30); // 분당 회전 속도

stepper.step(100); // 100 스텝 = 180도 회전

stepper.step(200); // 200 스텝 = 360도 회전

 

 

#include <Stepper.h>

#define STEPS_Revolution 32
#define GSR 32 * 64

Stepper stepper(STEPS_Revolution, 8, 9, 10, 11);

void setup()
{
stepper.setSpeed(300); 
}

void loop()
{
  stepper.step(GSR/2);   // 200 step = 1 revolution
  delay(2000);
  
  stepper.step(-GSR/2);   // 200 step = 1 revolution
  delay(2000);
}

 

32 스탭을 32 * 64 로 정의 -> 세밀 제어를 위함

 

 

 

1. 라이브러리 및 정의

 
#include <Stepper.h>
  • Stepper 라이브러리: 아두이노에서 스텝 모터를 쉽게 제어할 수 있도록 제공하는 라이브러리입니다.
 
#define STEPS_Revolution 32
#define GSR 32 * 64
  • STEPS_Revolution: 스텝 모터의 1회전(풀스텝)당 필요한 스텝 수를 정의합니다. 여기서는 32로 설정되어 있습니다.
  • GSR: 모터의 기어비(감속비)를 고려한 총 스텝 수를 계산합니다. 예를 들어, 1회전당 32 스텝을 가진 모터에 기어비 1:64가 적용되었을 때, 32 * 64 = 2048 스텝이 필요합니다.

 


 

2. 모터 객체 생성

 
Stepper stepper(STEPS_Revolution, 8, 9, 10, 11);
  • stepper 객체: Stepper 클래스를 사용해 스텝 모터 제어 객체를 생성합니다.
  • 파라미터:
    • STEPS_Revolution: 모터 1회전에 필요한 기본 스텝 수.
    • 8, 9, 10, 11: 모터에 연결된 아두이노 핀 번호입니다.

 


 

3. setup() 함수

 
void setup() {
    stepper.setSpeed(300); // 분당 회전 속도
}
  • stepper.setSpeed(300): 모터의 속도를 초당 스텝 수(RPM)가 아니라 초당 스텝(step/second)으로 설정합니다. 여기서는 300 스텝/초로 설정되었습니다.

 


 

4. loop() 함수

 
void loop() {
     stepper.step(GSR / 2); // 1024 스텝 (반 시계방향 회전)
     delay(2000); // 2초 대기
     stepper.step(-GSR / 2); // -1024 스텝 (시계방향 회전)
     delay(2000); // 2초 대기
}
  • stepper.step(steps):
    • 지정된 스텝 수만큼 모터를 회전시킵니다.
    • steps가 양수이면 반시계 방향으로, 음수이면 시계 방향으로 회전합니다.
  • 동작:
    1. GSR / 2: 감속비를 적용한 절반 회전(1024 스텝)을 반시계 방향으로 회전.
    2. 2초 대기 (delay(2000)).
    3. -GSR / 2: 감속비를 적용한 절반 회전(1024 스텝)을 시계 방향으로 회전.
    4. 2초 대기.
  • 결과적으로: 모터가 반시계 방향으로 반바퀴 회전한 뒤, 시계 방향으로 반바퀴 회전하는 동작을 반복합니다.

 


데이터베이스 연결

 

MySQL 데이터베이스 연결 및 C# 코드 구성

 

  • NuGet 패키지를 사용해 MySQL.Data를 설치.
  • MySql.Data.MySqlClient 네임스페이스 추가.
  • MySqlConnection 객체를 사용해 데이터베이스에 연결.
  • SQL 쿼리를 MySqlCommand에 전달해 실행.

 

 

  • MySQL 연결 문자열 구성 요소
    • Server, Database, Uid, Pwd 각각의 역할 설명.
    • string Conn = "Server=localhost;Database=example01;Uid=root;Pwd=root;";
      • Server:
        • MySQL 서버의 주소를 지정합니다.
      • Database:
        • 연결할 데이터베이스 이름을 지정합니다.
      • Uid:
        • MySQL 데이터베이스에 접속할 사용자 아이디를 지정합니다.
      • Pwd:
        • 접속할 사용자의 비밀번호를 지정합니다.
  • MySqlConnection과 MySqlCommand 사용법
    • MySqlConnection
      • MySQL 연결을 담당하는 클래스.
      • conn.Open()으로 연결을 열고 conn.Close()로 닫음.
    • MySqlCommand
      • SQL 문을 데이터베이스에 전달하고 실행.
      • ExecuteNonQuery():
        • INSERT, UPDATE, DELETE 실행 시 사용.
        • 반환값: 영향받은 행의 개수 (int).

 

 

 

 

 

 

 

//네임스페이스 추가
using MySql.Data.MySqlClient;

//접속query
string Conn = "Server=localhost;Database=####;Uid=####;Pwd=####;";  


//삽입구문
using (MySqlConnection conn = new MySqlConnection(Conn))
{
     conn.Open();
     MySqlCommand msc = new MySqlCommand("INSERT INTO ~", conn);
     msc.ExecuteNonQuery();
}


//검색구문
using (MySqlConnection conn = new MySqlConnection(Conn))
{           
        DataSet ds = new DataSet();
        string sql = "SELECT * FROM ~";
        MySqlDataAdapter adpt = new MySqlDataAdapter(sql, conn);
        adpt.Fill(ds, "~");
}


//수정구문
using (MySqlConnection conn = new MySqlConnection(Conn))
{
     conn.Open();
     MySqlCommand msc = new MySqlCommand("UPDATE ~ SET ~", conn);
     msc.ExecuteNonQuery();
}

//삭제구문
using (MySqlConnection conn = new MySqlConnection(Conn))
{
     conn.Open();
     MySqlCommand msc = new MySqlCommand("DELETE FROM ~", conn);
     msc.ExecuteNonQuery();
}

 

 


블루투스 셋팅 (HC-06)

 

Serial.available()

  • 외부에서 신호를 받았는지 확인
  • 아두이노는 시리얼 포트에서 온신호를 버퍼에 저장해두는데 이 값이 있는지 확인하는 방법이 'Serial.available()'를 호출
  • 시리얼 버퍼는 하드웨어 시리얼 통신을 통해 들어오는 데이터를 일시적으로 저장하는 공간입니다.
  • Serial.available()는 이 버퍼에 쌓여 있는 데이터의 개수를 확인합니다.
  • 따라서 반환값이 0보다 크면 버퍼에 읽을 수 있는 데이터가 있다는 뜻입니다.

HC-06

 

 

 

아두이노 소스

 

#include <SoftwareSerial.h>

SoftwareSerial bluetooth(2, 3);

void setup()  
{                
  pinMode(13, OUTPUT);
  Serial.begin(9600);
  bluetooth.begin(9600);
}

void loop()                    
{
   if(bluetooth.available())
   {
     int c = bluetooth.read();
     if (c == '1')
     {    
       digitalWrite(13,HIGH);
     }
     else if (c == '0')
     {
       digitalWrite(13,LOW);
     }
   }
}

 

bluetooth(2, 3) : 소프트웨어 시리얼 핀을 2번 핀(TX), **3번 핀(RX)**으로 설정합니다.

  • TX(송신) 핀은 데이터를 보낼 때 사용됩니다.
  • RX(수신) 핀은 데이터를 받을 때 사용됩니다.

 

  • pinMode(13, OUTPUT) : 13번 핀에 연결된 LED를 제어하기 위해 출력 모드로 설정합니다.
  • Serial.begin(9600) : 시리얼 모니터와 통신을 위해 9600bps로 하드웨어 시리얼을 초기화합니다.
  • bluetooth.begin(9600) : 블루투스 모듈과의 통신을 위해 소프트웨어 시리얼을 시작합니다.

 

블루투스가 연결되기만 하면 자동으로 값 1이 되는 것이 아니라,

블루투스 장치(스마트폰 등)에서 명시적으로 문자 '1' 또는 '0'을 보내야 bluetooth.read()를 통해 값이 들어오게 됩니다.

 

#include <SoftwareSerial.h>
SoftwareSerial hc06(2,3);

void setup(){
  //시리얼 시작
  Serial.begin(9600);
  Serial.println("AT 명령어를 쳐보세요:");
  //블루투스 시리얼 포트 시작
  hc06.begin(9600);
}

void loop(){
  //hc06에서 모니터로 데이터 쓰기
  if (hc06.available()){
    Serial.write(hc06.read());
  }
  
  //시리얼 모니터네서 hc06으로 데이터 쓰기
  if (Serial.available()){
    hc06.write(Serial.read());
  }  
}

 

시리얼 모니터 통신 시작

  • AT Command 명령어
    • AT : AT 모드 진입 확인
    • AT+NAME0000 블루투스 이름(0000) 모듈 설정
    • AT+PIN0000 비밀번호(0000) 설정

 

HC-06의 펌웨어 버전이 2.0 이하라면 line ending 없음으로 해야 시리얼 창에 응답

HC-06의 펌웨어 버전이 3.0이라면 Both NL & CR 해야 시리얼 창에 응답


라이브러리

 

 

  • Examples : 라이브러리 예제 폴더
  • Src : 라이브러리 구성하는 해더(.h)와 소스파일(.CPP)
  • Keywords: 아두이노 IDE 에서 코드를 볼때 강조표시(다른색상)할 문구 지정
  • library.properties : 라이브러리의 기본정보 파일
  • README.md : 라이브러리의 간단한 설명

 

Keywords

 

 

library.properties

 

 

README.md

 

 

 

 


BUZZER (부저)

 

구조

  • 전기가 통하면 삐 소리가 남  (삐 소리만 낼 수 있음)
  • 전자석을 이용하여 진동판을 진동시켜 소리를 내는 장치
  • 눈으로 신호나 레벨을 확인
    • LED, FND, TEXT, LCD 등
  • 스피커와 기본 원리는 동일하나, 스피커는 진동막을 진동시켜 구현
  • 부저는 단순한 금속성 소리
  • 스피커는 복잡한 소리
  • 부저는 2개의 선 (Vcc, GND)
    • 전자석이 철판을 끌어 당겨 서로 맞붙으면서 금속 소리가 나는 구조
    • 전류를 끊으면 붙어있던 철판이 다시 원상 
    • 1초에 수십~수만번 반복하면 이 주파수에 해당되는 소리가 생성
    • 사람이 알아들을 수 있는 주파수 20~20,000 Hz
    • 적당한 간격으로 주파수 신호르르 반복하면 특정한 소리 생성

종류

  • 능동 부저 (Active Buzzer)
    • 전원을 가해주면 바로 소리가 남 ( 내장된 회로가 있음 )
    • 사용 쉽고 편리
    • 낼 수 있는 소리가 한 가지
    • 단순한 소리, 경고음
  • 수동 부저 (passive Buzzer)
    • 전압을 신호 형태로 1-0-1-0-1-1 주기적으로 끊었다 연결했다를 반복해 주면 소리가 남 ( 내장된 회로가 없음 )
    • 주파수를 만들어 전류를 흘러주면 그 주파수 대로 음을 냄
    • 다양한 소리
    • 프로그램이 복잡
    • 다양한 소리 방생, 전자 피아노, 기타 가전기기

 

 

 

 

Tone 함수

tone(pin, frequency, duration)

디지털 핀 번호, 주파수, 재생 시간

 

 

 

 

 

틱 틱 틱

int buzzer = 8;

void setup() {
    pinMode(buzzer, OUTPUT);	
}
void loop() {
    digitalWrite(buzzer, HIGH);
    delay(1000);
    digitalWrite(buzzer, LOW);
    delay(1000);
}

 

 

피아노

void setup() {
    pinMode(8, OUTPUT); // 디지털 8번핀을 출력모드로 설정.
}
void loop() {
    tone(8, 261.6, 1000); // 8번핀, 4옥타브 도를 1초동안 출력한다.
    tone(8, 329.7, 2000); // 8번핀, 4옥타브 미를 2초동안 출력한다.
    tone(8, 349.2, 1000); // 8번핀, 4옥타브 도를 1초동안 출력한다.
} 


noTone : 주파수 신호 출력을 중지하기 위한 함수

 

int buzzer = 8;
int melody[] = {262, 294, 330, 349, 392, 440, 494, 523};

void setup()
{
	pinMode(buzzer, OUTPUT);
}
void loop()
{
    int i;
    for (i=0; i<=7; i++) {
        tone(8, melody[i], 250);
        delay(400);
	    noTone(8);
    }
}