Boa tarde.

Como posso utilizar Threads no Arduíno em uma função que faz a leitura de um ultrassom HCSR04 e o acionamento de um servomotor.No caso, eu tenho o código de cada um ja pronto, só precisaria das linhas de comando para criar as threads e aciona-las.

Fico no aguardo de vossa ajuda.

Obrigado.

Exibições: 4320

Responder esta

Respostas a este tópico

Sergio,

Sem ver os códigos fica difícil ajudar.

Abs.

Uma observação:

Tentei fazer o código com thread, mas continua travando.

Não sei se é devido ao delay que existe nas duas funções e com isso para o processamento do codigo.

Em todos casos, segue o codigo:

#include <Thread.h>
#include <ThreadController.h>
#include <Servo.h>
#define trigPin 9 //Pino 9 envia o pulso para gerar o echo
#define echoPin 10 //Pino 10 recebe o pulso do echo
Servo motor;
Thread threadDoUltrassom;
Thread threadDoServo;
void setup()
{
Serial.begin(9600); //inicia a porta serial
pinMode(trigPin, OUTPUT); // define o pino 09 como saida (envia)
pinMode(echoPin, INPUT); // define o pino 10 como entrada (recebe)
motor.attach(11);
threadDoUltrassom.setInterval(1300);
threadDoUltrassom.onRun(lerUltrassom);
threadDoServo.setInterval(1000);
threadDoServo.onRun (viraleme);
}
void loop ()
{

threadDoUltrassom.run();
threadDoUltrassom.run();

}
// ********************Metodos********************

//Método para ler ultrassom
void lerUltrassom()
{
//seta o pino 9 com um pulso baixo "LOW" ou desligado ou ainda 0
digitalWrite(trigPin, LOW);
// delay de 2 microssegundos
delayMicroseconds(2);
//seta o pino 9 com pulso alto "HIGH" ou ligado ou ainda 1
digitalWrite(trigPin, HIGH);
//delay de 10 microssegundos
delayMicroseconds(10);
//seta o pino 9 com pulso baixo novamente
digitalWrite(trigPin, LOW);
//pulseIn lê o tempo entre a chamada e o pino entrar em high
int duration = pulseIn(echoPin,HIGH);
//Esse calculo é baseado em s = v . t, lembrando que o tempo vem dobrado
//porque é o tempo de ida e volta do ultrassom
int distancia = duration /29 / 2 ;

Serial.print("Distancia em CM: ");
Serial.println(distancia);
delay (500);
if (distancia <= 20)
{
threadDoServo.run();
}
}

//Método para ler servo de leme
void viraleme()
{
motor.write(150);
delay(200);

motor.write(30);

delay(200);
}

Rogerio, bom dia.

Posso estar enganado, mas acho que os delay do ultrason não devem ser retirados.

Rui

RSS

© 2024   Criado por Marcelo Rodrigues.   Ativado por

Badges  |  Relatar um incidente  |  Termos de serviço