Programação Arduino Para Iniciantes: O Controlador De Semáforo

Na semana passada, nós aprendemos sobre a estrutura básica de um programa Arduino e examinamos mais de perto o exemplo 'blink'. Espero que você aproveite a oportunidade para experimentar o código, ajustando os tempos.

Na semana passada, nós aprendemos sobre a estrutura básica de um programa Arduino e examinamos mais de perto o exemplo 'blink'.  Espero que você aproveite a oportunidade para experimentar o código, ajustando os tempos.
Propaganda

O semáforo é um pequeno projeto divertido, que pode ser concluído em menos de uma hora. Aprenda como construir seu próprio - usando um Arduino - e como modificar o circuito para um modelo avançado.

Não se preocupe se você nunca usou um Arduino antes, temos um guia para iniciantes Introdução ao Arduino: Um Guia para Iniciantes Introdução ao Arduino: um Guia para Iniciantes Arduino é uma plataforma de prototipagem eletrônica de código aberto baseada em flexibilidade, fácil para usar hardware e software. É destinado a artistas, designers, amadores e qualquer pessoa interessada em criar objetos ou ambientes interativos. Consulte Mais informação .

Nota : Este é o mais recente de uma série de tutoriais de nível iniciante para o Arduino, a plataforma de prototipagem eletrônica de código aberto. Aqui está uma lista dos artigos anteriores da série:

  • O que é o Arduino eo que você pode fazer com ele O que é o Arduino eo que você pode fazer com ele? O que é o Arduino e o que você pode fazer com ele? O Arduino é um pequeno dispositivo eletrônico notável, mas se você nunca usou um antes, o que exatamente eles são eo que você pode fazer com um? consulte Mais informação
  • O que é um kit Starter Arduino e o que ele contém? O que está incluído em um kit inicial do Arduino? [MakeUseOf Explains] O que está incluído em um kit inicial do Arduino? [MakeUseOf Explains] Eu introduzi anteriormente o hardware de código aberto do Arduino aqui no MakeUseOf, mas você vai precisar mais do que apenas o Arduino para construir algo a partir dele e realmente começar. Arduino "kits iniciantes" são ... Leia mais
  • Mais componentes legais para comprar com o seu Starter Kit 8 Mais Componentes Cool para seus projetos do Arduino 8 Mais componentes legais para seus projetos do Arduino Então, você está pensando em adquirir um kit inicial do Arduino, mas imaginando se alguns LEDs e resistores básicos serão o suficiente para mantê-lo ocupado para o fim de semana? Provavelmente não. Aqui estão outros 8 ... Leia Mais
  • Primeiros passos com o Arduino Starter Kit - Instalação de drivers e configuração da placa e da porta Primeiros passos com o Arduino Starter Kit - Instalação de drivers e configuração da placa e da porta Primeiros passos com o Arduino Starter Kit - Instalação de drivers e configuração da placa Port Então, você comprou um kit inicial Arduino, e possivelmente alguns outros componentes legais - e agora? Como você realmente começou a programar essa coisa do Arduino? Como você configura ... Leia Mais
  • Um olhar mais atento sobre a estrutura de um aplicativo Arduino e o programa de exemplo Blink

O que você precisa

Além do Arduino básico, você precisará de:

  • LEDs vermelhos, amarelos e verdes.
  • Uma tábua de pão.
  • 6 x 220? resistores.
  • Conectando fios.
  • 1 botão de pressão x.
  • 1 x 10k? resistor

Quase qualquer Arduino será adequado, desde que tenha pinos suficientes. Certifique-se de ler o nosso guia de compra Arduino Guia de compra: Qual placa você deve obter? Guia de compra do Arduino: Qual placa você deve obter? Existem tantos tipos diferentes de placas Arduino por aí, você seria perdoado por estar confuso. Qual você deve comprar para o seu projeto? Deixe-nos ajudar, com este guia de compra do Arduino! Leia mais se não tiver certeza de qual modelo você precisa. Você provavelmente tem essas peças no seu kit inicial. O que há no seu Arduino Starter Kit? [Iniciantes no Arduino] O que há no seu Arduino Starter Kit? [Iniciantes em Arduino] Diante de uma caixa cheia de componentes eletrônicos, é fácil ficar sobrecarregado. Aqui está um guia para exatamente o que você encontrará no seu kit. Leia mais já.

