정보나눔

오픈소스하드웨어 프로젝트에 대한 다양한 정보를 나누는 공간입니다.

서브모터와 Interrupt코드
두유노우우노 | 2019-05-29

1. 프로젝트 사용한 보드 종류

  아두이노 UNO

 

 

2. 사용한 개발 프로그램명

  아두이노 IDE

 

 

3. 사용한 센서 모델명

  죄송합니다 센서이름만 아네요 ㅠ..

 

 

4. 연결한 회로 설명 (또는 이미지)

 

 

5. 소스코드 (주석 필수)

  

#include <Servo.h>

Servo myservo; // 서보를 제어할 서보 오브젝트를 만듭니다.

int pos = 0; // 서보 위치를 저장할 변수를 선언합니다.

int echopin= 8;

int trigpin= 9;

// A번 핀을 LED로 지정합니다.

int ledPin1 = 7;

int ledPin2 = 5;

int ledPin3 = 4;

// 디지털 3번핀을 불꽃감지센서로 지정합니다.

int interruptFlamePin = 3;

// 불꽃 감지 센서의 상태를 저장합니다.(처음 상태를 LOW로 설정)

int pirState = LOW;

// 센서 값을 읽기 위해 변수를 선언합니다.

int val;

// PWM 핀에 스피커 혹은 피에조 센서를 연결합니다.(digital 9, 10, or 11)

int pinSpeaker = 11;

void setup()

{ // LED 를 출력으로 설정합니다.

pinMode(ledPin1, OUTPUT);

pinMode(ledPin2, OUTPUT);

pinMode(ledPin3, OUTPUT);

// 센서를 입력으로 설정합니다.

 

pinMode(trigpin,OUTPUT);

pinMode(echopin,INPUT);

//불꽃감지 센서 인터럽트

pinMode(interruptFlamePin,INPUT);

attachInterrupt(digitalPinToInterrupt(interruptFlamePin), blink, HIGH);

 

// 스피커를 출력으로 설정합니다.

pinMode(pinSpeaker, OUTPUT);

// 핀 8의 서보를 서보 오브젝트에 연결합니다.

myservo.attach(A1);

// 시리얼 통신(9600)를 준비합니다.

Serial.begin(9600);

}void loop()

{//초음파 센서

digitalWrite(trigpin,LOW);

digitalWrite(echopin,LOW);

delayMicroseconds(2);

digitalWrite(trigpin,HIGH);

delayMicroseconds(10);

digitalWrite(trigpin,LOW);

unsigned long duration = pulseIn(echopin, HIGH);

float distance=((float)(340*duration) / 10000) /2;

Serial.print(distance);

Serial.println("cm");

delay(100);

 

//자동문 코드!!

 

if (5 >= distance)

{ myservo.write(90); // 변수의 위치로 서보를 이동시킵니다.

delay(4000);

}

 

else if (distance >= 5){

myservo.write(0); // 변수의 위치로 서보를 이동시킵니다.

delay(5000);

}

}

void blink() {

// 센서값을 읽어들입니다.

val = digitalRead(interruptFlamePin);

 

// 만약 값이 일때,

if (val == LOW) {

// LED를 켭니다.

digitalWrite(ledPin1, HIGH);

digitalWrite(ledPin2, HIGH);

digitalWrite(ledPin3, HIGH);

playTone(300, 760);

myservo.write(120);

delay(1000);

 

 

if (pirState == HIGH) {

// 센서의 상태가 HIGH일때

Serial.println("Fire.");

// 다음의 문구를 시리얼 모니터로 출력합니다.

pirState = LOW;

}

 

}

else {

 

// LED를 끕니다.

digitalWrite(ledPin1, LOW);

digitalWrite(ledPin2, LOW);

digitalWrite(ledPin3, LOW);

delay(1000);

 

 

if (pirState == LOW) {

//센서값이 LOW 일때

Serial.println("Fire extinguished");

// 다음의 문구를 시리얼 모니터로 출력합니다.

pirState = HIGH;

 

}

}

}// 경보음을 만들어 냅니다.

void playTone(long duration, int freq) {

duration *= 1000;

int period = (1.0 / freq) * 1000000;

long elapsed_time = 0;

while (elapsed_time < duration) {

digitalWrite(pinSpeaker,HIGH);

delayMicroseconds(period / 2);

digitalWrite(pinSpeaker, LOW);

delayMicroseconds(period / 2);

elapsed_time += (period); }

}

 

 

6. 문제점 및 에러 내용

 

만들고 싶던것은 처음엔 자동문으로 작동을 하다가 센서로 불꽃이 감지되면 계속 열려있는 문이었습니다..(몇 십초간 열렸다가 닫히거나)

 

그래서 우선 초음파 센서로 거리를 읽어서 서브모터로 열리고 닫히는 자동문을 만들고.

 

그런 다음에 불꽃감지 센서로 불꽃을 감지하면 interrupt로 자동문 코드를 무시하고 blink안의 명령문이 작동해서 

 

계속 열려있다가 센서에 불꽃이 감지되지 않으면 다시 자동문으로 기능하는 걸 구상했는데..

 

현재는 자동문은 기능하지만 불꽃이 감지되면 서브모터가 120도까지 가고서 다시 자동문의 else if 문으로 돌아가는듯 문이 닫히고 있습니다...

( LED는 불꽃이 감지되면 계속 켜져있습니다. 서브모터 혼자 어떨땐 120에 멈춰있고 어떨땐 120으로 갔다가 바로 0으로 가고 그럽니다)

 

실행하던걸 중지하고 다른 명령문을 강제로 실행하는게 Interrupt라고 해서 썼는데 제가 코드를 잘못 쓴건지 아니면

 

굳이 Interrupt를 안쓰고도 가능한데 괜히 쓴건지

 

자동문 코드부터 잘못된건지

 

아니면 애초에 서브모터를 이용하는 코드가 겹쳐서 불가능한건지..

 

아무리 생각해봐도 모르겠습니다 ㅜㅠㅜ 조언 부탁드립니다

 

이전글   |    음성인식과 어플로 서보모터 제어하긔 2019-05-29
다음글   |    아두이노 스마트홈 서보모터 2019-05-30