Arquivo da categoria: Robótica

Semáforo simples com Arduino e impressão 3D

Hoje veremos como programar um semáforo em Arduíno. A impressão foi feita por mim para ser usada nas aulas, no entanto vou compartilhar o desenho e o processo de como fiz a montagem.

O Semáforo 3D

O desenho foi feito no Tinkercad e pode ser visualisado a seguir.

Os LEDs foram colados com cola escolar líquida (de PVC) usada pra colar papel e outros materiais escolares. O resultado final ficou como nas fotos a seguir.

Semáforo impresso em impressora 3D
Semáforo impresso e os LEDs colados

Para conectar os LEDs aos fios que vão ao Arduino, tentei duas estratégias: soldar fios aos LEDs e conectar diretamente um fio M/F aos LEDs. A segunda opção se saiu melhor.

Detalhe dos fios soldados aos leds no semáforo. Uma das soldas se rompeu.
Tentativa de soldar os cabos nos LEDs: as soldas se rompem com a manipulação.
Detalhe com cabos conectados nos leds e fixos por fitas adesivas
Mesmo não ficando com uma aparência muito boa, usar uma fita adesiva e para segurar um conector fêmea diretamente no LED pareceu ser a melhor opção.

Apesar de decidir por não soldar os cabos os fios nos LEDs, achei bom colar os GNDs dos LEDs um no outro, diminuindo o uso de fios por parte dos alunos.

Semáforo com os gê ene dês , ou terras, dos leds soldados entre si,
Semáforo com GNDs dos LEDs soldados entre si.

O circuito no Tinkercad

Confira o circuito abaixo:

Se o circuito não carregar, acesse o circuito na página do Tinkercad.

O código

Baixe, compartilhe ou copie o código acessando o site do GitHub.

Vamos discutir o código a seguir.

Primeiramente inserimos variáveis com valores que correspondem às portas digitais a serem usadas.

int verde1 = 2, amarelo1 = 3,
    vermelho1 = 4, verde2 = 5, 
    amarelo2 = 6, vermelho2 = 7;

No setup, configuramos cada uma das portas acima como saída.

void setup() {
  pinMode(verde1, OUTPUT);
  pinMode(amarelo1, OUTPUT);
  pinMode(vermelho1, OUTPUT);
  pinMode(verde2, OUTPUT);
  pinMode(amarelo2, OUTPUT);
  pinMode(vermelho2, OUTPUT);
}

No loop, vamos detalhar um pouco mais. Começando com a parte do código que liga o LED verde do semáforo 1 e o vermelho do semáforo 2 e aguarda 2 segundos (2000 milissegundos).

void loop() {
  digitalWrite(verde1, HIGH);
  digitalWrite(vermelho2, HIGH);
  delay(2000);

Para mudar o semáforo 1 para amarelo precisamos desligar o verde e só então ligarmos o verde. Fazemos isso e aguardamos mais um segundo:

  digitalWrite(verde1, LOW);
  digitalWrite(amarelo1, HIGH);
  delay(1000);

Para mudar o semáforo 1 para vermelho temos que desligar o LED amarelo do semáforo 1. Logo em seguida, para mudar o semáforo 2 para verde, temos que desligar o LED vermelho do semáforo 2 e ligar o LED verde do semáforo 2. Depois, aguardamos mais 2 segundos.

  digitalWrite(amarelo1, LOW);
  digitalWrite(vermelho1, HIGH);
  digitalWrite(vermelho2, LOW);
  digitalWrite(verde2, HIGH);
  delay(2000);

Para colocar o semáforo 2 no amarelo precisamos desligar o LED verde e ligar o amarelo. Aguardamos mais um segundo no final:

  digitalWrite(verde2, LOW);
  digitalWrite(amarelo2, HIGH);
  delay(1000);

Por fim, deligamos o amarelo do semáforo 2 e o vermelho do semáforo 1.

  digitalWrite(amarelo2, LOW);
  digitalWrite(vermelho1, LOW);
}

Note que ao terminar o algoritmo o Arduino volta a executar tudo desde o começo, portanto, não precisamos escrever mais nada. Para verificar, veja abaixo o início do nosso código novamente:

  digitalWrite(verde1, HIGH);
  digitalWrite(vermelho2, HIGH);

Resultado final do projeto

Confira no vídeo a seguir o resultado final. Minha câmera não é boa, portanto o vídeo vai começar já na parte em que mostro o circuito funcionando. Em seguida discuto o código. A montagem do circuito ficou prejudicada e não recomendo o vídeo desde o começo.

Seta com Arduino UNO

Hoje vamos montar um circuito que simula a seta de um carro.

O código pode ser baixado no GitHub. Ao abrir, basta clicar no ícone para copiar (fica no canto superior direito do código).

Discutindo o código

