TCC - Pedro Alves de Oliveira Neto v19 REV4
TCC - Pedro Alves de Oliveira Neto v19 REV4
TCC - Pedro Alves de Oliveira Neto v19 REV4
Recife
2024
Pedro Alves de Oliveira Neto
Recife
2024
ESTA FOLHA DEVERÁ SER TROCADA PELA FICHA ELETRÔNICA QUE SERÁ
ELABORADA PELO AUTOR EM https://fichaeletronica.ufpe.br/ficha.html
Folha reservada para a ficha eletrônica que deve ser emitida pelo
autor do trabalho, após a defesa e realização das alterações
sugeridas pela banca examinadora. A mesma deve ser gerada a partir
do preenchimento de dados através do link
https://www.ufpe.br/sib/graduacao-deposito.
Pedro Alves de Oliveira Neto
BANCA EXAMINADORA
___________________________________________
Prof. Dr. Alexander Barros Lima (Orientador)
Universidade Federal de Pernambuco
___________________________________________
Prof. Dr. Xxxxxxxxxxxxxxxxxxxxxx (Examinador Interno)
Universidade Federal de Pernambuco
__________________________________________
Prof. Dr. Xxxxxxxxxxxxxxxxxxxxxx (Examinador Interno)
Universidade Federal de Pernambuco
Dedico este trabalho ao Departamento de Engenharia Elétrica, que
proporcionou todo o suporte necessário para minha formação excepcional. Em
particular, expresso minha gratidão aos professores Dr. Fabrício Bradaschia e Dr.
Márcio Evaristo pela prontidão em me ajudar. À equipe Mangue Baja, pelos valores
técnicos e morais que obtive tão cedo, tornando-se minha família na engenharia. À
minha noiva Marcella Cavalcanti, por sempre me apoiar e estar do meu lado em
conquistas tão significantes. E em especial ao meu avô, Dr. Pedro Alves de Oliveira
Filho, por ter me transmitido o valor do conhecimento. Sem sua influência, não teria
alcançado tanto.
“O âmago do espírito do homem pede novas experiências.” (Jon
Krakauer)
RESUMO
In recent years, the automotive industry has been distinguished by its rapid
technological evolution, especially in terms of digitalization and vehicle connectivity.
The integration of more sophisticated electronic systems has become a competitive
advantage for manufacturers, with recent strides towards the Internet of Things and
Artificial Intelligence benefiting this sector marked by reinvention. This work has the
goal to develop automotive electronic central units, that are modulated in order to
acquire parameters from all of the vehicle and transmit it through telemetry to the
server, seeking the automotive project optimization. The thesis will also detail the
implementation of the MQTT communication channels as well as the databases
involved, which will be essential to ensure the data integrity. Furthermore, it will be
disserted the implementation of artificial intelligence reinforcement learning
algorithms and its role in optimizing the systems in question through iterations with
non-linear mathematical models of the real system, known as digital twins. In
conclusion, the project should achieve the goal to facilitate the automotive project
iterations by allowing the implementation of high-efficient optimization algorithms in
systems that are tested in limited ways as are the automotive systems, allowing the
collaboration between simulated data and real data I the convergence of optimized
project parameters.
1 INTRODUÇÃO.................................................................................................14
1.2 JUSTIFICATIVA............................................................................................... 15
1.3 OBJETIVOS..................................................................................................... 16
2 REFERENCIAL TEÓRICO...............................................................................18
2.1.1 Definição...........................................................................................................18
2.2.1 ECUs................................................................................................................ 19
2.2.2 Protocolo CAN..................................................................................................22
2.2.3 Software Automotivo........................................................................................ 24
2.3.1 MQTT............................................................................................................... 28
2.3.2 TCU.................................................................................................................. 29
3 DESENVOLVIMENTO..................................................................................... 36
3.1 PLANEJAMENTO.............................................................................................36
4 RESULTADOS.................................................................................................62
6 REFERÊNCIAS................................................................................................64
14
1 INTRODUÇÃO
1.2 Justificativa
simples do sistema real será explorada pelo algoritmo, o que servirá de auxílio para
otimizar os parâmetros do sistema real ao comparar os resultados reais e virtuais.
1.3 Objetivos
Assim, o sistema atual possui algumas etapas que devem ser acompanhadas,
com objetivos bem definidos. Inicialmente, os dados devem ser captados por um
sistema embarcado automotivo robusto. Este sistema é composto por um conjunto
de centrais eletrônicas especializadas, cuja topologia é otimizada para facilitar a
aquisição eficiente de dados em tempo real.
2 REFERENCIAL TEÓRICO
2.1.1 Definição
2.2.1 ECUs
Uma vez que a rede CAN permite a conexão de várias centrais em um único
barramento, ela se tornou fundamental na indústria automotiva, sendo regulada pela
norma SAE J1939. Para viabilizar essa conexão, a concorrência de mensagens na
24
rede ocorre com base na prioridade de cada ECU, garantindo que as mensagens
mais críticas tenham precedência para manter a característica de tempo real da rede
(SMITH, 2021).
2.2.3.1 Microcontrolador
STM32 5 4 5 4 4 3 98
ATMega328p 3 2 3 5 3 2 73
PIC16 5 2 2 3 2 1 69
ATMega2560 2 3 5 4 4 4 73
ESP32 3 5 4 5 5 5 100
Fonte: O Autor, 2024.
No trabalho atual não será diferente, visto que a linguagem C além de possuir
uma grande liberdade do projetista em lidar com o microcontrolador, possui um alto
número de usuários, o que aumenta o volume de material para estudo e bibliotecas
que auxiliam no desenvolvimento. O framework, que é um conjunto de ferramentas e
bibliotecas que fornece uma estrutura base para o desenvolvimento do software, que
possibilitará a integração da linguagem C com os microcontroladores escolhidos é a
26
IDE do Arduino para a ESP32 e o Mbed para a STM32, ambos possuem uma
grande facilidade de implementação considerando a escala trabalhada, possuindo
uma grande disponibilidade de documentação.
2.3.1 MQTT
2.3.2 TCU
Transceptor CAN TJA1050 Preparar os dados CAN para uso do controlador embutido na
ESP32
Microcontrolador ESP32 Processamento dos dados, executar o código
Fonte chaveada LM2596 Fornecer a tensão adequada para uma parte dos componentes
Regulador de tensão LM1117 Fornecer a tensão adequada para outra parte dos componentes
Tabela 3 - Dados que compõem o pacote transitado pela CAN e enviado pelo MQTT.
Dado Tipo Tamanho
Aceleração em X int16 2 Bytes
Total: 33 Bytes
Fonte: AGNUSDEI, Giulio Paolo; ELIA, Valerio; GNONI, Maria Grazia (2021, p. 2767).
Para a visualização dos sistemas é utilizado o Unity 3D, uma ferramenta poderosa e
flexível para o desenvolvimento de jogos que também é utilizado para criar
visualizações de alta qualidade com interação por outros sistemas, que finaliza a
implementação de um gêmeo virtual com algoritmos de otimização.
36
3 DESENVOLVIMENTO
3.1 Planejamento
uma central traseira. Nas Tabelas 4, 5 e 6 foram descritas as funções de cada uma
dessas centrais, e posteriormente os circuitos dessas funcionalidades vão ser
detalhados.
Como visto na secção 2.2.1 o projeto do software embarcado deve ter sua
arquitetura de software detalhada. Assim, na etapa inicial, a Figura 8 contém o
diagrama de arquitetura de software, que foi planejada inicialmente para atender
todos os requisitos de uma ECU do projeto. Ele oferece uma visão dos principais
componentes, sendo assim, foi desenvolvido um diagrama que é suficiente para
representar os recursos que serão implementados nas 3 centrais. Na imagem é
possível identificar que quanto mais próximo da camada de aplicação, que é onde o
código é implementado, maior a abstração do hardware. Assim, as camadas foram
definidas como:
dado ser enviado pela TCU, um broker MQTT recebe esse pacote de dados a cada
5 segundos, tratando em seguida para salvamento em banco de dados.
O banco de dados é uma parte importante do projeto uma vez que é o ponto
de consulta central das aplicações de otimização. De maneira análoga à escolha da
tecnologia para o broker MQTT, o PostgreSQL foi escolhido como tecnologia de
banco de dados, fornecendo uma aplicação fácil e rápida, além de ser conhecido por
uma ótima escalabilidade em aplicações de grande porte (ASTERA, 2024).
um objeto. Como pode ser visto na Figura 15, as placas do capacitor são colocadas
de forma que o meio dielétrico é o ambiente externo, ao qual o sensor está
apontado, dessa maneira, materiais de diferentes constantes dielétricas irão resultar
em uma alteração na capacitância medida pelo dispositivo.
Com isso em contexto, basta tratar esse sinal gerado pela vela para que haja
a medição de rotação. O circuito para tal utiliza um opto-acoplador que, como
descrito em TUNG ([s.d].), funciona como forma de isolar o circuito que gera o sinal
com o circuito de aquisição. Logo, o sinal periódico faz com que um LED interno ao
componente acenda conforme o número de rotações, o que gera um sinal digital
com o nível de tensão correto para o microcontrolador implementar um contador de
rotações por tempo.
3.2.2 Componentes
O software utilizado para o projeto das placas foi o KiCad, uma vez que ele
possui código aberto e um bom suporte da comunidade, nele foram definidos tanto
os esquemáticos quanto o design da placa de circuitos. Como visto em JONES
(2004), uma boa configuração padrão para o design de PCIs que pode ser aplicada
em diversos projetos assegurando uma robustez são os valores de 25 milésimos de
polegada para trilhas de sinais, 50 milésimos de polegada para trilhas de potência,
15 milésimos de polegada de distância para outras trilhas e componentes. Ainda,
JONES (2004) define o tamanho do diâmetro da ilha de soldagem de um
componente de furo passante em 1,8 vezes o tamanho do diâmetro do furo.
Além disso, durante o projeto foi notado que as centrais dianteira e traseira
possuem circuitos extremamente semelhantes, com microcontroladores iguais e
diferenciando apenas nos circuitos. Uma vez que podemos tratar os circuitos como
módulos isolados, o projeto realizado uniu ambos os esquemáticos em uma única
placa de circuito impresso, visando melhor custo de produção, o que compensa na
aplicação de menor escala.
3.2.4 Prototipagem
3.2.5 Fabricação
A IDE escolhida para desenvolver o código das centrais foi o VS Code, uma
vez que permite a adição de extensões que facilitam o desenvolvimento. Tanto a
STM32 quanto a ESP32 possuem suporte pela extensão do PlatformIO, que facilita
a integração da IDE com os frameworks de desenvolvimento dessas placas, o
Arduino para a ESP32 e o Mbed OS para a STM32.
A relação entre componentes, como a obtenção do dado via CAN para envio
no MQTT por exemplo, deve ser definida então no código principal, ou main.c, dessa
maneira, qualquer componente que seja adicionado em um momento futuro ao
desenvolvimento, e que deve lidar com componentes já utilizados pelo código, não
irá causar problemas pelo “efeito espaguete” (HUGO, 2017), em que o código
assume um fluxo de controle intrincado, tornando a compreensão e manutenção
extremamente difíceis.
3.3.3 Depuração
4 RESULTADOS
6 REFERÊNCIAS
AGNUSDEI, Giulio Paolo; ELIA, Valerio; GNONI, Maria Grazia. Is digital twin
technology supporting safety management? A bibliometric and systematic review.
Applied Sciences, v. 11, n. 6, p. 2767, 2021.
ALI, Mohammed Hasan et al. Big data analysis and cloud computing for smart
transportation system integration. Multimedia Tools and Applications, p. 1-18, 2022.
BATTY, Michael. Digital twins. Environment and Planning B: Urban Analytics and
City Science, v. 45, n. 5, p. 817-820, 2018.
CONTESINI, Leonardo. Afinal o que é ECU? Como elas funcionam?. FlatOut Brasil,
2017. Disponível em: https://flatout.com.br/afinal-o-que-e-ecu-como-elas-funcionam/.
Acesso em: 2 fev. 2024
ESPRESSIF SYSTEMS (Xangai). ESP32 Series Datasheet. [S. l.: s. n.], 2023
FANTON, Darek. What is CAN bus and why is it so important?. OnLogic Blog, 2022.
Disponível em: https://www.onlogic.com/company/io-hub/what-is-can-bus/. Acesso
em: 2 fev. 2024
FRIGIERI, Edielson Prevato et al. Embedded Micro Application Server in Intel Mini-
ITX DN2800MT for Interaction with the ARM Cortex-M3. 2013.
HIVEMQ. What is MQTT Last Will and Testament (LWT)? – MQTT Essentials: Part
9. HiveMQ, 2015. Disponível em: https://www.hivemq.com/blog/mqtt-essentials-part-
9-last-will-and-testament/. Acesso em: 3 fev. 2024
JUNIOR, Adair Montagna. Protocolo CAN: Visão Geral e Aplicações. LRI Automação
Industrial, 2023. Disponível em: https://blog.lri.com.br/0-protocolo-can-visao-geral-e-
aplicacoes/. Acesso em: 3 fev. 2024
KAISER, Martin. Electronic control unit (ECU). In: Gasoline Engine Management:
Systems and Components. Wiesbaden: Springer Fachmedien Wiesbaden, 2014. p.
254-259.
KUECK, Christian. The Right Power Supply Can Simplify Automotive ECU Design.
Analog Devices, 2013. Disponível em:
https://www.analog.com/en/resources/technical-articles/the-right-power-supply-can-
simplify-automotive-ecu-design.html. Acesso em: 2 fev. 2024
LOCONAV. The What, Why, How of a Telematics Control Unit. LocoNav, 2022.
Disponível em: https://loconav.com/blog/telematics-control-unit/. Acesso em: 3 fev.
2024
MARTINS, Julia. Sete passos simples e rápidos para criar uma matriz de decisões,
com exemplos. Asana, 2021. Disponível em:
https://asana.com/pt/resources/decision-matrix-examples. Acesso em: 3 fev. 2024
MATTEDE, Henrique. Como seu carro se comunica? Rede CAN e OBD2!. Mundo da
Elétrica, [s.d]. Disponível em: https://www.mundodaeletrica.com/como-seu-carro-se-
comunica-rede-can-obd2/. Acesso em: 3 fev. 2024
PETTY, Mikel D. Modeling and validation challenges for Complex Systems. In:
Engineering Emergence. CRC Press, 2018. p. 199-216.
SMITH, Grant Maloy. O que é barramento CAN (Controller Area Network) e como
ele se compara a outras redes de barramento de veículos. DEWESoft, 2021.
Disponível em: https://dewesoft.com/pt/blog/que-e-barramento-can. Acesso em: 3
fev. 2024
SOLANKI, Vijender Kumar; DHALL, Rohit. An IoT based predictive connected car
maintenance approach. 2017.
68
TRACY, Phillip. MQTT protocol minimizes network bandwidth for the internet of
things. RCR Wireless News, 2016. Disponível em:
https://www.rcrwireless.com/20161129/featured/mqtt-internet-of-things-tag31-tag99.
Acesso em: 3 fev. 2024
TUNG, Megan. What is an Optocoupler and How it Works. Jameco, [s.d]. Disponível
em: https://www.jameco.com/Jameco/workshop/Howitworks/what-is-an-optocoupler-
and-how-it-works.html Acesso em: 3 fev. 2024
VEIGA, Fernando. Utilizando MQTT com Node Red. Medium, 2018. Disponível em:
https://medium.com/tht-things-hackers-team/utilizando-mqtt-com-node-red-
1b41352e9c85. Acesso em: 3 fev. 2024
XIA, Kaishu et al. A digital twin to train deep reinforcement learning agent for smart
manufacturing plants: Environment, interfaces and intelligence. Journal of
Manufacturing Systems, v. 58, p. 210-230, 2021.
69
Esse apêndice contém a função main.c e a função can.c que foram citadas de
exemplo de uso de componentes de maneira modular e escalável.
Código main.c
#include "can.h"
#include "uart.h"
QueueHandle_t can_to_uart_queue;
void app_main(void) {
configure_UART();
configure_CAN();
Código can.c
#include "can.h"
#include "../dbc/dbc_binUtil.h"
void configure_CAN(void) {
// Initialize configuration structures using macro initializers
can_general_config_t g_config =
CAN_GENERAL_CONFIG_DEFAULT(GPIO_NUM_19, GPIO_NUM_21,
CAN_MODE_NORMAL);
can_timing_config_t t_config = CAN_TIMING_CONFIG_500KBITS();
can_filter_config_t f_config = {.acceptance_code = 0xA4000000,
.acceptance_mask = 0x001FFFFF,
.single_filter = true};
return;
}
}
QueueHandle_t *uart_to_can_queue;
u_int8_t item;
while (1) {
if (xQueueReceive(*uart_to_can_queue, &item, 0) == pdTRUE) {
message.data[0] = item;
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
QueueHandle_t *can_to_uart_queue;
can_to_uart_queue = (QueueHandle_t *)pvParameters;
dbc_rx_t holder;
while (1) {
if (can_receive(&message, pdMS_TO_TICKS(10000)) == ESP_OK) {
uint32_t id = message.identifier;
uint8_t dlc = message.data_length_code;
vTaskDelay(100 / portTICK_PERIOD_MS);
}
}
71
console.log(lastJsonMessage);
setRecent(lastJsonMessage);
allData.unshift(lastJsonMessage);
setAllData(allData);
setGPSlist(allData);
}
},
shouldReconnect: (closeEvent) => true,
reconnectInterval: 3000
});
return (
<div className="hub-body">
<Navfooter cleanusertoken={cleanusertoken} />
<div className="main-body">
<div className="main-header"></div>
<div className="info-details">
<div className="info-widget">
<h1 className="info-title">Último dado</h1>
{recent ? (
<div className="info-block">
<h3>
Velocidade:{" "}
{recent.speed}
</h3>
<h3>
72
Rotação:{" "}
{recent.rpm}
</h3>
<h3>
Aceleração:{" "}
{"["+ recent.accx + ", " + recent.accy
+ ", " + recent.accz + "]"}
</h3>
<h3>
Temperatura:{" "}
{recent.temp}
</h3>
</div>
) : (
<h1 className="loading">.</h1>
)}
</div>
<div className="map-widget">
{gpslist.length > 0 && <MapContainer
latlnglist={gpslist} />}
</div>
</div>
<div className="logged-general">
<div className="logged-frequents">
<h1>Dados recebidos</h1>
<nav>
<ul>
{allData === null && <h1>.</h1>}
{allData &&
allData.map((detail) => (
<LoggedData
key={detail.time}
speed={detail.speed}
rpm={detail.rpm}
acc={detail.acc}
temp={detail.temp}
lat={detail.lat}
long={detail.long}
/>
))}
</ul>
</nav>
</div>
</div>
</div>
</div>
);
}
Esse apêndice contém o código fonte em Python que comunica com Simulink
para interação com a simulação de motor CC mostrada na Figura 27, além de se
comunicar com a ferramenta Unity 3D com o intuito de visualizar a resposta do
projeto visto na Figura 28.
Código Python
unity_comms = UnityComms(port=9000)
matlab_engine = matlab.engine.start_matlab()
matlab_engine.eval("b = 0",nargout=0)
matlab_engine.eval("J = 4",nargout=0)
matlab_engine.eval("Km = 2",nargout=0)
matlab_engine.eval("La = 1e-9",nargout=0)
matlab_engine.eval("Ra = 0.5",nargout=0)
matlab_engine.eval("model = 'APS1'",nargout=0)
matlab_engine.eval("load_system('APS1')",nargout=0)
print("Initialized Model")
matlab_engine.set_param('APS1','SimulationCommand','start','SimulationComma
nd','pause',nargout=0)
matlab_engine.set_param('APS1','SimulationCommand','continue', nargout=0)
matlab_engine.eval("wm_output = out.wm_output;",nargout=0)
matlab_engine.eval("tout = out.tout;",nargout=0)
wm_output = matlab_engine.workspace['wm_output']
tout = matlab_engine.workspace['tout']
unity_comms.Plot(data=wm_output)
unity_comms.PlotGraph(time=tout, data=wm_output)
matlab_engine.eval("La = 1",nargout=0)
matlab_engine.set_param('APS1','SimulationCommand','start',nargout=0)
matlab_engine.eval("wm_output = out.wm_output;",nargout=0)
matlab_engine.eval("tout = out.tout;",nargout=0)
wm_output = matlab_engine.workspace['wm_output']
tout = matlab_engine.workspace['tout']
75
matlab_engine.set_param('APS1','SimulationCommand','start','SimulationComma
nd','pause',nargout=0)
i = 0
la = 0.001
while (matlab_engine.get_param('APS1','SimulationStatus') != ('stopped' or
'terminating')):
#la += 0.001
#matlab_engine.eval("b = {}".format(la),nargout=0)
#i+=1
#print(i)
matlab_engine.set_param('APS1','SimulationCommand','continue','SimulationCo
mmand','pause', nargout=0)
matlab_engine.eval("wm_output = out.wm_output;",nargout=0)
matlab_engine.eval("tout = out.tout;",nargout=0)
wm_output = matlab_engine.workspace['wm_output']
tout = matlab_engine.workspace['tout']