Задержка по времени для сервы

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

коды сюда не забывайте грузить :) 

http://arduino.ru/forum/obshchii/vstavka-programmnogo-koda-v-temukomment...

Хорошо, спасибо! А небольшой вопросик: в Вашем примере в самом начале стоит "#define"... Это вызов библиотеки? У меня, к примеру, вызов библиотеки сервы выглядит как "#include <Servo.h> " В чем разница?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#define pinSensorT A0
#define pinServo 3 // PWM
unsigned long tTemper;
int liveTemper=60000; // измеряем каждые 60 сек
void setup()
{
  // установки
  tTemper=millis();
}
void loop()
{
  if((millis()-tTemper)>liveTemper)
    {
      // чтение Т 
      int T = analogRead(pinSensorT); // если датчик аналоговый - через резистивный делитель
     // поворот cервы
     byte angl=map(T,25,100,0,90);
     analogWrite(pinServo,angl);
     tTemper=millis();
    }
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

#define pinServo 3 // PWM

компилятор встретив в тексте pinServo подставит вместо него 3 ( макроподстановка )

 

удобнее в тексте применять мнемонопонятное определение, чем просто - 3.....

 

с инклудами - всё сложнее - читайте про С++ ( в частном случае - это подключение библиотеки )

Andrey-S
Offline
Зарегистрирован: 02.01.2015
#define pinSensorT A0
#define pinServo 9 // PWM
unsigned long tTemper;
int liveTemper=6000; // измеряем каждые 60 сек
void setup()
{
  tTemper=millis();
}
void loop()
{
   if((millis()-tTemper)>liveTemper)
{
  int T = analogRead(pinSensorT); // если датчик аналоговый - через резистивный делитель
byte angl=map(T,20,30,0,90);
analogWrite(pinServo,angl);
tTemper=millis();
}
}

Подредактировал Ваш код под эксперименты на борде... Серва каждые 6 секунд в конвульсиях)))... Чего-то не хватает видимо

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

pinMode( 3 , OUTPUT ) и pinMode( pinServo , OUTPUT ) - одно и тоже, НО второе - понятнее

bwn
Offline
Зарегистрирован: 25.08.2014

Директива #define служит для замены часто использующихся лексических единиц Си (констант, ключевых слов, операторов или выражений) на другие, так называемые идентификаторы.

Перед компиляцией программы препроцессор в соответствии с директивой #define заменит все идентификаторы , встречающиеся в программе, на соответствующий им текст.

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

#define pinSensorT A0
#define pinServo 9 // PWM
unsigned long tTemper;
int liveTemper=6000; // измеряем каждые 60 сек
void setup()
{
  tTemper=millis();
}
void loop()
{
   if((millis()-tTemper)>liveTemper)
{
  int T = analogRead(pinSensorT); // если датчик аналоговый - через резистивный делитель
byte angl=map(T,20,30,0,90);
analogWrite(pinServo,angl);
tTemper=millis();
}
}

Подредактировал Ваш код под эксперименты на борде... Серва каждые 6 секунд в конвульсиях)))... Чего-то не хватает видимо

Ну для начала вы в map сжали диапазон дальше некуда. на 10гр.температуры аж 90 град.поворота. Ее и будет колбасить, она у вас десятые доли температуры отрабатывает.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а что вы повесили на пин A0 ? выше был пример с вопросами.....

в вашем коде пин A0 ловит помехи, считывает от 0 до 1023 случайно - вот серву и колбасит :(

в примере не все установки прописаны !!!!!!!!!!!!!!!!

Andrey-S
Offline
Зарегистрирован: 02.01.2015

А вроде бы как можно писать:


int ledPin=13;
void setup(){
pinMode (ledPin, OUTPUT);
}

Это тоже самое или я ерунду написал?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

так больше памяти расходуется... int - много, byte - 0....255 - хватит, ибо пинов больше не бывает

но лучше для экономии памяти так 

#define ledPin 13     // БЕЗ ТОЧКИ С ЗАПЯТОЙ !!!!!!!!!!!!
void setup()
{
  pinMode(ledPin,OUTPUT);
}

 

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

А вроде бы как можно писать:


int ledPin=13;
void setup(){
pinMode (ledPin, OUTPUT);
}

Это тоже самое или я ерунду написал?

Ну а если очень сильно захотите как у вас в примере, то

const byte ledPin = 13;

const не даст вам в коде изменить его значение. И вроде как размещает эту переменную во флэш, а не в оперативке (в этом не уверен)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Спасибо вам за помощь, я за час понял больше чем за неделю благодаря вам)))...  Завтра обязательно постараюсь отписаться о результатах, ибо сейчас эксперименты зашли в тупик))) А именно я не понял из кода выше, как без библиотеки сервы, в которой содержатся все паузы и прочее, заставить серву работать и поворачиваться на 0 и 90 градусов соответственно))) Может в примере нужна все таки эта библиотека?

