Prévia do material em texto
FEMEC42082 – Redes Industriais Apostila de Apoio Bibliotecas Arduino® para Auxílio nas Aulas Práticas de Redes Industriais Autores: Álisson Carvalho Vasconcelos e José Jean Paul Zanlucchi de Souza Tavares 2024 Resumo: O ensino de disciplinas técnicas enfrenta desafios de acesso devido ao alto custo de equipamentos específicos, e com a mudança para um modelo híbrido presencial-remoto, a necessidade de laboratórios remotos é evidente. Nesse contexto, as tendências pedagógicas como IoT e laboratórios remotos ganham destaque. Protocolos como I2C, Ethernet e ZigBee são fundamentais em redes industriais. Todos esses protocolos são passíveis de serem implementados na prática usando plataformas de baixo custo como é o Arduino, todavia, sua implementação não é trival. Esse artigo desenvolve bibliotecas específicas para esses protocolos com o objetivo de facilitar a inicialização, implementação e geração de pacotes de dados. O desenvolvimento das bibliotecas I2C.h, Ethernet_UDP.h e Xbee_API.h melhorou significativamente a efetividade das práticas laboratoriais da disciplina de Redes Industriais da Universidade Federal de Uberlândia, ampliando o acesso dos alunos a tecnologias essenciais. Palavras-chaves: Arduino®; I2C; Ethernet; UDP; Xbee; ZigBee; Redes Industriais. 1. INTRODUÇÃO De acordo com Stemmer (2010), no que concerne redes industriais, a base das mesmas se apoia em protocolos mestre-escravo, token-passing (IEEE802.4), token-ring (IEEE802.5), ethernet (IEEE802.3) e comunicação sem fio industrial (IEEE802.14). Há diversas tecnologias mestre-escravo, sendo uma delas o protocolo de Circuito Inter-Integrado (I2C – Inter-Integrated Circuit) (MANKAR et al. 2014) (DEEPIKA et YADAV, 2018). A ethernet industrial ainda é vista como um protocolo não determinístico e iniciativas com conexões sensíveis ao tempo estão sendo desenvolvidas (METAAL et al. 2020) como também a pontualidade em redes Ethernet industriais comutadas (SKEIE JOHANNESSEN et. HOLMEIDE, 2006). Redes sem fio industriais se baseiam na tecnologia Zigbee (PAN et TSENG, 2007) (AHAMED, 2009). De acordo com Mankar et al. (2014), o protocolo I2C é uma forma de comunicação serial entre dispositivos eletrônicos como o Arduino® e o ESP32®. Esse protocolo oferece uma maneira eficiente e simplificada de trocar informações por meio de um barramento contendo uma linha de dados (SDA) e uma linha de clock (SCL). O I2C permite a conexão de múltiplos dispositivos em um barramento serial, facilitando a comunicação entre microcontroladores, sensores e outros periféricos. Para facilitar a implementação do protocolo I2C, existem bibliotecas disponíveis no Ambiente de Desenvolvimento Integrado ou IDE (do inglês Integrated Development Environment) Arduino® que oferecem uma interface de programação consistente e simplificada. Essas bibliotecas abstraem os detalhes de baixo nível da comunicação serial, permitindo que os desenvolvedores se concentrem na lógica da aplicação. Com as bibliotecas I2C, é possível configurar, enviar e receber dados através do protocolo I2C com facilidade, agilizando o desenvolvimento de sistemas embarcados em Arduino® e dispositivos eletrônicos que se integram com o IDE, como é o caso do ESP32®. De acordo com Stemmer (2010), o protocolo Ethernet pode ser implementado como UDP (Protocolo de Datagrama do Usuário – User Datagram Protocol) ou TCP (Protocolo de Controle de Transmissão – Transmition Control Protocol). O protocolo Ethernet é uma tecnologia de comunicação amplamente utilizada para transmitir dados em redes de forma mais leve e rápida, todavia não garante a entrega dos dados devido ao fato de poder ocorrer colisão de dados. Para sistemas que não dependem de informações importantes, a implementação da UDP é a escolha perfeita. Para sistema que dependem de informações importantes e que tenha problemas de colisão de dados é recomendado o TCP. Para simplificar o uso do protocolo Ethernet no IDE Arduino®, existem bibliotecas dedicadas que fornecem uma interface de programação fácil de usar para configurar e controlar a comunicação de rede, tanto UDP como TCP. Esse artigo foca no protocolo Ethernet UDP. No campo das redes de sensores sem fio e de IoT, o protocolo ZigBee se destaca como uma tecnologia de comunicação de baixo consumo de energia e curto alcance. O ZigBee permite a criação de redes auto- organizáveis em malha, ideais para aplicações que requerem comunicação confiável entre dispositivos distribuídos. Para facilitar a integração no IDE Arduino® existem bibliotecas como a Xbee.h, que oferecem ferramentas e recursos para simplificar o desenvolvimento de sistemas ZigBee. Todas as bibliotecas existentes no IDE, apesar de haver exemplos de uso, não são de fácil implementação. Essa apostila tem o objetivo de desenvolver bibliotecas para inicializar e implementar a geração de pacotes de dados no IDE Arduino que facilitem a implementação das redes I2C.h, Ethernet_UDP.h e Xbee.h. O protocolo I2C está detalhado na seção 2 seguido de da biblioteca I2C.h (seção 3). O protocolo Ethernet UDP está apresentado na seção 4, seguido da biblioteca Ethernet_UDP.h (seção 5). A seção 6 mostra o Protocolo Zigbee e a seção 7 detalha a biblioteca Xbee.h. Na seção 8 é apresentado os testes das bibliotecas seguido da Conclusão e Bibliografia. 2. PROTOCOLO I2C Conforme já mencionado, o protocolo I2C envolve o uso de duas linhas para transmissão de dados: clock serial (SCL – Serial Clock) que pulsa em intervalos regulares, e dados serial (SDA – Serial Data) no qual os dados são enviados entre dois ou mais dispositivos. Este protocolo é composto por um dispositivo controlador (Mestre), e um ou mais dispositivos periféricos (Escravo) conectados às linhas SCL e SDA dos controladores. Quando o controlador endereça o dispositivo, o controlador executa a requisição/transmissão de dados e o dispositivo executa a leitura/transmissão de dados por meio do clock gerado na linha SCL. Cada dispositivo no barramento I2C é funcionalmente independente do controlador, mas responderá com informações quando solicitado pelo controlador. Conforme Fig. 1 o pacote do protocolo I2C é composto por um cabeçalho de início de pacote (start), sete bits de endereçamento de escravo (7 bit Address), um bit identificador do tipo de requisição (Read/Write ou leitura ou escrita), um ou mais bits de confirmação de envio ou recebimento dos dados (Acknowledge), um ou mais pacotes de dados (Data pack) e um cabeçalho de fim de pacote (Stop). Fig. 1 Pacote I2C (STEMMER, 2010). Devido ao design de hardwares e às diversas diferenças arquitetônicas, a linha de comunicação I2C estão localizados em locais diferentes. A Tabela 1 representa o mapa de pinos para a linha de comunicação de alguns hardwares mais utilizados, bem como portas adicionais disponíveis. Tabela 1. Mapa de pinos das placas compatíveis com a plataforma Arduino IDE. Plataforma SDA SCL UNO & Nano A4 A5 MKR D11 D12 GIGA D9/D20/D1 01 D8/D21/D1 01 Mega & Due D20 D21 ESP32 GPIO21 GPIO22 Raspberry Pi 4 GPIO2 GPIO3 A ligação depende de cada módulo, mas obrigatoriamente todos os módulos devem ser alimentados (5V/3V3 e GND), com isso, podemos conectar a linha SCL e SDA entre os dispositivos para que ocorra a comunicação I2C (como o exemplo da Fig. 2), bem como entre dispositivos (Fig. 3). Quando mais de um módulo possui alimentação, não é necessário conectar a alimentação 5V/3V3 dos dois módulos Fig. 2 Exemplo de comunicação I2C entre um módulo e um UNO. Fig. 3 Exemplo de comunicação I2C entre dois Arduinos. 2.1 Biblioteca Wire.h A biblioteca Wire.h do IDE Arduino® permite a comunicação com dispositivos I2C (Inter-Integrated Circuit – Circuito Inter Integrado), recurso que está presenteem grande parte das plataformas eletrônicas, como Arduino®, ESP32®, PN532®, LCD e outros dispositivos I2C. Ela permite conectar diversos dispositivos periféricos, como sensores, displays, drivers de motor e assim por diante, com apenas alguns fios. A implementação da biblioteca Wire.h utiliza um buffer de 32 bytes, portanto qualquer comunicação deve estar dentro deste limite. Exceder bytes em uma única transmissão será simplesmente descartado. Para o desenvolvimento foram utilizadas algumas funções contidas na biblioteca Wire.h, como begin, onRequest, onReceive, requestFrom, beginTransmission, endTransmission, available, read e write. A função begin inicializa a biblioteca Wire.h e ingressa ao barramento I2C dispositivos como controlador ou periférico. A função onRequest registra uma função a ser chamada quando ocorrer o evento de solicitação de dados dos dispositivos periféricos para o dispositivo controlador. A função onReceive registra uma função a ser chamada quando ocorrer o evento de transmissão de dados do dispositivo controlador para os dispositivos periféricos. A função requestFrom é utilizada pelo dispositivo controlador para solicitar dados limitados (bytes) de um dispositivo periférico. A função beginTransmission inicia uma transmissão do dispositivo controlador com o dispositivo periférico endereçado, permitindo o enfileiramento de bytes para a transmissão. A função endTrasmission finaliza uma transmissão com o dispositivo periférico, enviando o número de bytes contido na mensagem. A função available verifica se existem dados armazenados no buffer e retorna o número de bytes a serem lidos. A função read realiza a leitura dos dados armazenados no buffer, retorna o valor como inteiro. A função write realiza a escrita de bytes enfileirados ou não na linha SDA. 3. BIBLIOTECA I2C.H Com base nas informações do protocolo I2C e da biblioteca Wire.h, foi possível o desenvolvido de uma biblioteca capaz de inicializar e implementar a geração de pacotes de dados. Sendo assim, o desenvolvimento da biblioteca I2C.h realizada no laboratório de Planejamento Automático de Manufatura (MAPL) foi uma solução adotada para controle de sistemas pneumáticos aplicados no laboratório da disciplina de Redes Industriais do curso de Engenharia Mecatrônica da Universidade Federal de Uberlândia (UFU). A biblioteca I2C.h é composta de macros, vetores e funções. As macros são parâmetros constantes e responsáveis por definir dados importantes da biblioteca (Fig. 4). Os vetores são variáveis que armazenam informações para envio e recebimento de mensagem (Fig. 5). As funções contidas na biblioteca I2C são usadas na inicialização da biblioteca Wire.h (Fig. 6), para requisição e leitura de dados dos periféricos (Fig. 7), transmissão de dados/instruções para os periféricos (Fig. 8) e leitura/envio de dados dos periféricos para o controlador (Fig. 9). Fig. 4 Macros de setup da biblioteca I2C. Fig. 5 Criação do buffer de dados e inicialização de funções da biblioteca I2C. Fig. 6 Inicialização do controlador e dos periféricos da biblioteca I2C. Fig. 7 Requisição e leitura de dados dos periféricos configurados na biblioteca I2C.h. Fig. 8 Transmissão de dados/instruções para os periféricos configurados na biblioteca I2C.h. Fig. 9 Leitura/envio de dados dos periféricos para o controlador por meio da biblioteca I2C.h. 4. PROTOCOLO ETHERNET UDP O protocolo UDP é parte do protocolo Ethernet que utiliza de cabeamento de par trançado para transmissão de dados (RJ45) entre dispositivos, roteadores e periféricos. Este protocolo é composto por um ou mais clients (dispositivo cliente) e por um server (dispositivo servidor de dados). Quando o dispositivo cliente/servidor endereça um dispositivo cliente e ou servidor, o dispositivo cliente/servidor empacota os dados no formato UDP e transmite seus dados para os dispositivos cliente e ou servidor. Cada dispositivo na rede possui sua própria função, podendo realizar a leitura/transmissão de dados em rede. A Fig. 10 representa o empacotamento do quadro Ethernet UDP, onde são apresentados os pacotes dos cabeçalhos de frame, datagrama e UDP, e dos dados contidos na aplicação. 4.1 Módulos de Comunicação Ethernet Os módulos de comunicação Ethernet são meios de comunicação entre dispositivos e redes locais. Eles são compatíveis com diversos tipos de hardware/dispositivos, onde alguns são externos e outros internos nos dispositivos. Hardwares como Arduino® e ESP32® são exemplos de dispositivos que comunicam com módulos de Ethernet externo (W5100, W5200 e W5500), conforme mostra a Fig. 11. Fig. 10 Pacote Ethernet (STEMMER, 2010). Fig. 11 Módulo de comunicação Ethernet W5500. 4.2. Funções das Bibliotecas Ethernet.h e UDP.h A biblioteca Ethernet.h e UDP.h oferecem funcionalidades para controle dos módulos responsáveis pela conexão de servidores e clientes com redes locais. Esse recurso é presente em grande parte das plataformas eletrônicas, como Arduino® e ESP32®, oferecendo suporte para configuração automática de IP (DHCP) e resolução de nomes de domínio (DNS). Para o desenvolvimento foram utilizadas funções contidas na biblioteca Ethernet.h e UDP.h, como begin, hardwareStatus, linkStatus, beginPacket, endPacket, parsePacket, read e write. A função begin inicializa a biblioteca Ethernet e Ethernet UDP, e as configurações de rede. A função hardwareStatus informa o módulo Ethernet detectado (W5100, W5200 e W5500). A função linkStatus verifica a conexão com a rede. A função beginPacket inicializa o empacotamento dos dados a serem enviados. A função endPacket finaliza o empacotamento dos dados e envia a mensagem. A função parsePacket verifica a presença de um pacote UDP e retorna o tamanho do dado. A função read realiza a leitura dos dados UDP armazenados no buffer. A função write realiza a escrita de dados UDP no buffer para o envio. 5. BIBLIOTECA ETHERNET.H E UDP.H Com base nas informações do protocolo e da biblioteca Ethernet.h e UDP.h, foi possível o desenvolvimento de uma biblioteca capaz de inicializar e implementar a geração de pacotes de dados. Sendo assim, o desenvolvimento da biblioteca Ethernet_UDP.h realizada no MAPL foi uma solução adotada para controle de sistemas pneumáticos aplicados em laboratório da disciplina de Redes Industriais do curso de Engenharia Mecatrônica da UFU. A biblioteca é composta de macros, objetos, vetores e funções. As macros são parâmetros constantes e responsáveis por definir dados padrões da biblioteca (Fig. 12). O objeto é uma classe filha da biblioteca UDP, onde herda todos os métodos e parâmetros. Os vetores são variáveis que armazenam informações para o envio e recebimento de mensagens. As funções contidas na biblioteca Ethernet_UDP.h são usadas na inicialização da biblioteca UDP (Fig. 13), e para leitura/envio de dados contidos no buffer (Fig. 14). Fig. 12 Macros, objetos e vetores da biblioteca Ethernet_UDP.h. Fig. 13 Inicialização da biblioteca Ethernet_UDP.h. 6. PROTOCOLO ZIGBEE O protocolo ZigBee é um protocolo responsável pela comunicação entre dispositivos por meio de redes sem fio. Possui flexibilidade para vários tipos de topologias de rede, como estrela, malha e árvore (Fig. 15). Seu endereçamento é definido por softwares e é composto por 16 bytes. Nesse protocolo é encontrado dispositivos coordenadores, roteadores e dispositivos finais. Fig. 14 Leitura/envio de dados contidos no buffer da biblioteca Ethernet_UDP.h. Fig. 15 Topologia da Rede ZigBee (AHAMED, 2009). Quando o dispositivo endereça outro dispositivo, é realizado o empacotamento e a transmissão dos dados. Cada dispositivo possui seu próprio papel na rede, podendo realizar a leitura/transmissão de dados em pacotes ZigBee. A Fig. 16 representa o quadro ZigBee, onde são apresentadosos pacotes delimitadores de início (Start Delimiter), tamanho (Length), dados propriamente ditos (Frame Data) que possuem um identificador de tipo de informação (API Identifier) e os dados em si (Identifier-specific Data) e o dígito verificador (Checksum). Fig. 16 Pacote ZigBee com configuração API-Mode (STEMMER, 2010). O módulo Xbee é um hardware de comunicação entre dispositivos que estrutura redes ZigBee e é compatível com diversos tipos de hardware/dispositivos, utilizando ou não shields específicos. Hardwares como Arduino® e ESP32® são exemplos de dispositivos que comunicam com módulos Xbee externo e utilizam como meio de comunicação a interface UART – comunicação Serial (Fig. 17). Fig. 17 Módulo XBee com shield de comunicação para Arduino. Um diferencial com os outros módulos, é a necessidade de configurar o módulo antes de ser utilizado. Com o auxílio do software XCTU podemos configurar o módulo para o formato API-mode. A biblioteca XBee.h oferece funcionalidades para controle dos módulos Xbee, que realizam a comunicação utilizando o protocolo ZigBee. Esse recurso é utilizado em plataformas eletrônicas com programação em C++, como Arduino® e ESP32®, que utilizam o software Arduino IDE. 7. BIBLIOTECA XBEE.H Para o desenvolvimento da biblioteca Xbee_API.h foram utilizadas alguns métodos contidos na biblioteca Xbee.h, como setSerial, XBeeAddress64, getResponse, isAvailable, getApiID, getZBRxResponse, isError, getErrorCode, getZBTxStatusResponse, getModemStatusResponse, getOption, getData, getStatus, getDeliveryStatus, ZBTxRequest, readPacket e send. O método setSerial define a porta UART do dispositivo que será utilizado para comunicação entre o dispositivo e o módulo. O método XBeeAddress64 formata o endereço do destinatário para ser inserido no pacote ZigBee. O método getResponse realiza a captura da informação contida no buffer do XBee. O método isAvailable é utilizado após o método getResponse, ele identifica a existência de informações capturadas. O método getApiID é utilizado após o método getResponse, ele retorna o valor do ID da informação contida no buffer. O método getZBRxResponse é utilizado após o método getResponse, ele armazena na variável repassada como parâmetro do método a informação contida no buffer (dados). O método isError é utilizado após o método getResponse, e retorna à existência de erro na captura da informação contida no buffer. O método getErrorCode é utilizado após o método getResponse, ele retorna o erro causado durante a captura da informação no buffer. O método getZBTxStatusResponse é utilizado após o método getResponse, e armazena na variável repassada como parâmetro do método a informação contida no buffer (status). O método getModemStatusResponse é utilizado após o método getResponse, e verifica o status do buffer do XBee, onde indicara se o módulo XBee está conectado. O método getOption é utilizado na variável repassada para o método getZBRxResponse, ele informa se a captura de informação contida no buffer foi bem-sucedida. O método getData captura a informação armazenada na variável repassada para o método getZBRxResponse. O método getStatus captura a informação armazenada na variável repassada no método getModemStatusResponse. O método getDeliveryStatus é utilizado na variável repassada para o método getZBTxStatusResponse, ele informa se a captura da informação contida no buffer é o sucesso no envio da mensagem. O método ZBTxRequest é responsável por empacotar os dados para envio. O método readPacket realiza a leitura dos dados armazenados no buffer. O método send realiza o envio dos dados contidos no pacote gerado pelo método ZBTxRequest. Com base nas informações do protocolo ZigBee e da biblioteca XBee, foi possível o desenvolvimento de uma biblioteca capaz de inicializar e implementar a geração de pacotes de dados. Sendo assim, o desenvolvimento da biblioteca Xbee_API.h realizada no MAPL foi uma solução adotada para controle de sistemas pneumáticos aplicados em laboratório da disciplina de Redes Industriais do curso de Engenharia Mecatrônica da UFU. A biblioteca é composta de macros, objetos, variáveis e funções (Fig. 18). As macros são parâmetros contantes e responsáveis por definir dados padrão biblioteca. Os objetos são classes filhas das classes definidas na biblioteca XBee.h, onde herdam todos os métodos e parâmetros. A variável booleana é responsável por permitir a impressão quando a porta serial estiver livre. As funções contidas na biblioteca Xbee_API.h são usadas na inicialização da biblioteca XBee.h (Fig. 19), e para envio de dados contidos no buffer (Fig. 20). Fig. 18 Macros, objetos e variáveis da biblioteca Xbee_API.h. Fig. 19 Inicialização da biblioteca Xbee_API.h. 8. TESTES DAS BIBLIOTECAS NA PRÁTICA As aulas práticas da Disciplina de Redes Industriais do curso de Engenharia Mecatrônica da FEMEC/UFU no 1.o semestre de 2023 não fizeram uso das bibliotecas. Dos 8 grupos de alunos criados, apenas 1 conseguiu realizar o projeto final completamente, perfazendo 12,5% de efetividade. No 2.o semestre de 2023, após a aplicação das bibliotecas para inicializar e implementar a geração de pacotes de dados em I2C, Ethernet e Zigbee, foi atingido 100% de efetividade nos 4 grupos de alunos. As bibliotecas estão disponíveis no https://github.com/MAPL-UFU/Industrial-NetWork.git. https://github.com/MAPL-UFU/Industrial-NetWork.git Fig. 20 Envio de dados da biblioteca Xbee_API.h. REFERÊNCIAS Ahamed, S. S. (2009). The Role of Zigbee Technology in Future Data Communication System. Journal of Theoretical & Applied Information Technology 5.2. Disponível em https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=41850ca3b3d76c225d80deea7627adf759bd bda5. Acessado em 14 de maio de 2024. Alarcon, D., da Rosa, L.Q., da Silva, R.S., Müller, F.M., de Souza, M.V. (2018). O Desafio da Educação em Redes no Contexto da Indústria 4.0. Anais do VIII Congreso Internacional de Conocimiento e Innovación. Guadalaraja, 2018. Disponível em https://proceeding.ciki.ufsc.br/index.php/ciki/article/view/471/278. Acessado em 14 de maio de 2024. Deepika. D., YADAV, N. (2018). Design of Dual Master I2C Bus Controller and Interfacing it with DC Motor. Nos Anais de International Conference on Advances in Computing, Communication Control and Networking (ICACCCN), Greater Noida, India, 2018, pp. 668-673, doi: 10.1109/ICACCCN.2018.8748677. Giacomini, D. (2014). Desenvolvimento de um Módulo Educacional para Aprendizado de Redes Industriais. Trabalho de Conclusão de Curso. Universidade Federal de Santa Maria – UFSM. 2014. Disponível em https://www.ufsm.br/app/uploads/sites/495/2018/12/TCC_Douglas.pdf. Acessado em 14 de maio de 2024. Mankar, J., Darode, C., Trivedi, K., Kanoje, M., Shahare, P. (2014). Review of the I2C Protocol. International Journal of Research in Advent Technology, 2(1), 474-479. Disponível em https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=314537daa1f601f83044b25b68e2af6c8f331 f3f. Acessado em 14 de maio de 2024. Metaal, M.A., Guillaume, R., Steinmetz, R., Rizk, A. (2020). Integrated Industrial Ethernet Networks: Time-sensitive Networking over SDN Infrastructure for mixed Applications. Nos Anais de IFIP Networking Conference (Networking), Paris, France, pp. 803-808. Disponível em https://ieeexplore.ieee.org/abstract/document/9142734. Acessado em 14 de maio de 2024. Pan, M.S., Tseng, Y.C. (2007). ZigBee and Their Applications. In: Mahalik, N.P. (eds) Sensor Networks and Configuration. Springer, Berlin, Heidelberg. https://doi.org/10.1007/3-540-37366-7_16 Skeie, T., Johannessen, S., Holmeide, O. (2006). Timeliness of real-time IP communication in switched industrial Ethernet networks. IEEE Transactions on Industrial Informatics, vol. 2, no. 1, pp. 25-39, Feb. 2006, doi: 10.1109/TII.2006.869934.Stemmer, M.R. (2010). Redes Locais Industriais: A Integração da Produção Através das Redes de Comunicações. Editora UFSC, Florianópolis, 2010. https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=41850ca3b3d76c225d80deea7627adf759bdbda5 https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=41850ca3b3d76c225d80deea7627adf759bdbda5 https://proceeding.ciki.ufsc.br/index.php/ciki/article/view/471/278 https://www.ufsm.br/app/uploads/sites/495/2018/12/TCC_Douglas.pdf https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=314537daa1f601f83044b25b68e2af6c8f331f3f https://citeseerx.ist.psu.edu/document?repid=rep1&type=pdf&doi=314537daa1f601f83044b25b68e2af6c8f331f3f https://ieeexplore.ieee.org/abstract/document/9142734