Este documento descreve um projeto que implementa treinamento e operação de uma rede neural artificial diretamente em hardware para aproximar funções de controle de motores de um veículo após supervisão. O treinamento é realizado usando um Arduino Due conectado a sensores e motores de um veículo de pequeno porte, enquanto é conduzido remotamente.
1. 1
TREINAMENTO E OPERAÇÃO DIRETA EM HARDWARE DE UMA
REDE NEURAL ARTIFICIAL E SUA APLICABILIDADE NA
APROXIMAÇÃO DE FUNÇÕES PARA CONDUÇÃO AUTÔNOMA DE
VEÍCULO APÓS SUPERVISIONAMENTO
Tiago Correa Prata1
Um treinamento de Rede Neural consiste na modificação dos pesos das conexões das
entradas com os neurônios e também entre neurônios. Os pesos iniciais são aleatórios e são
modificados de forma iterativa e neste trabalho serão modificados utilizando um algoritmo de
aprendizado supervisionado. Usualmente as Redes Neurais são implementadas em simulações
computacionais, porém este trabalho visa principalmente realizar a fase de treinamento e
operação da rede de forma embarcada, sendo ambas as fases implementadas diretamente em
uma plataforma de hardware chamada Arduino Due. A rede desenvolvida é aplicada à
condução de um pequeno veículo e visa fazer a aproximar as funções de acionamento dos
motores com base nos dados coletados pelo conjunto de sensores do veículo durante a fase de
aprendizagem.
Palavras-chave: Treinamento em hardware. Redes Neurais Artificiais. Arduino.
A Neural Network training consists of changing the weights of the connections of the
inputs to the neurons and between neurons. The initial weights are random and modified
iteratively and in this work they will be modified using a supervised learning algorithm.
Neural Networks are usually implemented in computer simulations, however, this work aims
mainly performing the training and operation phase of the embedded network. Both phases
are implemented directly in a hardware platform called Arduino Due. The developed network
is applied to driving a small vehicle and aims to approximate the functions of driving the
motors based on data collected by the sensor array of the vehicle during the learning phase.
Palavras-chave: Training hardware. Artificial Neural Networks. Arduino.
1
Aluno do curso de Eng. de Controle e Automação do Instituto Federal de Educação, Ciência e Tecnologia de São Paulo Campus São
Paulo.
E-mail: <tiagoprata@ymail.com>
2. 2
1 INTRODUÇÃO
Uma Rede Neural é uma estrutura
desenvolvida com inspiração no cérebro
humano e que visa interligar células
computacionais simples denominadas
“neurônios”, de modo que esta rede possa
interpretar sinais elétricos e apresentar uma
resposta adequada para o sistema
(HAYKIN, 2001).
A aplicação desenvolvida no presente
trabalho pode ser classificada como
pertencente à área de Automação de
Veículos Não-Tripulados e de Controle
Automático, pois utiliza uma rede neural
embarcada conectada a sensores de
proximidade para a coleta de informações do
ambiente, processamento dos dados e
identificação, com base em um treinamento
realizado no próprio dispositivo, da função
de acionamento dos motores que controlam
a direção de um veículo.
O ambiente físico escolhido para embarcar a
rede neural foi a plataforma de prototipagem
eletrônica Arduino Due.
Sua escolha deveu-se a cinco fatores
principais: modelo do microcontrolador
contido na placa (AT91SAM3X8E – ARM
Cortex-M3); velocidade de clock (84 MHz);
número de pinos de entrada e saída; acervo
bibliográfico existente; e por ter uma
linguagem de programação baseada em
C/C++, que possibilita a criação de objetos e
classes.
2 REDES NEURAIS
Segundo Haykin, uma rede neural artificial é
uma máquina que é projetada para modelar a
maneira como o cérebro realiza uma tarefa
particular ou função de interesse.
As redes neurais artificiais têm seus
primeiros estudos datados de 1943, porém só
passaram a ser fortemente pesquisadas no
início dos anos 90 e ainda possuem um
potencial de pesquisa imenso. Sua teoria
baseia-se nos neurônios biológicos (PIÃO,
2012), que serão descritos a seguir.
2.1 Neurônio Biológico
Os neurônios são as células constituintes do
cérebro e, tipicamente, são de cinco a seis
vezes mais lentos que as portas lógicas em
silício, contudo, devido ao número
espantosamente elevado de neurônios no
cérebro, permitem que o cérebro realize
algumas operações, como o reconhecimento
de imagens mais rapidamente que
computadores (MITCHELL, 1997). A
interação entre estes neurônios se dá através
de sinapses.
As sinapses são unidades estruturais e
funcionais que medeiam as interações entre
os neurônios. Uma sinapse converte um
sinal elétrico pré-sináptico em um sinal
químico e então volta em um sinal elétrico e
sua principal função é transmitir ou barrar o
envio da informação vinda do axônio.
Figura 1 – Neurônio biológico
Fonte: http://www.infoescola.com/wp-
content/uploads/2010/01/neur%C3%B4nio.gif
O funcionamento de um neurônio biológico
(figura 1) pode ser melhor compreendido se
este for subdividido em três partes:
dendritos, núcleo e axônio.
Os dendritos são responsáveis por captar a
informação vinda dos outros neurônios. As
informações advindas de todas as entradas
são acumuladas no núcleo da célula e, por
fim, caso o neurônio seja ativado, o impulso
nervoso resultante é enviado ao axônio que é
o responsável por transmitir o sinal às
próximas células (SOUSA, 2011).
3. 3
2.2 Neurônios Artificiais
O modelo de um neurônio artificial similar à
estrutura de um neurônio natural foi
proposto por McCulloch e Pitts, em 1943, e,
como visto na figura 2, é um modelo
bastante simples, porém ainda é o modelo
mais usado em arquiteturas de redes neurais
artificias, pois reproduz algumas
características de um neurônio biológico.
(PIÃO, 2012).
Figura 2 – Modelo não-linear de neurônio
Fonte: HAYKIN, S. Redes Neurais – Princípios e
Práticas. Porto Alegre: Bookman, 2001. p.36
Ainda segundo Pião, as entradas
representam os pulsos recebidos pelos
neurônios biológicos, estes podendo ser
advindos de outro neurônio ou mesmo de
fatores externos; os pesos representam a
sensibilidade da membrana pós-sináptica
dos neurônios biológicos; a soma do produto
das entradas pelos seus pesos é efetuada no
bloco somador; o parâmetro bias representa
o limiar de disparo do neurônio biológico, e
a subtração deste representa a comparação
do potencial pós-sináptico com o limiar de
disparo; a saída ‘u’ é equivalente ao pulso de
saída do neurônio biológico; a função de
ativação representa a concentração de
neurotransmissores da membrana pré-
sináptica do neurônio biológico; e, por fim, a
saída ‘y’ equivale a saída final do neurônio
biológico.
Os sinais de entrada são ponderados de
acordo com os pesos de suas conexões, e
essa ponderação é feita através da
multiplicação dos valores da entrada pelo
peso. Todas as entradas são somadas após a
ponderação, e então este valor é submetido a
uma função de ativação, determinando o
limiar de disparo da saída do neurônio.
Para o funcionamento eficiente desta rede
artificial, é necessário que os pesos de
ponderação estejam com valores capazes de
balancear bem os valores de entrada. Para
isso é necessário que a rede seja ‘treinada’.
O processo de treinamento é feito
apresentando à rede diversas amostras dos
parâmetros de entrada, juntamente com a
saída que é desejada para que a rede possa
mapear os valores de saída de acordo com
entradas recebidas. Quanto maior for
número de exemplos apresentados no
treinamento, melhor a rede será treinada.
2.3 Perceptron de múltiplas camadas
Uma Rede Neural é uma rede formada pela
conexão de vários dos neurônios citados
anteriormente (também conhecidos como
Perceptron).
Neurônios diferentes ligados às mesmas
entradas e às mesmas saídas são
considerados neurônios pertencentes a uma
mesma camada, e quando uma rede neural é
formada por várias camadas de neurônios
Perceptron, está é considerada uma Rede
Perceptron de Múltiplas Camadas, ou PMC.
As redes PMC são redes versáteis que
possuem inúmeras aplicações, tais como
aproximação de funções, reconhecimento de
padrões, identificação e controle de
processos, previsão de séries temporais,
otimização de sistemas. (HAYKIN, 2001).
3 METODOLOGIA
Este trabalho visa a construção de uma rede
PMC para a aproximação de funções, sendo
que tanto seu treinamento quanto sua
execução sejam feitos diretamente em
hardware, sem conexão a um computador
para o cálculo dos pesos. Esta rede foi
aplicada à condução de um pequeno veículo
dotado de um conjunto de sensores para que
4. 4
pudesse aprender a função de controle dos
motores segundo os dados de obstáculos do
percurso captados pelos elementos sensores.
3.1 Aspectos computacionais
A plataforma Arduino, apesar de sua vasta
comunidade de desenvolvedores, não possui
uma biblioteca de fácil acesso para a criação
e desenvolvimento de Redes Neurais
Artificiais, e, por esse motivo, percebeu-se a
oportunidade de desenvolver algo que viesse
a ser útil não apenas neste trabalho, mas
também em trabalhos futuros que desejem
utilizar a plataforma Arduino como
hardware no qual uma Rede Neural esteja
embarcada, inclusive por outros
pesquisadores. Sendo assim, a etapa inicial
deste projeto foi o de desenvolvimento desta
biblioteca.
As características do modelo do neurônio
Perceptron e sua forma de aplicação nas
redes neurais, juntamente com o fato de a
linguagem de programação C++ ser
orientada a objeto, possibilitaram tornar o
Neurônio uma classe de objeto programável.
Ou seja, a partir da biblioteca criada torna-se
possível a criação de vetores e matrizes de
neurônios de forma a construir uma rede
neural com uma linha de comando.
Como foi dito anteriormente, a camada de
uma rede neural é um conjunto de neurônios
que compartilham das mesmas entradas e
saídas, sendo assim, um vetor de neurônios
com essas características pode ser encarado
como uma Camada. Partindo deste princípio
surgiu na biblioteca a classe de Camadas.
Por fim, a biblioteca desenvolvida apresenta
um conjunto de funções para
desenvolvimento de uma rede PMC,
possibilitando que a alteração de poucos
parâmetros tais como a topologia, ou função
dos neurônios de uma camada, que
permitam reestruturar inteiramente a rede.
Desenvolver a rede neural sobre o conceito
computacional de objeto foi vital para que os
testes de diferentes topologias de rede
fossem viáveis ao longo do projeto.
Atualmente esta biblioteca encontra-se
disponível no site:
https://github.com/TiagoPrata/Neuronio
Outro aspecto computacional importante
para o desenvolvimento do projeto foi a
existência de uma biblioteca para a
integração de um controle sem fio ao
Arduino.
Este controle foi utilizado no processo de
treinamento e será mais detalhado a seguir.
3.2 Aspectos de hardware
Para que o treinamento e execução desta
rede neural pudessem ser visualizados de
forma prática, foi construído um veículo de
pequeno porte, munido com 8 sensores
ultrassônicos e dois motores DC de 5V para
controle e direcionamento do mesmo.
O sensor utilizado foi o HC-SR04 (figura 3).
Nele, além dos terminais de alimentação
(Vcc e Gnd), há outros dois terminais, Trig e
Echo, que são responsáveis pelo disparo do
sinal do sensor e pela indicação da sua
resposta, respectivamente.
Figura 3 – Sensor ultrassônico HC-SR04
Uma vez que o terminal Trig é disparado, o
alto-falante do sensor dispara um sinal
sonoro e o terminal Echo mantem-se em
nível lógico 1 até que este sinal ecoado seja
recebido, dessa forma é possível avaliar a
distância de um objeto de acordo com o
tempo que o sinal de resposta demora para
atingir o sensor.
Apesar da fácil utilização este sensor
apresenta incompatibilidade de tensão com o
Arduino Due, uma vez que esse Arduino
5. 5
trabalha com tensão nominal de 3,3V e o
sensor 5V.
Para solucionar esse problema foram
desenvolvidas interfaces de tensão
utilizando transistores MOSFET 2N7000 e
resistores como mostrado no diagrama da
figura 4.
Figura 4 – Interface entre sensor ultrassônico e
Arduino
Para o acionamento dos motores utilizou-se
o drive TB6612FNG (figura 5), pois através
dele foi possível realizar o acionamento dos
motores utilizando sinais PWM.
A tabela 1 descreve os terminais do drive e
indica suas funções.
Figura 5 – Drive de acionamento dos motores
Pino Descrição
GND Terra do drive
VCC Alimentação do drive (3.3V)
AO1
Saída para Motor A
AO2
BO1
Saída para Motor B
BO2
VMOT Alimentação do motor
GND Terra do motor
PWMA Acionamento PWM do motor A
AIN2 Terminais que definem sentido de
rotação do motor AAIN1
STBY Utilizado para desligar o drive
BIN1 Terminais que definem sentido de
rotação do motor ABIN2
PWMB Acionamento PWM do motor B
GND Terra do drive
Tabela 1 – Terminais do drive TB6612FNG
Na figura 6 é possível verificar o
veículo construído.
Figura 6 – Veículo construído
Para a utilização do controle remoto descrito
anteriormente foi necessária a associação de
um microcontrolador ATMEGA328P ao
Arduino Due. Este microcontrolador é
responsável; por coletar os dados recebidos
através do controle remoto e enviá-los para o
Arduino. A comunicação entre eles foi feita
utilizando protocolo I²C. (http://www.i2c-
bus.org/)
3.3 Funcionamento
Inicialmente, durante a fase de treinamento
da rede, o veículo deve ser conduzido
6. 6
utilizando o controle remoto a ele conectado.
Nesta fase, ao passo que o veículo é guiado,
a rede armazena os dados dos sensores
ultrassônicos e também os sinais que são
enviados para os motores; estes sinais são do
tipo PWM, pois podem modificar a tensão
aplicada variando a largura do pulso de
onda. Os dados coletados pelos sensores são
utilizados como os sinais de entrada da rede
e os sinais dos motores são a saída desejada
para o treinamento.
Antes que esses sinais possam ser lidos pela
rede neural eles devem ser pré-processados,
pois a rede tem um melhor desempenho
trabalhando com valores entre 0 e 1.
(NUNES, 2010)
Os sinais advindos dos sensores
ultrassônicos são, inicialmente, inteiros com
5 casas, portanto para adequá-los a entrada
da rede deve-se utilizar a divisão simples a
seguir:
𝐸𝑛𝑡𝑟𝑎𝑑𝑎𝑖 =
(𝑆𝑖𝑛𝑎𝑙 𝑑𝑜 𝑠𝑒𝑛𝑠𝑜𝑟)𝑖
100000
O sinal PWM originado do Arduino e que é
enviado para o motor tem uma resolução de
8 bits, ou seja, pode variar entre 0 e 255,
porém, além disso há mais dois bits (que são
associados aos pinos xIN1 e xIN2 do drive
TB6612FNG, e onde ‘x’ pode ser o motor A
ou B) que definem o sentido de rotação dos
motores. Como o sinal tratado deve variar
entre 0 e 1 definiu-se que: entre 0 e 1
3⁄ é a
variação do sinal PWM para o motor
girando no sentido horário; entre 1
3⁄ e 2
3⁄ é
a faixa em que o motor está parado; e entre
2
3⁄ e 1 é a variação do sinal PWM para o
motor girando no sentido anti-horário. Como
exemplificado na figura a seguir.
Figura 7 – Adequação do sinal PWM
Esta rede, portanto, tem como objetivo fazer
uma aproximação de função onde os valores
lidos nos sensores ultrassônicos são as
variáveis de entrada e o sinal PWM
resultante dos comandos enviados pelo
controle sem fio é o valor de saída da função
a ser generalizada pela Rede Neural. Desta
forma, foram implementadas diretamente em
hardware, duas Redes Neurais semelhantes;
uma para o sinal PWM do motor A e outra
para o sinal PWM do motor B, assim como
indicado abaixo.
𝑃𝑊𝑀𝐴 = 𝑓𝐴(𝑠1, 𝑠2, 𝑠3, 𝑠4, 𝑠5, 𝑠6, 𝑠7, 𝑠8)
𝑃𝑊𝑀 𝐵 = 𝑓𝐵(𝑠1, 𝑠2, 𝑠3, 𝑠4, 𝑠5, 𝑠6, 𝑠7, 𝑠8)
A figura 8 mostra uma representação da rede
desenvolvida, onde sua topologia segue o
método de Kolmogorov (NUNES, 2010):
𝑁 = 2. 𝐸 + 1
Onde N é o número de neurônios na camada
escondida e E o número de entradas.
Como temos 8 sinais de entrada, teremos 17
neurônios na camada escondida.
7. 7
Figura 8 – Representação da PMC
4 RESULTADOS
Para fins comparativos, implementou-se
uma rede embarcada no Arduino Due e outra
projetada em MatLab, rodando em um
computador com processador Intel Core 2
Duo, 4Gb de memória RAM e Windows 8,
ambas com a mesma topologia de rede e
com os mesmos valores de treinamento.
Inicialmente verificou-se que a rede
embarcada necessita de algumas interações a
mais para alcançar o critério de parada,
porém sua velocidade de treinamento foi
aproximadamente 20% superior em
comparação com a rede neural executada no
computador citado. Ambas tiveram margem
de acerto de 99,8% quando aplicadas a um
banco de dados controlado para comparação
do funcionamento dos processos de
treinamento das redes.
A figura 9 mostra um gráfico comparativo
entre os dados obtidos no processo de
treinamento com o banco de dados de
controle.
Figura 9 – Dados obtidos nos treinamentos
A linha azul mostra os valores desejados de
saída da rede; em vermelho estão os valores
obtidos pelo treinamento no MatLab; e a cor
verde mostra os valores obtidos com a PMC
embarcada em Arduino.
5 CONCLUSÃO
Ao aplicar-se a rede neural embarcada os
dados de treinamento deste projeto
(informações coletadas pelo conjunto sensor
8. 8
associadas ao comando dos motores
orientados pelo controle sem fio) verificou-
se que a rede é capaz de generalizar a função
de condução do veículo.
Uma dificuldade encontrada na construção
foi o fato de o processador ARM Cortex-M3
não conseguir realizar tarefas em paralelo.
Isso dificulta muito a precisão da coleta de
dados, pois há um atraso causado pelo seu
processamento sequencial, pois o momento
que ocorre a leitura dos dados dos sensores
não é o mesmo da coleta de dados dos
motores, assim as informações de entradas
coletadas podem não condizer com a saída
desejada.
Contudo a rede neural embarcada foi
treinada e executada com sucesso e com um
desempenho equivalente ao de um
treinamento realizado em computador.
6 REFERENCIAS
HAYKIN, Simon. Redes Neurais –
Princípios e Práticas. Porto Alegre:
Bookman, 2001.
PIÃO, S. S. Implementação de rede neural
artificial em FPGA utilizando VHDL.
EESC/USP, 2012.
SOUSA, M. A. A; TORRES, T. F. J.
Implementação direta de uma rede neural
artificial em hardware e sua aplicabilidade
no reconhecimento de padrões para
separação de frutas. São Paulo: Sinergia,
vol. 12, n. 1, p. 50-58, 2011.
MITCHELL, Tom M. Machine Learning.
McGraw-Hill, First Edition, 1997.
NUNES, Ivan; SPATTI, Danilo;
FLAUZINO, Rogério. Redes Neurais
Artificiais para engenharia e ciências
aplicadas. São Paulo: Artliber, 2010.