Entendendo os 6 pinos de ICSP dos Arduinos
Conhecendo na prática o ICSP header, que tem funções importantes que podem facilitar o desenvolvimento de soluções usando o Arduino ou os ATmegas e ATtinys.
Você já notou que praticamente todos os Arduinos têm um (ou mais) conjuntos de 6 pinos alinhados em 3 fileiras, 2 a 2?
As setas na imagem acima indicam os 2 conjuntos presentes no Arduino Uno e o conjunto único presente no Arduino Nano, para exemplificar.
Esse conjunto de 6 pinos segue um padrão fixo, normalmente chamado de ISP header de 6 pinos, e costumeiramente indicado com a sigla ICSP nas placas Arduino. ISP e ICSP são duas siglas que se referem a um mesmo conceito geral: a capacidade de transferir programas para um componente enquanto ele está instalado em um sistema (a sigla ICSP se refere especificamente a fazê-lo por meio de protocolos seriais).
No caso dos Arduinos, o ICSP se refere à capacidade de programar diretamente os microcontroladores da placa usando o protocolo serial SPI, e é por isso que – além dos pinos de tensão e controle (VCC, GND e RESET) – estão presentes nele os 3 pinos necessários para uma conexão ponto-a-ponto usando SPI: MOSI, MISO e SCK, que são, respectivamente, os pinos pelos quais o mestre envia dados ao periférico, o mestre recebe dados do periférico e o mestre controla o pulso/clock da conexão.
A configuração dos pinos adota o padrão unificado a seguir, sendo que o pino 1 geralmente é indicado por um ponto estampado na placa:
Para que serve o ICSP
O controle remoto e transferência via serial (SPI) é a forma mais comum de instalar um bootloader no ATmega328 de um Arduino Uno, por exemplo, e também é o mesmo padrão que usamos no recente artigo sobre como identificar a configuração e os fuses dos ATmegas. Ele pode ser usado para transferir programas/firmwares e também para executar tarefas administrativas.
É possível que você já tenha feito instalação de bootloader diversas vezes, e rodado vários programas que fazem uso de SPI, sem jamais ter encostado no ICSP header.
Isso é perfeitamente possível na maioria dos casos, porque de modo geral (mas não sempre!) todos os pinos do ICSP são espelhados em outros pinos de uso geral dos vários modelos de Arduino. Por exemplo, no Arduino Uno os pinos MOSI, MISO e SCK do ICSP são meros espelhos conectados em paralelo com os pinos 11, 12 e 13, respectivamente.
Mas esse espelhamento não é a regra geral: no Arduino Leonardo, por exemplo, os pinos MOSI, MISO e SCK estão disponíveis apenas no ICSP header. E até no Arduino Uno nosso de cada dia existe um segundo ICSP, pouco acima do pino 13, cujos pinos SPI não estão espelhados em lugar nenhum. Aquele ICSP é específico para programar o chip conversor serial-USB do Uno.
Experimento 1 - gravar o programa Blink em um ATtiny85 via ICSP do Uno
Já vimos em um artigo anterior como usar um Arduino Uno para transferir programas para o ATtiny85.
Hoje vamos repetir o exato mesmo procedimento, mas usando os pinos do ICSP do Uno, e não os seus pinos numerados tradicionais (exceto o pino 10, que faz parte do procedimento e não tem equivalente no ICSP).
Os detalhes do procedimento você encontra no artigo anterior, e a descrição em linhas gerais é esta: rodamos no Uno o sketch ArduinoISP, selecionamos o ATtiny85 em Tools/Board, e selecionamos a opção Arduino as ISP em Tools/Programmer. Aí fazemos as conexões físicas entre o Uno e o ATtiny85 exigidas pelo ArduinoISP, e a partir daí podemos programar o ATtiny85 a partir da IDE do Arduino.
A conexão física, usando os pinos do ICSP no Uno, fica assim:
Pino no Arduino Uno
Pino físico no ATtiny85 | |
10 | 1 (RST) |
1 do ICSP (MISO) | 6 |
2 do ICSP (VCC) | 8 (VCC) |
3 do ICSP (SCK) | 7 |
4 do ICSP (MOSI) | 5 |
5 do ICSP (RESET) | —— |
6 do ICSP (GND) | 4 (GND) |
Na prática, a tabela acima corresponde à foto abaixo, exceto quanto ao led e resistor, que estão aqui para poder fazer o teste do Blink:
Feita a conexão acima, e após configurar a IDE e o Uno na forma que descrevi, foi só abrir no editor o exemplo Blink, substituir as referências ao pino 13 (que não existe nesse ATtiny) pelo pino 3 (que corresponde ao pino físico 2 do ATtiny), e pressionar o botão de upload. Em poucos instantes o programa estava compilado, transferido para o ATtiny, e o led começou a piscar ;-)
Vale lembrar: os detalhes sobre como programar para o ATtiny85 estão no artigo anterior.
Experimento 2 – ler num Uno a configuração do ATmega de um Arduino Leonardo
No artigo anterior, sobre identificar a configuração geral e os fuses de um ATmega, nós montamos assim a conexão entre os pinos do Arduino Uno no qual roda o programa descritor e o ATmega externo sendo lido em uma protoboard:
Pino no Arduino
Pino no ATmega | |
9 | XTAL1 (9) |
10 | RST (1) |
11 (MOSI) | 11 (17) ➡ MOSI |
12 (MISO) | 12 (18) ➡ MISO |
13 (SCK) | 13 (19) ➡ SCK |
5V | VCC (7) e AVCC (20) |
GND | GND (8 e 22) |
A exata mesma técnica pode ser usada para ler a configuração do ATmega32U4 instalado em um Arduino Leonardo, mas há um obstáculo: ao contrário do que ocorre com o Uno (e em outros Arduinos baseados no ATmega328), o Arduino Leonardo não tem as funções de MOSI, MISO e SCK espelhadas nos seus pinos numerados, o que nos obrigará a usar os pinos do ICSP.
Os pinos do lado da esquerda da tabela podem permanecer os mesmos, ou você pode optar por usar o ICSP do Arduino Uno, também. Quanto aos pinos do lado direito da tabela, você também pode optar entre usar todos os disponíveis no ICSP, ou fazer um mix entre os do ICSP e os que estão espelhados no Leonardo.
Para essa experiência, vou manter inalterado o uso dos pinos do lado esquerdo da tabela, e fazer no lado esquerdo um mix entre pinos do ICSP e pinos "do Leonardo". O Arduino Leonardo fica desconectado da porta USB, e a tabela revisada fica assim:
Pino no Uno
Pino no Leonardo | |
9 | não utilizado (o Leonardo tem clock próprio) |
10 | RESET |
11 (MOSI) | 4 do ICSP ➡ MOSI |
12 (MISO) | 1 do ICSP ➡ MISO |
13 (SCK) | 3 do ICSP ➡ SCK |
5V | 5V |
GND | GND |
Na prática, as conexões ficam assim (note que os jumpers que ligam pinos do Uno ao ICSP do Leonardo são macho-fêmea):
Feita a conexão física, basta rodar no Uno o sketch descritor de configuração remota que já descrevemos no artigo anterior, e ele vai começar a detalhar os dados encontrados.
Selecionei alguns trechos do relatório que foi gerado sobre o meu Arduino Leonardo, que está em configuração default:
Entered programming mode OK.
Signature = 1E 95 87
Processor = ATmega32U4
Flash memory size = 32768 bytes.
Clock calibration = 67
Bootloader in use: Yes
Bootloader is 4096 bytes starting at 7000
MD5 sum of bootloader = 53 E0 2C BC 87 F5 0B 68 2C 71 13 E0 ED 84 05 34
Bootloader name: Leonardo-prod-firmware-2012-04-26
O microcontrolador do Leonardo é o ATmega32U4, primo do ATmega328 do Uno que se destaca por uma capacidade extra: a de se conectar diretamente a computadores e outros dispositivos via USB.
Na listagem acima, além da identificação do chip, encontramos outra informação interessante: o tamanho do bootloader dele, que é 8x o tamanho do bootloader do Uno.
Mas bootloaders são assunto para um próximo artigo. Até lá!
Comentar