bwn
Offline
Зарегистрирован: 25.08.2014

Ну вам же SU-27-16 написал, что это пример. Подразумевается, что библиотеки, переменные вы сами проверите, подключите и объявите. Я вам когда писал про диапазон в map, подразумевал, что температуру вы уже получаете корректную. Теперь в этом не уверен.

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Походу я небезнадежен:-) Осталось сюда attach-detach впихнуть и, думаю, будет практически то, что надо!

#define pinSensorT A0
#include <Servo.h>
Servo myservo; 
unsigned long tTemper;
int liveTemper=6000; // измеряем каждые 6 сек
void setup()
{ myservo.attach(9);
  tTemper=millis();
  Serial.begin(9600);
}
void loop()
{
  
  int T = analogRead(pinSensorT);
 T=T*0.48828125;
   if((millis()-tTemper)>liveTemper)
{
  
byte angl=map(T,20,30,0,90);
myservo.write(angl);
tTemper=millis();
}
Serial.println(T);
delay(1000);
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

SU-27-16 пишет:

чем управляет серва ? при detach сервы неведомые нам силы могут и подвинуть серву в сторону противодействия :(

Не могут! Не имеют права !!  Проверено электроникой !!! 

Разве что только если нагрузка на валу сможет серву провернуть ( а удержания то нету! ). Но это только у 4-9 граммовых можно с трудом, но свернуть её за выходной вал, а у более тяжёлых вряд-ли удастся.

А после attach будет подана "команда" на предыдущую позицию, ту что была до detach, поэтому серва никуда и не дёрнется. Это положение библиотека сама запоминает .

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Попрбуйте так:


#define pinSensorT A0
#include <Servo.h>
Servo myservo;
unsigned long tTemper;
int liveTemper=6000; // измеряем каждые 6 сек
void setup()
{
  // myservo.attach(9);
  tTemper=millis();
  Serial.begin(9600);
}
void loop()
{

  int T = analogRead(pinSensorT);
  T=T*0.48828125;
  if((millis()-tTemper)>liveTemper)
  {

    byte angl=map(T,20,30,0,90);
    myservo.attach(9);
    myservo.write(angl);
    delay(100);
    myservo.detach();
    tTemper=millis();
  }
  Serial.println(T);
  delay(1000);
}

 

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
int T = analogRead(pinSensorT);

T=T*0.48828125;

что за датчик температуры ? при чтении с A0 значения например 512 - T = 250 ? если датчик от авто и делитель напряжения - то делитель неправильно рассчитан.....

строки 15,16 - в строки 19, 19А, строку 27 - в 25А, 28 убрать - зачем измерять и выводить в сериал Т каждую секунду, а применять раз в 6 сек ? 

строку 27 Serial.println(T); в строку

Serial.print(" T = "); Serial.print(T); Serial.print("   angl = "); Serial.println(angl);

про sprintf() - попозже изучите :)

trembo, спасибо за #65

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Датчик вот такой http://arduino55.ru/index.php?route=record/record&blog_id=65&record_id=71 ... Пока работает неплохо, не смотря на мои всяческие издевательства))) Показывает довольно корректную температуру.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

я так понимаю он для опытов ? вы же Т воды собирались измерять....

Andrey-S
Offline
Зарегистрирован: 02.01.2015

А я его через термоклей к металлической трубе пришпандорю)))) Можно предварительно наполовину залить эпоксидным клеем))

Andrey-S
Offline
Зарегистрирован: 02.01.2015

По поводу вышеизложенного кода с дополнениями ниже - попробую сейчас и отпишусь!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

можно и так....

а можно и датчик Т вазовский прилепить, если есть возможность резьбу под него в трубе нарезать - покажет непосредственно Т воды и заменить легко, если чё

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

строка 5А - const float k=0.48828125;

строка 15 - int T = analogRead(pinSensorT) * k ;

это облегчение компилятору и для чтения текста удобнее...

когда проект разрастётся, может придётся поменять имя - по названию переменной/константы всё понятно, например

const float kLM35toT=0.48828125;

