Cidades Inteligentes
Demonstrando conceitos de controle de tráfego com Arduino

Prof. Dr. Daniel G. Costa (Página pessoal)


Atividade 1 - Semáforo


O objetivo desta atividade é introduzir o uso do Arduino e de alguns componentes básicos de eletrônica, que serão utilizados para simular a operação de um semáforo. Para tanto, o desenvolvimento será incremental, adicionando novas funcionalidades que serão posteriormente relacionadas à serviços comuns em Cidades Inteligentes.


Para esta atividade, os materiais inicialmente necessários são:


Arduino Uno (pode ser outro modelo)



Breadboard



Material de eletrônica (LEDs, resistores, jumpers, etc).



A partir deste material, pode-se montar um semáforo simples, com o acionamento das três cores padrões (vermelho, amarelo e verde). Para tanto, foi utilizada uma caixa de papelão para montar a estrutura desejada, como apresentado a seguir (o Arduino está na parte superior da estrutura):





O Arduino é uma placa de desenvolvimento open-source e de uso genérico, que permite a execução de uma infinidade de códigos para diversas funções. Devido a sua flexibilidade, estrutura operacional e baixo custo, o Arduino se tornou bastante popular, encontrando espaço em aplicações de automação e controle. Recentemente, com o surgimento de aplicações IoT e de Cidades Inteligentes, um novo campo de atuação foi aberto para a plataforma Arduino.


Apesar de existir mais de uma forma de utilizar o Arduino, uma maneira comum é executando o IDE próprio disponibilizado pelo fabricante. Esse IDE, que está preparado para programação na linguagem C, pode ser baixado AQUI.


O Arduino Uno é uma versão "simplificada" que possui 14 pinos digitais de I/O e 6 pinos analógicos. Operando a 16 MHz, o Arduino Uno pode ser alimentado por uma fonte externa (entre 7V e 12V) ou por uma entrada USB (5V).


Para a montagem do semáforo, o Arduino irá controlar quando cada um dos três LEDs será aceso. Dessa forma, cada LED estará conectado a um pino digital do Arduino (configurado como pino de SAIDA). Uma configuração possível é apresentada a seguir:




No circuito criado, como os LEDs serão "acesos" no nível HIGH (5V), os LEDS devem ser conectados no sentido correto e conectados ao GND através de um resistor. Deve-se lembrar que cada LED deve ser ligado a um resistor para evitar a sua queima (LEDs são diodos). Como os pinos digitais do Arduino estão em nível HIGH com 5V, deve-se considerar a tensão e corrente esperada para cada LED (que pode variar de acordo com a cor do LED adotado). Para este cálculo, deve-se considerar a Lei de Ohm (pode-se consultar AQUI ou AQUI).


Para esse exemplo, foi aproximado o valor dos resistores, sendo escolhido um de 220 Ohm para cada LED.


O código para o semáforo construído é apresentado a seguir. Esse código deve ser digitado no IDE Arduino e "exportado" para a placa através do cabo USB apropriado.


void setup() {
  pinMode(11, OUTPUT);    //VERMELHO. Pino 11 como saída
  pinMode(12, OUTPUT);    //AMARELO. Pino 12 como saída
  pinMode(13, OUTPUT);   //VERDE. Pino 13 como saída

  digitalWrite(13, HIGH); //Sinal inicia em VERDE 
 }

//Método loop é executado enquanto o arduino estiver ligado.
void loop() {
  //Controle do led verde 
  delay(10000);        //espera 10 segundos
  digitalWrite(13, LOW);  //apaga o led  
  
  //Controle do led amarelo
  digitalWrite(12, HIGH); //acende o led
  delay(2000);           
  digitalWrite(12, LOW);  

  //Controle do led vermelho
  digitalWrite(11, HIGH); 
  delay(10000);           
  digitalWrite(11, LOW); 
  digitalWrite(13, HIGH); 
}

Após este processo, o Arduino irá executar continuamente o mesmo código, mesmo após ser ligado e desligado repetidas vezes.

Continuando na construção do semáforo e imaginando um cenário de controle de acesso, uma cancela pode ser implantada para impedir que qualquer carro passe quando o sinal estiver VERMELHO. Uma forma de implementar essa cancela é através de um micro servo, como o modelo apresentado a seguir (Micro Servo Motor 9g SG90):




