Добрый день, использую в девайсе вакуумную присоску. Вакуумный генератор - это аквариумныи воздушныи компрессор с перевернутыми клапанами. Необходимо отслеживания наличия вакуума. прошу помощи в подборе модуля с датчиком давления.
Смотря какое давление его обычно мерит барометр в прочем в скетче кватернионного фильтра как раз есть барометр BMP 280 ))).
Определение силы вакуума. Взял медицинский шприц, к штоку повесил бутылочку с водой (вода для того что бы изменять вес бутылки). Определил следующие параметры. Шток начинает смещаться при весе груза 98 грамм (это свободное перемещение – определение силы трения между поршнем и стенкой цилиндра шприца) При подключении вакуумной трубки к шприцу, вес до которого поршень продолжает движение вверх – 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; Тут возникает вопрос как подцепить датчик, как его показания разбить на «есть» и «нет» вакуума, как придать это значение переменной… Вот схема подключения вариант первы датчик в потоке, второ вариант на тронике датчик. По перврму варианту если пневмопинцет засосал предмет - (закрыл проход потоку воздуху) поток прекратился. По второму варианту пока пневмо пинцет без предмета у датчика на троинике - нет вакуума, как только закрыть (пррисосать пинцетом предмет) - в датчике на тронике будет образовываться вакуум НАЛИЧИЕ ВАКУУМА ЭТО - НАЛИЧИЕ/ОТСУТСТВИЕ ПРИСОСАННОГО ПРЕДМЕТА
Достаточно установить порог для считываемых с датчика данных. Больше порога - есть вакуум, меньше - нет. Для начала - прочитать сам датчик в уже готовой системе или в модели со шприцом.
Как код на условие будет выглядеть? Подскажите плиз... Датчик с али едет...Хочу код своять к прибытию..
Я пишу в BASCOM... Попытаюсь на "интерсленге"... <порог> - установленный порог <датчик> - считанное с датчика значение <решение> - принятое решение <датчик> = ...читаем датчик... ЕСЛИ <датчик> > <порог>, то <решение> = "Вакуума нет" ЕСЛИ <датчик> < <порог>, то <решение> = "Вакуум есть" Или наоборот.
Сила трения покоя в 98 граммосил задаёт нижнюю границу диапазона измерений. Вакуум меньше этого значения датчик из шприца не определит. Надеюсь, сила трения одинакова при двидении вверх и вниз. Так что давление это (98 гс + вес груза гс ) / площадь штока.
Датчики разные бывают. Вам нужен датчик типа реле, которое срабатывает при установленном уровне вакуума. Тогда нужно просто периодически считывать состояние реле и принимать решение. Но подойдёт датчик, который пропорционально преобразует вакуум в напряжение или ток. Тогда МК оцифровывает напряжение от датчика, сравнивает с пороговым значением.
Я так все и посчитал...Сила трения одинакова, как в верх, таки вниз... Таков алгоритм я и сам могу на интер сленге, какие изменения в мой код надо внести? К примеру если значение переменной "z" больше 500 - есть вакумм, предмет засосан, значение меньше либо равно 500 нет вакуума предмет не засосан.
В Си не спец, но если я правильно понял приведенный участок кода, то это вообще банальное переключение пинов из "1" в "0". Из предложенного алгоритма надо сделать проверку условий и вставлять ее в нужное место кода.
Абсолютно верно, бональные включение/выключение контактов... Но нужно условие на повтор выполнения предыдущего блока команд по условию... Как будет выглядеть ...не знаю..
Твой "код" даже не компилируется. Почитай про опрератор if () else и функцию analogRead. Код (C++): int z = analogRead(vacuumPin); if(500 < z ) { // есть вакуум } else { // нет вакуум }
Вот вроде своял...НО это не совсем то... Так сказать за один проход данныи код работает, но как при проверке условия учесть, что при повторном отсутствия вакуума он должен повторять 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;
Вот вроде скомпелировался... но должны быть циклы же? Код (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;
Функция loop вызывается в теле бесконечного цикла. С логикой проблема. За нет вакуум отвечает код с несовместимыми условиями. Код (C++): if(500 < z ) // есть вакуум { // ..... if(500 > z ) // есть вакуум ????? { // этот код никогда не получит управление
Нееее. мне надо что б не весь код бесконечно выполнялся, а только предыдущая команда в случае не выполннения условия... Если вы заметили, что у меня case закоментированно, так вот таких блоков у меня много... при чтении с SD карты значения, будет выполнятся тот или иной САSE...Поэтому цикл нужен внутри блока... А вернее два цикла... Непонятно, Просто второе условие - работает на оборот, нет вакуума меняется на есть ваккум ПРавильно будет if(500> z )// нет вакуума Но с этим я разберусь, тут все понятно.., а вот с циклами...