BASIC4MCU | 질문게시판 | 질문드립니다...
페이지 정보
작성자 살라미 작성일2019-05-16 19:38 조회4,162회 댓글1건
https://www.basic4mcu.com/bbs/board.php?bo_table=gac&wr_id=8626
본문
/*
제가 하고자 하는것은 이것입니다.!
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; // 리미트UPint LSD=12; // 리미트DOWNint 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리미트 감지까지 upmotor_stop(); digitalWrite(ULT,LOW);}}//if (!digitalRead(UP ))motor_up();else if(!digitalRead(DOWN))motor_dn();else motor_stop();}}위 코드 각 스위치 리드스위치 다 확인해도 멀쩡히 잘 작동합니다.시리얼을 통해서 1,0 나오는지 다 확인도 했구요계속 상,하 버튼에 의한 조작에서만 막히는데..뭐가 문제인지 당최 모르겠습니다.if문의 위치도 바꿔보았구요첫번째 else {}안에 있는 애들을 밖으로 꺼내서 해보아도 안되고..정말 어디서 잘못된건지 궁금합니다..
댓글 1
조회수 4,162master님의 댓글
master 작성일
void loop() 함수의 실행을 보면
비상스위치는 눌려있지 않을테니
else{}와 업다운 스위치 체크문이 실행 됩니다.
작동 스위치가 눌려있으면 else 문 안의 딜레이가 (약 1.7초로) 길고
while(!digitalRead(LSU)) 리미트 스위치가 눌려있으면 무한루프에 빠지므로
업다운 스위치 체크하지 못합니다.