Arduino LED RGB, 서보모터, 초음파 센서
- IoT
- 2022. 3. 28.
회로는 이렇게 구성 하자
LED RGB를 보면 제일 긴 선이 있다 이 선은 GND에 연결하자
void setup() {
Serial.begin(9600);
pinMode(6, OUTPUT);
pinMode(5, OUTPUT);
pinMode(3, OUTPUT);
}
void loop() {
//pwm을 이용하여 값을 적용 0~255
int red = random(256); //0~255
int green = random(256);
int blue = random(256);
Serial.println((String)red+" "+green+" "+blue);
analogWrite(6, red);
analogWrite(5, green);
analogWrite(3, blue);
delay(1000);
}
이러면 랜덤으로 색이 바뀐다.
이제 서보모터를 다뤄보자.
서보모터는 180도까지 회전이 가능하다.
주황색 선은 10번 핀에
갈색은 GND에
빨간색은 5V에 꼽아준다
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(10); //핀 설정
}
void loop() {
myservo.write(0); // 각도
delay(1000); //서보모터는 반드시 딜레이를 줘야함
// 모터가 동작할 시간을 줘야 함.
myservo.write(90);
delay(1000);
myservo.write(180);
delay(1000);
}
일단 움직이는지만 보자
잘 움직인다
0도로 갔다가 90도로 갔다가 180도로 갔다가 반복을 하게 된다.
//라이브러리 없이 작업하기
void setup() {
pinMode(10, OUTPUT);
}
void loop() {
digitalWrite(10, HIGH);
delay(1);
digitalWrite(10, LOW);
delay(19);
//이렇게 하면 각도 조절하기가 너무 어렵다.
}
라이브러리 없이 작업을 하면 각도를 조절하기가 너무 어렵다
그래서 라이브러리를 활용해서 각도를 쉽게 조절하는 것이다.
문제)
가변저항과 서보모터의 각도를 연결해서 작업해보기
더보기
#include <Servo.h>
Servo myservo;
void setup() {
myservo.attach(10);
}
void loop() {
int value = analogRead(A0);
myservo.write(map(value,0,1024,0,180));
delay(10);
}
문제)
스위치와 서보모터를 연결해서 각도를 조절하는 연습
- 스위치 2개를 연결(풀다운 풀업 아무거나 해도 됨) : +, -로 설정하기
- +와 - push버튼을 누르면 20도씩 +되거나 -되면서 서보의 각도가 조절되도록 처리해보기
더보기
#include <Servo.h>
Servo myservo;
int value = 0;
void setup() {
myservo.attach(10);
pinMode(12, INPUT);
pinMode(11, INPUT);
myservo.write(0);
}
void loop() {
if(digitalRead(12) == HIGH)
(value == 180) ? NULL : value += 20;
if(digitalRead(11) == LOW)
(value == 0) ? NULL : value -= 20;
myservo.write(value);
delay(100);
}
초음파 센서는 2cm~ 400cm 안에 거리를 측정할 수 있다
트리거에서 초음파가 날라간다.
물체에 맞고 반대로 에코로 들어간다.
트리거에서 물체까지의 거리와
에코로 들어오는 거리가 모두 합산되어서 나올거다.
void setup() {
Serial.begin(9600);
pinMode(10, OUTPUT); // triger
pinMode(9, INPUT); // echo
}
void loop() {
//초음파 신호 보내기
//triger 핀의 입력이 low에서 high로 변하는 순간부터 시간을 측정하고
//다시 low로 변경되는 시점까지의 시간을 마이크로초단위로 변환
digitalWrite(10, LOW);
delayMicroseconds(2);
digitalWrite(10, HIGH);
delayMicroseconds(10);
//10ms 시간을 줘야 신호가 간다.
digitalWrite(10, LOW);
//초음파 신호를 수신
//수신될때까지 시간을 측정
//echo핀으로 high신호가 들어오는 시점의 시간을 반환 -pulseIn함수
//low - high로 변하는 시점부터 측정을 하려면 HIGH
//high - low변하는 시점부터 측정을 하려면 LOW로 정의
double duration = pulseIn(9, HIGH);//echo신호가 들어오면
//거리 계산= 시간, 속력
double distance = 340 * duration / 10000 / 2;
//편도로 계산하기 위해 / 2 해줌
Serial.println((String)distance+"cm");
delay(500);
}
문제)
초음파 센서와 물체의 거리가 30cm 미만이면 led 불 켜기
더보기
void setup() {
Serial.begin(9600);
pinMode(10, OUTPUT); // triger
pinMode(9, INPUT); // echo
pinMode(12, OUTPUT);
}
void loop() {
digitalWrite(10, LOW);
delayMicroseconds(2);
digitalWrite(10, HIGH);
delayMicroseconds(10);
digitalWrite(10, LOW);
double duration = pulseIn(9, HIGH);
double distance = 340 * duration / 10000 / 2;
if(distance < 30)
digitalWrite(12, HIGH);
Serial.println((String)distance+"cm");
delay(500);
}