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.
Tags:
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);
}
tem que remover todos os delay() do codigo
Rogerio, bom dia.
Posso estar enganado, mas acho que os delay do ultrason não devem ser retirados.
Rui
Bem-vindo a
Laboratorio de Garagem (arduino, eletrônica, robotica, hacking)
© 2024 Criado por Marcelo Rodrigues. Ativado por