BASIC4MCU | 질문게시판 | 리니어레일+적외선 리모컨+리미트스위치 질문입니다!
페이지 정보
작성자 capstone돌모자 작성일2020-11-21 18:20 조회9,117회 댓글1건본문
#include <IRremote.h>
#include <Stepper.h>
int stepsPerRevolution = 200;
int control;
Stepper motor1(stepsPerRevolution, 8, 9);
Stepper motor2(stepsPerRevolution, 10, 11);
#define LIMIT_PIN 3
int RECV_PIN = A0;
IRrecv irrecv(RECV_PIN);
decode_results results;
void setup()
{
irrecv.enableIRIn();
digitalWrite(0,LOW);
pinMode(8, OUTPUT);
pinMode(9, OUTPUT);
pinMode(10, OUTPUT);
pinMode(11, OUTPUT);
pinMode(LIMIT_PIN, INPUT);
motor1.setSpeed(1200);
motor2.setSpeed(1200);
Serial.begin(9600);
}
void loop()
{
if (irrecv.decode(&results))
{
Serial.println(results.value,HEX);
if((results.value == 0xFF6897)||(results.value == 0xFF30CF)||(results.value == 0x97483BFB)||(results.value == 0xFFE01F))
{
control=1;
}
else if((results.value == 0xFF6897)||(results.value == 0xFF5AA5)||(results.value == 0xFF4AB5)||(results.value == 0xFF52AD))
{
control=2;
}
irrecv.resume();
}
if (control==1)
{
motor1.step(1);
motor2.step(1);
}
else if(control==2)
{
motor1.step(-1);
motor2.step(-1);
}
else if(digitalRead(LIMIT_PIN) == LOW)
{
motor1.step(0);
motor2.step(0);
delay(500);
motor1.step(-1);
motor2.step(-1);
delay(1000);
motor1.step(0);
motor2.step(0);
}
}
ㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡㅡ
적외선 리모컨으로 레일을 이동시키고 리미트 스위치에 물체가 닿으면 정지했다가 딜레이 후 반대방향으로 잠깐 움직였다가 레일이 다시 멈추게 하는 코드를 짰습니다.
하지만 리미트 스위치에 닿으면 정지만 하고 원하는대로 역방향으로 움직이거나 하지 않습니다.
리미트 스위치 자체에 정지하는 기능만 있어서 코드가 그 상태에서 종료되는지 궁금합니다.
아니라면 원하는 방식대로 구현하도록 하는 코딩이 있을지 조언 부탁드립니다 ! :)
댓글 1
조회수 9,117master님의 댓글
master 작성일
딜레이를 준다고 모터가 이동하는 것이 아닙니다.
//
motor1.step(0);
motor2.step(0);
스텝0 제어는 아무런 의미가 없습니다.
스텝모터의 정지는 스텝신호를 주지 않으면 정지입니다.
//
motor1.step(-1);
motor2.step(-1);
delay(1000);
잠깐 움직이는 코드가 이 것 이겠죠?
만약 1초동안 -100스텝 정도 움직이고 싶다면
for(int i=0;i<100;i++){ motor1.step(-1); motor2.step(-1); delay(10); }
만약 1초동안 -1000스텝 정도 움직이고 싶다면
for(int i=0;i<1000;i++){ motor1.step(-1); motor2.step(-1); delay(1); }
만약 1초동안 -10스텝 정도 움직이고 싶다면
for(int i=0;i<10;i++){ motor1.step(-1); motor2.step(-1); delay(100); }