2013-06-17 3 views
3

Я создаю свою первую программу 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); 
} 
+0

Какого уровня напряжения вы пытаетесь измерить? Будучи Arduino, способным выдавать 1023 точки на аналоговых выводах, теоретически минимально вы можете измерить 5V/1023 = 0.0049V. Но если напряжения нет, аналоговый штырь плавает, и вы получите случайные значения. – FeliceM

+0

Каков выходной сигнал от лазерных датчиков, минимальное значение и максимальное значение? Действительно ли они способны выводить от 0 до 5 вольт? Вы тестировали их индивидуально в небольшой тестовой программе, чтобы почувствовать выход по отношению к расстоянию? – user2019047

+0

Вы пытались увеличить задержку между чтением, например, 20 мс? Может быть, SAR ADC не подходит. Вы пытались включить внутреннее подтягивание аналоговых входов? – Thanushan

ответ

2

AFAICT, это должно быть действительно из-за плавающих булавки окружающих измерительные штыри, имеющие беспорядочные значения, следовательно, perturbating свои меры. Вы должны посмотреть на свои значения, используя arduinoscope, что покажет вам мешающие эффекты других плавающих контактов на ваших измерительных выводах.

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

+0

zmo, я попытался заземлить каждый из аналоговых контактов, которые не используются. Еще одна проблема. Я также хотел бы добавить, что я подключаю свой проект через выводы Vin и Gnd схемой стабилизатора напряжения, используя токораспределитель напряжения TO-220 с выходным напряжением 5 вольт и 24 В вход. У меня есть достаточный размер колпачков, и все основания связаны. Считаете ли вы, что источник питания может вызывать странные показания на контактах, поскольку он установлен в непосредственной близости от моих аналоговых контактов arduino. Или есть способ сброса регистра результатов аналогового вывода между показаниями? – GoJo2332

+0

Вы пытались прочитать входы с помощью ардуиноскопа, чтобы увидеть качество всех ваших входов? Это не так много, и это часто помогает. Может быть, ваш GND плавает или получил сигнал, который не так, как вы ожидаете ... Или ваш TO220 может быть неисправен ... Я не могу сказать. Но ардуиноскоп покажет вам, как выглядит не так. Я не гуру в электронике, но из моего опыта есть одна вещь, которую я точно знаю: есть много возможностей для отказа оборудования, чем нужно работать правильно: -s – zmo

+0

Сегодня я попробую ардуиноскоп. никогда не использовал его раньше, однако я проверил входные данные, используя стандартный рабочий стол oscope. Спасибо, Ill, дайте знать, что я нахожу. – GoJo2332

1

Я понимаю, что эта ветка несколько устарела, но, возможно, это поможет кому-то. Если вы управляете Arduino только 5V, как вы говорите, вы сделали это с регулятором, вы получите очень неустойчивое поведение, особенно от аналоговых контактов. Это связано с тем, что вы начнете сглаживать внутренние регуляторы напряжения, которые обеспечивают выходы AREF, 3.3 и 5.0. Я тестировал это для проекта робототехники, над которым я работаю, и около 6,5 вольт, все начинает идти не так. Я полагаю, что если бы вы всегда обеспечивали входное напряжение 5.0, вы могли бы компенсировать этот эффект, но в моем случае я использовал батарею LiPo, которая могла бы варьироваться от 8,4 вольт до 6,0 вольт, и все шло с 6,5 вольтами.

0

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

-1

Инициализировать булавки тянуть вверх режим, чтобы избежать значений для мусора или булавки «плавающих» или использовать свои собственные выпадающие/резисторы на выводах :)

Смежные вопросы