질문드립니다...
페이지 정보
작성자 살라미 작성일19-05-16 19:38 조회4,146회 댓글1건본문
/*
제가 하고자 하는것은 이것입니다.!
1.스위치 1개(작동버튼),리미트 스위치 두개(UP,DOWN),UP스위치,DOWN 스위치,비상정지버튼
2.작동스위치를 누르면 DC모터 역방향 구동된다.
3.DOWN리미트 스위치에 닿으면 DC모터가 1초간 더 작동후 1.5초간 멈춘다
4.1.5초간 멈춘 후 UP리미트 스위치에 닿을떄 까지 모터가 역방향 한다
5.UP리미트 스위치에 닿으면 작동이 끝이 난다.
UP스위치를 누르면 모터가 역회전한다
DOWN스위치를 누르면 모터가 정회전한다
비상정지 버튼이 눌리면 그자리에서 작동이 정지한다.
입니다!
*/
// MCU BASIC: https://www.basic4mcu.com
// DateTime : 2019-05-08 오전 8:06:45
// by Ok-Hyun Park
//
int ULT=7; // 릴레이(초음파)
int SW=8; // 작동스위치 푸시버튼사용
int UP=9; // 실린더 UP 버튼
int DOWN=10; // 실린더 DOWN버튼
int LSU=11; // 리미트UP
int LSD=12; // 리미트DOWN
int EMG=13; // 비상정지버튼
int IN1=3; // 드라이버 정
int IN2=4; // 드라이버 역
int EN=11; // PWM으로 속도 조절시 필요
int mode=0; // 초기 정지모드
//
void motor_stop(){ digitalWrite(IN1,0); digitalWrite(IN2,0); }
void motor_up() { digitalWrite(IN1,1); digitalWrite(IN2,0); }
void motor_dn() { digitalWrite(IN1,0); digitalWrite(IN2,1); }
//
void setup(){
pinMode(IN1,OUTPUT); pinMode(IN2,OUTPUT); pinMode(EN,OUTPUT);
pinMode(ULT,OUTPUT); //릴레이(진동자 On/Off)
pinMode(SW,INPUT_PULLUP);
pinMode(LSU,INPUT_PULLUP); pinMode(LSD,INPUT_PULLUP);
pinMode(EMG,INPUT_PULLUP); pinMode(UP,INPUT_PULLUP); pinMode(DOWN,INPUT_PULLUP);
}
//
void loop(){
if(!digitalRead(EMG)||!digitalRead(SW)){ // 비상정지
motor_stop(); digitalWrite(ULT,LOW); // 정지
}
else{
if(!digitalRead(SW)){ // 작동스위치
if(digitalRead(LSD)){} // DOWN리미트 감지중이면 통과
else{
motor_dn(); digitalWrite(ULT,HIGH);
while(!digitalRead(LSD)){ if(!digitalRead(EMG))return; } // DOWN리미트 감지까지 dn
//
delay(200); motor_stop(); delay(1500);
//
motor_up();
while(!digitalRead(LSU)){ if(!digitalRead(EMG))return; } // UP리미트 감지까지 up
motor_stop(); digitalWrite(ULT,LOW);
}
}
//
if (!digitalRead(UP ))motor_up();
else if(!digitalRead(DOWN))motor_dn();
else motor_stop();
}
}
위 코드 각 스위치 리드스위치 다 확인해도 멀쩡히 잘 작동합니다.
시리얼을 통해서 1,0 나오는지 다 확인도 했구요
계속 상,하 버튼에 의한 조작에서만 막히는데..
뭐가 문제인지 당최 모르겠습니다.
if문의 위치도 바꿔보았구요
첫번째 else {}안에 있는 애들을 밖으로 꺼내서 해보아도 안되고..
정말 어디서 잘못된건지 궁금합니다..
댓글 : 1
조회수 : 4,146
master님의 댓글
master 작성일
void loop() 함수의 실행을 보면
비상스위치는 눌려있지 않을테니
else{}와 업다운 스위치 체크문이 실행 됩니다.
작동 스위치가 눌려있으면 else 문 안의 딜레이가 (약 1.7초로) 길고
while(!digitalRead(LSU)) 리미트 스위치가 눌려있으면 무한루프에 빠지므로
업다운 스위치 체크하지 못합니다.