Arduino LED RGB, 서보모터, 초음파 센서

회로는 이렇게 구성 하자

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);
}

 

 

 

댓글

Designed by JB FACTORY