Tutorial: Comunicação SPI (Serial Peripheral Interface) com Arduino

Adquira componentes na Loja do Lab de Garagem

A Serial Peripheral Interface é um protocolo de dados seriais síncronos utilizado em microcontroladores para comunicação entre o microcontrolador e um ou mais periféricos. Também pode ser utilizado entre dois microcontroladores.

A comunicação SPI sempre tem um master. Isto é, sempre um será o master e o restante será slave. Por exemplo, o arduino é o master e os outros periféricos são slave. Esta comunicação contém 4 conexões:

  • MISO (Master IN Slave OUT) - Dados do Slave para Master;
  • MOSI (Master OUT Slave IN) - Dados do Master para Slave;
  • SCK (Serial Clock) - Clock de sincronização para transmissão de dados entre o Master e Slave;
  • SS (Slave Select) - Seleciona qual Slave receberá os dados.

Na figura acima mostra um exemplo de como funciona a comunicação SPI. Alguns periféricos são apenas Slave, por exemplo, cartão SD, memória flash e alguns sensores.

Geralmente estes periféricos contém a mesma pinagem que acima ou a pinagem abaixo:

  • SDI - Slave Data IN - Pino de dados de entrada;
  • SDO - Slave Data OUT - Pino de dados de saída;
  • CS - Seleção de Chip;
  • SCK - Clock de sincronização.

O arduino contém uma biblioteca pronta chamada SPI library. O qual você pode mandar dados para periféricos SPI.

Vamos pegar o exemplo "DigitalPotControl" disponível na IDE do Arduino para mostrar seu funcionamento. Para este exemplo vamos utilizar o AD5206. Este Circuito integrado é um potenciômetro digital. Primeiramente faça a seguinte ligação:

Agora abra a IDE do Arduino e abra o exemplo em "File/Examples/SPI/DigitalPotControl". A programação está mostrada abaixo:

/*
Digital Pot Control

This example controls an Analog Devices AD5206 digital potentiometer.
The AD5206 has 6 potentiometer channels. Each channel's pins are labeled
A - connect this to voltage
W - this is the pot's wiper, which changes when you set it
B - connect this to ground.

The AD5206 is SPI-compatible,and to command it, you send two bytes,
one with the channel number (0 - 5) and one with the resistance value for the
channel (0 - 255).

The circuit:
* All A pins of AD5206 connected to +5V
* All B pins of AD5206 connected to ground
* An LED and a 220-ohm resisor in series connected from each W pin to ground
* CS - to digital pin 10 (SS pin)
* SDI - to digital pin 11 (MOSI pin)
* CLK - to digital pin 13 (SCK pin)

created 10 Aug 2010
by Tom Igoe

Thanks to Heather Dewey-Hagborg for the original tutorial, 2005

*/


// inslude the SPI library:
#include <SPI.h>


// set pin 10 as the slave select for the digital pot:
const int slaveSelectPin = 10;

void setup() {
// set the slaveSelectPin as an output:
pinMode (slaveSelectPin, OUTPUT);
// initialize SPI:
SPI.begin();
}

void loop() {
// go through the six channels of the digital pot:
for (int channel = 0; channel < 6; channel++) {
// change the resistance on this channel from min to max:
for (int level = 0; level < 255; level++) {
digitalPotWrite(channel, level);
delay(10);
}
// wait a second at the top:
delay(100);
// change the resistance on this channel from max to min:
for (int level = 0; level < 255; level++) {
digitalPotWrite(channel, 255 - level);
delay(10);
}
}

}

int digitalPotWrite(int address, int value) {
// take the SS pin low to select the chip:
digitalWrite(slaveSelectPin,LOW);
// send in the address and value via SPI:
SPI.transfer(address);
SPI.transfer(value);
// take the SS pin high to de-select the chip:
digitalWrite(slaveSelectPin,HIGH);
}

No primeiro "for" é escolhido o Led que acenderá e apagará. No segundo "for" aumenta a intensidade do Led. E no terceiro "for" diminui a intensidade do Led.

Conecte seu Arduino na porta USB do seu PC e selecione a versão do seu Arduino (UNO, Duemilanove, etc) em "Tools/Boards". Selecione a porta (COMx, ttyUSBx, ttyACMx, etc) em que seu Arduino está conectado em "Tools/Serial Port". Por fim, clique em UPLOAD.

Ao terminar de fazer o UPLOAD, cada Led acenderá e apagará devagar. 

E é isso! Esperamos que tenha gostado! Em caso de dúvidas, poste aqui neste blog! para sugestões de tutoriais, clique aqui! Para ver outros tutoriais e projetos desenvolvidos pela equipe LdG e por outros garagistas, clique aqui e aqui, respectivamente! Até a próxima!

Referências:

http://arduino.cc/en/Tutorial/SPIDigitalPot

http://arduino.cc/en/Reference/SPI

Exibições: 42588

Comentar

Você precisa ser um membro de Laboratorio de Garagem (arduino, eletrônica, robotica, hacking) para adicionar comentários!

Entrar em Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)

Comentário de José Gustavo Abreu Murta em 26 agosto 2019 às 12:19
Comentário de Dinis Brás em 21 junho 2016 às 19:33

Olá galera!

tenho um arduino uno, uma wifi shield e um datalogger arduino.
https://www.arduino.cc/en/Main/ArduinoWiFiShield
https://www.adafruit.com/product/1141

Quando ponho no arduino a wifi shield+datalogger shield, a wifi shield deixa de ser reconhecida.... ambas usam o protocolo SPI, a wifi shield tem com SS o pino 10 e a data logger o pino 5. Se mantiver a data logger acoplada no arduino mas remover o cartao já reconhece, mas assim nao posso guardar dados :/ Não consigo por ambas a funcionar em conjunto com o arduino...
 Alguma ideia do que poderá ser?

Obrigado!

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço