Я создаю свою первую программу Arduino на UNO r3. Я играл с Arduino Uno раньше, просто с небольшими примерами программ и т. Д. Я использую два аналоговых входа для определения расстояния с помощью двух лазерных датчиков с масштабированием 0-5vdc. Эти два входа - 0-5vdc, и я обеспечил общее заземление. Два датчика называются слева и справа и вводятся соответственно в A0 и A1. У меня также есть дифференциальный POT, который использует напряжение стеклоочистителя POT на 10K Ом в качестве входа на A2. Теория программы состоит в том, чтобы принять абсолютное значение разности входных напряжений между левым и правым лазерами, а затем определить, больше ли равен или равен напряжению на штифте A2 от очистителя POT. Основываясь на полученной математике, включите или выключите реле, вставленное на контакт D13, через цепь транзистора.Использование аналоговых входов arduino
ПРОБЛЕМА: Я не могу добиться точных изменений напряжения на шкале (0-1023) на выводах A0, A1 или A2. Я использовал последовательный монитор для диагностики этой проблемы. Не уверен, в чем проблема, любая помощь будет отличной. Кроме того, я не могу достичь значения 0 на любом из вышеуказанных аналоговых контактов, даже POT-очиститель !!!
Вот мой код:
const int lf_dist = A0; //names A0
const int rt_dist = A1; //names A1
const int differential = A2; //names A2
const int relay = 13; // select the pin for the relay coil
unsigned int left = 0; // variable to store the value coming from the left sensor
unsigned int right = 0; // variable to store the value coming from the right sensor
unsigned int diff = 0; // variable to store the value coming from the differential POT for maximum distance differential
unsigned int offset = 0; // variable that stores the value between the two laser sensors
void setup() {
Serial.begin(9600);
pinMode(A0, INPUT);
pinMode(A1, INPUT);
pinMode(A2, INPUT);
pinMode(relay, OUTPUT); // declare the relay pin as an OUTPUT:
analogReference(DEFAULT);
}
void loop()
{
unsigned int left = 0; // variable to store the value coming from the left sensor
unsigned int right = 0; // variable to store the value coming from the right sensor
unsigned int diff = 0; // variable to store the value coming from the differential POT for maximum distance differential
unsigned int offset = 0; // variable that stores the value between the two laser sensors
left = analogRead(A0); // read the value from the left laser
delay(5);
right = analogRead(A1); // read the value from the right sensor
delay(5);
diff = analogRead(A2); // read the value from the differential POT
delay(5);
offset = abs(left - right);
if(offset >= diff) // does math to check if left and right distances are greater than the value clocked in by the differential POT
{
digitalWrite(relay, LOW); // turns off the relay, opens the stop circuit, and turns on the yellow light
}
else
{
digitalWrite(relay, HIGH); // turns on the relay if all is good, and that keeps the machine running
}
Serial.print("\n left = ");
Serial.print(left);
Serial.print("\n right = ");
Serial.print(right);
Serial.print("\n differential = ");
Serial.print(diff);
delay(1000);
}
Какого уровня напряжения вы пытаетесь измерить? Будучи Arduino, способным выдавать 1023 точки на аналоговых выводах, теоретически минимально вы можете измерить 5V/1023 = 0.0049V. Но если напряжения нет, аналоговый штырь плавает, и вы получите случайные значения. – FeliceM
Каков выходной сигнал от лазерных датчиков, минимальное значение и максимальное значение? Действительно ли они способны выводить от 0 до 5 вольт? Вы тестировали их индивидуально в небольшой тестовой программе, чтобы почувствовать выход по отношению к расстоянию? – user2019047
Вы пытались увеличить задержку между чтением, например, 20 мс? Может быть, SAR ADC не подходит. Вы пытались включить внутреннее подтягивание аналоговых входов? – Thanushan