BASIC4MCU | 질문게시판 | 아두이노 코딩 질문드립니다!
페이지 정보
작성자 김정훈 작성일2019-05-27 19:46 조회3,391회 댓글0건본문
안녕하세요. 아두이노를 이번에 처음 접해보는 공과대학 대학생입니다.
저는 적외선, 초음파, 자이로 센서를 결합하여 특정 조건이 되면 모터(LM-4057)가 작동하도록 구현하는 것을 목표로 하고 있고,
조건 자체와 모터가 작동하는거까지는 구현을 해냈습니다.
이 때, 제가 사용하는 모터가 리니어 모터로 10cm를 앞으로 나오거나 들어가는 구조로 되어있는데,
조건 내에서는 2cm 정도만 나오고 나온 상태에서 멈춰있다가
조건을 만족하지 못하는 경우 다시 들어가는 형태로 구현하고 싶습니다.
analogWrite(pwm,255);
digitalWrite(dir,LOW);
delay(1000); 모터가 나오는 이 코드 뒤에
analogWrite(pwm,0); 를 이용해 멈춰있도록 조건문을 만들고 싶은데 도저히 모르겠습니다.
(제가 계속 고민하고 다른 분들의 조언을 얻어본 결과입니다. 꼭 이 방법이 아니여도 관계없습니다.)
while 문을 사용해야 될거같다는 생각이 들긴 하는데 어디를 어떻게 수정해야할지 잘 모르겠네요...
조언 부탁드립니다.
----------------------------------------------------------------------------------------------------------------------------------------
#include<Wire.h>
const int MPU=0x68; //MPU 6050 의 I2C 기본 주소
int16_t GyX;
#define TRIG 3 //초음파
#define ECHO 4 //초음파
int Buzzer = 9; //부저
int infrared = 5; //적외선
int pwm=7; //모터
int dir=6; //모터
void setup() {
Wire.begin(); //Wire 라이브러리 초기화
Wire.beginTransmission(MPU); //MPU로 데이터 전송 시작
Wire.write(0x6B); // PWR_MGMT_1 register
Wire.write(0); //MPU-6050 시작 모드로
Wire.endTransmission(true);
pinMode(TRIG, OUTPUT);
pinMode(ECHO, INPUT); //초음파
pinMode(infrared, INPUT);
pinMode(Buzzer,OUTPUT);
Serial.begin(9600);
pinMode(7,OUTPUT); //모터
pinMode(6,OUTPUT); //모터
}
void loop() {
int state = digitalRead(infrared);
if(state == 1){ //적외선 감지 x
first();
}
else{
digitalWrite(Buzzer,HIGH);
analogWrite(pwm,255);
digitalWrite(dir,HIGH);
}
}
void first() {
float duration, distance;
digitalWrite(TRIG, LOW);
delay(1);
digitalWrite(TRIG, HIGH);
delay(1);
digitalWrite(TRIG, LOW);
duration = pulseIn(ECHO, HIGH);
distance = ((340 * duration)/1000) / 2;
//Serial.print(distance);
// Serial.println("mm");
Wire.beginTransmission(MPU); //데이터 전송시작
Wire.write(0x3B); // register 0x3B (ACCEL_XOUT_H), 큐에 데이터 기록
Wire.endTransmission(false); //연결유지
Wire.requestFrom(MPU,14,true); //MPU에 데이터 요청
//데이터 한 바이트 씩 읽어서 반환
GyX=Wire.read()<<8|Wire.read(); // 0x43 (GYRO_XOUT_H) & 0x44 (GYRO_XOUT_L)
Serial.print(" | GyX = "); Serial.print(GyX);
if(GyX > 2500 || GyX < -2500)
{
digitalWrite(Buzzer,LOW);
analogWrite(pwm,255);
digitalWrite(dir,LOW);
delay(1000);
}
else if(distance > 150)
{
digitalWrite(Buzzer,LOW);
analogWrite(pwm,255);
digitalWrite(dir,LOW);
delay(1000);
}
else
{
digitalWrite(Buzzer,HIGH);
analogWrite(pwm,255);
digitalWrite(dir,HIGH);
delay(1000);
}
}
댓글 0
조회수 3,391등록된 댓글이 없습니다.