или k_LM35_To_T - но так выделять для копирования одним кликом не получится :(

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Вот блин, все работает! Серва отключается, потом через 6 секунд включается и меняет положение... Я вчера и так.... и сяк... Компилятор уже матерится на меня ща чувствую начнет причем по-русски.. А чем отличается myservo.attach от myservo.attached? И я так понял при включении сервы (аттач) необходимо в скобках прописывать пин сервы, а при выключении - нет? А если у меня две сервы в одном условии if? Детач обе вырубит чтоли?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

у второй сервы будет другое имя

аттач - указание подключиться, а аттачед - это вопрос, проверка подключена ли серва

воткните в код Serial.println( myservo.attached ); в строки 20А, 21А, 24А - увидите что происходит

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

при детаче МК знает пин сервы от аттача

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

не читали чоли ? http://arduino.ru/Reference/Library/Servo

Andrey-S
Offline
Зарегистрирован: 02.01.2015

Агааа... Выдает 0-1-0 соответственно... А если будет подключена серва с шаровым краном, у которой скорость вращения меньше раза в 3, то достаточно в строке 23 delay сделать побольше опытным путем  и все?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

да

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

разве в кране стоит серва ? а не мотор-редуктор ? есть фото, описание указанного шарового крана ?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

полезно добавить в код - каждый час поворот крана от мин до макс раза три - чёбы шар не закис 

Andrey-S
Offline
Зарегистрирован: 02.01.2015

SU-27-16 пишет:

полезно добавить в код - каждый час поворот крана от мин до макс раза три - чёбы шар не закис 

Ну за час точно не закиснет))) Раз в месяц вполне достаточно... Да и к чему, если каждый день он сам будет вначале растопки полностью закрыт, а в середине уже полностью открыт... Кран примерно думаю такой будет http://www.vesta-trading.ru/catalog/klapany_reduktory/elektromagnitnye_klapany/kran_sharovoj_s_servoprivodom_1_2323.html  ... И, кстати, я упустил такой момент, но думаю уже благодаря вам соображу: Растопка котла - серва закрыта (ждем 60 градусов Цельсия и началы работы функции map совместно с сервой)... Котел растопился и вышел на рабочий режим - серва в любом положении между МИН и МАХ... И тут котел затухает и согласно коду серва закрывается... Но не надо, чтобы она закрывалась, а надо, чтобы в этот момент наоборот открывалась, чтобы теплоноситель  в системе отопления продолжал циркулировать предотвращая замерзание системы в "слабых" местах.

bwn
Offline
Зарегистрирован: 25.08.2014

Andrey-S пишет:

Агааа... Выдает 0-1-0 соответственно... А если будет подключена серва с шаровым краном, у которой скорость вращения меньше раза в 3, то достаточно в строке 23 delay сделать побольше опытным путем  и все?

Какой delay(), все эти гадости в топку. В рабочем коде, любые delay()подобные команды, считать впадением в ересь и проводить публичное аутодафе. И не важно, что "ведь все работает", эти грабли все равно однажды ударят.

bwn
Offline
Зарегистрирован: 25.08.2014

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

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Andrey-S, сервопривод - широкое определение, ваш кран - это мотор-редуктор с концевыми выключателями( к Servo как вы использовали в опытах - не имеет отношения)...

И тут котел затухает и согласно коду серва закрывается... Но не надо, чтобы она закрывалась, а надо, чтобы в этот момент наоборот открывалась, чтобы теплоноситель  в системе отопления продолжал циркулировать предотвращая замерзание системы в "слабых" местах.

для этого нужен ещё один признак-флаг - котёл в норме или нет

если котёл в норме и >60 - открыть, если котёл в норме и <60 - закрыть, если котёл НЕ в норме - открыть независимо от температуры и оповестить вас - АВАРИЯ

как будете отлавливать котёл ? можно по Т в топке....

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Да, это шаровой вентиль  с моторчиком и концевиками.

У меня такие есть http://www.aliexpress.com/item/1-2-DN15-DC12V-3-Way-T-Port-Electric-Ball-Valve-Brass-Motorized-Ball-Valve-5/32263252100.html

Удобно управлять в двухпроводном варианте: подал напряжение- провернулся и сам остановился, напряжение можно не снимать. Подал обратную полярность- опять повернулся. Вот только там моторчик простой на 12 Вольт, как-то останавливать посередине - это надо на короткое время питание подавать и насколько повернулся неизвесно, надо смотреть результат этого управления и корректировать.. Это не серва где всё понятно.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

у ТС питание 220

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Судя по картинке выведены концевики- а это геморройс логикой и программой

Лучше использовать 12 Вольтовые и именно двухпроводные- я уже писал как легко ими управлять с Ардуино.

Да и ток потребления при повороте там совсем смешной- миллиампер 300 будет, любой адаптер на 1 Ампер и ещё через пару диодов аккумулятор подцепить от машины с преобразователем на 100 -200 Ватт ( синусный-  обязательно для работы циркуляционника) -вообще автономно достаточно долго будет. Ну и 220 Вольт не будет рядом с трубами-водой-Ардуиной

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

