아두이노 배열 저장 후 동작 질문입니다.


얼마 전에 질문을 해서 답변을 해주신 것을 토대로 어느정도 구현을 해보고 있는데 큐 표현쪽 부분이 이해가 정확하게 되지 않아 헤메고 있습니다...

#define FORWARD 1
#define BACKWARD 2
#define LEFT 3
#define RIGHT 4
#define MAX 10

const int buttonPin0 = 7; //시작 버튼
const int buttonPin1 = 8; //앞 버튼
const int buttonPin2 = 9; //뒤 버튼
const int buttonPin3 = 10; // 오른쪽버튼
const int buttonPin4 = 11; // 왼쪽버튼

const int in1pin = 2; //왼쪽모터
const int in2pin = 3; //왼쪽모터
const int in3pin = 4; //오른쪽모터
const int in4pin = 5; //오른쪽모터

int buttonStateOK = 1;
int buttonStateGO = 1;
int buttonStateBACK = 1;
int buttonStateLEFT = 1;
int buttonStateRIGHT = 1;
int queue_array[MAX];
int rear = 0;   //Position to write
int front = -1;//Position to read

int nextPosition(int position) {
  return (position + 1) % MAX;
}

void insert(int add_item)
{
  if (queue_array[rear] == BLANK)
  {
    if (front == -1)
    {
      front = 0;
    }
    queue_array[rear] = add_item;
    rear = nextPosition(rear);
    printf("insert %d\n", add_item);
  }
  else {
    printf("insert %d ignored\n", add_item);
  }
}
int read() {
  if (front >= 0) {
    if (queue_array[front] != BLANK) {
      int ret = queue_array[front];
      queue_array[front] = BLANK;
      front = nextPosition(front);
      return ret;
    }
  }
  return BLANK;
}
void reset() {
  rear = 0;
  front = -1;
  for (int i = 0; i<MAX; i++) {
    queue_array[i] = BLANK;
  }
}

void setup() {
  int queue_array[MAX];
  pinMode(buttonPin0, INPUT_PULLUP);
  pinMode(buttonPin1, INPUT_PULLUP);
  pinMode(buttonPin2, INPUT_PULLUP);
  pinMode(buttonPin3, INPUT_PULLUP);
  pinMode(buttonPin4, INPUT_PULLUP);
  pinMode(buttonPin5, INPUT_PULLUP);
  pinMode(in1pin, OUTPUT);
  pinMode(in2pin, OUTPUT);
  pinMode(in3pin, OUTPUT);
  pinMode(in4pin, OUTPUT);
}

void loop() {
  // 버튼(들) 상태 읽기
  buttonStateOK = digitalRead(buttonPin0);
  buttonStateGO = digitalRead(buttonPin1);
  buttonStateBACK = digitalRead(buttonPin2);
  buttonStateLEFT = digitalRead(buttonPin3);
  buttonStateRIGHT = digitalRead(buttonPin4);
  buttonStateSTART = digitalRead(buttonPin5);

  if (buttonStateGO == LOW) {
    insert(FORWARD);
  }
  else if (buttonStateBACK == LOW) {
    insert(BACKWARD);
  }
  else if (buttonStateLEFT == LOW) {
    insert(LEFT);
  }
  else if (buttonStateRIGHT == LOW) {
    insert(RIGHT);
  }
  else if (buttonStateOK == LOW) {
    while (read() != BLANK) {
      if (read() == FORWARD) {
        // 모터 동작 - 전진
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, LOW);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, LOW);
        delay(1500);
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, HIGH);
      } else if (read() == BACKWARD) {
        // 모터 동작 - 후진.
        digitalWrite(in1pin, LOW);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, LOW);
        digitalWrite(in4pin, HIGH);
        delay(2000);
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, HIGH);
      } else if (read() == LEFT) {
        // 모터 동작 - 왼쪽
        digitalWrite(in1pin, LOW);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, LOW);
        delay(995);
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, HIGH);
      } else if (read() == RIGHT) {
        // 모터 동작 - 오른쪽
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, LOW);
        digitalWrite(in3pin, LOW);
        digitalWrite(in4pin, HIGH);
        delay(995);
        digitalWrite(in1pin, HIGH);
        digitalWrite(in2pin, HIGH);
        digitalWrite(in3pin, HIGH);
        digitalWrite(in4pin, HIGH);
      }
    }
    reset();
  }
}

조언부탁드립니다.

  • 2016년 05월 26일에 작성됨

조회수 169


1 답변


좋아요
1
싫어요
채택취소하기

우선 큐에 대해서 이해가 필요하실것 같습니다.

입력 값을 가지고 있다가 하나씩 빼서 쓰기 위해 큐를 사용하는건데요. 다음 링크를 참고하세요.

http://www.logonluv.com/2015/02/datastructure-queue.html?m=1

지난번에 올려드린 코드는 배열로 간단한 순환큐를 만든겂니다.

  • 2016년 05월 26일에 작성됨
    루비와 파이썬을 좋아합니다. 새로운 언어를 배우는것도 좋아해요. 모바일 게임도 조금 만들어 봤습니다.

  • 네 감사합니다 !    Vicals   2016.5.26 09:39     
  • 덕분에 잘 해결 했습니다. 간단한 문제가 있었는데 생각을 못한 부분이 있었네요. 혹시 이 자료 참고하시는 분들은 setup안에 reset();을 추가해야되고 loop가 빨리 돌아 큐 안에 버튼상태가 하나로 저장되는 경우가 있으니 loop문에 delay();를 추가해주시면 해결 가능합니다!    Vicals   2016.5.31 16:52     

로그인이 필요한 기능입니다.

Hashcode는 개발자들을 위한 무료 QnA사이트 입니다. 작성한 답변에 다른 개발자들이 댓글을 작성하거나 좋아요/싫어요를 할 수 있기 때문에 계정을 필요로 합니다.
► 로그인
► 계정만들기
Close