2013-07-20 4 views
2

저는 ArduinoIO-Matlab 인터페이스를 사용하여 Matlab에서 Arduino를 제어하고 있습니다. 현재의 셋업은 3 개의 EMG 근육 센서 (Advancer Technologies)가 아날로그 핀 1,2에서 Arduino에 연결되어 있고 3입니다. Arduino는 Matlab과 연결되어 있습니다. 나는이 세 핀에서 동시에 데이터를 수집하고 매트릭스 크기 1000x3로 저장하려고합니다. 내 문제는 Matlab이 아날로그 핀에서 샘플링하는 속도입니다. 3 개의 핀에서 동시에 1000 개의 판독 값을 수집하는 데 약 25 초가 소요됩니다. 나는 Arduino 자체가 더 높은 속도로 샘플을 알아. 아래는 제 코드입니다. 10 초 동안 1000 샘플 정도의 샘플링 속도를 얻으려면 어떻게 변경합니까? 내가 명확히해야 할 뭔가가있는 경우Matlab-Arduino analogRead() 샘플링 속도 늘리기/바꾸기

time  calls line 
< 0.01  1 3 ax = zeros(1000,3); 
        4 
< 0.01  1 5 for ai = 1:1000 
25.07 1000 6  ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)]; 
      1000 7 end 
        8 
    1.24  1 9 delete(ar); 

은 알려 주시기 바랍니다 :

ar = arduino('COM3'); 

ax = zeros(1000,3); 

for ai = 1:1000 
    ax(ai,:) = [ar.analogRead(1) ar.analogRead(2) ar.analogRead(3)]; 
end 

delete(ar); 

은 위의 코드 (프로파일 뷰어)에 의해 촬영 시간입니다. 감사 : D enter code here

답변

1

arduino C++ 코드 (.pde 파일)를 수정해야합니다. 이 코드에서는 원하는대로 신호를 샘플링 한 다음 (예 : 1000) serial.writeln() 메서드를 사용하여 샘플링 된 데이터를 matlab으로 전송해야합니다.

이 (요인을 많이에 따라) 당신에게 ~이 3kHz의 샘플링 속도를 줄 것이다는 ...

+0

안녕하세요 무하마드. 좀 더 명확하게 설명해 주시겠습니까? "adiosrv.pde"arduino 코드의 정확성과 정확성은 어디에 설정해야합니까? 나는 adiosrv.pde를보고 있었지만 이해할 수 없거나 수정해야 할 곳을 찾을 수 없었습니다. –

+0

간단한 IO 체계 (adiosrv.pde)로 작업했습니다. 아날로그 판독 값은 코드에서 "case 30"을 사용하여 수행됩니다 (@ 217 시작). arduino에서 입력을 요청하고 하나의 입력을 읽고 직렬 쓰기를 사용하여 Matlab으로 보내는 대신 다음을 수행했습니다. for (int i = 0; i <1000; ++ i) Serial.println (analogRead (pin)); 또한 matlab 코드에서 analogRead 메소드를 수정해야합니다. i = 1 : 1000의 경우 signal (i) = fscanf (a.ser, "% d"); end 샘플링을 수행하는 더 좋은 방법은 전체 신호를 샘플링 한 다음 시리얼을 통해 Matlab으로 다시 전송하는 것입니다. 실제로는 저에게 맞지 않습니다. (만족스러운 것은 ...) – Muhammad

+0

Ok. Btw는 늦은 답변을 드려 죄송합니다. 내 시험이 끝났으므로이 시험을 볼 수 없었습니다. 이제 adiosrv.pde의 사례 30에 이 있습니다. (val> 96 && val <113) { pin = val-97; agv = 아날로그 읽기 (핀); \t Serial.println (agv); } s = -1; 휴식; 이 부분 중 어떤 부분을 추가해야합니까? 또한 고정 된 크기의 데이터를 필요로 할 때만 사용됩니다. 실시간 연속 데이터 수집을 위해 무엇을해야합니까? –

0

다음은 매우 아마 당신이보고있는 결과를 설명하고 당신은 무엇 무하마드의 대답처럼 뭔가를해야하는 이유 제안. 이 이유는 그의 대답에 암시되었지만 다른 사람들이 '함정'을 피할 수 있도록 철자가 붙여지지 않았습니다.

이 답변을 확실하게 확인하는 데 필요한 기본 코드와 시스템에 액세스 할 수 없습니다. 이 답변은 "전형적인 방법"에 기반을두고 단순한 poppycock [tm] 일 가능성은 적지 만 관찰과 표준 방법 사이의 정확한 일치는 이것이 무엇이 일어나고 있는지를 암시합니다. 필요한 시스템을 가진 누군가가 매우 적게 파고들 경우 이것이 올바른지를 보여줍니다.

데이터가 한 번에 하나의 데이터 샘플로 전송되는 경우 샘플 당 오버 헤드가 원시 데이터를 전송하는 데 걸리는 시간을 훨씬 초과합니다.

3000 샘플을 전송하는 데 25 초가 걸립니다.
샘플 당 시간 = 25/3000 = 샘플 당 8.333 ms.

9600 보오 데이터 전송 속도를 가정하십시오.
기본 통신 속도는 9600 보 (baud)입니다. 이것은 검사 할 수 있지만 결과가 정확하고 약간 다른 가정을하면 똑같이 좋은 설명이 될 수 있음을 알 수 있습니다.

일반적으로 직렬 COM은 N81 형식 = 1 시작 비트, 8 데이터 비트, 8 비트 바이트 당 1 정지 비트를 사용합니다.
그래서 1 비트 9,600분의 1 S
10 비트 9,600분의 10 = 1.042 밀리
샘플 시간/바이트
시간 = 8.333/1.042 = 7.997 단어 시간을 소요.
실제로 반올림 또는 절단없이 계산을 수행하면
25/3000 x 9600/10 = 8.000 ....과 같이됩니다. 예 : 전송 당 샘플 당 정확히 8 x 9600 보오 워드 시간이 걸립니다.
똑같이 정확히 4 x 4800 보오 또는 2 x 2400 보오 전송 시간입니다.

사용 된 형식은 조사하지 않았지만 PC 모니터 프로그램에서 작동하려면 기본 직렬 루틴이
2 x 데이터 바이트 + CR + LF = 4 바이트를 사용할 수 있다고 상상해보십시오.
16 비트 변수가 2 x 8 비트 이진 단어로 전송된다고 가정합니다.
가능성 높음 =
- 16 비트는 4 x ASCII 문자로 전송되거나
- 24 비트는 6 x ASCII 문자로 전송됩니다.

적절히 깊이 파고 들지 않으면 9600 보오에서 6 개의 ASCII 단어와 CR + LF를 사용하면 전형적인 매개 변수를 사용하여 좋은 적합성을 얻을 수 있으며 Occam은 이것이 가장 좋은 출발점이라고 생각합니다. 총 요구 사항이 8 또는 4 또는 2 바이트인지 여부에 관계없이 관측 된 데이터 속도와 표준 전송 속도 사이의 다소 우연한 일치는 이것이 사용자가 보는 기본 이유를 제공함을 의미합니다.

코드를 보면 보드 율, 데이터 길이 및 패킹이 빠르게 사용됩니다.