아누이노 코드에 대한 질문
페이지 정보
작성자 zeeon 작성일21-06-01 17:13 조회3,215회 댓글2건본문
안녕하세요. 제가 사용중인 모터 드라이버의 2번핀에서 회전에따른 펄스개수가 나오고,
이를 출력하기 위한 코드를 짜봤습니다. 5번핀은 모터에 속도입력하는 선입니다.
모터는 현재 0-2V 역회전, 2-3V 정지, 3-5V 를 인가하면 정회전이 되고있습니다.
---------------------------------------------------------------------------------------------
volatile int old_count=-1,count=0;
int speedA =5; // 모터 드라이버의 speed_IN 핀
int val;
//
void setup(){
pinMode(2,INPUT); // 모터 드라이버의 speed_OUT 핀
pinMode(speedA,OUTPUT);
analogWrite(speedA,128); // 안전을 위한 초기 속도 설정
attachInterrupt(0,Interrupt_A,CHANGE); // interrupt 0(pin 2)
Serial.begin(9600);
}
//
void loop(){
if(Serial.available()){
char input=Serial.read();
if( input == '1')
{ digitalWrite(speedA,val);
val = HIGH;
while(digitalRead(speed == HIGH))
{
if(old_count!=count){
old_count=count;
Serial.print("count="); Serial.println(count);}
if (count>= 2000){
analogWrite(speedA,128);
break;}
} }
else if (input == '2')
{ digitalWrite(speedA,val);
val = LOW;
while(digitalRead(speedA == LOW))
{ if(old_count!=count){
old_count=count;
Serial.print("count="); Serial.println(count);}
if (count <= 0 ){
analogWrite(speedA,128);
break;}
} }
else if (input == '+')
{ digitalWrite(speedA, HIGH);}
else if (input == '-')
{ digitalWrite(speedA,LOW);}
else
{analogWrite(speedA,128);}
}
}
void Interrupt_A(){
if( val == HIGH ){
count++;
}
else if ( val == LOW ){
count--;
}
}
================================
이렇게 업로드를 했을 때, 1을 입력하면 정회전으로 돌고 시리얼모니터에 펄스가 카운터가 0부터 되다가 count가 2000이 될 때 모터가
정지하게 되는 코드입니다. 이후 2를 입력에 역회전으로 돌면 2000에서 0으로 감소하게 되는데요.
하지만, 제가 analogWrite를 이용해서 모터의 속도를 HIGH가 아니라 analogWrite(speedA, 215)로 바꾸고싶고,
LOW 가 아니라 analogWrite(speedA,40)으로 바꾸고 싶은데요..
digitalWrite(speedA,val);
val = HIGH;
while(digitalRead(speed == HIGH))
대신에 무엇을 써야하는지 모르겠습니다.
analogWrite(speedA,val);
val = 215;
while( val == 215 ) 로 쓰고
인터럽트 함수에서
void Interrupt_A(){
if( val == 215 ){
count++;
로 바꿔도 안되던데 어떻게 해야하나요 ㅠㅠ? 알려주시면 감사하겠습니다..
디지털핀에서는 Write와 Read가 모두 가능해서 저렇게 썼는데,
아날로그에서는 Read핀이 따로 있어서 어떻게 해야할지 모르겠습니다.
코드를 보완해주시면 감사하겠습니다.
댓글 : 2
조회수 : 3,215
master님의 댓글
master 작성일
analogWrite(speedA,val);
val = 215;
순서가 바뀐 것 아닌가요?
val = 215;
analogWrite(speedA,val);
master님의 댓글
master 작성일
volatile int old_count=-1,count=0;
volatile int speedA =5; // 모터 드라이버의 speed_IN 핀
volatile int val;
인터럽트에서 사용하는 전역변수는 volatile 선언을 해줘야합니다.