Genuino 101: testamos o Arduino com chip Intel, Bluetooth e acelerômetro
Conheça os detalhes e acompanhe o teste com… um detector de petelecos.
O Genuino 101 é uma placa introdutória, mas com recursos avançados: CPU Intel, bastante memória, Bluetooth LE interno, acelerômetro interno, 2 seriais (USART) físicas, interrupção externa em todos os pinos, e muito mais.
Talvez você a conheça como Arduino 101. Fora dos EUA ela se chama “Genuino 101”, e é o mesmo hardware. Essa situação é consequência da disputa judicial que os fundadores do projeto Arduino vêm travando, nos EUA e na Europa, pelo uso da marca.
Minha experiência com os Arduinos baseados em chips ATmega de 8 bits sempre foi positiva, mas de vez em quando me vejo tentado a experimentar com os modelos de maior desempenho.
Quis o destino que a oportunidade para isso chegasse com a notícia de que a tradicional Filipeflop (cuja sede fica aqui em Florianópolis) se tornou a primeira distribuidora da Genuino 101 no Brasil. Recebi deles uma placa para testes, e não teve jeito: interrompi outros projetos que vinham me mantendo longe da bancada e dediquei algumas horas a conhecer e experimentar com esse hardware fascinante.
O nome 101 me parece tão apropriado quanto o singelo Uno: ambas são placas introdutórias, e o número 101 é tradicionalmente usado em universidades norte-americanas para indicar a matéria introdutória de um curso: assim, Marketing 101 seria a cadeira na qual um calouro se matricularia para saber os primeiros passos sobre marketing, e Arduino 101 seria a placa que um iniciante procuraria para seus primeiros passos com o Arduino – ou ao menos é isso que a Intel e os fundadores do Arduino parecem indicar ao fazer essa associação.
O Genuino 101 é parecido com o Uno, mas nem tanto
As semelhanças ficam evidentes desde a primeira olhada, incluindo as dimensões, o posicionamento das barras de pinos, a presença de um LED conectado ao pino 13, etc.
Mas também há diferenças bem evidentes, mesmo antes de ligar a placa:
- São 2 botões de reset: um deles reinicia o sketch Arduino que estiver rodando, e outro reinicializa a placa inteira, incluindo o RTOS.
- Tem um pino lógico a mais: com o nome de ATN, ele é vizinho do IOREF, serve (experimentalmente) para a função SS em comunicação I2C (mais detalhes adiante), e ocupa um espaço vago no Uno original, e aproveitado como um pino analógico adicional (A7) em muitos clones chineses.
- São só 4 portas com capacidade de PWM via
analogWrite()
.
Além disso, há algumas diferenças mais sutis:
- A lógica é de 3,3V: o Genuino 101 não vai queimar ao receber 5V (ele tem circuitos especiais para evitar isso), mas sua lógica e seu funcionamento interno são a 3,3V (assim, o valor 1023 lido em uma porta analógica corresponde a uma entrada de 3,3V, e não de 5V como no Uno).
- Todos os pinos suportam interrupções externas.
- As seriais têm diferenças (de configuração e pinagem) que veremos com detalhes mais adiante.
A diferença fundamental: sai ATmega, entra Intel Curie
O módulo retangular logo abaixo da marca "Genuino 101" na placa é o Intel Curie, uma plataforma SoC que é basicamente um computador inteiro, acompanhado de alguns periféricos internos voltados a aplicações vestíveis ou móveis: conexão Bluetooth LE e um acelerômetro/giroscópio – tudo isso feito para rodar bastante tempo, mesmo alimentado por uma bateria pequena.
O sistema tem 384K de armazenamento flash e 80K de RAM disponíveis, mas uma parte disso fica bloqueada para uso interno do sistema. Mas o total liberado para uso pelo seu sketch não é pouco: 196K de flash e 80K de RAM.
A arquitetura é bem mais complexa do que os nossos modestos ATmegas nos quais o único elemento que divide a atenção com o sketch é o bootloader: num Genuino 101, nós temos 2 núcleos separados, sendo um deles padrão x86 (Quark) e o outro um ARM (ARC), ambos rodando a 32MHz.
Ao compilar um sketch, a IDE providencia para distribuir a carga entre os 2 núcleos, e existe todo um mecanismo em que o programa do usuário rodando no Genuino 101 faz chamadas ao sistema operacional de tempo real (RTOS) que roda no Intel Curie, para fazer uso das suas funcionalidades.
Esse RTOS é uma atração à parte: seu código é open source, ele permanece em desenvolvimento, e há expectativa de que novas funcionalidades sejam disponibilizadas em versões futuras.
A disponibilização do código foi em Abril de 2016 (escrevi a respeito no BR-Linux), e este não diz respeito apenas ao RTOS: há também um firmware que gerencia atualizações e o bootloader. O código vem pronto para ser compilado em um host Ubuntu de 64 bits.
Como instalar o Genuino 101
Para usar o Genuino 101, você precisará de um cabo USB modelo A–B, o mesmo do Arduino Uno1 e da maioria das impressoras.
No meu computador (um Mac rodando OS X 10.11), foi só plugar e usar, mas sua experiência pode variar: no Windows um driver é necessário (mas a documentação informa que a Arduino IDE se encarrega de instalá-lo), e no Linux pode ser necessário rodar um script2 para ter permissão de pleno uso da comunicação USB com a placa. Detalhes podem ser encontrados na documentação oficial.
É possível usar a IDE Arduino versão 1.6.7 ou posterior – eu usei a 1.6.9. O suporte ao Genuino Uno não vem nela por default, sendo necessário usar uma opção do menu para ativá-lo. O menu em questão é o Ferramentas | Placa | Gerenciador de placas, que abre o gerenciador, no qual selecionei "Intel Curie Boards" e pressionei o botão Instalar.
Depois disso, foi só selecionar a placa e a porta serial corretas no menu Ferramentas, como já fizemos para tantas outras placas Arduino ao longo dos tempos.
Para testar, carreguei o tradicional exemplo Blink (em Arquivo | Exemplos | Basics | Blink), pressionei o botão "Carregar"3 na tela do editor, e pronto: o programa foi compilado, enviado para a placa, e em 5 segundos ela começou a alegremente piscar o LED verde conectado ao pino 13.
Seriais diferentonas
Se você já lidou com um Arduino Mega ou Arduino Due, já sabe que o fato de o Arduino Uno ter só uma serial (USART) é ao mesmo tempo uma limitação e um convite à simplicidade nos programas do usuário.
O Genuino 101 não tem essa simplicidade: são duas seriais, sendo que a que vem associada à porta USB tem o nome de Serial
, e a que funciona nos pinos digitais 1 e 0 se chama Serial1
.
Assim como acontece com outros modelos de Arduino com hardwares relativamente avançados, a Serial da porta USB não fica disponível imediatamente ao ligar (ou resetar) a placa. Para garantir que as tentativas de usá-la (por exemplo, para exibir mensagens no Monitor Serial) não aconteçam antes dessa disponibilização, você pode inserir no início da sua função setup()
a seguinte linha, que define um loop vazio que aguarda pela disponibilidade da Serial:
while (!Serial) ;
Ocorre um erro se você roda o Monitor Serial enquanto a Serial está indisponível (logo após o boot). a solução mais básica é aguardar alguns segundos e tentar de novo.
Além disso, temos os tradicionais padrões seriais I2C (pinos dedicados para SCL e SDA, logo acima do pino AREF) e SPI, cujos pinos SS, MOSI, MISO e SCK estão todos associados ao header ICSP do Genuino 101, e vêm acompanhados de um novo pino ATN, localizado ao lado do tradicional pino IOREF, que vai ser usado para a função de chip select (SS) em conexões SPI, mas no momento ainda está marcado como experimental, e pouco documentado.
Experimentando com o acelerômetro interno
Não poderia terminar um artigo apresentando o Genuino 101 sem testar pelo menos um dos seus periféricos especiais. Escolhi o acelerômetro de 6 eixos, e o Bluetooth interno fica para um próximo artigo ;-)
O programa abaixo se chama peteleco.ino, e usa o acelerômetro para identificar leves batidas, exibindo no Monitor Serial em qual dos 6 lados da placa o impacto ocorreu:
#include "CurieIMU.h"
void setup() {
while (!Serial) ;
Serial.begin(9600);
CurieIMU.begin();
CurieIMU.attachInterrupt(eventCallback);
// define parametros do impacto que pode ser detectado, e ativa
CurieIMU.setAccelerometerRange(4);
CurieIMU.setDetectionThreshold(CURIE_IMU_TAP, 750); // (750mg)
CurieIMU.interrupts(CURIE_IMU_TAP);
Serial.println("Inicializacao completa, aguardando eventos");
}
void loop() {
// vazio, tudo fica no callback
}
static void eventCallback()
{
if (CurieIMU.getInterruptStatus(CURIE_IMU_TAP)) {
if (CurieIMU.tapDetected(X_AXIS, NEGATIVE))
Serial.println("Peteleco pelo lado do header ICSP (-x)");
if (CurieIMU.tapDetected(X_AXIS, POSITIVE))
Serial.println("Peteleco pelo lado da porta USB (+x)");
if (CurieIMU.tapDetected(Y_AXIS, NEGATIVE))
Serial.println("Peteleco pelo lado das portas digitais (-y)");
if (CurieIMU.tapDetected(Y_AXIS, POSITIVE))
Serial.println("Peteleco pelo lado das portas analogicas (+y)");
if (CurieIMU.tapDetected(Z_AXIS, NEGATIVE))
Serial.println("Peteleco pelo lado de cima da placa (-z)");
if (CurieIMU.tapDetected(Z_AXIS, POSITIVE))
Serial.println("Peteleco pelo lado de baixo da placa (+z)");
}
}
Note a inclusão da biblioteca CurieIMU (configurada automaticamente pela IDE ao instalar o suporte à placa Genuino 101), que define métodos para lidar com o acelerômetro. Há outras bibliotecas padrão para outras características especiais do Genuino 101: CurieBLE para Bluetooth, Curie Timer One para temporização, CurieSoftwareSerial, e mais.
Não vou detalhar todo o funcionamento do programa, inclusive porque é relativamente simples (embora use recursos avançados):
- a função
setup()
define os parâmetros de funcionamento do acelerômetro de 6 eixos e ativa uma interrupção que vai chamar a funçãoeventCallback()
sempre que alguma batida for detectada. - a função
eventCallback()
é chamada pela interrupção do acelerômetro, e identifica em qual dos eixos (x, y ou z) e com qual sinal ocorreu a batida, e aí exibe no Monitor Serial qual dos lados da placa (o da USB, o das portas analógicas, etc.) recebeu um peteleco.
No Monitor Serial, as batidas detectadas aparecem como no exemplo:
Peteleco pelo lado da porta USB (+x)
Peteleco pelo lado de cima da placa (-z)
Peteleco pelo lado das portas analogicas (+y)
Simples, não? O programa é uma mera adaptação do exemplo TapDetect, incluído pela Intel na IDE do Arduino. Mérito deles, portanto ;-)
Agradecimento e próximos passos
Não posso deixar de agradecer à Filipeflop, que me enviou essa placa como cortesia, sem contrato ou maiores formalidades. Para saber mais detalhes, sugiro uma visita à página do Genuino 101 na Filipeflop.
A Filipeflop é a primeira distribuidora do Genuino 101 no Brasil, e tem uma linha de embarcados da Intel que também inclui modelos Edison e Galileo. Espero que logo possamos fazer em conjunto mais atividades de interesse mútuo!
Agora que a placa está em mãos, certamente retornarei a ela em artigos futuros explorando seus outros recursos, aguarde!
Comentar