Сравнение значений двух переменных резисторов, поворотное устройство

Тема в разделе "Arduino & Shields", создана пользователем varvik85, 19 ноя 2015.

  1. varvik85

    varvik85 Нерд

    Добрый день. Делаю одно устройство, которое должно будет поворачиваться на заданный угол, точность не сильно высокая по этому в качестве датчика угла поворота планирую использовать простой линейный переменный резистор. Сам поворачивающий механизм к сожалению не сервомашинка, а более мощная штуковина. Задача стоит в следующем: задающим переменный резистором, который будет располагаться на передней панели, оператор задает угол поворота, жмет кнопку и устройство поворачивается на заданный угол. Получается мне нужно сравнивать два переменных резистора между собой, один как задающий, второй прикрепленный к валу поворачивающего механизма. Если сопротивление первого( задающего) резистора больше второго то устройство поворачивается вправо пока сопротивление второго не сравниться с сопротивлением первого, и на оборот, если сопротивление первого меньше, то устройство поворачивается влево, как только их сопротивления уравняются то устройство останавливается. Загвоздка заключается в том, что я не знаю как сравнивать два аналоговых значения между собой и как создать программно такой алгоритм "весов" который всегда бы стремился уравнять значения обоих переменных резисторов при помощи поворотного двигателя одно из них. Может есть наброски, полностью за меня проделать всю работу не прошу, хочу лишь попросить подсказать или направить в правильное русло. :)

    наверно как то так, простите за примитивизм, не оформил как подобает, но суть думаю понятна
    Код (C++):
    if (analogread1 > anqlogread2)
    digitalWrite(vpravoPin, HIGH);
    if (analogread1 < anqlogread2)
    digitalWrite(vlevoPin, HIGH);
    но я хочу еще задать допуск, допустим + - 5 ком, т.е в этом интервале будет считаться что достигнуто равенство, как это сделать? Если я просто создам константу равную значению в 5 кОм буду складывать или вычитать ее к переменной и применю дизъюнкцию, то получится что у меня сравнивается всего три значение значение когда они равны, больше на 5кОм и меньше на 5кОм. а как мне сделать чтоб весь интервал в 5 кОм проверять? Разбить его на массив и прибавлять весь массив?
     
    Последнее редактирование: 19 ноя 2015
  2. Alex19

    Alex19 Гуру

    Это работа PID (ПИД) регулятора, посмотрите данную тему - http://forum.amperka.ru/threads/pid-управление-отоплением-в-отдельно-взятой-каморке.2441/#post-19059.

    Вот Вам еще 1 мысль, сам обдумывал как сделать из мотора с редуктором, серву (не пригодилось). Расковыряв серву увидел обычный мотор, платку и переменный резистср, может можно попробовать просто подключить Ваш мотор к платке и переменному резистору и управлять через плату. Если токи не большие.
     
  3. Если правильно понял то как то так.
    Код (C++):

    int pogreshnost = 5; // только не 5, а 5 * на что то..
    if (analogread1 > (anqlogread2 - pogreshnost) || analogread1 > (anqlogread2 + pogreshnost) )
    digitalWrite(vpravoPin, HIGH);
    if (analogread1 < anqlogread2 - pogreshnost) || analogread1 < anqlogread2 + pogreshnost) ||)
    digitalWrite(vlevoPin, HIGH);

     
     
  4. varvik85

    varvik85 Нерд

    Спасибо но это немного не то. Мне нужны не три ветики, а все поле значений. Допустим у меня допуск +- 5 ком, что можно перевести в число, допустим 100, так вот, хотелось бы чтоб все числа от 1 до 100 и от -1 до -100 входили в этот диапазон. Т. е если первый резистор будет выставлен допустим на 50 кОм то устройство сработает если второй резистор окажеться в любой точке диапазона 45-55 ком, например 46 или 52 или 47,85 как то так.
    [​IMG]
    Еще раз скажу зачем это нужно, само устройство поворота будет немного инерционным, т.е оно не остановиться точно в нужном месте. После отключения двигателя оно еще немного проедет пару миллиметров точно, что будет являться выходом из точки сработки устройства, и программа начнет его двигать назад, и опять инерция, так и будет оно в этих + - 2 мм елозить туда сюда, мне это не нужно. Остановилось, ну чуть проехало, ничего страшного, не критично, сильная точность не нужна.По этому хочу и ввести такое число, число допуск, и все его множества должны быть полем сработки программы. Вот. Не знаю как это сделать
     
  5. Вы делаете что то на подобии джойстика ?
    Просто не могу понять зачем два резистора ?
     
  6. varvik85

    varvik85 Нерд

    Да я уже разобрался, на другом форуме подсказал человек, все очень просто оказалось, даже немного стыдно что сам не докнокал. Всем спасибо)
     
  7. Если не жалко, то поделитесь решением)
     
  8. varvik85

    varvik85 Нерд

    [​IMG]

    Если показания с левого потенциометра выходят за диапазон, ограниченный "коридором" (GAP), то доворачиваем вправо:

    1 if (analogRead(LEFT_PIN) - GAP > analogRead(RIGHT_PIN) - GAP)
    2 {
    3 digitalWrite(vpravoPin, HIGH);
    4 }
    Аналогично с правой стороной.

    Если же показания находятся в диапазоне -GAP...+GAP, то находимся в "точке назначения" и моторы выключены:

    1 digitalWrite(vpravoPin, LOW);
    2 digitalWrite(vlevoPin, LOW);