Скорость чтения с 2-мя фотоэлектрическими датчиками c с Arduino и показывать скорость после чтения - PullRequest
0 голосов
/ 16 марта 2020
  1. У меня есть 2 фотоэлектри c сенсора с выходом NPN: если посмотреть на лист данных, он может быть НИЗКИМ (вывод NPN на стр. 14): mouser.com/datasheet/2/307/e3fb_photoelectri c -1189416.pdf стр. 14. Два датчика расположены на расстоянии 152,4 мм друг от друга. По сути, я хочу запустить таймер, когда сработали первые ворота, и завершить sh, когда сработали вторые ворота, а затем разделить установленное расстояние (152,4 мм) на время, которое необходимо пройти между каждым воротом, и вывести скорость в метрах в секунду. Датчики питаются от источника питания 24 В C, выходное напряжение NPN может достигать 3 В D C от коллектора. Сначала я проверил датчик, чтобы встроенный светодиод мигал, когда перед датчиком присутствует объект, который смог запустить светодиод:

    const int sensorPin = 3; // photoelectric sensor
    const int ledPin = 13;
    boolean state1 = LOW; // state at startup
    
    void setup() {
      pinMode(sensorPin, INPUT_PULLUP); // sensor input with internal pullup 
      resistor enabled
      pinMode(ledPin, OUTPUT); // initialize digital pin 13 as an output.
    }
    
    void loop() {
      state1 = digitalRead(sensorPin);
      if (state1 == HIGH) {
        digitalWrite(ledPin, HIGH);
      }
      else {
        digitalWrite(ledPin, LOW);
      }
    }
    

напряжение находится в правильном диапазоне, чтобы считываться как ВЫСОКОЕ или НИЗКОЕ.

Итак, я попытаюсь измерить скорость. Код ниже:

const int PE_01 = 2;
const int PE_02 = 3;
unsigned long start, finish, speed;
float elapsed;
boolean state1 = LOW; //state at startup
boolean state2 = LOW; //state at startup

void setup() {
  // Initialize the serial communication at 9600 bits per second:
  Serial.begin(9600);
  pinMode(PE_01, INPUT_PULLUP); //sensor input with internal pullup 
  resistor enabled
  pinMode(PE_02, INPUT_PULLUP); //sensor input with internal pullup 
  resistor enabled
 }

void loop() {
  state1 = digitalRead(PE_01);
  state2 = digitalRead(PE_02);
   // time = millis ();
  if (state1 == HIGH){

    start = millis();
  }
if (state2 == HIGH) {
  finish = millis();
}
elapsed = finish - start;
speed = 76200/elapsed; // unit distance (micro meters) and time (milli 
seconds)
Serial.print("initial time (ms) = ");
Serial.println(start);
Serial.print("final time (ms) = ");
Serial.println(finish);
Serial.print("Speed of object (M/s) = ");
Serial.println(speed);
 delay(500);
}

однако на последовательном мониторе я вижу следующее:

10:31:07.632 -> initial time (ms) = 15502
10:31:07.666 -> final time (ms) = 15502
10:31:07.666 -> Speed of object (M/s) = 4294967295
10:31:08.109 -> initial time (ms) = 16002
10:31:08.144 -> final time (ms) = 15502
10:31:08.178 -> Speed of object (M/s) = 0

4294967295 отображается, когда объекта нет и когда он кажется вывод 0. Я несколько раз корректировал уравнение, но, похоже, я ничего не понимаю. Любая помощь очень ценится. Спасибо!

1 Ответ

1 голос
/ 02 мая 2020

Лог c кода не выглядит правильным. Из вашего объяснения, если вы уверены, что сработавшее состояние ВЫСОКО, мой код будет таким:

void loop() {

  if (digitalRead(PE_01)== HIGH){// Check if first sensor trigged
      unsigned long start = millis();
      while(digitalRead(PE_02)== LOW);// Wait until second sensor trigged
      unsigned long finish = millis();
      float speed = 76200.0f/float(finish - start ); 
      Serial.print("initial time (ms) = ");
      Serial.println(start);
      Serial.print("final time (ms) = ");
      Serial.println(finish);
      Serial.print("Speed of object (M/s) = ");
      Serial.println(speed);
      delay(500);
}

Редактировать

Если ваш датчик активен на низком уровне, поверните все логи c.

void l oop () {

  if (digitalRead(PE_01)== LOW){// Check if first sensor trigged
      unsigned long start = millis();
      while(digitalRead(PE_02)== HIGH);// Wait until second sensor trigged
      unsigned long finish = millis();
      float speed = 76200.0f/float(finish - start ); 
      Serial.print("initial time (ms) = ");
      Serial.println(start);
      Serial.print("final time (ms) = ");
      Serial.println(finish);
      Serial.print("Speed of object (M/s) = ");
      Serial.println(speed);
      delay(500);
}
...