Датчик давления

Тема в разделе "Arduino & Shields", создана пользователем Artclonic, 7 мар 2018.

  1. Artclonic

    Artclonic Гик

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

    Sencis Гик

    Смотря какое давление его обычно мерит барометр в прочем в скетче кватернионного фильтра как раз есть барометр BMP 280 ))).
     
  3. mcureenab

    mcureenab Гуру

    Например MPX5700DP.
     
  4. Artclonic

    Artclonic Гик

    Определение силы вакуума.

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

    1. Шток начинает смещаться при весе груза 98 грамм (это свободное перемещение – определение силы трения между поршнем и стенкой цилиндра шприца)
    2. При подключении вакуумной трубки к шприцу, вес до которого поршень продолжает движение вверх – 230 грамм.
    И того мой вакуум поднимает 230 грамм груза и преодолевает силу трения в 98 грамм. Всего вакуум получается поднимает 328 грамм (если откинуть силу трения между поршнем и стенкой).

    Диаметр поршня 19 мм. Соответственно его площадь 283.5 мм2.

    Правильно расчитал давление?

    Давление 8218.25 Па

    Теперь вопрос правильно я подобрал датчик?, если мнев принципе не надо измерять давление вакуума, а надо определяеть его наличие....
    Вот кусочек моего кода, в котором в зависимости от значений на sd карте, выполняется определенный блок команд (ниже к примеру приведена «реакция» на «1»). Хочу добавить контроль наличия вакуума (соответсвенно присосалась ли к пневмопинцету деталька или нет). Я так предполагаю, что надо будет ввести некую переменную, значение которой будет определять по датчику есть ли вакуум или нет… Допустим есть вакуум, она равна «1», если нет равна «0».

    Перед выполнением III блока команд, нужно проверить «есть ли вакуум или нет» (значение переменной – «1» или «0», если есть «1», то выполняется код далее, если нет «0», тогда повторяется блок предыдущий команд II).

    Соответственно сделать аналогичную проверку перед выполнением блока IV, но в обратном алгоритме, если есть «1», - то повторяем предыдущий, если нет «0» - идем дальше…
    Код (C++):
    01
    case 1: // блок команд на чтение значения «1»
    02
    03
        {
    04
    05
    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    06
    07
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)
    08
    09
    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    10
    11
    digitalWrite(ob12,LOW); //Выключение элемента №2 (Блок II)
    12
    13
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    14
    15
    digitalWrite(ob13,LOW); //Выключение элемента №3 (Блок III)
    16
    17
    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    18
    19
    digitalWrite(ob14,LOW);  //Выключение элемента №4 (Блок IV)    
    20
    21
        }
    22
    23
        break;
     

    Тут возникает вопрос как подцепить датчик, как его показания разбить на «есть» и «нет» вакуума, как придать это значение переменной…
    Вот схема подключения вариант первы датчик в потоке, второ вариант на тронике датчик. По перврму варианту если пневмопинцет засосал предмет - (закрыл проход потоку воздуху) поток прекратился. По второму варианту пока пневмо пинцет без предмета у датчика на троинике - нет вакуума, как только закрыть (пррисосать пинцетом предмет) - в датчике на тронике будет образовываться вакуум
    НАЛИЧИЕ ВАКУУМА ЭТО - НАЛИЧИЕ/ОТСУТСТВИЕ ПРИСОСАННОГО ПРЕДМЕТА
     

    Вложения:

    • СХВ.jpg
      СХВ.jpg
      Размер файла:
      117,7 КБ
      Просмотров:
      137
    Последнее редактирование: 11 мар 2018
  5. Belkin

    Belkin Гик

    Достаточно установить порог для считываемых с датчика данных.
    Больше порога - есть вакуум, меньше - нет.

    Для начала - прочитать сам датчик в уже готовой системе или в модели со шприцом.
     
  6. Artclonic

    Artclonic Гик

    Как код на условие будет выглядеть? Подскажите плиз...
    Датчик с али едет...Хочу код своять к прибытию..
     
  7. Belkin

    Belkin Гик

    Я пишу в BASCOM... ;)
    Попытаюсь на "интерсленге"...

    <порог> - установленный порог
    <датчик> - считанное с датчика значение
    <решение> - принятое решение

    <датчик> = ...читаем датчик...
    ЕСЛИ <датчик> > <порог>, то <решение> = "Вакуума нет"
    ЕСЛИ <датчик> < <порог>, то <решение> = "Вакуум есть"
    Или наоборот.
     
  8. mcureenab

    mcureenab Гуру

    Сила трения покоя в 98 граммосил задаёт нижнюю границу диапазона измерений. Вакуум меньше этого значения датчик из шприца не определит.

    Надеюсь, сила трения одинакова при двидении вверх и вниз.

    Так что давление это (98 гс + вес груза гс ) / площадь штока.
     
  9. mcureenab

    mcureenab Гуру

    Датчики разные бывают.
    Вам нужен датчик типа реле, которое срабатывает при установленном уровне вакуума. Тогда нужно просто периодически считывать состояние реле и принимать решение.

    Но подойдёт датчик, который пропорционально преобразует вакуум в напряжение или ток. Тогда МК оцифровывает напряжение от датчика, сравнивает с пороговым значением.
     
  10. Artclonic

    Artclonic Гик

    Я так все и посчитал...Сила трения одинакова, как в верх, таки вниз...
    Таков алгоритм я и сам могу на интер сленге, какие изменения в мой код надо внести? К примеру если значение переменной "z" больше 500 - есть вакумм, предмет засосан, значение меньше либо равно 500 нет вакуума предмет не засосан.
     
  11. Belkin

    Belkin Гик

    В Си не спец, но если я правильно понял приведенный участок кода, то это вообще банальное переключение пинов из "1" в "0".
    Из предложенного алгоритма надо сделать проверку условий и вставлять ее в нужное место кода.
     
  12. Artclonic

    Artclonic Гик

    Абсолютно верно, бональные включение/выключение контактов... Но нужно условие на повтор выполнения предыдущего блока команд по условию... Как будет выглядеть ...не знаю..
     
  13. mcureenab

    mcureenab Гуру

    Твой "код" даже не компилируется.

    Почитай про опрератор if () else и функцию analogRead.

    Код (C++):
    int z = analogRead(vacuumPin);
    if(500 < z ) {
      // есть вакуум
    } else {
      // нет вакуум
    }
     
  14. Artclonic

    Artclonic Гик

    С чего ему компелироваться? Это кусок....
    Ага щаз свояю....Спасибо!
     
  15. Belkin

    Belkin Гик

    Создается впечатление, что я знаю Си лучше некоторых здесь... ;)
    Без обид, плиз...
     
  16. Artclonic

    Artclonic Гик

    Вот вроде своял...НО это не совсем то... Так сказать за один проход данныи код работает, но как при проверке условия учесть, что при повторном отсутствия вакуума он должен повторять
    digitalWrite(ob13, HIGH); //Включение элемента №3 (Блок II)
    digitalWrite(ob13,LOW); //Выключение элемента №3 (Блок II)
    и соответственно
    digitalWrite(ob13, HIGH); //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW); //Выключение элемента №3 (Блок III)
    бесконечно.... Пока не засосет/пока не снимется элемент с пневмопинцета.
    Код (C++):

    void setup()
    {
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(z, INTPUT);
      }

    // case 1: // блок команд на чтение значения «1»

        {

    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)


    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)

    if(500 < z ) // есть вакуум
    {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)

    if(500 > z ) // есть вакуум
    {
    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    digitalWrite(ob14,LOW);    //Выключение элемента №4 (Блок IV)
    }
    else // нет вакуум
    {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    }
    else // нет вакуум
    {
    digitalWrite(ob12, HIGH);  //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);    //Выключение элемента №2 (Блок II)
    }
        }

        // break;
     
  17. Artclonic

    Artclonic Гик

    Так и есть. Знал бы все сам написал и не спрашивал как сделать...Критика - стимулирует Все нормально
     
  18. Artclonic

    Artclonic Гик

    Вот вроде скомпелировался... но должны быть циклы же?
    Код (C++):
    int z = analogRead(32);// пин датчика аналогового
    const int ob11=48; // ШД №1
    const int ob12=34; // ШД №1
    const int ob13=36; // ШД №1
    const int ob14=38; // ШД №1

    void setup()
    {
    pinMode(ob11, OUTPUT);
    pinMode(ob12, OUTPUT);
    pinMode(ob13, OUTPUT);
    pinMode(ob14, OUTPUT);
    pinMode(z, INPUT);
      }

    void loop(){

    // case 1: // блок команд на чтение значения «1»
       

    digitalWrite(ob11, HIGH);  //Включение элемента №1  (Блок I)
    digitalWrite(ob11,LOW);    //Выключение элемента №1 (Блок I)


    digitalWrite(ob12, HIGH); //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);   //Выключение элемента №2 (Блок II)

    if(500 < z ) // есть вакуум
    {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)

    if(500 > z ) // есть вакуум
    {
    digitalWrite(ob14, HIGH);  //Включение элемента №4 (Блок IV)
    digitalWrite(ob14,LOW);    //Выключение элемента №4 (Блок IV)
    }
    else // нет вакуум
    {
    digitalWrite(ob13, HIGH);  //Включение элемента №3 (Блок III)
    digitalWrite(ob13,LOW);    //Выключение элемента №3 (Блок III)
    }
    }
    else // нет вакуум
    {
    digitalWrite(ob12, HIGH);  //Включение элемента №2 (Блок II)
    digitalWrite(ob12,LOW);    //Выключение элемента №2 (Блок II)
    }
       
        }

        // break;

     
     
  19. mcureenab

    mcureenab Гуру

    Функция loop вызывается в теле бесконечного цикла.

    С логикой проблема. За нет вакуум отвечает код с несовместимыми условиями.

    Код (C++):
    if(500 < z ) // есть вакуум
    {
    // .....

    if(500 > z ) // есть вакуум ?????
    { // этот код никогда не получит управление
     
  20. Artclonic

    Artclonic Гик

    Нееее. мне надо что б не весь код бесконечно выполнялся, а только предыдущая команда в случае не выполннения условия...
    Если вы заметили, что у меня case закоментированно, так вот таких блоков у меня много...
    при чтении с SD карты значения, будет выполнятся тот или иной САSE...Поэтому цикл нужен внутри блока... А вернее два цикла...
    Непонятно, Просто второе условие - работает на оборот, нет вакуума меняется на есть ваккум

    ПРавильно будет
    if(500> z )// нет вакуума
    Но с этим я разберусь, тут все понятно.., а вот с циклами...