정보나눔

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

아두이노 리밋스위치 사용 질문
이상익 | 2017-05-24

#include <SoftwareSerial.h>
#include <L298Drv.h>

L298Drv motor1(8, 24); //회전판 DC
L298Drv motor2(26, 28); //병맥주 DC
L298Drv motor3(42, 44); //사과펌프
L298Drv motor4(46, 48); //오렌지펌프
L298Drv motor5(43, 45); //포도펌프
L298Drv motor6(47, 49); //맥주펌프
L298Drv motor7(33, 35); //디스펜서 타미야
       
static int cnt= 0;
int blueTx=2;   //Tx (보내는핀 설정)at
int blueRx=3;   //Rx (받는핀 설정)
SoftwareSerial mySerial(blueTx, blueRx);  //시리얼 통신을 위한 객체선언
const int button=32;   //회전판 핀번호
int buttonchack = LOW;

 
int pinNum = A0; //아날로그 0번핀 사용
int distance = 0; //거리값 변수 생성
int ledPin=13;
 int val = 0;

void setup() {
  Serial.begin(9600);
   mySerial.begin(9600); //블루투스 시리얼
   pinMode (pinNum,INPUT); //A0번핀을 INPUT으로 설정
  pinMode(ledPin,OUTPUT);  //ledPin OUTPUT으로 설정
 
  pinMode(button,INPUT);    //limit switch Pin number


  analogReference(DEFAULT); //아날로그 측정
}

void loop() {
 
   char cmd;  //문자열 변수 선언
buttonchack=digitalRead(button);

 int data = analogRead(pinNum); //적외선 거리 센서로 부터 측정값을 읽어온다
  int volt = map(data, 0, 1023, 0, 5000); //측정한 volt값을 0에서 5000사이의 값으로 변환
  distance = (21.61/(volt-0.1696))*1000; //측정값을 통해 거리를 계산
 

for (int a = 0; a <= 100; a++ )//처음시작시에는 반드시 기계작동전에 맥주병 넣어두기
{
  if(distance<5){     
  motor2.drive(150); //병맥 기울기
   delay(500);
   Serial.println("적");
   motor7.drive(150); //디스펜서 누르기
    delay(1000);
     motor7.drive(-150); //디스펜서 빼기
    delay(1000);
    motor1.drive(25); //회전판 돌리기
        delay(5000);
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
  
  }
     motor2.drive(-150); //병맥 기울기
     delay(500);
      
  
  }
 
  //거리가 5cm보다 크면
  else {
     Serial.println(a);
    motor7.drive(250); //디스펜서 누르기
    delay(1000);
     motor7.drive(-250); //디스펜서 빼기
    delay(1000);
     Serial.println("A");
   
        motor1.drive(70); //회전판 돌리기
        delay(5000);
       
         Serial.println("B");
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
        Serial.println("b");
  }
    
    
  }

  switch(cmd){

  Serial.println(cmd);

  
     case 1:
      motor3.drive(250); //사과
        delay(3000);
        motor3.drive(-250); //사과
        delay(3000);
       motor6.drive(250); //맥주
        delay(3000);
   motor6.drive(-250); //맥주
        delay(3000);
   motor1.drive(25); //회전판 돌리기
        delay(5000);
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
  
  }
      break;
  
  
      case 2:
        motor4.drive(250); //오렌지
        delay(3000);
           motor4.drive(-250); //오렌지
        delay(3000);
        motor6.drive(250); //맥주
        delay(3000);
   motor6.drive(-250); //맥주
        delay(3000);
   motor1.drive(25); //회전판 돌리기
        delay(5000);
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
  
  }
   
      break;


    case 3:
     motor5.drive(250); //포도
        delay(3000);
 motor5.drive(-250); //포도
        delay(3000);
         motor6.drive(250); //맥주
        delay(3000);
   motor6.drive(-250); //맥주
        delay(3000);
       motor1.drive(25); //회전판 돌리기
        delay(5000);
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
  
  }
       break;
     
  
    case 4:
     motor6.drive(250); //맥주
        delay(3000);
     motor6.drive(-250); //맥주
        delay(3000);
      motor1.drive(25); //회전판 돌리기
        delay(5000);
   if(buttonchack==HIGH){ 
     motor1.drive(0); //회전판 멈추기
        delay(10000);
  
  }
      break;

   
      
 
}

}
}

 

이것은 저희가 만든 프로그램입니다.  회전판 모터가 돌면서 리밋스위치 닿으면 멈춰야하는것이 문제 점에 있습니다.

아두이노 2560 보드를 사용하고 있습니다. 리밋스위치 NC 부분이 접접되면 멈추는 프로그램을 만들려 하는데

회전 모터는 회전을 하는데 리밋스위치를 눌러도 멈추지 않고 있습니다.

이에 대해 조언 부탁드립니다.

프로필사진

수박쨈 2017-05-25 16:35:18

딜레이가 코드상에 존재하기 때문에 그런게 아닐까라는 생각이 드네요.

 

딜레이로 인해 코드는 멈춰있는상태인데 스위치가 눌리게 되면 아두이노에서는 스위치가 눌렸는지 감지할 수 없으니 생기는 문제가 아닐까 합니다.

 

아두이노에 보시면 withoutDelay라는 예제가 있습니다. 그 예제를 보시면 딜레이없이 LED를 주기적으로 깜빡이는 스킬을 볼 수 있는데 참조하시면 좋을 거 같습니다.

 

 

이전글   |    sd카드 내부의 파일 정보를 2진수 혹은 16진수로 출력하기 ... 2017-05-24
다음글   |    아두이노 랜덤숫자 스위치이용해서 출력하는거.... 2017-05-25