FUNDAMENTOS DE SISTEMAS EMBARCADOS
Trabalho 1 - 2021/2
Trabalho 1 da disciplina de Fundamentos de Sistemas Embarcados (2021/2)
Para executar
-
Na pasta raiz do projeto
make
-
Execute
./bin/bin
1. Objetivos
Este trabalho tem por objetivo a implementação de um sistema (que simula) o controle de um forno para soldagem de placas de circuito impresso (PCBs). Abaixo vemos alguns exemplos de fornos comerciais para este propósito.
Reflow Oven - 1826 Mark5 | Forno LPKF Protoflow S4 | Controleo3 Reflow Oven |
---|---|---|
No trabalho, o aluno deverá desenvolver o software que efetua o controle de temperatura do forno utilizando dois atuadores para este controle: um resistor de potência de 15 Watts utilizado para aumentar temperatura e; uma ventoinha que puxa o ar externo (temperatura ambiente) para reduzir a temperatura do sistema.
Os comandos do usuário do sistema para definir a temperatura desejada serão controlados de três maneiras:
- Através de um Potenciômetro externo;
- Através de entrada de teclado no terminal;
- Seguindo uma curva de temperatura pré-definida em arquivo de configuração (Arquivo da Curva).
O controle da temperatura será realizado através da estratégia PID onde deverão estar disponíveis para o usuário o ajuste dos parâmetros Kp, Ki e Kd nas configurações do sistema (Via terminal).
2. Controle PID
A abordagem de controle a ser utilizado é o controle PID (Proporcional Integral Derivativo). O PID é um dos tipos mais simples de algoritmos de controle que proporciona um bom desempenho para uma grande variedade de aplicações.
O conceito fundamental desse tipo de controlador se baseia em monitorar uma variável de um processo (neste caso a temperatura interna) e medir a diferença entre seu valor atual (TI - Temperatura Interna) a uma valor de referência (TR - Temperatura de Referência) desejado. A partir dessa medida de Erro = TR - TI, toma-se uma ação de correção para que o sistema alcançe o valor desejado. O figura abaixo demonstra uma visão geral da estratégia de controle.
O controle PID une três tipos de ações sobre a variável de controle para minimizar o erro do sistema até que o mesmo alcançe a referência desejada. No caso deste sistema, nossa variável monitorada é a TI - Temparatura Interna e o seu controle é efetuado através do acionamento da Resistência (R) ou da Ventoinha (V) e nosso Erro é a diferença entre a temperatura de referência e a temperatura interna do sistema (Erro = TR - TI).
Detalhando as 3 ações do PID temos:
- Controle Proporcional (P): ajusta a variável de controle de forma proporcional ao erro, ou seja, quanto maior o erro, maior a intensidade de acionamento do resistor (0 a 100%). Esse ajuste é feito pela variável Kp.
- Controle Integral (PI): ajusta a variável de controle baseando-se no tempo em que o erro acontece, acumulando este erro (integral). Esse ajuste é feito pela variável Ki.
- Controle Derivativo (PD): ajusta a variável de controle tendo como base a taxa de variação do erro ou a velocidade com a qual o sistema está variando o erro. Esse ajuste é feito pela variável Kd.
A figura abaixo mostra as equações envolvidas no cálculo do PID.
O ajustes de cada constante do PID (Kp, Ki e Kd) tem efeitos distintos no controle do sistema conforme pode ser visto na figura abaixo.
4. Componentes do Sistema
O sistema como um todo é composto por:
- Ambiente fechado controlado com o resistor de potência e ventoinha;
- 01 Sensor DS18B20 (1-Wire) para a medição da temperatura interna (TI) do sistema;
- 01 Sensor BME280 (I2C) para a medição da temperatura externa (TE);
- 01 módulo Display LCD 16x2 com circuito I2C integrado (Controlador HD44780);
- 01 Conversor lógico bidirecional (3.3V / 5V);
- 01 Driver de potência para acionamento de duas cargas;
- 01 ESP32;
- 01 Potenciômetro (Para definir a temperatura de referência TR);
- 01 Switch (Para definir a estratégia de controle);
- 01 Raspberry Pi 4;
5. Conexões entre os módulos do sistema
- O sensor de temperatura BM280 está ligado ao barramento I2C e utiliza o endereço (0x76);
- O módulo de display LCD está conectado ao barramento I2C utilizando o endereço 0x27;
- O resistor de potência e a ventoinha estão ambos ligados às portas GPIO e são acionados através do circuito de potência;
3.1. Resistor: GPIO 23 ou Pino 16 (Board)
3.2. Ventoinha: GPIO 24 ou Pino 18 (Board) - A ESP32 está conectada à placa Raspberry Pi via UART (Protocolo MODBUS-RTU);
- O potenciômetro é conectado à porta analógica (A1) da ESP32;
- Os comandos de acionamento e controle do sistema virão do Dashboard (Thingsboard) através da ESP32;
- O sensor de temperatura DS18B20 para medição do ambiente controlado está ligado à ESP32 na porta GPIO 4 via protocolo 1-Wire;
6. Requisitos
Os sistema de controle possui os seguintes requisitos:
- O código deve ser desenvolvido em C/C++;
- Na implementação do software, não podem haver loops infinitos que ocupem 100% da CPU;
- O sistema deve implementar o controle de temperatura do ambiente fechado utilizando o controle PID atuando sobre o Resistor e a Ventoinha;
- A interface de terminal do usuário deve prover a capacidade de definição dos seguintes parâmetros:
- Temperatura de referência (TR): deve haver uma opção para escolher se o sistema irá considerar TR definido pelo teclado, pelo potenciômetro via UART ou seguindo as curvas de temperatura definidas em arquivo.
- Parâmetros Kp, Ki, Kd: para o controle PID deve ser possível definir os valores das constantes Kp, Ki e Kd;
- No caso da temperatura ser definida via UART (potenciômetro / outros), o programa deve consultar o valor através da comunicação UART com a ESP32 a cada 1 segundo;
- O programa deve gerar um log em arquivo CSV das seguintes informações a cada 01 segundo com os seguintes valores: (Data e hora, temperatura interna, temperatura externa, temperatura definida pelo usuário, valor de acionamento dos atuadores (Resistor e Venoinha em valor percentual)).
- Display LCD (16x2): O sistema deve apresentar na tela LCD seu estado atual. Os estados são:
- Desligado;
- Acionado: mostrar o modo de controle (Terminal ou UART) juntamente com os valores das temperaturas (TI, TE, TR) atualizados a cada 1 segundo;
- O programa deve tratar a interrupção do teclado (Ctrl + C = sinal SIGINT) encerrando todas as comunicações com periféricos (UART / I2C / GPIO) e desligar os atuadores (Resistor e Ventoinha);
- O código deve possuir Makefile para compilação;
- O sistema deve conter em seu README as instruções de compilação e uso, bem como gráficos* com o resultado de dois experimentos, um com o Potenciômetro como referência e outro executando a Curva de Reflow, ambos por um período de aproximadamente minutos.
* Serão necessários dois gráficos para cada experimento. Um deles plotando as temperaturas (Ambiente, Interna e Referência (Potenciômetro)) e outro gráfico com o valor do acionamento dos atuadores (Resistor / Ventoinha) em valor percentual entre -100% e 100%.
7. Comunicação UART com a ESP32
A comunicação com a ESP32 deve seguir o mesmo protocolo MODBUS utilizado no Exercício 2.
A ESP32 será responsável por:
- Efetuar a medição da temperatura interna (Sensor DS18B20);
- Realizar a leitura do potenciômetro para o controle externo da temperatura de referência;
- Iniciar e Desligar o sistema de controle;
- Enviar comandos para a mudança de modo de controle (Potenciômetro ou Curvas de Temperatura);
- Atualizar informações sobre as temperaturas e o sinal de controle no dashboard (ThingsBoard).
Para acessar as informações via UART envie mensagens em formato MODBUS com o seguinte conteúdo:
- Código do Dispositivo (ESP32): 0x01
- Leitura do Valor de Temperatura Interna (TI): Código 0x23, Sub-código: 0xC1 + 4 últimos dígitos da matrícula. O retorno será o valor em Float (4 bytes) da temperatura interna do sistema com o pacote no formato MODBUS;
- Leitura da temperatura de referência - TR (Potenciômetro): Código 0x23, Sub-código: 0xC2 + 4 últimos dígitos da matrícula. O retorno será o valor em Float (4 bytes) da temperatura de referência definida pelo usuário com o pacote no formato MODBUS;
- Envio do sinal de controle (Resistor / Ventoinha): Código 0x16, Sub-código: 0xD1 + 4 últimos dígitos da matrícula, Valor em Int (4 bytes).
- Envio do sinal de referência nos casos em que o sistema esteja sendo controlado ou pelo terminal ou pela curva de referência: Código 0x16, Sub-código: 0xD2 + 4 últimos dígitos da matrícula, Valor em Float (4 bytes).
- Leitura dos Comandos de usuário: Código 0x23, Sub-código: 0xC3;
- Envio do estado interno do sistema em resposta aos comandos de usuário:
- Estado (Ligado / Desligado): Código 0x16, Sub-código: 0xD3 + byte;
- Modo de Controle (Potenciômetro = 0 / Referência = 1): Código 0x16, Sub-código: 0xD4 + byte;
Tabela 1 - Códigos do Protocolo de Comunicação
Endereço da ESP32 | Código | Sub-código + Matricula | Comando de Solicitação de Dados | Mensagem de Retorno |
---|---|---|---|---|
0x01 | 0x23 | 0xC1 N N N N | Solicita Temperatura Interna | 0x00 0x23 0xC1 + float (4 bytes) |
0x01 | 0x23 | 0xC2 N N N N | Solicita Temperatura Potenciômetro | 0x00 0x23 0xC2 + float (4 bytes) |
0x01 | 0x23 | 0xC3 N N N N | Lê comandos do usuário | 0x00 0x23 0xC3 + int (4 bytes de comando) |
0x01 | 0x16 | 0xD1 N N N N | Envia sinal de controle Int (4 bytes) | - |
0x01 | 0x16 | 0xD2 N N N N | Envia sinal de Referência Float (4 bytes) | - |
0x01 | 0x16 | 0xD3 N N N N | Envia Estado do Sistema (Ligado = 1 / Desligado = 0) (1 byte) | 0x00 0x16 0xD3 + int (4 bytes de estado) |
0x01 | 0x16 | 0xD4 N N N N | Modo de Controle (Potenciômetro = 0 / Curva = 1) (1 byte) | 0x00 0x16 0xD4 + int (4 bytes de modo de controle) |
Obs: todas as mensagens devem ser enviadas com o CRC e também recebidas verificando o CRC. Caso esta verificação não seja válida, a mensagem deverá ser descartada e uma nova solicitação deverá ser realizada.
Tabela 2 - Comandos de Usuário via UART
Comando | Código |
---|---|
Liga o Forno | 0x01 |
Desliga o Forno | 0x02 |
Aciona modo de controle via potenciômetro | 0x03 |
Aciona modo de controle via curva de temperatura | 0x04 |
A leitura dos comandos via UART deve ser realizada a cada 1 s.
8. Parâmetros de PID
Para o uso do controle do PID, estão sendo sugeridos os seguintes valores para as constantes:
Placa Rasp42 com Fonte de 12V:
- Kp = 30.0
- Ki = 0.2
- Kd = 400.0
- Placa Rasp43 com Fonte de 5V:
- Kp = 20.0
- Ki = 0.1
- Kd = 100.0
Porém, vocês estão livres para testar outros valores que sejam mais adequados.
Acionamento do Resistor
O resistor deve ser acionado utilizando a técnica de PWM (sugestão de uso da biblioteca WiringPi / SoftPWM). A intensidade de acionamento do resistor por variar entre 0 e 100%.
Acionamento da Ventoinha
A venotinha também deve ser acionada utilizando a técnica de PWM. Porém, há um limite inferior de 40% de intensidade para seu acionamento pelas características do motor elétrico. Ou seja, caso o valor de saída do PID esteja entre 0 e -40%, a ventoinha deverá ser acionada com 40% de sua capacidade.
Observa-se ainda que a saída negativa só indica que o atuador a ser acionado deve ser a ventoinha e não o resistor e o valor de PWM a ser definido deve ser positivo, invertendo o sinal.
9. Critérios de Avaliação
A avaliação será realizada seguindo os seguintes critérios:
ITEM | COMENTÁRIO | VALOR |
---|---|---|
Implementação do controlador PID | Correta implementação do controlador PID (Resistor / Venotinha), incluindo a leitura das temperaturas e acionamento dos atuadores. | 2,0 |
Menu de controle | Correta implementação do menu apresentando as informações atualizadas ao usuário e permitindo o controle dos parâmetros do sistema. | 1,0 |
Leitura da Temperatura Ambiente | Leitura dos valores de Temperatura Ambiente (Sensor BME280). | 0,5 |
Comunicação UART | Leitura dos valores de Temperatura Interna, Potenciômetro e Chave e envio do sinal de controle através da comunicação MODBUS-UART. | 2,0 |
Mostrador no LCD | Apresentação das 3 temperatudas no LCD e estado do sistema. | 1,0 |
Armazenamento em arquivo | Armazenamento em arquivo CSV dos dados medidos. | 0,5 |
Qualidade do Código | Utilização de boas práticas como o uso de bons nomes, modularização e organização em geral. | 2,0 |
README com Experimento | Documentação README com instruçoes de compilaçõa, uso e relatório do experimento com o gráfico. | 1,0 |
Pontuação Extra | Qualidade e usabilidade acima da média. | 0,5 |
10. Referências
Controle Liga/Desliga - Wikipedia
Controle PID - Wikipedia
Driver da Bosh para o sensor BME280
Biblioteca BCM2835 - GPIO
Controle do LCD 16x2 em C
Biblioteca WiringPi GPIO
PWM via WiringPi