- 모터란
- 고정자로 영구자석 사용
- 회전자로 코일을 사용
- 전기자에 흐르는 전류의 방향을 전환함으로써 자력의 반발
- 흡인력으로 회전력을 생성
- 서보 모터 (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 순서로 각 상이 순차적으로 활성화됩니다.
- 코일 하나가 자화되어 스테이터(고정자)가 특정 위치에서 로터(회전자)를 당기고, 다음 상이 활성화되면 로터가 그 방향으로 움직입니다.
- 특징:
- 단계별 회전 각도(스텝 각):
- 설명에 따르면 7.5°씩 움직이므로 한 번의 1상 전환으로 로터가 7.5° 회전합니다.
- 360° ÷ 7.5° = 48 스텝으로 한 바퀴를 완성합니다.
- 속도 제어:
- 한 번의 스텝 사이에 딜레이를 주어 속도를 조절할 수 있습니다.
- 딜레이가 짧아지면 빠르게 회전하고, 딜레이가 길어지면 천천히 회전합니다.
- 장점:
- 전원 소비가 적고 회로가 단순합니다.
- 단점:
- 로터의 위치가 정확히 고정되지 않고 진동이 발생할 수 있습니다.
- 토크가 상대적으로 낮습니다.
- 단계별 회전 각도(스텝 각):
2상 제어 방식
- 동작 원리:
- 한 번에 두 개의 상(A, B)을 동시에 활성화하여 전원을 공급합니다.
- 예를 들어, A와 B를 동시에 활성화한 뒤, B와 C를 활성화하는 식으로 두 상을 중첩시켜 회전합니다.
- 특징:
- 단계별 회전 각도(스텝 각):
- 한 번의 2상 전환으로 3.75° 회전합니다(1상에서의 회전 각도 7.5°의 절반).
- 360° ÷ 3.75° = 96 스텝으로 한 바퀴를 완성합니다.
- 장점:
- 두 상을 동시에 사용하기 때문에 위치 고정성이 높아지고 진동이 감소합니다.
- 더 높은 토크를 제공합니다.
- 단점:
- 전력 소비가 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. 라이브러리 및 정의
- Stepper 라이브러리: 아두이노에서 스텝 모터를 쉽게 제어할 수 있도록 제공하는 라이브러리입니다.
- STEPS_Revolution: 스텝 모터의 1회전(풀스텝)당 필요한 스텝 수를 정의합니다. 여기서는 32로 설정되어 있습니다.
- GSR: 모터의 기어비(감속비)를 고려한 총 스텝 수를 계산합니다. 예를 들어, 1회전당 32 스텝을 가진 모터에 기어비 1:64가 적용되었을 때, 32 * 64 = 2048 스텝이 필요합니다.
2. 모터 객체 생성
- stepper 객체: Stepper 클래스를 사용해 스텝 모터 제어 객체를 생성합니다.
- 파라미터:
- STEPS_Revolution: 모터 1회전에 필요한 기본 스텝 수.
- 8, 9, 10, 11: 모터에 연결된 아두이노 핀 번호입니다.
3. setup() 함수
- stepper.setSpeed(300): 모터의 속도를 초당 스텝 수(RPM)가 아니라 초당 스텝(step/second)으로 설정합니다. 여기서는 300 스텝/초로 설정되었습니다.
4. loop() 함수
- stepper.step(steps):
- 지정된 스텝 수만큼 모터를 회전시킵니다.
- steps가 양수이면 반시계 방향으로, 음수이면 시계 방향으로 회전합니다.
- 동작:
- GSR / 2: 감속비를 적용한 절반 회전(1024 스텝)을 반시계 방향으로 회전.
- 2초 대기 (delay(2000)).
- -GSR / 2: 감속비를 적용한 절반 회전(1024 스텝)을 시계 방향으로 회전.
- 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:
- 접속할 사용자의 비밀번호를 지정합니다.
- Server:
- MySqlConnection과 MySqlCommand 사용법
- MySqlConnection
- MySQL 연결을 담당하는 클래스.
- conn.Open()으로 연결을 열고 conn.Close()로 닫음.
- MySqlCommand
- SQL 문을 데이터베이스에 전달하고 실행.
- ExecuteNonQuery():
- INSERT, UPDATE, DELETE 실행 시 사용.
- 반환값: 영향받은 행의 개수 (int).
- MySqlConnection
//네임스페이스 추가
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);
}
}