ага, Ну и 220 Вольт не будет рядом с трубами-водой-Ардуиной

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

если ТС кулибин то  - простой поворотный кран, плечо и серва посильней....

можно будет управлять проходным отверстием крана :)

bwn
Offline
Зарегистрирован: 25.08.2014

SU-27-16 пишет:

если ТС кулибин то  - простой поворотный кран, плечо и серва посильней....

можно будет управлять проходным отверстием крана :)

О, именно так и собираюсь на своей ректификационной колонне замутить.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

а ещё лучше поставить трёхходовой кран - один выход на котёл, второй в обход котла - циркуляция ВСЕГДА есть, управление температурой положением трёхходовика ( сколько воды через котёл для нагрева, а сколько через байпас )

схемку нарисовать ? ;)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

рисовать неохота....

выхЦиркНасос - входТрёхХод - 1выхТрёхХод - вхКотёл - выхКотёл - батареи отопления - вхЦиркНасос

                                              - 2выхТрёхХод - выхКотёл - 

:)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

bwn пишет:

SU-27-16 пишет:

если ТС кулибин то  - простой поворотный кран, плечо и серва посильней....

можно будет управлять проходным отверстием крана :)

О, именно так и собираюсь на своей ректификационной колонне замутить.

программное управление-защита само сбой, а поставить микрики в крайних положениях не помешает, ибо какая серва ? - может и шток крану свернуть :(

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Серву, да помощьней, ещё как-то закрепить на вентиле надо умудриться, да чтобы она себя саму не свернула. Упрётся- выломает всё или себя сломает. Вы сможете это сделать? А какой ток при этом упоре жрать будет?

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

Куча минусов.

А китайский за 30 уе как бюджетный не  катит? Тюх-тюх-тюх  за 5- 2 секунды от 7 до 15 Вольт при 300 миллиамперах

http://arduino.ru/forum/programmirovanie/zaderzhka-po-vremeni-dlya-servy?page=1#comment-100371

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

проектировали/делали брату на даче.... так он сразу отказался от сервы, спать говорит хочу спокойно :)

сделал ему трёхходовой вентиль из двух тюх-тюх-тюшных работающих в противофазе....

....спит спокойно :)

Andrey-S
Offline
Зарегистрирован: 02.01.2015

trembo пишет:

Да, это шаровой вентиль  с моторчиком и концевиками.

У меня такие есть http://www.aliexpress.com/item/1-2-DN15-DC12V-3-Way-T-Port-Electric-Ball-Valve-Brass-Motorized-Ball-Valve-5/32263252100.html

Удобно управлять в двухпроводном варианте: подал напряжение- провернулся и сам остановился, напряжение можно не снимать. Подал обратную полярность- опять повернулся. Вот только там моторчик простой на 12 Вольт, как-то останавливать посередине - это надо на короткое время питание подавать и насколько повернулся неизвесно, надо смотреть результат этого управления и корректировать.. Это не серва где всё понятно.

А, кстати, неплохой вариант! Опытным путем можно вычислить среднее положение и заморочиться чуть с кодом. К, примеру, такой кран с "али" я бы себе поставил в подвал на капельный полив и запрограммировал ардуинку по времени.. Каждый вечер в такое то время на 2ч открывать. И еще с телефона прям врубать/вырубать :-). Благодарю за "пиннок", закажу себе такой кран для дома. А если взять опять же такой кран только необходимым диаметром для котла 1" ( http://ru.aliexpress.com/store/product/1-DN25-DC12V-Motorized-Ball-Valve... ) например.... и уйти от среднего положения совсем и от "mapинга"... Скажем, греем котел сразу до 70-80градусов (помним, что минимальная рабочая температура котла 60град) и потом полностью открываем кран. Если температура падает до 60, то снова закрываем. Ну раза 3 он крутанется за час и встенет до конца в открытом положении. И реализовать все через обычное 3х-пиновое реле как раз. Что скажете по этому поводу?

bwn
Offline
Зарегистрирован: 25.08.2014

Почему бы и нет?

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

У меня сейчас на улице "0",  а котёл, согласно погодному графику, готовит 35-40 градусов подачу. В тёплый пол уходит 30 ( свой регулятор), в большие радиаторы всё что даёт котёл.

Не понял что такое: (помним, что минимальная рабочая температура котла 60град). У вас что, нет запаса мощьности и приходится её где-то накапливать? Обычно стараются держать минимум температуры- так выше КПД( Карно писАл)