Pessoal,

Sou novato no mundo arduino e gostaria de fazer um carrinho de polícia para o meu sobrinho, mas empaquei em um impasse na programação. Como faço para acionar leds e um piezo ao mesmo tempo? se eu coloco os dois em um loop, um aciona em quanto o outro desliga. 

Como posso resolver isso e acionar os dois ao mesmo tempo?

Obrigado

Exibições: 868

Responder esta

Respostas a este tópico

Olá, amigo. Coloca mais ou menos a descrição de como vai funcionar para que possamos te ajudar. Por exemplo:

O carrinho vai para a frente por tanto tempo e depois para, acende as luzes (leds), aciona o piezo e volta a correr....

O motor do carro é acionado via ponte H, tem sensores de distância, etc...

Por exemplo, o som da sirene, temos esse aqui: http://www.dobitaobyte.com.br/linux/eletronica-digital-com-arduino-...

Estuda essa aqui também:

Piscar sem delay- http://arduino.cc/en/Tutorial/BlinkWithoutDelay

Na realidade o projeto é simples, quando ele apertar o botão o carrinho vai tocar e acender a sirene, mas esse tocar e acender a sirene simultaneamente q eu empaquei.

Amigo, segue o sketch:

// Projeto - Carro de polícia

float sinVal;
int toneVal;
int ledDelay = 50; // delay de 50ms
int redPin = 9;
int bluePin = 11;

void setup(){
pinMode(8, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}

void loop(){
for (int x=0; x<180; x++){
//converte graus para radianos, e depois obtém o valor do seno
sinVal = (sin(x*(3.1416/180)));
//gera uma freguência a partir do valor do seno
toneVal = 2000+(int(sinVal*1000));
tone(8, toneVal);
delay(2);

ESTOU COM PLOBLEMAS A PARTIR DAQUI, POIS SOMENTE QND A SIRENE TOCA O LUZ ACENDE
}
digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms

digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms

digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms

digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms

digitalWrite(redPin, HIGH); // Liga o led Vermelho
delay(ledDelay); // espera 50 ms

digitalWrite(redPin, LOW); // Desliga o led Vermelho
delay(ledDelay); // espera 50 ms

delay(100); // delay para alternar o led 100ms

digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms

digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms

digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms

digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms

digitalWrite(bluePin, HIGH); // Liga o led Azul
delay(ledDelay); // espera 50 ms

digitalWrite(bluePin, LOW); // Desliga o led Azul
delay(ledDelay); // espera 50 ms
}

Já tentei fazer isso. Não consegui.

O Arduíno executa linha por linha, então não tem como executar duas coisas ao mesmo tempo.

Se alguém souber fazer, eu também quero saber!

O problema está na função TONE.

no comando : tone(8, toneVal); , não sei o que acontece que o programa parece parar ali. Ainda estou estudando o que acontece. Há inclusive uma discussão a respeito aqui no blog: http://labdegaragem.com/forum/topics/a-fun-o-tone-interfere-no-func...

Fiz um teste e, retirando a linha acima mencionada, o programa roda tranquilamente. Após recolocá-la, o led não pisca.

Como eu estava tendo dificuldade em implementar a função tone, utilizei a função AnalogWrite. Não sei se vai funcionar pois não testei no "mundo real". Fiz virtualmente.

Código:

float sinVal; // variável para estocar o valor de sinVal
int toneVal; // variável para estocar o valor de toneVal
int somPin= 3; // o pino do som é o pino analógico 3
int redPin = 10; // LED vermelho no pino 10
int bluePin = 11; // LED azul no pino 11
int ledState = LOW; // variável de estado dos LED's
long previousMillis = 0;
long interval = 1000; // intervalo entre as piscadas dos LED's

void setup(){

Serial.begin(9600);
pinMode (somPin, OUTPUT);
pinMode(redPin, OUTPUT);
pinMode(bluePin, OUTPUT);
}
void loop(){

for (int x=0; x<180; x++){

//converte graus para radianos, e depois obtém o valor do seno
sinVal = (sin(x*(3.1416/180)));
Serial.print("sinval ="); // joga no serial monitor o valor de sinval
Serial.println(sinVal);

//gera uma freguência a partir do valor do seno
toneVal = (int(sinVal*1000)); // Somar mais 2000

Serial.print("toneval ="); // joga no serial monitor o valor de toneval
Serial.println(toneVal);

// código para piscar os LED's sem delay
unsigned long currentMillis = millis();
if(currentMillis - previousMillis > interval) {
// salva a última vez que o led piscou
previousMillis = currentMillis;

// se o LEDstate é LOW, o novo estado é High
if (ledState == LOW)
ledState = HIGH;
// caso contrário, o estado é LOW
else
ledState = LOW;

// seta o LED azul com o estado inverso do LED vermelho
digitalWrite(redPin, ledState);
digitalWrite(bluePin,!ledState);
}

// Joga no pino 3, o valor de toneVal
analogWrite(somPin,toneVal);
delay(2);
}
}

link para o circuito funcionando: http://123d.circuits.io/circuits/96725-teste-tone/view

 Olá Felipe,

 Observei a proposta do seu projeto, e é bem parecida com uma que tive à algum tempo atrás. A melhor maneira que encontrei foi utilizando o conceito de Máquinas de Estado. Onde você cria uma tarefa, e assim que uma tarefa for executada ela passa para a tarefa seguinte.

 Criei um projeto simulado que responde bem ao que você queria. Basicamente criei uma máquina de estados para controlar os periféricos, e através de uma variável ("configurável de acordo com os tempos e controle que queira") ela é acionada para controlar os dois leds e a buzina.

   O código não está enxuto, fiz correndo. ^^ Mas é fácil de entender e você pode customizá-lo para ficar melhor. Junto mandei o projeto do Proteus para poder verificar (podendo até ouvir a sirene pelo audio do PC) e no código já possui algum debug pela serial.

   Segue imagens das duas sirenes que criei, uma pulsando a buzina com um led, e a outra com a buzina contínua.  E o arquivo está em anexo.

   Espero ter ajudado, boa sorte.

Anexos
Obrigado pessoal, pela força.

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço