Prévia do material em texto
1
REDES PARA IOT
AULA 2
Prof. Gian Carlo Brustolin
2
CONVERSA INICIAL
A criação de objetos inteligentes depende, essencialmente, de se
embarcar inteligência em objetos controláveis. Embarcar inteligência não é um
procedimento novo, controladores industriais e a robótica associada, por
exemplo, já são parte do cotidiano humano há bom tempo. A indústria
automotiva, em função da intensidade com que implementa soluções de controle
em seus produtos, cunhou o termo eletrônica embarcada para descrever a
inserção de controles eletrônicos em objetos originalmente de essência
mecânica, como carros, caminhões e ônibus.
Quando analisamos a eletrônica embarcada, vemos que nem sempre o
processo de controle é dotado de inteligência. Se voltarmos ao exemplo dos
veículos, sabemos que o controle de certas facilidades de conforto, como o ar-
condicionado veicular, embora possa ser eletrônico, depende da interferência
humana para que as decisões de temperatura e de operação sejam tomadas.
De qualquer forma, como já afirmado em capítulo anterior, sempre que há uma
eletrônica de controle, existe a possibilidade de se inserir inteligência nas
decisões de controle. A inserção de inteligência depende da agregação de
componentes eletrônicos específicos, como os microprocessadores e
microcontroladores.
Situação análoga se dá na automação residencial, cujo estudo se dá o
nome de domótica. Soluções tradicionais têm foco em automação de certas
tarefas e controle remoto de iluminação, portões, entre outras pequenas tarefas
baseadas em eletrônica embarcada, mas a ideia da casa inteligente, que agrega
conectividade e aplicações de cognição à domótica clássica, permite acrescentar
facilidades de segurança e conforto bastante inovadoras (Stevan; Farinelli, 2018,
p. 16).
A presença de um microprocessador ou microcontrolador (em breve
descreveremos em que aspectos eles se distinguem) permitirá acrescentar, à
eletrônica embarcada, capacidades importantes como conectividade,
computação, análise semântica etc. Essas capacidades facultarão a conversão
de um objeto provido de eletrônica embarcada elementar em um objeto
inteligente que poderá ser, então, conectado às redes de interconexão, como a
internet.
3
Para que possamos entender melhor esse fenômeno, é necessário
compreendermos a arquitetura de um sistema de controle inteligente e seus
componentes. O objetivo desta aula será, então, mergulhar nesses sistemas de
controle.
TEMA 1 – ARQUITETURA BÁSICA DE PLACA PARA IOT
Como comentado anteriormente, um objeto inteligente é composto pela
eletrônica de controle e outra de inteligência. A eletrônica inteligente será
doravante chamada, para os fins do estudo atual, “placa para IoT”. Naturalmente,
em aplicações de larga escala, em que a produção de circuitos dedicados é
economicamente viável, as duas eletrônicas, de controle e inteligência, são
unificadas em placa única. Esses casos, entretanto, não se contrapõem à
arquitetura básica que apresentaremos a seguir, uma vez que a junção física
entre as duas funções não altera os princípios arquitetônicos elementares.
Os blocos básicos de uma placa para IoT podem ser descritos como na
figura a seguir. O processamento da placa é composto de uma CPU e
memórias (integradas ou não à CPU). Esse bloco responsabiliza-se pela
execução da aplicação residente na ROM (firmware), controlando as portas de
entrada e saída de dados digitais (GP I/O), a conectividade com o mundo externo
e as saídas para acionadores analógicos.
Figura 1 – Blocos rudimentares da placa de IoT
Fonte: Brustolin, 2022.
O bloco GP I/O (General Purpose In/Out ou entradas e saídas de
propósito geral) é a interface digital da placa de IoT com a eletrônica de controle.
4
Por ela, o processador pode adquirir dados de sensores embarcados ou enviar
comandos para atuadores com entradas digitais. Essas I/Os são digitais binárias,
normalmente, de 8 bits, embora existam versões mais recentes de placas IoT
com GP I/O de 16 ou mesmo 32 bits. Para economia de espaço, permitindo maior
miniaturização das placas, os pinos de saída são, via de regra, compartilhados
com os de entrada. Um pino de seleção de I/O indica se os pinos estão
disponíveis para receber ou fornecer dados para a eletrônica associada.
O bloco de alimentação normalmente pode estar incorporado a uma
interface de entrada, como USB ou Power over IP, ou se tratar de pinos
apropriados para a conexão com uma fonte externa de corrente contínua,
comumente 5Vcc (Arduino e Raspberry, por exemplo) ou, mais raramente,
tensões menores, como 3,3Vcc no Photon. Objetos inteligentes podem ser
dotados de facilidades de adormecimento que permitem a operação com
pequenas baterias por anos. Essas facilidades são importantes quando esses
objetos estão conectados a sensores ou atuadores remotos, localizados em
áreas de difícil manutenção.
O bloco de conectividade normalmente incorpora interface rádio,
predominantemente 802.1x, além de interfaces fiadas como USB, serial,
Ethernet, entre outras. A esse tema de conectividade dedicaremos a maior parte
deste curso. Por esse motivo, não dispensaremos a ele mais detalhamento neste
momento.
As I/Os analógicas são portas de entrada e saída capazes de receber ou
enviar sinais analógicos de controle. Os níveis máximos dessas entradas estão
limitados à tensão de alimentação e especial cuidado precisa ser tomado com
essa limitação. A presença dessas portas facilita substancialmente a conexão
das placas diretamente a sensores ou atuadores sem a necessidade de
conversores A/D.
Podemos ver a seguir uma placa IoT Photon com a identificação de alguns
blocos funcionais.
5
Figura 2 – Placa Photon para IoT
Fonte: Monk, 2018.
Como podemos observar, a eletrônica é bastante compacta, econômica e
flexível. Essas características são mandatórias em placas IoT, uma vez que a
profusão de objetos é bastante elevada, principalmente em instalações
industriais e comerciais.
O bloco nevrálgico para qualquer placa IoT é o de processamento
composto por um chip contendo um microprocessador e algumas facilidades
mínimas de memória. Vamos, a seguir, entender o que são e como operam as
CPUs elementares.
TEMA 2 – MICROPROCESSADORES E MICROCONTROLADORES
Um sistema computacional elementar é formado por um processador (ou
Unidade Central de Processamento, em inglês, Central Processing Unit - CPU),
um conjunto de memórias digitais e uma estrutura de I/O.
6
Basicamente, o processador é uma máquina sequencial que acessa os
dados binários da memória segundo um relógio (clock, em inglês) que determina
a velocidade de acesso. Esses dados binários, acessados pelo processador,
podem ser instruções de processamento ou dados a serem processados.
Um processador possui um conjunto de instruções, ou seja, há um
conjunto de dados (números binários) que, ao serem lidos pelo processador,
provocam uma reação. Dessa forma, para uma dada instrução, o processador
realizará uma ação ou, eventualmente, uma pequena sequência de ações. Essa
ação, na verdade, é fruto da decodificação do binário pela Unidade Controladora
que é o núcleo lógico de controle do processador.
Vamos dar um exemplo: suponha uma controladora rudimentar composta
pelas portas lógicas descritas na figura seguinte. A saída somente estará ativa
se o vetor (A7, A6, A5, A4, A3, A2, A1, A0) = (1,1,1,1,1,1,0,0) estiver presente
na entrada. Dito de outra forma, se o dado de entrada for 1111 1100 (ou FA h) a
saída será 1, outros binários não ativarão a saída.
Figura 3 – Circuito lógico de uma controladora hipotética rudimentar
Fonte: Brustolin, 2022.
Podemos, agora, ampliar nossa máquina computacional, associando à
entrada da controladora uma memória e à saída um acionador de uma lâmpada,
por exemplo. Se essamemória hipotética possuir oito posições (endereços) de
8 bits (1 byte) cada, ela será capaz de armazenar 64 bits.
7
Suponha que na primeira posição da memória (endereço 0) está
armazenado o binário 0010 0011 (ou 23h), no endereço 1 temos 20h e no
endereço 3 temos FA h. O processador, que é uma máquina sequencial,
acessará inicialmente o endereço de memória 0 e lerá o valor 23h, como não é
uma instrução válida (não há ativação da saída para esse byte), nada ocorrerá,
em seguida, o processador lerá 20h, novamente nenhuma ação ocorre, mas, ao
ler FA h a saída será sensibilizada e a lâmpada acenderá.
Seguindo o mesmo raciocínio, podemos imaginar outros circuitos lógicos
sensíveis a outros bytes de dados. Assim, podemos supor várias ações (saídas)
provocadas por bytes de dados determinados (instruções). Voltando finalmente
ao nosso processador, esse é o conceito de instrução. Cada processador terá
um conjunto de instruções válidas, às quais corresponderá uma ação.
A linguagem Assembler é, de fato, um conjunto de mnemônicos que
representam esses bytes que sensibilizam a controladora, provocando ações.
Em nosso exemplo, escolhemos instruções de 8 bits, mas os processadores
trabalham, na atualidade, com instruções maiores, de até 64 bits de extensão.
O conceito apresentado de controlador explica as ações do processador, mas
não sua habilidade de realizar cálculos. Essa função demanda uma estrutura
própria chamada de Unidade Lógica Aritmética (Arithmetic Logic Unit, ALU, em
inglês) que é o núcleo lógico matemático do processador. Uma vez que a
controladora recebe a instrução para somar duas memórias, por exemplo, ela
acionará a ALU para realizar tal tarefa. A ALU, de fato, é também um circuito
combinacional, como a controladora, dedicado a realizar cálculos simples.
2.1 Microprocessador X microcontrolador
Inicialmente, devemos diferenciar um microprocessador de um
microcontrolador. Um microprocessador, normalmente dito CPU, é um
dispositivo semicondutor, constituído por milhões de circuitos transistorizados
que implementam funções eletrônicas, similares ao exercício mental que
acabamos de realizar. Já um microcontrolador é também um dispositivo
semicondutor, mas que congrega em um único circuito integrado ou chip, além
de um microprocessador, que descrevemos anteriormente, também as
memórias voláteis e não voláteis e portas de I/O (Gimenes, 2002, p. 4). O
diagrama a seguir ilustra o comentado.
8
Figura 4 – Microcontrolador
Fonte: Gimenes, 2002, p. 5.
Um microcontrolador tem significativas limitações de memória, devido à
sua compactação. A aparente desvantagem se converte em vantagem quando
essa limitação é entendida. Um microcontrolador se torna, então, a inteligência
ideal para objetos IoT.
2.2 Arquitetura de um processador
Acabamos de entender os rudimentos de operação de um processador,
vamos agora examinar algumas arquiteturas reais dessas máquinas.
Uma arquitetura computacional é o conjunto mínimo de componentes que
permitem o completo funcionamento da máquina. A arquitetura básica seguida
pelos processadores atuais tem mais de 60 anos, proposta por John von
Neumann. Segundo essa arquitetura, apresentada no diagrama da figura a
seguir, teremos uma CPU contendo uma ALU, registradores, que tem por função
o armazenamento intermediário dos operandos, uma unidade de controle e um
apontador de instruções (PC), que armazena o endereço da próxima instrução a
ser executada (Baer, 2013).
9
Figura 5 – Máquina de von Neumann
Fonte: Baer, 2013.
Nessa arquitetura, como se observa na figura, há um único barramento
de acesso à memória, assim, não há distinção entre a memória de dados e a
memória de programa. Nela, determinado segmento de endereçamento da
memória será reservado para programa e o restante liberado para
armazenamento de dados. Caberá ao controlador endereçar corretamente a
memória em cada segmento, quando determinado pela instrução recebida. Esse
processo de leitura da memória e decodificação é chamado ciclo de execução
de instruções. Segundo Baer (2013), o ciclo, para a arquitetura von Neumann, é
o seguinte:
1. instrução (apontada pelo PC) é buscada da memória;
2. a unidade de controle decodifica a instrução;
3. instrução é executada. Ela pode ser uma instrução baseada na ALU, uma
carga (load) de uma posição da memória para um registrador, um
armazenamento (store) de um registrador para a memória ou uma
condição de teste para um desvio (branch) em potencial;
4. o PC é atualizado (incrementado em todos os casos, menos no caso de
um desvio bem-sucedido);
5. volte ao passo 1.
10
Outra arquitetura possível, Harward, diferencia as memórias de dados e
de programa. Isso exigirá do controlador gerenciar dois barramentos distintos de
acesso à memória, porém, tal complexidade faculta o acesso simultâneo a dados
e a instruções, propiciando velocidades consideravelmente mais altas de
operação com o mesmo clock. Na figura a seguir vemos uma representação da
arquitetura Harvard.
Figura 6 – Arquitetura Harvard
Fonte: elaborado com base em Lenz; Torres, 2019, p. 29.
Como se pode observar, a arquitetura Von-Neumann permite maior
compactação física ao passo que a arquitetura Harvard oferece maior
capacidade de processamento (Lenz; Torres, 2019, p. 28).
Além dessa distinção de hardware construtivo, os microprocessadores
podem ser classificados em RISC ou CISC segundo o conjunto de instruções
utilizado pela máquina. A escolha de uma máquina RISC (Reduced Instruction
Set Computer, ou computador com conjunto de instruções reduzido) tem por
vantagem um processamento mais rápido de cada instrução, porém o
programador utilizará um conjunto de instruções elevado para realizar uma
tarefa. Máquinas CISC (Complex Instruction Set Computer, ou computador com
conjunto de instruções complexo), por outro lado, utilizam memórias de
programa menores que seus pares RISC.
TEMA 3 – PROGRAMAÇÃO DE MICROPROCESSADORES
De fato, o núcleo de qualquer microcomputador (como aquele que você
está usando neste momento), é formado por uma CPU, memórias e I/Os,
descritas anteriormente, as quais são agregados os periféricos, a exemplo de
11
telas, teclados, mouse etc. Dessa forma, toda vez que desenvolvemos um
código, em qualquer linguagem de alto nível, estamos programando, em última
análise, um microprocessador (a CPU de seu computador).
Há, entretanto, um nível de programação, mesmo para o seu computador,
que é extremamente rudimentar em relação aos nossos códigos baseados em
IDEs (Integrated Development Environments) complexos. Esse baixíssimo nível
é o firmware que inicializa seu computador. Ao se acionar a chave liga/desliga,
o computador roda um programa de inicialização, que foi, ainda na fábrica da
placa, gravado em uma memória não volátil. Essa memória é acessada pela
CPU que lê as primeiras instruções, as quais configuram o ambiente básico de
operação, sobre o qual o sistema operacional será instalado e controlará a
máquina.
Quando falamos de programação de processadores, estamos tratando da
programação de firmware, ou seja, do código primordial que o processador
executa, sobre o qual todos as demais aplicações se apoiarão.
Os comandos desse baixíssimo nível de programação são o próprio
conjunto de instruções do processador. Naturalmente, mesmo nesse nível há
ferramentas para auxiliar na codificação. Alguns ambientes de desenvolvimento
foram criados para simplificar essa codificação e a compilação para a linguagem
binária de máquina.
Terminada a codificação e a compilação, será necessário gravar os
dados, dito microcódigo, em uma memória de programa, não volátil, que pode
ser externa (microprocessador) ou interna (microcontrolador) ao chip.
Hipoteticamente, pode-se utilizar qualquer linguagem de alto nível para
gerar o microcódigo, não apenaso Assembly, este, entretanto, é a linguagem
que mais se aproxima da linguagem de máquina binária. Lenz e Torres (2019, p.
96), outrossim, advertem quanto ao uso de linguagens de alto nível, afirmando
que tais linguagens
são mais fáceis de compreender, ocupam menos espaço e demandam
menos tempo de aprendizado e desenvolvimento. Em contrapartida, a
compilação é prejudicada pelo caráter genérico da linguagem e uma
operação que poderia ser desenvolvida com poucas instruções para
um microcontrolador específico pode ser traduzida para uma
quantidade de instruções muito maior, já que o compilador nem sempre
será capaz de encontrar a solução mais favorável. (Lenz; Torres, 2019,
p. 96)
12
3.1 Assembly
A seguir vamos conhecer alguns rudimentos de programação em
Assembly. Esse conhecimento é importante porque nos aproxima da forma como
o processador resolve os códigos computacionais.
Normalmente, uma instrução em Assembly é composta pelo mnemônico
seguido ou não de operandos, na maioria das vezes, mas não exclusivamente,
hexadecimais. Nesse ponto, é importante comentar que não há um único
Assembly. Cada família de processadores possui um conjunto próprio de
instruções, embora exista um padrão no uso dos mnemônicos. Dessa forma,
alguns processadores não terão equivalentes, em sua lista de instruções válidas,
para todos os mnemónicos Assembly existentes. O programador deve, antes de
iniciar a programação, verificar, no manual do fabricante do processador, o
“instrution set” daquele chip.
Nesse ponto, uma consulta à página de internet de um fabricante pode
ser interessante para tornar o até aqui afirmado mais palpável. Por exemplo,
para a família de 64 bits da Intel, que engloba os chips Core I3 e seguintes, o
conjunto de instruções (instructions set) pode ser visto no capítulo 3, p. 3-17 e
seguintes, do documento:
. Acesso em: 16 fev. 2022.
Observando, para exemplificarmos, o mnemônico ADD, que realiza a
adição entre dois registradores do chip, após o mnemônico, seguirão os
endereços dos registradores que se deseja adicionar. Assim, a instrução ADD
AL, imm8 realizará a adição do conteúdo de AL com o conteúdo de imm8,
mantendo o resultado em AL. Você deve estar se perguntando como carregamos
um registrador interno. A instrução MOV, por exemplo, transfere o conteúdo de
uma posição de memória para um registrador. Certo, mas como lemos um dado
externo? A instrução IN captura o valor presente em uma porta de entrada e o
coloca na memória.
Dessa maneira, a sequência de instruções a seguir lerá o dado presente
em uma porta e o adicionará a um registrador do chip processador:
IN pp,iii
MOV iii, rr
13
ADD AL,rr
O conjunto de instruções de um processador complexo, como aqueles
que equipam os Core i3, é, naturalmente, também complexo, como você pode
verificar no documento que sugerimos anteriormente.
Os processadores que equipam objetos IoT são substancialmente mais
simples, por questões de volume, custo e demanda de energia. A lógica da
programação em linguagem de máquina, entretanto, mantém-se em todos os
níveis de complexidade.
3.2 Compilação do Assembly
Terminada a construção do código, será necessário compilá-lo para o
opcode do processador destino. Um compilador que converte os nmemônicos
Assembly em opcodes é dito assembler ou assemblador.
O assemblador, sabendo qual o chip destino, converterá os menmônicos
nos opcodes hexadecimais devidos, assim, a instrução ADD será convertida
para 88 h em um Intel 64 e para o singelo binário 00 0111 em um PIC16 (Lenz;
Torres, 2019, p. 23). A figura a seguir ilustra esse processo.
Figura 7 – Assemblador
Fonte: elaborado com base em Lenz; Torres, 2019, p. 107.
Um código em Assembly tem a extensão “.asm” enquanto o objeto
normalmente recebe a extensão “.o” ou “.hex”. Essa saída, em hexadecimal, é
ainda amigável, na fase de gravação os valores hexadecimais serão, finalmente,
convertidos para binário.
3.3 Gravação
Para que o opcode, agora convertido em binário, possa incorporar o
firmware do microprocessador, será necessário um acessório de gravação. Este
14
acessório, o gravador, controlará a descarga dos bits para a unidade de
armazenamento do processador, que poderá estar no próprio chip da CPU ou
em memória não volátil externa, a exemplo das PROMs e EPROMs (Erasable
Programmable Read-Only Memory ou Memória de Somente Leitura
Programável Apagável).
Figura 8 – Gravador
Fonte: elaborado com base em Super Gravador, [S.d.].
Entendido esse processo de upload do código, estamos preparados para
compreender os objetos inteligentes e sua programação.
TEMA 4 – PLACAS IoT
Já conhecemos arquitetura básica de uma placa para IoT e entendemos
como o microprocessador, contido nessa placa, pode ser programado.
Há, atualmente, no mercado, uma boa coleção de hardwares de baixo
custo que permitem implementações rápidas da inteligência associada à
eletrônica embarcada de controle. De fato, placas como Arduino e Raspberry Pi
podem ser consideradas responsáveis pela disseminação acelerada de objetos
IoT (Ideali, 2021, p. 17). Neste tema, vamos conhecer algumas placas
comercialmente utilizadas em objetos IoT.
15
4.1 Photon
O Photon é uma placa para objetos IoT originada de uma plataforma
anterior da Particle, chamada Spart Core. A placa possui como portas I/O as
opções serial, USB e Wi-Fi, além de entradas/saídas digitais e analógicas para
acionadores e sensores, o microcontrolador é um ARM Cortex M3 de clock
120MHz. Essa placa pode operar em modo adormecido, fato bastante
importante em objetos inteligentes dado aos fatores anteriormente tratados neste
curso.
A programação do microcontrolador será feita por um IDE, com uso de
linguagem de alto nível, baseada no C, muito similar àquele utilizado na
programação do Arduíno. O IDE para essa placa possui ambiente de
programação online, dito WebIDE, que transfere a programação, via rede,
diretamente para o Photon. Há também a opção offline, porém a filosofia dessa
pequena placa está mais voltada para a primeira opção, conforme veremos a
seguir.
O Photon se conecta nativamente à internet e busca, nessa rede, alguns
aplicativos ou se conecta com outros Photons. Naturalmente, problemas de
segurança e de privacidade podem vir da escolha dessa solução, embora o
fabricante garanta a presença de camadas de segurança na conexão e
operação.
A primeira conexão da placa será feita energizando-a pela interface USB.
A placa, após energizada, criará um ponto de acesso Wi-Fi com uma SSID
genérica. Com o auxílio de um aplicativo de configuração, baixado no celular,
informa-se ao Photon o SSID da rede Wi-Fi disponível, bem como as credenciais
de acesso. A figura a seguir ilustra esse processo.
16
Figura 9 – Placa Photon e aplicativo de configuração
Fonte: Monk, 2018.
Uma vez configurado, o Photon estará apto a conectar-se à internet e
receber a programação que criarmos para controlá-lo, pelo WebIDE. A seguir,
um exemplo de programa, da biblioteca de aplicativos disponível em
, que permite a leitura de um fotossensor e o
controle do led disponível na placa.
// We're going to start by declaring which pins everything is plugged into.
int led = D0;
// This is where your LED is plugged in. The other side goes to a resistor
connected to GND.
int photoresistor = A0;
// This is where your photoresistor is plugged in. The other side goes to the
"power" pin (below).
int power = A5;
// This is the other end of your photoresistor. The other side is plugged into the
"photoresistor" pin (above).
17
// The reason we have plugged one side into an analogpin instead of to "power"
is because we want a very steady voltage to be sent to the photoresistor.
// That way, when we read the value from the other side of the photoresistor, we
can accurately calculate a voltage drop.
int analogvalue;
// Here we are declaring the integer variable analogvalue, which we will use later
to store the value of the photoresistor.
// Next we go into the setup function.
void setup() {
// First, declare all of our pins. This lets our device know which ones will be used
for outputting voltage, and which ones will read incoming voltage.
pinMode(led,OUTPUT);
// Our LED pin is output (lighting up the LED)
pinMode(photoresistor,INPUT);
// Our photoresistor pin is input (reading the photoresistor)
pinMode(power,OUTPUT);
// The pin powering the photoresistor is output (sending out consistent power)
// Next, write the power of the photoresistor to be the maximum possible, so that
we can use this for power.
digitalWrite(power,HIGH);
// We are going to declare a Particle.variable() here so that we can access the
value of the photoresistor from the cloud.
Particle.variable("analogvalue", &analogvalue, INT);
// This is saying that when we ask the cloud for "analogvalue", this will
reference the variable analogvalue in this app, which is an integer variable.
// We are also going to declare a Particle.function so that we can turn the LED
on and off from the cloud.
Particle.function("led",ledToggle);
// This is saying that when we ask the cloud for the function "led", it will employ
the function ledToggle() from this app.
}
// Next is the loop function...
void loop() {
18
// check to see what the value of the photoresistor is and store it in the int variable
analogvalue
analogvalue = analogRead(photoresistor);
}
// Finally, we will write out our ledToggle function, which is referenced by the
Particle.function() called "led"
int ledToggle(String command) {
if (command=="on") {
digitalWrite(led,HIGH);
return 1;
}
else if (command=="off") {
digitalWrite(led,LOW);
return 0;
}
else {
return -1;
}
}
É possível observar que a programação de fato ocorre em C,
naturalmente, há particularidades próprias da placa que não estão presentes nas
bibliotecas clássicas do C. Concluída a codificação, no IDE, devemos gravá-la
na placa, nesse IDE a opção é chamada flash. Solicitada a operação, o código
será assemblado e gravado na EEPROM da placa. Após a reinicialização, a
placa executará o código criado por nós. Com esse procedimento, a gravação
do opcode e sua conversão para binário é controlada pelo IDE dispensando os
passos descritos no tema anterior bem como eliminando a necessidade de um
gravador. O custo para essa facilidade é a permanência, na memória de
programa, de um código semelhante a um SO rudimentar que faculta as trocas
de programação com uso da interface Wi-Fi.
19
4.2 Arduino e Genuino
Os nomes Genuíno ou Arduino referem-se à mesma placa dependendo
do local de fabricação. Aqui, preferimos utilizar o termo Arduino dada sua
popularidade.
O Arduino foi pensado originalmente como uma plataforma de testes e
aprendizado de computação embarcada. Segundo Oliveira e Zanetti (2015), o
Arduino é uma plataforma de hardware open source criada com o objetivo de
fornecer um recurso de prototipação de projetos interativos. A consolidação dos
objetos inteligentes, entretanto, ressignificaram essa placa para IoT, tornando-a,
hoje, a mais popular no mundo.
Há vários modelos de placas Arduino. Na versão mais simples, a placa
possui um microcontrolador Atmel AVR (ATMega 328 com clock de 16MHz),
memória RAM de 2KB e flash, para armazenamento secundário, de 32 KB, além
de interfaces de I/O digitais e analógicas. A programação da placa é feita por
meio de um IDE simples com uso de linguagem de programação baseada no
C/C++, batizada de Wiring.
Mais recentemente, facilidades de conectividade Wi-Fi e Bluetooth foram
incorporadas à placa, essas facilidades eram antes disponibilizadas por shields,
placas externas de complementação da arquitetura (Ideali, 2021, p. 18). A versão
mais comumente comercializada é o Uno, cuja foto se vê a seguir. A placa
recebe na fábrica um firmware bootloader de cerca de 500 bytes que permite a
inicialização da placa e sua conexão USB com o computador habilitado a
programá-la.
20
Figura 10 – Placa Arduino Uno
Fonte: Arduino/CC.
O Arduíno possui IDEs para Windows, MacOs e Linux com download
gratuito em: , há também uma
WebIDE acessível a partir do mesmo endereço.
As especificações do Arduino Uno podem ser vistas a seguir. Interessante
observar que há uma memória de programas de 32 KB, não volátil, que receberá
o “sketch” ou programa básico (compilado do C), e a memória SRAM (Static
Random Access Memory) armazenará as variáveis dinâmicas. Variáveis
estáticas, de uso permanente, podem ser armazenadas na EEPROM.
Figura 11 – Especificações Arduino Uno
Característica Descrição
Microcontrolador principal Atmel Atmega 328P-PU (8 bits)
Microcontrolador USB/serial Atmel Atmega 16U2
Oscilador (clock) 16 MHz
GPIOs analógicas 6
GPIOs digitais 14 (6 deles com PWM)
Memória de programas (flash) 32 kB
Memória volátil (SRAM) 2 kB
Memória não volátil (EEPROM) 1 kB
Tensão de operação 5 B
Fonte: Stevan; Farinelli, 2018, p. 51.
21
O Arduíno é a placa indicada para principiar na programação de objetos
IoT. De forma análoga ao uso de Python como linguagem de programação, o
Arduino (e seu IDE) possui uma boa quantidade de bibliotecas já desenvolvidas
pelas comunidades. A principal comunidade se denomina GitHub e possui, além
de bibliotecas de aplicações, ferramentas para conexão de placas periféricas.
Boa parte das bibliotecas estão agregadas ao IDE básico, mas as demais são
facilmente instaláveis.
Aprofundar-se nesse tema não é objeto do presente estudo,
recomendamos, entretanto, aos interessados, a leitura da obra dos engenheiros
Stevan e Farinelli (2018).
4.3 Raspberry Pi
Esta placa tem origem acadêmica. Em 2006, uma equipe de professores
de Cambridge buscou criar uma placa de baixo custo e de simples aplicabilidade
pedagógica. Desde então, a placa ganhou várias versões, mas segue apreciada
pelos desenvolvedores, ganhando novo impulso com a popularização das
aplicações inteligentes IoT.
Como a origem acadêmica sugere, há várias facilidades embarcadas na
placa que a tornam muito semelhante a um computador portátil. A Raspberry Pi
Foundation detém um sistema operacional baseado no Debian Linux (Raspbian
ou Raspberry Pi OS) que possui algumas versões e atualizações conforme o uso
que se fará da placa. Todas as versões e facilidades disponíveis podem ser
baixadas gratuitamente em: . O próprio HW sofreu evoluções e especializações no decorrer dos
anos, como podemos observar na figura a seguir. Talvez o único ponto negativo
a ser considerado, no uso dessa placa, seja a limitação de conectividade on
board, na maioria das versões. Estão disponíveis, por padrão, a interface
periférica serial (SPI) comumente usada entre shields e uma UART, além das já
citadas. Facilidades sem fio devem ser obtidas por periféricos dedicados.
22
Figura 12 – Placas Raspberry Pi, versões Pico (esquerda) e 4 Model B (direita)
Fonte: elaborado com base em Raspberry Pi, [S.d.].
O sítio de internet da fundação possui alguns cursos básicos de
codificação e uso da placa para propósitos pedagógicos.
A flexibilidade de uma placa que permite a conexão de periféricos como
teclado, mouse (USB) e monitor (HDMI), além de conexão Ethernet para rede e
programação facilitada dos GPIO,acabaram motivando seu uso fora do âmbito
educacional, como uma controladora IoT de propósito geral.
4.4 Outras placas para IoT e prototipação
Após estudarmos algumas placas para IoT mais comercializadas, vamos
citar alternativas que estão disponíveis no mercado, bem como algumas
características que as diferenciam.
A Giant Board é uma opção interessante por possuir especificações um
tanto superiores às demais placas IoT. Giant Board é de fato um SBC (Single
Board Computer ou computador de placa única) equipado com um processador
ARM Cortex de 500MHz e RAM 128MB DDR2, além da opção de ampliação de
armazenamento por cartão SD. Ela placa tem instalado um SO Linux Debian
permitindo o prático uso de bibliotecas, facilidades de programação e
roteamento.
Placas da BeagleBone são uma alternativa interessante quando
necessitamos de ampla conectividade nativa. A placa BB Green Gateway tem
interfaces para Ethernet, Wi-Fi e Bluetooth Low Energy e é também conhecida
por inserir baixa latência nas aplicações graças ao processador ARM de 1 GHz.
23
Já a BB Black tem apenas a interface Ethernet, mas mantém o excelente
desempenho para aplicações de tempo real.
A Texas Instruments, em sua linha SimpleLink, apresenta suporte para
vários protocolos de comunicação como ZigBee e LoRa que, como já
comentamos, são resilientes e indicados para operação stand alone.
Há uma infinidade de placas disponíveis no mercado, normalmente
focadas em dada aplicação, há exemplos de placas com facilidades multimídia
ou com aplicações nativas de criptografia. Essa relativa especialização se
justifica pelo fato de placas IoT não possuírem a mesma flexibilidade de
adaptação de periféricos que um sistema computacional de maior porte físico.
TEMA 5 – INTERFACES DE COMUNICAÇÃO
Em todas as placas que vimos anteriormente, de maior presença
comercial, estão disponíveis, como interfaces padrão de comunicação as de
baixo nível (a exemplo da USB, serial e paralela) bem como interfaces de mais
alto nível, de interconectividade mais genérica (Wi-Fi, Bluetooth e Ethernet).
São essas as únicas interfaces de comunicação para IoT? Certamente,
não. Assim como não são essas as únicas placas para IoT.
Interfaces mais flexíveis, adaptadas à aplicação na qual se deseja aportar
inteligência já são bastante comuns. A adaptação da interface ao
microcontrolador pode ser feita por shields como nos Arduinos, mas há placas
com interfaces nativas bem mais focadas. Como discutimos, em nossa aula
anterior, soluções que envolvam protocolos como LoRa e ZigBee já são bastante
comuns.
Sensores equipados com interface LoRa são frequentes em detecção de
abertura de portas e janelas, em instalações industriais e residenciais (veja figura
a seguie), assim como sensores de CO2, detetores de presença, sensores de
nível de água. O uso da interface, como veremos posteriormente em detalhes,
faculta a operação em stand alone, com baterias pequenas, por vários anos sem
manutenção.
24
Figura 13 – Sensores de nível e abertura de janelas com interface LoRa
Fonte: elaborado com base em Iot Factory, [S.d.].
Outras interfaces para 5G e WiSun também já estão disponíveis como
acessórios e como interfaces nativas em placas para IoT, justificando a
exploração mais aprofundada desses protocolos em nossas próximas aulas.
FINALIZANDO
Objetos inteligentes são basicamente equipamentos dotados de
eletrônicas embarcadas associadas a microcontroladores que permitem a
conectividade e a consequente operação remota. A programação desses objetos
é feita de forma análoga à dos microprocessadores, embora facilitada por IDEs
desenvolvidas especificamente para esse fim, como vimos nesta aula.
A criação de redes inteligentes de objetos IoT é o próximo passo lógico
facultada por essa tecnologia. Em nossas próximas aulas estudaremos algumas
das redes que atendem a diferentes aplicações desses objetos.
25
REFERÊNCIAS
BAER, J.-L. Arquitetura de Microprocessadores – do simples Pipeline ao
multiprocessador em chip. Grupo Gen, 2013.
GIMENES, S. P. Microcontroladores 8051. São Paulo: Pearson Education do
Brasil, 2002.
LENZ, M.; TORRES, F. E. Microprocessadores. Grupo A, 2019.
MONK, S. Internet das coisas: uma introdução com o Photon – série Tekne
Grupo A, 2018.
OLIVEIRA, C. L. V.; ZANETTI, H. A. P. Arduino descomplicado – como
elaborar projetos de eletrônica. São Paulo: Editora Saraiva, 2015.
STEVAN JR, S. L. S.; FARINELLI, F. A. I. Domótica - automação residencial e
casas inteligentes com Arduino e ESP826. São Paulo: Editora Saraiva, 2018.
Conversa Inicial
REFERÊNCIAS