Estudamos a interface SPI e conectamos um shift register ao Arduino, que acessaremos usando este protocolo para controlar os LEDs.
Necessário
- - Arduino;
- - registrador de deslocamento 74HC595;
- - 8 LEDs;
- - 8 resistores de 220 Ohm.
Instruções
Passo 1
SPI - Serial Peripheral Interface ou "Serial Peripheral Interface" é um protocolo de transferência de dados síncrono para interface de um dispositivo mestre com dispositivos periféricos (escravo). O mestre geralmente é um microcontrolador. A comunicação entre os dispositivos é realizada por meio de quatro fios, razão pela qual o SPI às vezes é chamado de "interface de quatro fios". Esses pneus são:
MOSI (Master Out Slave In) - linha de transmissão de dados do mestre para os dispositivos escravos;
MISO (Master In Slave Out) - linha de transmissão do escravo para o mestre;
SCLK (Serial Clock) - pulsos do relógio de sincronização gerados pelo mestre;
SS (Slave Select) - linha de seleção do dispositivo escravo; quando na linha "0", o escravo "entende" que está sendo acessado.
Existem quatro modos de transferência de dados (SPI_MODE0, SPI_MODE1, SPI_MODE2, SPI_MODE3), devido à combinação da polaridade do pulso do relógio (trabalhamos no nível ALTO ou BAIXO), Polaridade do relógio, CPOL e a fase dos pulsos do relógio (sincronização na borda ascendente ou descendente do pulso de clock), Clock Phase, CPHA.
A figura mostra duas opções para conectar dispositivos usando o protocolo SPI: independente e em cascata. Quando conectado de forma independente ao barramento SPI, o mestre se comunica com cada escravo individualmente. Com uma cascata - os dispositivos escravos são acionados alternadamente, em cascata.
Passo 2
No Arduino, os barramentos SPI estão em portas específicas. Cada placa tem sua própria atribuição de pino. Por conveniência, os pinos são duplicados e colocados em um conector ICSP (In Circuit Serial Programming) separado. Observe que não há pino de seleção escravo no conector ICSP - SS, uma vez que presume-se que o Arduino será usado como mestre na rede. Mas, se necessário, você pode atribuir qualquer pino digital do Arduino como um SS.
A figura mostra a atribuição padrão dos pinos aos barramentos SPI para o Arduino UNO e o Nano.
etapa 3
Uma biblioteca especial foi escrita para o Arduino que implementa o protocolo SPI. Ele está conectado assim: no início do programa, adicione #include SPI.h
Para começar a trabalhar com o protocolo SPI, você precisa definir as configurações e inicializar o protocolo usando o procedimento SPI.beginTransaction (). Você pode fazer isso com uma instrução: SPI.beginTransaction (SPISettings (14000000, MSBFIRST, SPI_MODE0)).
Isso significa que inicializamos o protocolo SPI na frequência de 14 MHz, a transferência de dados vai, a partir do MSB (bit mais significativo), no modo "0".
Após a inicialização, selecionamos o dispositivo escravo colocando o pino SS correspondente no estado LOW.
Em seguida, transferimos os dados para o dispositivo escravo com o comando SPI.transfer ().
Após a transmissão, retornamos SS ao estado ALTO.
O trabalho com o protocolo termina com o comando SPI.endTransaction (). É desejável minimizar o tempo de execução da transferência entre as instruções SPI.beginTransaction () e SPI.endTransaction () para que não haja sobreposição se outro dispositivo tentar inicializar a transferência de dados usando configurações diferentes.
Passo 4
Vamos considerar a aplicação prática da interface SPI. Acenderemos os LEDs controlando o registrador de deslocamento de 8 bits por meio do barramento SPI. Vamos conectar o registrador de deslocamento 74HC595 ao Arduino. Conectamos a cada uma das 8 saídas por meio de um LED (por meio de um resistor de limitação). O diagrama é mostrado na figura.
Etapa 5
Vamos escrever esse esboço.
Primeiro, vamos conectar a biblioteca SPI e inicializar a interface SPI. Vamos definir o pino 8 como o pino de seleção do escravo. Vamos limpar o registrador de deslocamento enviando o valor "0" para ele. Inicializamos a porta serial.
Para acender um LED específico usando um registrador de deslocamento, você precisa aplicar um número de 8 bits à sua entrada. Por exemplo, para que o primeiro LED acenda, alimentamos o número binário 00000001, para o segundo - 00000010, para o terceiro - 00000100, etc. Esses números binários em notação decimal formam a seguinte sequência: 1, 2, 4, 8, 16, 32, 64, 128 e são potências de dois de 0 a 7.
Consequentemente, no loop () pelo número de LEDs, recalculamos de 0 a 7. A função pow (base, grau) aumenta 2 à potência do contador de ciclos. Os microcontroladores não funcionam com muita precisão com números do tipo "duplo", portanto, para converter o resultado em um número inteiro, usamos a função round (). E transferimos o número resultante para o registrador de deslocamento. Para maior clareza, o monitor da porta serial exibe os valores obtidos durante esta operação: um percorre os dígitos - os LEDs acendem em uma onda.
Etapa 6
Os LEDs acendem por sua vez, e observamos uma "onda" de luzes em movimento. Os LEDs são controlados por meio de um registrador de deslocamento, ao qual nos conectamos por meio da interface SPI. Como resultado, apenas 3 pinos do Arduino são usados para acionar 8 LEDs.
Estudamos o exemplo mais simples de como um Arduino funciona com um barramento SPI. Consideraremos a conexão de registradores de deslocamento com mais detalhes em um artigo separado.