Como aumentar a velocidade de gravação do cartão SD no arduino

12

Estou criando um sistema de registro de dados que registra dados no cartão SD a uma alta velocidade de cerca de 20.000 a 3.000 bytes por segundo. Mas a biblioteca SD no arduino atualmente grava dados em cerca de 4500-5000 bytes por segundo, o que é muito lento.

Eu li esse truque para melhorar a velocidade de gravação , mas estou pensando se é possível uma abordagem mais direta, talvez ajustando as configurações SPIS .

Ashish Ranjan
fonte
1
Você pode experimentar a biblioteca SdFat - é muito mais eficiente que a biblioteca SD padrão.
Majenko
Você também pode verificar se o seu cartão SD é de boa qualidade, embora 5000 bytes pareçam muito baixos para qualquer tipo de cartão SD.
22416 Len

Respostas:

11

ESTÁ BEM. Então, eu tentei a biblioteca SDFat. Esta biblioteca é definitivamente melhor que a biblioteca SD padrão que acompanha o adruino. Mas não foi assim que resolvi meu problema de baixa taxa de dados.

Eu segui as instruções do autor da biblioteca SDFat deste post .

De acordo com fat16lib , para aumentar a taxa de dados, precisamos usar flush () com sabedoria. Gostaríamos de escrever () os dados em cada ciclo, mas precisamos apenas liberar () uma vez a cada 100 ciclos, dependendo da quantidade de dados que está sendo gravada em cada ciclo. Além disso, mantenha o sinalizador em SD.open () como 'O_WRITE | O_CREAT 'em vez de' FILE_WRITE '.

Isso com certeza aumentou a velocidade por um grande fator. Mas eu precisava de mais!

Armazenar os dados em binário ( confira este blog ) melhorou ainda mais o desempenho.

Minha velocidade atual é de aproximadamente 100-120 KBps (quilo bytes) com um cartão SD de classe 4!

Finalmente, quero agradecer a vocês por sua ajuda.

Ashish Ranjan
fonte
4

Muitos fatores decidem se você pode atingir essa velocidade desejada. Apenas alguns deles.


1. Seu software

A biblioteca SdFat é mais rápida que a biblioteca SD padrão do Arduino IDE. Também possui uma função de compatibilidade fácil de usar com a biblioteca SD padrão. Experimente.

2. Seu hardware

Você deve usar um cartão SD de alta classe. Como você talvez saiba, os cartões SD são classificados em classes de desempenho. A maioria das pessoas na internet recomenda um cartão SD da SanDisk.

William Roy
fonte
Vou tentar isso em alguns dias e informar os resultados. Obrigado.
Ashish Ranjan
4

Evite que o aperto de mão consiga um buffer!

Use SD.write (buf, tamanho);

Oi pessoal, Estou trabalhando em um projeto com o mesmo problema. Eu estava seguindo os mesmos passos e obtive exatamente os mesmos números. Eu acabei de consertar. O problema é o aperto de mão quando você liga para o SD.write().

Em vez de:

//for each loop, it is going to make a handshake
while(<yourCondition>){
    SD.write(<yourValue>);
}

Faz:

char buf[length];
while(yourCondition){
    buf[index] = yourValue;
}
SD.write(buf,index);//only one handshake

No meu projeto, o primeiro obteve 4100 bytes e o segundo, usando um buffer com 128 (buf [128]), obteve 145408 bytes no meu projeto. Bom o bastante.

Pinipa
fonte
1
Não sei o que você quer dizer com aperto de mão, porque o AFAIK SD usa um buffer (512 kB) internamente de qualquer maneira. Mas também observei que escrever bytes individuais com File.write é extremamente lento e o compilador não parece capaz de otimizá-lo (afinal, ele está apenas copiando um byte para o buffer interno e verificando se o buffer está cheio e a transmissão SPI deve começar). O uso de meu próprio buffer externo e o File.write (buffer, tamanho) trouxeram extrema melhoria de desempenho também no meu aplicativo.
Oliver