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ção eventCallback() 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!

 
  1.  Mas não da maioria dos clones chineses, que usam portas fisicamente menores.

  2.  com um comando como sudo ~/.arduino15/packages/Intel/tools/arduino101load/1.6.4+1.18/scripts/create_dfu_udev_rule

  3.  Ou "Upload"

Comentar

Dos leds ao Arduino, ESP8266 e mais

Aprenda eletrônica com as experiências de um geek veterano dos bits e bytes que nunca tinha soldado um led na vida, e resolveu narrar para você o que descobre enquanto explora esse universo – a partir da eletrônica básica, até chegar aos circuitos modernos.

Por Augusto Campos, autor do BR-Linux e Efetividade.net.

Recomendados

Livro recomendado


Artigos já disponíveis

Comunidade Arduino

O BR-Arduino é integrante da comunidade internacional de entusiastas do Arduino, mas não tem relação com os criadores e distribuidores do produto, nem com os detentores das marcas registradas.

Livros recomendados