Logo Passei Direto
Buscar
Material
páginas com resultados encontrados.
páginas com resultados encontrados.

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

Mais conteúdos dessa disciplina