terça-feira, maio 03, 2022

Acessando um SD Card com o RP2040: Parte 3

Chega de falação, vamos à parte prática! Neste post vou mostrar como ligar um cartão SD a um Raspberry Pi Pico e como acessá-lo usando o SDK C/C++.



Do ponto de vista de hardware, como vimos na parte 1, basta ligar alimentação e SPI. Um detalhe importante é que o SD trabalha com 3,3V, isto é ótimo para o PiPico mas requer cuidados adicionais com microcontroladores que operam a 5V (como o Arduino Uno e Nano).

As lojas costumam ter dois tipos de módulos para ligação de cartão SD: o "Módulo SD Card" e o "Módulo Micro SD Card". Além da diferença do soquete para o cartão, o módulo micro SD possui um buffer/conversor de nível CD4050 que permite ligar sinais tanto de 3,3V como 5V. Ambos os módulos possuem um regulador para reduzir a alimentação de 5V para 3,3V. Outro detalhe no módulo SD Card é que ele tem uma barra dupla de pinos, mas os pinos são interligados na horizontal (ou seja, não tem nenhum sinal adicional e atrapalha espetar na protoboard). A não ser que você pretenda usar uns cartões antigos com o tamanho original, eu recomendo o módulo micro SD.  Você pode também apelar é soldar direto fios no cartão ou num adaptador.

É claro que eu só tenho o módulo SD Card... mas tenho alguns cartões antigos de 2G para brincar.

O Pi Pico tem duas portas SPI e existem várias opções de pinos para elas. O sinal CS pode ser qualquer GPIO. A figura abaixo é a montagem que usei para teste.


Podem ser necessários resistores de pull-up para os sinais MISO e CS. O software ira ativar os pull-ups internos do RP2040, mas eles podem não ser suficientes. Nos esquemas que eu encontrei, o módulo SD Card possui pull-up no MISO.

No lado do software, o SDK do Pi Pico não tem nenhuma biblioteca para acesso a SD Card. No Pico Extras tem um exemplo, mas é bem fraco e marcado como experimental. Na IDE do Arduino tem uma biblioteca genérica para acesso a SD. Mas o que vou usar aqui é uma biblioteca específica para o Pi Pico, que você pode baixar de https://github.com/carlk3/no-OS-FatFS-SD-SPI-RPi-Pico.  Esta biblioteca é bastante completa e aproveita o recurso de DMA do Pi Pico.

As instruções abaixo são para instalar e usar a biblioteca no Windows, supondo que foi feita a instalação do SDK conforme descrita no manual "Getting Started with Raspberry Pi Pico".  

1) Baixe a biblioteca num diretório de trabalho. Supondo que você use o "Git Bash" do "Git for Windows"
  cd {dir-de-trabalho}
  git clone --recurse-submodules https://github.com/carlk3/no-OS-FatFS-SD-SPI-RPi-Pico.git

Edite o arquivo no-OS-FatFS-SD-SPI-RPi-Pico\example\hw_config.c, substituindo a iniciação de sd_cards para refletir a montagem feita
// Hardware Configuration of the SD Card "objects"
static sd_card_t sd_cards[] = {  // One for each SD card
    {
        .pcName = "0:",           // Name used to mount device
        .spi = &spis[0],          // Pointer to the SPI driving this card
        .ss_gpio = 17,            // The SPI slave select GPIO for this SD card

        .use_card_detect = false,
        .m_Status = STA_NOINIT,
    }
};
2) Gere o programa exemplo. Abra um prompt de desenvolvimento através de Windows / Visual Studio 2019 / Developer Command Prompt e digite os comandos abaixo
  cd {dir-de-trabalho}
  cd no-OS-FatFS-SD-SPI-RPi-Pico\example
  mkdir build
  cd build
  cmake -G "NMake Makefiles" ..
  make
Não testei no Linux, mas o processo é semelhante:
  cd {dir-de-trabalho}
  git clone --recurse-submodules https://github.com/carlk3/no-OS-FatFS-SD-SPI-RPi-Pico.git
  # edite o arquivo no-OS-FatFS-SD-SPI-RPi-Pico/example/hw_config.c
  cd no-OS-FatFS-SD-SPI-RPi-Pico\example
  mkdir build
  cd build
  cmake ..
  make
Não se assuste com alguns warnings durante a compilação, eles não impediram o funcionamento do exemplo.

Coloque um cartão SD (que não tenha nada importante) no soquete, pressione o botão BOOT e conecte a Pi Pico ao micro. Solte o botão BOOT, uma unidade RPI-RP2 vai aparecer, copie nela o arquivo FatFS_SPI_example.uf2. Ao final da cópia o drive vai desaparecer e em seu lugar teremos uma porta serial (no Windows use o Gerenciador de Dispositivos para descobrir qual COM foi associada).

Conecte a esta porta serial a 115200bps (no Windows você pode usar o programa PuTTY). Digitando Enter vai aparecer um prompt ('<'). Digite "help" seguido de enter para ver os comandos disponíveis.

Use o comando "mount 0:" para o cartão ser reconhecido. Se forem apresentados erros, confira as ligações e experimente com outro cartão (para mim não funcionou com um velhusco cartão MMC de 256M). Se deu certo, experimente usar os comandos "cd" e "ls" para ver o conteúdo do cartão. O comando "getfree" vai mostrar a capacidade total e quanto está em uso.

Para uma brincadeira melhor, começa acertando a data e hora através do comando "setrtc <DD> <MM> <YY> <hh> <mm> <ss>" (por exemplo, "setrc 02 05 22 17 31 20" para 02/05/22 17:31:20) . O comando "date" permite conferir a data e hora atuais. Em seguida use o comando "start_logger" para iniciar o registro da data e hora e a temperatura medida pelo sensor interno do RP2040. Após alguns minutos, use "stop_logger" para parar o registro. O resultado estará num arquivo csv dentro de um subdiretório do diretório /data. O comando "cat <arquivo>" lista o conteúdo de um arquivo.

A biblioteca tem uma quantidade boa de funções úteis para uso de cartão SD nas suas aplicações.O exemplo mostra como usar algumas delas. A documentação das funções pode ser vista em http://elm-chan.org/fsw/ff/00index_e.html. Atenção que o arquivo ff.conf.h (em no-OS-FatFS-SD-SPI-RPi-Pico\FatFs_SPI\ff14a\source) permite desabilitar algumas das funções para reduzir o tamanho do código.

Eu pretendo usar futuramente este módulo e talvez até me atreva a tentar tirar os warnings na compilação.

Nenhum comentário: