2016-06-21 5 views
0

저는 SD 카드에 저장된 데이터를 기반으로 서보 모터를 제어해야하는 프로젝트를 진행하고 있습니다. 지금까지는 잘 진행되고 있지만 서보 모터 움직임의 타이밍과 속도를 제어하는 ​​데 문제가 있습니다. 내가 성취하고자하는 것을 설명하고 예제 코드를 설명 할 것입니다.SD 카드 데이터가있는 Arduino 서보 모터 컨트롤

저는 SD 모듈이 부착 된 Arduino Mega를 사용하고 있습니다. SD 카드에는 네 가지 .txt 파일이 있습니다. 각 파일은 30 개의 정수 값을 포함하며, 각 행은 단일 정수를 포함하고 a (,)로 끝납니다. 이것은 단순히 테스트 데이터 일 뿐이므로 다양한 각도로 스윕하여 값을 잘 읽고 값을 변환하는지 확인할 수 있습니다. 그러나 타이머를 사용하여 서보를 늦추려고 할 때 코드가 지연되는 등 속도가 빨라집니다. 내 경우에는 코드는 다음과 같습니다

string dataRead ="";     // String object to read bytes from 
unsigned long int motorTime = 250; // Refresh time of the motor (250 ms)  
unsigned long int lastMotor = (long) micros(); 
while (entry.available()) {   // While there are bytes in the file to be read 
    dataRead = entry.readStringUntil(','); 
    while((long) micros() - lastMotor <= (motorTime * 1000)); // Do nothing until refresh time has elapsed 

    myServo.write(dataRead.toInt()); 
    lastMotor = (long) micros(); 
} 

데이터는 잘 읽어 모터는 그러나 타이밍 코드는 단지 어떤 이유로 부정 것으로 보인다, 데이터에 따라 이동합니다. 모든 종류의 하드웨어 기능이 Arduino IDE의 모든 추상화 레이어 아래에서 사용 가능하고 사용 불가능하게되어 있고 지연이 어떤 이유로 인해 무효화되기 때문인 것으로 판단됩니다.

누구나이 경험이 있습니까? 설정 속도로 서보를 운전하기위한 팁이 있습니까? 내 대안 솔루션은 데이터를 배열로로드하는 것입니다. 하지만 난 모든 RAM을 통해 레코딩의 위험을 실행하고 다른 문제를 일으키고 싶지 않아요.

미리 감사드립니다.

답변

0

결국 수정했습니다. 나는 데이터를 읽을 때 인터럽트를 사용할 수 없게 만들었고 micros()와 millis()와 같은 타이머 함수를 혼란스럽게 만들었다. 그들은 경과 시간을 추적하기 위해 인터럽트에 의존합니다. 기본적으로 인터럽트 서비스 루틴을 비활성화하는 대신 인터럽트 서비스 루틴을 분리하는 것이 좋습니다.