아두이노를 이용해 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 |