Neste tutorial, você aprende como controlar o potenciômetro digital AD5206 via SPI. Para uma explicação sobre a SPI, consulte o tutorial da EEPROM SPI. Os potenciômetros digitais são úteis para quando é necessário variar a resistência elétrica em um circuito de forma eletrônica e não manual. Exemplos de aplicações que se utilizam disso são o controle do brilho de LEDs, o condicionamento de sinal de áudio e a geração de tons. Neste exemplo, usamos um potenciômetro digital de seis canais para controlar o brilho de seis LEDs. Os passos dados para implementar a comunicação SPI podem ser modificados para o uso com outros dispositivos SPI.
* Potenciômetro digital AD5206 * Placa Arduino * 6 LEDs * Fios
Núm. Pino | Nome | Descrição |
---|---|---|
1 | A6 | Terminal A do pot. 6 |
2 | W6 | Cursor do pot. 6, endereço b101 |
3 | B6 | Terminal B do pot. 6 |
4 | GND | Terra |
5 | /CS | Chip Select, ativo em LOW. Quando o /CS retorna HIGH, os dados no registrador de entrada serial é decodificado com base nos bits de endereçamento e carregado no latch do pot. correspondente |
6 | VDD | Alimentação, pode ser em 5 V ou 3 V (obs.: |VDD| + |VSS| < 5,5 V) |
7 | SDI | Entrada de dados seriais. Bit mais significativo primeiro |
8 | CLK | Clock, dados amostrados na subida |
9 | VSS | Alimentação negativa, pode ser em 0 V ou -2,7 V (obs.: |VDD| + |VSS| < 5,5 V) |
10 | B5 | Terminal B do pot. 5 |
11 | W5 | Cursor do pot. 5, endereço b100 |
12 | A5 | Terminal A do pot. 5 |
13 | B3 | Terminal B do pot. 3 |
14 | W3 | Cursor do pot. 3, endereço b010 |
15 | A3 | Terminal A do pot. 3 |
16 | B1 | Terminal B do pot. 1 |
17 | W1 | Cursor do pot. 1, endereço b000 |
18 | A1 | Terminal A do pot. 1 |
19 | A2 | Terminal A do pot. 2 |
20 | W2 | Cursor do pot. 2, endereço b001 |
21 | B2 | Terminal B do pot. 2 |
22 | A4 | Terminal A do pot. 4 |
23 | W4 | Cursor do pot. 4, endereço b011 |
24 | B4 | Terminal B do pot. 4 |
O AD5206 é um potenciômetro digital de 6 canais. Isso significa que possui seis resistores variáveis (potenciômetros) com controle eletrônico individual. Há três pinos no chip para cada um dos seis resistores variáveis e podem ser interfaceados da mesma maneira que você faria com um potenciômetro mecânico. Os pinos de cada um desses resistores variáveis têm o nome Ax, Bx e Wx, p. ex. A1, B1 e W1.
Neste tutorial usamos cada resistor variável como um divisor de tensão, isto é, põe-se um dos pinos (pino B) em HIGH, o outro pino (pino A) em LOW e toma-se uma tensão de saída variável no pino cursor (W).
O AD5206 é controlado digitalmente por meio da SPI. O dispositivo é habilitado quando se aplica LOW no pino Chip Select (CS). Instruções são enviadas a ele na forma de opcodes com 11 bits, sendo que os três bits mais significativos (11-9) definem o endereço do potenciômetro a ajustar-se, enquanto que os oito bits menos significativos (8-1) definem qual o valor a ajustar o potenciômetro (de 0 a 255). Os dados são enfileirados com o bit mais significativo primeiro e são amostrados na borda de subida do clock. Quando em LOW, o clock está parado.
Insira o chip AD5206 na protoboard. Conecte a alimentação de 5 V e o terra na protoboard e à placa Arduino. Conecte os pinos 3, 6, 10, 13, 16, 21 e 24 do AD5206 aos 5 V e os pinos 1, 4, 9, 12, 15, 18, 19 e 22 ao terra. Fazemos isso para criar seis divisores de tensão.
Conecte o pino 5 do AD5206 ao pino 10 do Arduino (Slave Select - SS), o pino 7 do AD5206 ao 11 do Arduino (Master Out Slave In - MOSI) e o pino 8 do AD5206 ao 13 do Arduino (Serial Clock - SCK).
Finalmente, conecte um LED entre cada pino de cursor (pinos 2, 11, 14, 17, 20 e 23 do AD5206) e o terra, de maneira que o terminal mais longo do LED conecte-se ao pino de cursor e o terminal mais curto do LED ao terra.
Agora escrevemos o código que habilita o controle do AD5206 por SPI. Este programa acende cada LED e então diminui gradualmente seu brilho. Fazemos isso no loop(), mudando as resistências individuais de cada potenciômetro de totalmente desligado para totalmente ligado, ao longo de toda a sua escala de 255 passos. Acompanhe os comentários ao longo do programa.
Definimos os pinos a usar-se para a conexão SPI: DATAOUT, DATAIN, SPICLOCK e SLAVESELECT. Embora não leiamos nenhum dado vindo do AD5206 neste programa, o pino 12 vai ligado ao SPI embutido no Arduino, de forma que é melhor não usá-lo para outras funções, para evitar qualquer erro:
#define DATAOUT 11 // MOSI #define DATAIN 12 // MISO - não usado, mas faz parte do SPI embutido #define SPICLOCK 13 // SCK #define SLAVESELECT 10 // SS
Em seguida, alocamos espaço para as variáveis a guardar os valores de resistência e os valores de endereçamento para os potenciômetros:
byte pot = 0; byte resistance = 0;
Primeiro ajustamos os modos dos pinos de entrada e saída e configuramos a linha SLAVESELECT para HIGH, para des-selecionar o dispositivo e evitar transmissões falsas de mensagens devidas aos ruído na linha:
void setup() { byte clr; pinMode(DATAOUT, OUTPUT); pinMode(DATAIN, INPUT); pinMode(SPICLOCK,OUTPUT); pinMode(SLAVESELECT,OUTPUT); digitalWrite(SLAVESELECT,HIGH); // desabilita dispositivo
Agora dispomos o valor binário 01010000 dentro do registrador SPI Control (SPCR). No registrador de controle, cada bit faz o ajuste de uma funcionalidade diferente. O 8o. bit desabilita interrupções SPI, o 7o. bit habilita a SPI, o 6o. bit diz que bits mais significativos serão enviados primeiro, o 5o. bit põe o Arduino em modo mestre, o 4o. bit comanda que o clock é pausado em nível LOW, o 3o. bit ajusta a SPI para fazer amostragens de dados à subida do clock e os 2o. e 1o. bits ajustam a velocidade da SPI para (mesma do sistema / 4) (que é a mais rápida). Depois de ajustar o registrador de controle, inserimos o valor nos registradores SPI Status (SPSR) e SPI Data (SPDR) dentro da variável clr, para limpar qualquer informação espúria:
SPCR = (1<<SPE)|(1<<MSTR); clr=SPSR; clr=SPDR; delay(10);
Concluímos o setup() com o ajuste de todos os potenciômetros para resistência máxima e, assim, desligando os LEDs:
for (i=0;i<6;i++) { write_pot(i,255); } }
No loop(), iteramos cada valor de resistência (0-255) para cada endereço de potenciômetro (0-5). Pausa-se por 10 milissegundos a cada iteração para que a gradação de brilho seja visível. Isto faz com que os LEDs, sequencialmente, brilhem forte e então desvaneçam-se lentamente:
void loop() { write_pot(pot, resistance); delay(10); resistance++; if (resistance==255) { pot++; } if (pot==6) { pot=0; } }
A função spi_transfer() carrega os dados de saída dentro do registrador de transmissão de dados, o que causa o início da transmissão SPI. Ela vigia, com uma máscara de bits, um bit do registrador SPI Status (SPSR) para detectar se a transmissão foi completada. Uma explicação sobre máscaras de bits pode ser vista aqui?. Em seguida, retorna qualquer dado que tiver chegado a partir do AD5206:
char spi_transfer(volatile char data) { SPDR = data; // Começa transmissão while (!(SPSR & (1<<SPIF))) // Espera finalizar { }; return SPDR; // Retorna o byte chegador }
A função write_pot() permite-nos controlar os potenciômetros individuais. Ajustamos a linha SLAVESELECT para LOW, para habilitar o dispositivo. Depois, transferimos o byte de endereçamento, seguido por um byte com o valor de resistência. No fim, ajustamos a linha SLAVSELECT de novo a HIGH, para liberar o chip e sinalizar o fim da transmissão:
byte write_pot(int address, int value) { digitalWrite(SLAVESELECT,LOW); // opcode de 2 bytes spi_transfer(address); spi_transfer(value); digitalWrite(SLAVESELECT, HIGH); // libera chip, sinaliza fim da transmissão }