Iniciamos o código com um comentário, no qual apresentamos como deve ser o circuito (conectando um LED na porta digital 2 e outro na digital 3; conectando os botões para acionar as setas nas portas digitais 4 e 5).

/* LED esquerdo -> digital 2
   LED direito -> digital 3
   botão led esquerdo -> 4
   botão led direito -> 5
*/

A seguir vemos as variáveis que correspondem às conexões elétricas.

int LEDesquerdo = 2, LEDdireito = 3, botaoEsquerdo = 4, botaoDireito = 5; 
int seta = 0; //se 1 liga a esquerda, se 2 liga a direita

Note que criamos uma variável chamada seta. Ela servirá para identificar qual das setas deve ser acionada.

No setup´ iniciamos a comunicação serial para verificarmos se os botões estão funcionando. Note que a entrada dos botões estão definidas como INPUT_PULLUP, que significa que a porta digital ficará em HIGH quando não pressionamos o botão e em LOW quando pressionamos. Isso implica que devemos conectar o GND aos botões.

void setup() {
  Serial.begin(9600);
  pinMode(LEDesquerdo, OUTPUT);
  pinMode(LEDdireito, OUTPUT);
  pinMode(botaoEsquerdo, INPUT_PULLUP);
  pinMode(botaoDireito, INPUT_PULLUP);
}

No loop iniciamos com um Serial.println para vemos se os botões estão funcionando. Para isso, abra o monitor serial para ver se está alternando entre 0 e 1 ao pressionar os botões. Se estiver sempre mostrando somente zero, você ligou incorretamente o fio GND no(os) botão(ões). Tente mudar isso para ver se resolve.

void loop() {
  Serial.println(digitalRead(botaoEsquerdo));
  Serial.println(digitalRead(botaoDireito));

Agora vamos usar a variável seta: se pressionarmos o botão esquerdo, a variável guarda o número 1 e se pressionarmos o botão da direita esta variável muda para 2.

Note que ao colocar if (!digitalRead(botaoEsquerdo)), o que está dentro do if será verdadeiro (True) (ou 1 ou ainda HIGH) quando pressionarmos o botão, uma vez que quando pressionamos o botaoEsquerdo terá valor 0 (falso ou False ou LOW) e o símbolo “!” nega isso (ou seja, se botaoEsquerdo for 0, o argumento do if será 1). Por outro lado, se não pressionamos, botaoEsquerdo valerá 1 (ou True ou LOW) e
!digitalRead(botaoEsquerdo) valerá 0 (ou False ou LOW).

Lembre-se que o que está abaixo do if (entre as chaves {}) só será executado se o argumento do if for True.

  if (!digitalRead(botaoEsquerdo)) {
    seta = 1;
  }
  if (!digitalRead(botaoDireito)) {
    seta = 2;
  }

O final do código começa com um delay de 300 milisegundos (ou 0,3 segundo) que servirá para manter o LED escolhido apagado por este tempo. Este delay foi colocado de forma estratégica para que o pressionar do botão seja reconhecido antes da espera (lembre-se que o código fica sendo executado em loop, ou seja, após executar todo o código, esta parte será executada novamente.

  delay(300);
  if (seta == 1) {
    digitalWrite(LEDesquerdo, HIGH);
    delay(400);
    digitalWrite(LEDesquerdo, LOW);
  }
  if (seta == 2) {
    digitalWrite(LEDdireito, HIGH);
    delay(400);
    digitalWrite(LEDdireito, LOW);
  }
}

Os ifs servem para ligar a seta correspondente, esperar por 400 milissegundos (0,4 segundo) e desligar a seta.

O circuito

Para montar o circuito, você deverá ligar um o GND no pino menor de cada LED usado, sendo possível usar quantos LEDs você quiser em cada uma das setas. Aqui, no entanto, é importante colocar um resistor, fornecido por seu professor, para não queimar o LED ou sobrecarregar o Arduino.

No botão, sugiro que faça uma conexão cruzada, como na figura a seguir. Assim você nunca vai errar no uso dos botões do tipo pushbutton.

Como conectar os fios no botão
Conecte os fios de forma cruzada no botão, assim você nunca vai erra a conexão deste tipo de botão

A perninha maior de cada LED deve ser conectada na porta digital correspondente.

Veja simulação a seguir:

Gostou deste novo formato de documento para as aulas? Temos algumas vantagens quanto à isso:

  • Menor quantidade de papel impresso usado;
  • Conteúdo mais responsivo: pode ver no notebook ou celular que a visualização fica amigável;
  • Maior interatividade, pois você pode postar uma dúvida abaixo que o professor irá te responder;
  • Mais fácil de encontrar este circuito no futuro, pois todas as nossas aulas estarão marcadas na categoria “Robótica” e, se for com Arduino, também terá a categoria “Arduino”.