Um exemplo simples

Vamos começar pequeno. Um único semáforo básico é um bom lugar para começar. Aqui está o circuito:

arduino_traffic_light

Conecte o ânodo (perna longa) de cada LED aos pinos digitais oito, nove e dez (através de um resistor 220). Conecte os catodos (perna curta) ao terra do Arduino.

Eu usei o Fritzing para desenhar esses diagramas. Não é apenas fácil de usar, é grátis!

O código

Comece definindo variáveis ​​para que possamos endereçar as luzes pelo nome em vez de um número. Inicie um novo projeto do Arduino e comece com estas linhas:

int red = 10; int yellow = 9; int green = 8; 

Em seguida, vamos adicionar a função de configuração, onde vamos configurar os LEDs vermelho, amarelo e verde para serem saídas. Como você criou variáveis ​​para representar os números de pinos, agora você pode se referir aos pinos pelo nome.

 void setup(){ pinMode(red, OUTPUT); pinMode(yellow, OUTPUT); pinMode(green, OUTPUT); } 

Essa foi fácil. Agora, para a parte difícil - a lógica real de um semáforo. Crie uma função separada para mudar as luzes (você verá por que mais tarde).

Quando você começa a programar, o próprio código é muito rudimentar - é descobrir os mínimos detalhes lógicos que apresentam o maior problema. A chave para ser um bom programador é poder olhar para qualquer processo e dividi-lo em seus passos fundamentais. Aqui está o resto do código:

 void loop(){ changeLights(); delay(15000); } void changeLights(){ // green off, yellow on for 3 seconds digitalWrite(green, LOW); digitalWrite(yellow, HIGH); delay(3000); // turn off yellow, then turn red on for 5 seconds digitalWrite(yellow, LOW); digitalWrite(red, HIGH); delay(5000); // red and yellow on for 2 seconds (red is already on though) digitalWrite(yellow, HIGH); delay(2000); // turn off red and yellow, then turn on green digitalWrite(yellow, LOW); digitalWrite(red, LOW); digitalWrite(green, HIGH); delay(3000); } 

Feito! Agora, carregue e execute (certifique-se de selecionar a placa e a porta corretas nos menus Ferramentas > Porta e Ferramentas > Placa ). Você deve ter um semáforo de trabalho que muda a cada 15 segundos, como este (acelerado):

Uma travessia de pedestres

Agora que você sabe o básico, vamos melhorar. Adicione um botão para os pedestres mudarem a luz sempre que quiserem:

arduino_traffic_light_with_button

Observe como o semáforo é exatamente igual ao exemplo anterior. Conecte o botão ao pino digital 12. Você notará que o interruptor tem uma alta impedância de 10k? resistor ligado a ele, e você pode estar se perguntando por quê. Isso é chamado de resistor pull-down. É um conceito difícil de entender no começo, mas tenha paciência comigo.

Um comutador deixa o fluxo atual ou não. Isso parece bastante simples, mas em um circuito lógico, a corrente deve estar sempre fluindo em um estado alto ou baixo (lembre-se - 1 ou 0, alto ou baixo). Você pode assumir que um botão de pressão que não está sendo realmente pressionado seria definido como estando em um estado baixo, mas na verdade é dito que ele está 'flutuando', porque nenhuma corrente está sendo desenhada.

Neste estado flutuante, é possível que ocorra uma leitura falsa, pois flutua com interferência elétrica. Em outras palavras, um comutador flutuante não fornece uma leitura de estado alta nem baixa confiável. Um resistor de pull down mantém uma pequena quantidade de corrente fluindo quando o switch é fechado, garantindo assim uma leitura de estado baixa e precisa. Em outros circuitos lógicos, você pode encontrar um resistor de pull-up - isso funciona no mesmo princípio, mas em sentido inverso, certificando-se de que a porta lógica particular padrão seja alta.

Agora, na parte de loop do código, em vez de trocar as luzes a cada 15 segundos, vamos ler o estado do botão de pressão e só mudar as luzes quando for ativado.

O código

Comece adicionando uma nova variável ao início do programa:

 int button = 12; // switch is on pin 12 

Agora, na função de configuração, adicione uma nova linha para declarar o comutador como uma entrada. Eu também adicionei uma única linha para iniciar os semáforos no palco verde. Sem essa configuração inicial, eles seriam desativados até a primeira vez que um changeLights () fosse iniciado usando uma função.

 pinMode(button, INPUT); digitalWrite(green, HIGH); 

Altere a função loop inteira para o seguinte:

 void loop() { if (digitalRead(button) == HIGH){ delay(15); // software debounce if (digitalRead(button) == HIGH) { // if the switch is HIGH, ie. pushed down - change the lights! changeLights(); delay(15000); // wait for 15 seconds } } } 

Isso deve resolver. Você pode estar se perguntando porque o botão está marcado duas vezes ( digitalRead (botão) ), separados por um pequeno atraso. Isso é chamado de debounce. Assim como o resistor pull down era necessário para o botão, essa simples verificação interrompe o código detectando pequenas interferências quando um botão é pressionado. Você não precisa fazer isso (e provavelmente funcionaria muito bem sem isso), mas é uma boa prática.

Ao aguardar dentro da declaração if por 15 segundos, os semáforos não podem mudar por pelo menos essa duração. Depois de 15 segundos, o loop é reiniciado. A cada reinicialização do loop, leia o estado do botão novamente, mas se não for pressionado, a instrução if nunca é ativada, as luzes nunca mudam e simplesmente reinicia novamente.

Veja como isso parece (acelerado):

Uma junção

Vamos tentar um modelo mais avançado. Em vez de uma passagem para pedestres, modifique seu circuito para ter dois semáforos:

arduino_dual_traffic_light

Ligue o segundo semáforo aos pinos digitais 11, 12 e 13.

O código

Primeiro, atribua seus novos pinos de semáforo às variáveis ​​e configure-as como saídas, assim como no primeiro exemplo:

 // light one int red1 = 10; int yellow1 = 9; int green1 = 8; // light two int red2 = 13; int yellow2 = 12; int green2 = 11; void setup(){ // light one pinMode(red1, OUTPUT); pinMode(yellow1, OUTPUT); pinMode(green1, OUTPUT); // light two pinMode(red2, OUTPUT); pinMode(yellow2, OUTPUT); pinMode(green2, OUTPUT); } 

Agora, atualize seu loop para usar o código do primeiro exemplo (em vez da passagem para pedestres):

 void loop(){ changeLights(); delay(15000); } 

Mais uma vez, todo o trabalho está sendo realizado na função changeLights () . Em vez de ficar vermelho > vermelho e amarelo > verde, este código irá alternar os semáforos. Quando uma estiver verde, a outra estará no vermelho. Aqui está o código:

 void changeLights(){ // turn both yellows on digitalWrite(green1, LOW); digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); delay(5000); // turn both yellows off, and opposite green and red digitalWrite(yellow1, LOW); digitalWrite(red1, HIGH); digitalWrite(yellow2, LOW); digitalWrite(red2, LOW); digitalWrite(green2, HIGH); delay(5000); // both yellows on again digitalWrite(yellow1, HIGH); digitalWrite(yellow2, HIGH); digitalWrite(green2, LOW); delay(3000); // turn both yellows off, and opposite green and red digitalWrite(green1, HIGH); digitalWrite(yellow1, LOW); digitalWrite(red1, LOW); digitalWrite(yellow2, LOW); digitalWrite(red2, HIGH); delay(5000); } 

Aqui está o que parece (acelerado):

É isso por este tempo, então espero que você tenha aprendido muito e tenha se divertido escrevendo do zero. Você suja as mãos com alguns LEDs e resistores, além de adicionar um interruptor com um resistor pull down - esperamos que você entenda por que precisamos de um. Brinque com o código, ajuste-o e, o mais importante, divirta-se. Se você fizer alguma adição ou alteração, por que não nos informar sobre isso nos comentários?

Crédito de imagem: androsvector via Shutterstock.com

In this article