정보나눔

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

FreeRTOS라이브러리와 모터쉴드를 이용한 스텝모터 컨트롤에관해 질문드립니다
구본석 | 2016-11-12

아두이노를 이용해 xy플로터를 제작하고 있는 학생입니다.

dk electronics motor shield V1과 FreeRTOS를 이용하여 스텝모터를 컨트롤하려던 중 문제가 생겨서 질문드립니다. 

 

#include <FreeRTOS_AVR.h>
#include <AFMotor.h>

 AF_Stepper motor1(200, 1);
 AF_Stepper motor2(200, 2);

SemaphoreHandle_t sem;


static void Thread1(void* arg) {
  while (1) {

    xSemaphoreTake(sem, portMAX_DELAY);

      Serial.println("Micrsostep steps");
  motor2.step(100, FORWARD, MICROSTEP); 

  vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);

    
  }
}



static void Thread2(void* arg) {

  while (1) {

  motor1.setSpeed(20);  // rpm   
  motor2.setSpeed(10);  // rpm   

Serial.println("Micrsostep steps");
  motor1.step(200, FORWARD, MICROSTEP);
  motor1.step(200, BACKWARD, MICROSTEP);
Serial.println("Micrsostep steps");
  motor1.step(100, FORWARD, MICROSTEP);
  motor1.step(100, BACKWARD, MICROSTEP);

    
    xSemaphoreGive(sem);

    Serial.println("Micrsostep steps");
  motor1.step(200, FORWARD, MICROSTEP); 

  vTaskDelay((200L * configTICK_RATE_HZ) / 1000L);

  }
}

void setup() {
  portBASE_TYPE s1, s2;

  Serial.begin(9600);
  Serial.println("Stepper test!");
  
  sem = xSemaphoreCreateCounting(1, 0);

  s1 = xTaskCreate(Thread1, NULL, configMINIMAL_STACK_SIZE, NULL, 2, NULL);

  s2 = xTaskCreate(Thread2, NULL, configMINIMAL_STACK_SIZE, NULL, 1, NULL);

  if (sem== NULL || s1 != pdPASS || s2 != pdPASS ) {
    Serial.println(F("Creation problem"));
    while(1);
  }
  
  vTaskStartScheduler();
  Serial.println(F("Insufficient RAM"));
  while(1);
}

void loop() {
}
 

 

코드를 실행시켰을때 Serial 창에

 

Stepper test!
Micrsostep steps
Micrsostep steps

 

단 세줄만 뜨고 세마포어를 전달하는 단계가 진행되지 않습니다...

쉴드를 사용하면 FreeRTOS와 호환이 되지 않나요? 이문제를 어떻게 해결해야하나요..

 

이전글   |    오렌지 보드와 와이파이, 이더넷 쉴드 호환... 2016-11-12
다음글   |    초음파 센서와 마이크로 sd카드 모듈 질문이요... 2016-11-13