Сделать систему с ультразвуковым датчиком и сервоприводом

Я хочу создать систему, в которой сервопривод будет заставлять ультразвуковой датчик двигаться и определять область перед ним. Я сделал программу, но при запуске ультразвуковой датчик не может обнаружить, как обычно.

У кого-нибудь есть другая программа или почему моя программа работает не так, как планировалось?

Это исходный код :

#include <Servo.h> 

const int trigPin = 10;
const int echoPin = 9;
int lampu = 13 ;

// membuat nama objek servo untuk pengontrolan servo 
Servo myservo;          
// variable untuk menyimpan posisi servo 
int pos = 0;
long duration, inches, cm;
void setup() {
  Serial.begin(9600);
  pinMode(lampu, OUTPUT);
  myservo.attach(7);   
}

void loop() {
  pinMode(trigPin, OUTPUT);
  digitalWrite(trigPin, LOW);
  delayMicroseconds(2);
  digitalWrite(trigPin, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigPin, LOW);
  pinMode(echoPin, INPUT);
  duration = pulseIn(echoPin, HIGH);
  inches = microsecondsKeInchi(duration);
  cm = microsecondsKeCenti(duration);
  Serial.print(inches);
  Serial.print(" in, ");
  Serial.print(cm);
  Serial.print(" cm");
  Serial.println();

  lampuNyala() ;
  servo();
  delay(10);        
}

// start dari 0 derajar sampai 180 derajat 
long microsecondsKeInchi(long microseconds)
{
  return microseconds / 74 / 2;
}

long microsecondsKeCenti(long microseconds)
{
  return microseconds / 29 / 2;
}       

void servo(){
  for(pos = 0; pos < 180; pos += 1)  
  {
    // pada posisi 1 derajat
    // memberitahu servo untuk pergi ke posisi  'pos'
    myservo.write(pos);
    // tunggu 15ms untuk pencapaian  posisi servo    
    delay(30);   
  } 
  // start dari 180 derajat ke 0 derajat 
  for(pos = 180; pos>=1; pos-=1)  
  {
    // memberitahu servo untuk pergi ke posisi  'pos'                                
    myservo.write(pos);                 
    // tunggu 15ms untuk pencapaian  posisi servo    
    delay(30);    
  }
}

void lampuNyala(){
  if(cm > 0 && cm <=30){
    digitalWrite(lampu,HIGH) ;
  }
  else{
    digitalWrite(lampu,LOW) ;
  }
}

, 👍-1

Обсуждение

Комментарии на английском языке были бы полезны, @Greenonline


1 ответ


0

Посмотрите на свою кодовую последовательность. Ультразвуковое измерение выполняется только при использовании функции pulseIn(). В конце функции loop() вы вызываете свою функцию servo (). В нем вы указываете Arduino сначала перейти от 0° к 180°, а затем обратно к 0°. ПОСЛЕ ЭТОГО (!) функция завершается, и функция loop() продолжается. Это означает, что во время движения сервопривода больше ничего не происходит. Измерение происходит только между движениями, то есть примерно каждые 10 секунд.

Чтобы решить эту проблему, вам нужно сделать код сервопривода неблокирующим. В основном плохо использовать функцию delay(), так как вы не можете делать ничего другого во время ожидания. Подумайте о том, как вы поддерживаете пиццу. Вы не сидите перед духовкой все время, пока пицца не будет готова. Вместо этого вы регулярно смотрите на свои часы и проверяете, не пора ли вынуть пиццу из духовки.

Вы можете сделать то же самое на Arduino с помощью функции millis (). Он вернет миллисекунды с момента последнего сброса/включения питания Arduino. Это должно использоваться как часы. Чтобы что-то сделать после определенного времени, вы сначала сохраняете текущее время в метке времени:

unsigned long timestamp=0;
...
timestamp = millis();

Затем в функции loop() вы регулярно (на каждой итерации цикла) проверяете, превышает ли разница между меткой времени и текущим временем установленный вами интервал:

if(millis() - timestamp > 30){
    // сделайте что-нибудь здесь, например, переместите сервопривод
    timestamp = millis(); //обновить метку времени для следующего события
}

Arduino не будет делать все это одновременно, но будет переключаться между различными частями кода так быстро, что это будет казаться одновременным. Также обратитесь к примеру BlinkWithoutDelay библиотеки Arduino.

Примечание: Текущая задержка между двумя последовательными значениями сервопривода в порядке. Если вы хотите работать намного быстрее с сервоприводом, вам нужно следить за тем, чтобы остальная часть кода в цикле() не заняла много времени. Если это произойдет, и вы не сможете сделать другие части кода неблокирующими, вы также можете выполнить серво-часть в процедуре прерывания по таймеру.

,