Trabalho 1 da disciplina de Fundamentos de Sistemas Embarcados (2023/2)
Este trabalho tem por objetivo a criação de um sistema distribuído para o controle e monitoramento de um grupo de cruzamentos de sinais de trânsito. O sistema deve ser desenvolvido para funcionar em um conjunto de placas Raspberry Pi com um servidor central responsável pelo controle e interface com o usuário controlador e servidores distribuídos para o controle local e monitoramento dos sinais do cruzamento junto aos respectivos sensores que monitoram as vias. Dentre os dispositivos envolvidos estão: o controle de temporizaçãio e acionamento dos sinais de trânsito, o acionmento de botões de passagens de pedestres, o monitoramento de sensores de passagem de carros bem como a velocidade da via e o avanço de sinal vermelho.
A Figura 1 ilustra cruzamentos de trânsito.
Cada cruzamento possui:
- 4 Sinais de Trânsito (Em pares);
- 2 botões de acionamento para pedestres (pedir passagem), uma para cada direção;
- 2 Sensores de velocidade/presença/passagem de carros (nas vias auxiliares, um em cada direção);
- 2 Sensores de velocidade/presença/passagem de carros (nas vias principais, um em cada direção);
- 1 Sinalização de áudio (buzzer) para sinalizar quando o sinal está mudando de estado (quando o cruzamento de pedestres irá ser fechado);
Cada cruzamento deverá ser controlado por um processo individual que esteja rodando em uma placa Raspberry Pi e cada controlador de cruzamento deve se comunicar via rede (TCP/IP) com o servidor central.
Na Figura 2 é possível ver a arquitetura do sistema.
Para simplificar a implementação e logística de testes do trabalho, a quantidade de cruzamentos será limitada a 2 sendo que devem ser implementados 2 serviços de controle dos cruzamentos e um servidor central.
- 01 Placa Raspberry Pi 3/4;
- 01 Placa Raspberry Pi 3/4;
- 04 Saídas GPIO (LEDs) representando os semáforos;
- 02 Entradas sendo os botões de pedestre;
- 02 Entradas sendo os sensores de velocidade/presença/contagem de veículos das vias auxiliares (2 por cruzamento);
- 02 Entradas sendo os sensores de velocidade/presença/contagem (4 por cruzamento);
- Saída de áudio para efeito sonoro estado do sinal para deficientes auditivos;
- Os servidores distribuídos deverão se comunicar com o servidor central através do Protocolo TCP/IP (O formato das mensagens ficam à cargo do aluno. A sugestão é o uso do formato JSON);
- Cada instância do servidor distribuído (uma por cruzamento) deve rodar em um processo paralelo em portas distintas, podendo ser executado em placas distintas;
- Cada entrada / saída está representada na Tabela abaixo. Cada servidor distribuído é responsável pelo controle de um cruzamento.
Item | GPIO Cruzamento 1 | GPIO Cruzamento 2 | Direção |
---|---|---|---|
Semáforo 1 - Pino 1 | 09 | 10 | Saída |
Semáforo 1 - Pino 2 | 11 | 08 | Saída |
Semáforo 2 - Pino 1 | 05 | 01 | Saída |
Semáforo 2 - Pino 2 | 06 | 18 | Saída |
Botão de Pedestre 1 | 13 | 23 | Entrada |
Botão de Pedestre 2 | 19 | 25 | Entrada |
Sensor Via Auxiliar 1 | 26 | 25 | Entrada |
Sensor Via Auxiliar 2 | 22 | 12 | Entrada |
Sensor Via Principal 1 | 0 | 16 | Entrada |
Sensor Via Principal 1 | 27 | 20 | Entrada |
Buzzer | 17 | 21 | Saída |
Os sistema de controle possui os seguintes requisitos:
O código do Servidor Distribuído deve ser desenvolvido em Python, C ou C++.
Os servidores distribuídos tem as seguintes responsabilidades:
- Controlar os semáforos (temporização) - cruzamento com 4 sinais: os semáforos da via principal tem temporização diferente dos das vias auxiliares conforme e tabela abaixo.
Estado | Via Principal (s) | Via Auxiliar (s) |
---|---|---|
Verde (mínimo) | 10 | 5 |
Verde (máximo) | 20 | 10 |
Amarelo | 2 | 2 |
Vermelho (mínimo) | 5 | 10 |
Vermelho (máximo) | 10 | 20 |
- Controlar o acionamento dos botões de travessia de pedestres (2 por cruzamento): ao acionar o botão, o sinal em questão deverá cumprir seu tempo mínimo (Ex: permanecer verde pelo tempo mínimo antes de fechar. Caso o tempo mínimo já tenha passado, o sinal irá mudar de estado imediatamente após o botão ser pressionado);
- Controlar o acionamento dos sensores de passagem de carros nas vias auxiliares. Caso o sinal esteja fechado e um carro pare na via auxiliar, o comportamento será o mesmo que um pedestre pressionar o botões de travessia;
- Contar a passagem de carros em cada direção e sentido do cruzamento (4 valores sepadados) e enviar esta informação periodicamente (2 segundos) ao servidor central;
- Monitorar a velocidade das vias (principal e auxiliar) através dos sensores de velocidade. A velocidade de cada carro deverá ser reportada para o servidor central periodicamente. Veídulos acima da velocidade permitida deverão ser reportados ao servidor central e contabilizados separadamente. Além disso, é necessário soar um alarme ao detectar um veículo acima da velocidade permitida;
Velocidade Máxima:
a. Via Principal: 80 km/h;
b. Via auxiliar: 60 km/h. - Efetuar o controle de avanço do sinal vermelho em ambas as vias. O número de veículos que avançam o sinal vermelho deverá ser reportado ao servidor central e o alarme deve ser disparado a cada detecção de infração;
- Cada instância dos servidores distribuídos a ser executada deve automaticamente se configurar para o controle do cruzamento 1 ou 2 à partir de um arquivo de configuração (configuração de portas, pinos, etc).
O código do Servidor Central pode ser desenvolvido em Python, C ou C++.
O servidor central tem as seguintes responsabilidades:
- Manter conexão com os servidores distribuídos (TCP/IP);
- Prover uma interface que mantenham atualizadas as seguintes informações por cruzamento:
a. Fluxo de trânsito na via principal e em cada via auxiliar (Carros/min);
b. Velocidade média de cada via (km/h);
c. Número de infrações (Por tipo: avanço de sinal e velocidade acima da permitida); - Prover mecanismo na interface para:
a. Modo de emergência: liberar o fluxo de trânsito em uma via (os dois cruzamentos com a via principal em verde);
b. Modo noturno fazer o sinal amarelo piscar em todos os cruzamento; - Armazenar de modo persistente (arquivo) o estado atual (número de infrações, velocidade da pista, etc) para que possa ser re-estabelecido em caso de queda de energia.
- Em qualquer uma das linguagens devem haver instruções explicitas de como instalar e rodar;
- Para C/C++ é mandatório o uso do Makefile e incluir todas as dependências no próprio projeto;
- Cada serviço (programa) deve poder ser iniciado independente dos demais e ficar aguardando o acionamento dos demais;
- Qualquer queda de comunicação entre os serviços, seja por falta de energia, erro de comunicação, etc deverá ser re-estabelecida automaticamente assim que o serviço voltar ao ar, sem perda de função.
- Deverá haver um arquivo README no repositório descrevento o modo de instalação/execução e o modo de uso do programa.
- Semáforos: cada semáforo será controlado por dois pinos da GPIO e um multiplexador.
Semáforo | Pino 1 | Pino 2 |
---|---|---|
Desligado | 0 | 0 |
Verde | 0 | 1 |
Amarelo | 1 | 0 |
Vermelho | 1 | 1 |
- Botão de travessia de pedestre: devem tratar o debounce. No simulador, o sinal do botão é acionado por um intervalo de 300 a 400 ms. O sinal é normalmente em baixa e ativado em alta _|‾|_ .
- Sensor de Velocidade: estes sensores são implementados através do sensor de efeito hall. O sensor de velocidade é um sensor que é acionado tanto na borda de subida _|‾ quanto na borda de descida ‾‾|_ . O comprimento médio dos carros é de 2 metros. Portanto, na passagem de um carro, o sensor é acionado primeiro pela borade de subida e depois pela borda de descida. Neste caso, para calcular a velocidade do carro passando pelo sensor, é necessário calcular o intervalo de tempo entre o acionamentdo da borda de subida e a de descida. Em seguida, dividir a distância (2 metros) pelo intervalo de tempo medido.
Obs: No simulador, o intervalo de tempo entre a ativação da borda de subida e a de descida é de no mínimo 15 ms e no máximo 300 ms. O sinal do sensor permanece em baixa (0.0V) enquanto está inativo e em alta (3.3V) quando ativado _|‾|_ .
A avaliação será realizada seguindo os seguintes critérios:
Tabela 4 - Avaliação- gpiozero (https://gpiozero.readthedocs.io)
- RPi.GPIO (https://pypi.org/project/RPi.GPIO/)
A documentação da RPi.GPIO se encontra em https://sourceforge.net/p/raspberry-gpio-python/wiki/Examples/
- WiringPi (http://wiringpi.com/)
- BCM2835 (http://www.airspayce.com/mikem/bcm2835/)
- PiGPIO (http://abyz.me.uk/rpi/pigpio/index.html)
- sysfs (https://elinux.org/RPi_GPIO_Code_Samples)
Há um compilado de exemplos de acesso à GPIO em várias linguages de programação como C, C#, Ruby, Perl, Python, Java e Shell (https://elinux.org/RPi_GPIO_Code_Samples).