Com esse micro servo e considerando a funcionalidade esperada (abrir e fechar a cancela), é possível mover uma haste em 90 graus. Este micro servo possui três conectores, sendo dois deles ligados à alimentação (5V e GND) e apenas 1 deles utilizado para receber dados do Arduino (no exemplo, o pino digital 2). Mais detalhes de como conectar o micro servo podem ser obtidos AQUI.


O resultado final deste circuito é apresentado a seguir:




Para movimentar o semáforo e a cancela, de forma coordenada, foi escrito o seguinte código, que deve ser gravado no Arduino (removendo o código anterior):


#include <Servo.h>
Servo myservo;

void setup() {
  pinMode(11, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);  
  myservo.attach(2);

  //Configuracao inicial
  digitalWrite(13, HIGH); //inicia com VERDE 
  myservo.write(30);
}

void abrirCancela() {
  for (int angulo =120; angulo >= 30; angulo -= 1) 
  { 
      myservo.write(angulo); // Comando para angulo específico 
      delay(15); 
  } 
}

void fecharCancela() {
  for (int angulo =30; angulo <= 120; angulo += 1) 
  { 
      myservo.write(angulo); // Comando para angulo específico 
      delay(15); 
  } 
}


//Método loop, é executado enquanto o arduino estiver ligado.
void loop() {
  //Controle do led verde 
  delay(10000);       
  digitalWrite(13, LOW);  
  
  //Controle do led amarelo
  digitalWrite(12, HIGH); 
  delay(2000);          
  digitalWrite(12, LOW);  

  //Controle do led vermelho
  digitalWrite(11, HIGH); 
  fecharCancela();
  delay(10000);           
  digitalWrite(11, LOW);
  digitalWrite(13, HIGH);
  abrirCancela();
}

Com esse código exportado, o semáforo irá se comportar da mesma forma que antes, porem agora fechando a cancela no sinal VERMELHO e abrindo a cancela no sinal VERDE.


Por fim, para concluir esse semáforo, será simulado um botão para alterar o funcionamento padrão do mesmo. Imagine que um pedestre queira atravessar a rua e que possa apertar um botão para que o semáforo mais rapidamente atinja o estado VERMELHO. Para tanto, a programação do Arduino deve ser alterada para processar o acionamento de um botão, como apresentado a seguir:


#include <Servo.h>
Servo myservo;

void setup() {
  pinMode(11, OUTPUT); 
  pinMode(12, OUTPUT);
  pinMode(13, OUTPUT);  
  myservo.attach(2);

  pinMode(10,INPUT_PULLUP); //botao

  //Configuracao inicial
  digitalWrite(13, HIGH); //inicia com VERDE 
  myservo.write(30);
}

void abrirCancela() {
  for (int angulo =120; angulo >= 30; angulo -= 1) 
  { 
      myservo.write(angulo); // Comando para angulo específico 
      delay(15); 
  } 
}

void fecharCancela() {
  for (int angulo =30; angulo <= 120; angulo += 1) 
  { 
      myservo.write(angulo); // Comando para angulo específico 
      delay(15); 
  } 
}

void loop() {
  int cont = 100; //100 testes para o VERDE
  int botao = HIGH;

  while (cont > 0)
  {
      botao = digitalRead(10); //lê o botao

      if (botao == LOW)
        break;
        
      delay(100); //"dorme" 0.1 segundo
      cont--;
  }
  digitalWrite(13, LOW);  
  
  //Controle do led amarelo
  digitalWrite(12, HIGH); 
  delay(2000);          
  digitalWrite(12, LOW);  

  //Controle do led vermelho
  digitalWrite(11, HIGH); 
  fecharCancela();
  delay(10000);           
  digitalWrite(11, LOW);
  digitalWrite(13, HIGH);
  abrirCancela();
}


Quando o botão é acionado, o laço que mantém o sinal VERDE ligado é encerrado ("break"). Nesse caso, a operação do sinal verde foi alterada, sendo que agora o acionamento do botão é testado a cada 100ms. Outra questão importante é verificar a conexão do botão utilizada, que está ligado ao GND do Arduino.


O circuito final dessa atividade é apresentado a seguir:






Atividade 2 - Contando carros


Breve