Автоматическая рулонная штора своими руками.

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

Это навязаное неизвестно кем мнение.  :) Я раньше тоже так примерно думал, потом изучил вопрос повнимательней, никто лавочки у меня под окнами не строит и билеты в театр не продает :) Хотя был театер одно время, когда монтировали кухню и подсветку.

Если вас так волнует что вы в витрине,  повесте жалюзи,ну или вообще окна кирпичем заложите :)

Живу на первом этаже и представьте себе - волнует :)) И мне кажется что это нормально. Вы же по городу без штанов не ходите.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Vallu пишет:

Вы меня растраиваете :( . Значить опять лепить придется из подручных средств. Дома буду в воскресенье, превым делом соберу миханизм и попробую, отчет сразу выложу.

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

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Живу на первом этаже и представьте себе - волнует :)) И мне кажется что это нормально. Вы же по городу без штанов не ходите.

Дык и по дому без штанов я тоже не хожу... Странно это вообще без штанов ходить..

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Не спорьте горячие финские парни :))) . И прошу по теме больше конкретики т.е. предложения, варианты, коды. Зарание спасибо.

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

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

Если это та форточка, что на видео, то это не форточка а фромуга. Петли горизонтально. А это гораздо труднее двигать в отличии от вертикальных петель.

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

Дык и по дому без штанов я тоже не хожу... Странно это вообще без штанов ходить..

Скажу по секрету, дома люблю ходить в трусах и  майке :))

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Если это та форточка, что на видео, то это не форточка а фромуга. Петли горизонтально. А это гораздо труднее двигать в отличии от вертикальных петель.

[/quote]

Спорить не буду в воскресенье отпишусь о результатах. Но завтра сьезжу на радиорынок посмотрю варианты шаговиков с редукторами помощнее, спасибо за предуприждение.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

 

Скажу по секрету, дома люблю ходить в трусах и  майке :))

[/quote]

Блин, я тоже :) . А то и без майки :)))

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Скажу по секрету, дома люблю ходить в трусах и  майке :))

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

Ибо класические семейники в нынешних вариантах лихо канают за шорты...

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

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

Ибо класические семейники в нынешних вариантах лихо канают за шорты...

:))))

Ладно....завязываем не по теме :)

Joiner
Offline
Зарегистрирован: 04.09.2014

А что касается шаговика на штору могу пояснить следущее, как я это себе представляю.

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

Потом сама программа. Штора открыта, состояние записано в программе. Получили сигнал. Раз штора открыта, поехали вниз на известное нам количество шагов. Достигли, записали что штора закрыта. Получили сигнал. Раз штора закрыта, то поехали вверх на известное намколичество шагов, записали что штора открыта. Вот так, одной кнопкой, без каких-либо датчиков.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Ладно....завязываем не по теме :)

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

тут остаеться только усилия расчитывать и рычаги что бы хватало легкого счелчка

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

А что касается шаговика на штору могу пояснить следущее, как я это себе представляю.

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

Потом сама программа. Штора открыта, состояние записано в программе. Получили сигнал. Раз штора открыта, поехали вниз на известное нам количество шагов. Достигли, записали что штора закрыта. Получили сигнал. Раз штора закрыта, то поехали вверх на известное намколичество шагов, записали что штора открыта. Вот так, одной кнопкой, без каких-либо датчиков.

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

Joiner
Offline
Зарегистрирован: 04.09.2014

Puhlyaviy пишет:

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

Тоже вариант, немного сложнее, но более гибкий.

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Joiner пишет:

Тоже вариант, немного сложнее, но более гибкий.

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

Mikhail_Sakh
Offline
Зарегистрирован: 03.04.2014

Puhlyaviy пишет:

ГЕ-НИ-АЛЬ-НО!

 

Я ЖДАЛ )))))

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

 А если серьёзно, никто не мешает подпружинить механизм остановки (могу даже схемку накидать, как это реализовать применительно к шторам) дабы нагрузка возрастала более плавно. Двигател, он на то и двигатель, чтобы работать под нагрузкой. Только надо учесть возможности БП, драйвера двигателя (если имеется) и самого двигателя, снять замеры и прикинуть, чтобы всё это не выходило за выше упомянутые возможности силовых компонентов системы.  И кстати, датчик тока, как раз таки и выполняет защитную функцию по перегрузке. Что будет, если магнитик проскочит геркон, или датчик холла и двигатель не остановится? (тем более, что направляющих у штор нет).  

Puhlyaviy пишет:

Я за вариант, что шторы это нечто декоративное.

Я бы тоже не заморачивался, но вот с "переводом часов", точнее с его отсутствием теперь, многие мои знакомые, да в том числе и я, столкнулись с неприятной проблемой сбитых биоритмов, когда зимой в 17:00 уже темно, а летом в 4:30 уже светло. С потемками то можно бороться, а с лупящим в глаз в 5 утра Солнцем (хоть я ему и рад до безумия- погода не часто радует) можно бороться только при помощи штор (ну хочется поспать еще час другой). 

Puhlyaviy
Puhlyaviy аватар
Offline
Зарегистрирован: 22.05.2013

Mikhail_Sakh пишет:

Я ЖДАЛ )))))

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

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

Я так понимаю что вы не читаете другие коментарии... Снимите двигатель стеклоподьемника с любой японки... и ( барабанный бой) обнаружте внутри датчик Хола. :) тадам

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Здравствуйте, прошу прощения за задержку (поздно приехал). Joiner оказался прав. Шаговик полное г.... . Решил взять мотор с редуктором который первоначально был предназначен для шторы но оказался очень медленным. Фото процесса адаптации:

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

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

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

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

ось рычага в шестерню входит ? пропили в ней паз под штифт....

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

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

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

ось рычага в шестерню входит ? пропили в ней паз под штифт....

так и было задумано, но надо шоб рычаг держался на редукторе.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

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

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

лучше болт , чем шпилька :) ( нижняя гайка - это типа голова болта )

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

параллельно нарисовал так же со сквозной шпилькой :), но завтра эксперементальным путем проверю как будет лучше.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

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

магнит + геркон - не по времени , а по колву оборотов

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

магнит + геркон - не по времени , а по колву оборотов

эта шестерня будет поворачиваться примерно градусов на 100.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

А с герконом хорошо придумано надо попробовать. С углом я так на вскидку, это уже по месту буду смотреть.

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

через весь корпус и вторую или третью шестерёнку от червяка сквозное отверстие D=3..5 мм - снаружи корпуса с одной стороны светодиод , с другой фоторезистор - это ещё проще

или этот http://robocraft.ru/shop/index.php?route=product/product&path=38&product_id=143 и 
одно отверстие в корпусе,  и блестяшку на шестерёнку....

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

 удачи.....

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

через весь корпус и вторую или третью шестерёнку от червяка сквозное отверстие D=3..5 мм - снаружи корпуса с одной стороны светодиод , с другой фоторезистор - это ещё проще

или этот http://robocraft.ru/shop/index.php?route=product/product&path=38&product_id=143 и 
одно отверстие в корпусе,  и блестяшку на шестерёнку....

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

 удачи.....

к сожалению токаря нет :( . Попробую реализовать на фоторезисторе и фотодиоде они под рукой есть, а фотоинтераптора нет, надо заказывать, а это время.

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

http://www.chipdip.ru/product/ktir0821ds/

знакомый токарь-фрезеровщик-фанат у тибя соседом , Б.Ижора.... в ЧТВ переговорю с ним....
если сделаешь чертёж , вернее размеры , будет с ним уже разговор конкретный ( не любит обсуждать эскизы )
ещё бы фотку мотор-редуктора с другой стороны , посмотреть выход вала шестерни....

позвони в ЧТВ 10...23 305-17-05 , -51 - текст "беспилотники, Кронштадт , прошу УТП-1"

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

TSheff пишет:

Логичнее так:

да :) спасибо

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

файл "Vallu.ino"


#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
volatile int posFramDelta =   0;      // приращение положения фрамуги
boolean directFram = 0;               // направление = 0 - close , 1 - open
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
}
//=====================================================
//     функция-подпрограмма поднятия/опускания шторы
//=====================================================
void StoraUpDown( boolean direction )
{
  digitalWrite( pinDriverStA, direction );
  digitalWrite( pinDriverStB, !direction );
  if (direction)
  {
    delay ( timeStoraDown );
  } 
  else
  {
    delay ( timeStoraUp );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд и управление шторой
  if ( irrecv.decode(&results) )
    {
      delay( timeIR ); 
      if ( codeIRstoraUp == results.value )
        {
          StoraUpDown( HIGH );                   // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          StoraUpDown( LOW );                    // штора вниз
        }
      if ( codeIRframOpen == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу приоткрыть
        }    
      if ( codeIRframClose == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу призакрыть
        }    
      if ( codeIRframSet == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу юстировать
        } 
      irrecv.resume(); 
    }
// управление фрамугой
// ....................................................
// продолжение следует ................................
    
    
    
}
//=====================================================

файл "ValluDef.h"


#include "Arduino.h"

// определения

// IR
#define recvPin 11
#define timeIR 300
// коды
#define codeIRstoraUp   0xDAEA83EC  // штора вверх
#define codeIRstoraDown 0x2BAFCEEC  // штора вниз
#define codeIRframOpen  0xFEFEFEFE  // фрамугу приоткрыть
#define codeIRframClose 0xACACACAC  // фрамугу призакрыть
#define codeIRframSet   0x78787878  // юстировка положения фрамуги
// штора
#define pinDriverStA    3
#define pinDriverStB    5
#define timeStoraDown   25300
#define timeStoraUp     42500
// фрамуга
#define pinDriverFrA    7
#define pinDriverFrB    8
#define pinEncoderFr    2           // прерывание "0"
#define maxStepFr       1900        // шагов для максимального открытия фрамуги
#define microStepFr     100         // шагов для перемещения на одно нажатие кнопки

 

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 (подскажите как к Вам обращаться), спасибо Вам огромнейшее за помощь. Токарь которого Вы рекомендуете от меня долековато, я живу в финке, родители в Кронштадте, а сестра на Ленинском пр. но я примерно раз в месяц показываюсь в Питере. Сейчас попытаюсь сделать на шпильке, если что, у меня в запасе есть редуктор с мотором и рычаг. Буду эксперементировать :)

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

обновление-устранение ошибок :)

Vallu.ino

#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
volatile int posFramDelta =   0;      // приращение положения фрамуги
boolean directFram = 0;               // направление = 0 - close , 1 - open
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                      // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                        // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу приоткрыть
        }    
      if ( codeIRframClose == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу призакрыть
        }    
      if ( codeIRframSet == results.value )
        {
          //StoraUpDown( LOW );                  // фрамугу юстировать
        } 
      irrecv.resume(); 
    }
// управление фрамугой
// ....................................................
// продолжение следует ................................
    
    
    
}
//=====================================================

ValluDef.h

#include "Arduino.h"

// определения

// IR
#define recvPin 11
#define timeIR 300
// коды
#define codeIRstoraUp   0xDAEA83EC  // штора вверх
#define codeIRstoraDown 0x2BAFCEEC  // штора вниз
#define codeIRframOpen  0xFEFEFEFE  // фрамугу приоткрыть
#define codeIRframClose 0xACACACAC  // фрамугу призакрыть
#define codeIRframSet   0x78787878  // юстировка положения фрамуги
// штора
#define pinDriverStA    3
#define pinDriverStB    5
#define timeStoraDown   25300
#define timeStoraUp     42500
// фрамуга
#define pinDriverFrA    7
#define pinDriverFrB    8
#define pinEncoderFr    2           // прерывание "0"
#define maxStepFr       1900        // шагов для максимального открытия фрамуги
#define microStepFr     100         // шагов для перемещения на одно нажатие кнопки
// мотор
#define motorStop       2
#define motorUp         1
#define motorDown       0

Александр :)

......недостаток с делеями - на время подъёма-опускания шторы ардуина будет глуха и нема, фрамуга будет недоступна
надо будет переходить к millis()

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Очень приятно Александр, меня зовут Валерий. Сейчас собрал редуктор с рычагом, попробую это дело на усилие, как закончу отпишусь. Наверное глупый вопрос а почему два файла? я так понимаю второй идет в первый после определения библиотек или я совсем лашара?

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

"Vallu.ino" - вроде бы всё.... надо тестировать....

#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
volatile int posFramDelta =   0;      // приращение положения фрамуги
boolean directFram = 0;               // направление = 0 - close , 1 - open
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                      // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                        // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
    if( posFramCurrent > maxStepFr )
    {
      posFramCurrent = maxStepFr;
      posFramDelta = 0;
    }
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
    if( posFramCurrent < 0 )
    {
      posFramCurrent = 0;
      posFramDelta = 0;
    }
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          directFram = 1;                        // фрамугу приоткрыть
          posFramDelta = posFramDelta + microStepFr;
        }    
      if ( codeIRframClose == results.value )
        {
          directFram = 0;                        // фрамугу призакрыть
          posFramDelta = posFramDelta - microStepFr;
        }    
      if ( codeIRframSet == results.value )
        {
          directFram = 0;                        // фрамугу юстировать
          posFramDelta = 6;                      // подбор-настройка
        } 
      irrecv.resume(); 
    }
// управление фрамугой
  if( directFram && ( posFramDelta != 0 ) )      // фрамугу приоткрыть
  {
    MotorFram( motorUp );
    while( posFramDelta > 0 ) {}
    MotorFram( motorStop );
  }
  if( !directFram && ( posFramDelta != 0 ) )      // фрамугу призакрыть
  {
    MotorFram( motorDown );
    while( posFramDelta > 0 ) {}
    MotorFram( motorStop );
  }
  if( posFramDelta != 0 )                         // фрамугу юстировать
  {
    MotorFram( motorDown );
    while( posFramDelta > 0 ) {}
    MotorFram( motorStop );
  }
}
//=====================================================

:) приятно познакомиться

вложенные файлы - удобная штука ( могут быть вложенными во вложенные ) - котлеты в одном файле, мухи в другом
Linker и компилятор сами во всём разберутся, где что.....
упрощается основной код для чтения ( это не самое главное )

скопируй текст "Vallu.ino" в IDE и сохрани скетч как "Vallu"
в правом верхнем углу IDE есть треугольничек - жми и выбери "New Tab" , внизу введи название нового файла "ValluDef.h"
....увидишь новую вкладку - в неё скопируй текст из "ValluDef.h"
.....сохрани скетч

лучшееееееее и проще на ТЫ :)

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

работа кода :

предположим , что ход фрамуги от закр до полнОткр - 2000 тиков энкодера

пульт, кнопка ШтНиз  - штора поехала, пока едет ничего не доступно
пульт, кнопка ШтВерх - штора поехала, пока едет ничего не доступно

пульт, кнопка ФрОткр                        - фрамуга поехала откр на 400 тиков энкодера, остановилась, положение 400
пульт, кнопка ФрОткр два раза          - фрамуга поехала откр на 800 тиков энкодера, остановилась, положение 1200
пульт, кнопка ФрЗакр три....семь раз - фрамуга поехала закр на 1200....2800 тиков энкодера, но это не так....
                                                            фрамуга остановится как только положение станет 0
пульт, кнопка ФрОткр шесть раз       - фрамуга поехала откр на 2400 тиков энкодера, но это не так....                                                                                                                        фрамуга остановится как только положение станет 2000
пульт, кнопка ЮстФр +/-                   - ручной режим, фрамуга откр или закр на 20 тиков, стоп

юстировка - кнопками ЮстФр +/- установить нужное положение-усилиеЗакрытия , выключить питание ардуины ( или ресет ), включить питание

при отработке мотором положения фрамуги - управление шторой недоступно

недостаток - без концевиков крайних положенений фрамуги при сбое питания возможны повреждения шестерён мотор-редуктора, рычага, фрамуги или вообще оконного проёма :) , смотря какой узел слабее :(

под это всё обновил коды :
******.ino

#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
volatile int posFramDelta =   0;      // приращение положения фрамуги
boolean directFram = 0;               // направление = 0 - close , 1 - open
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                      // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                        // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
    if( posFramCurrent > maxStepFr )
    {
      posFramCurrent = maxStepFr;
      posFramDelta = 0;
    }
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
    if( posFramCurrent < 0 )
    {
      posFramCurrent = 0;
      posFramDelta = 0;
    }
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          directFram = 1;                        // фрамугу приоткрыть
          posFramDelta = posFramDelta + microStepFr;
        }    
      if ( codeIRframClose == results.value )
        {
          directFram = 0;                        // фрамугу призакрыть
          posFramDelta = posFramDelta - microStepFr;
        } 
      if ( codeIRframSetOpen == results.value )
        {
          directFram = 1;                        // фрамугу юстировать +
          posFramDelta = ustStepFr;
        }    
      if ( codeIRframSetClose == results.value )
        {
          directFram = 0;                        // фрамугу юстировать -
          posFramDelta = ustStepFr;
        } 
      irrecv.resume(); 
    }
// управление фрамугой
  if( directFram && ( posFramDelta != 0 ) )      // фрамугу приоткрыть
  {
    MotorFram( motorUp );
    while( posFramDelta > 0 ) {}
    MotorFram( motorStop );
  }
  if( !directFram && ( posFramDelta != 0 ) )     // фрамугу призакрыть
  {
    MotorFram( motorDown );
    while( posFramDelta > 0 ) {}
    MotorFram( motorStop );
  }
}
//=====================================================

***Def.h

#include "Arduino.h"

// определения

// IR
#define recvPin 11
#define timeIR 300
// коды
#define codeIRstoraUp      0xDAEA83EC  // штора вверх
#define codeIRstoraDown    0x2BAFCEEC  // штора вниз
#define codeIRframOpen     0xFEFEFEFE  // фрамугу приоткрыть               пример
#define codeIRframClose    0xACACACAC  // фрамугу призакрыть               пример
#define codeIRframSetOpen  0x78787878  // юстировка положения фрамуги +    пример
#define codeIRframSetClose 0x78787878  // юстировка положения фрамуги -    пример
// штора
#define pinDriverStA    3
#define pinDriverStB    5
#define timeStoraDown   25300  // подбор-настройка
#define timeStoraUp     42500  // подбор-настройка
// фрамуга
#define pinDriverFrA    7
#define pinDriverFrB    8
#define pinEncoderFr    2      // прерывание "0"
#define maxStepFr       2000   // шагов для максимального открытия фрамуги, подбор-настройка
#define microStepFr     400    // шагов для перемещения на одно нажатие кнопки, подбор-настройка
#define ustStepFr       20     // шагов для регулировки положения и усилия "закрыто"
// мотор
#define motorStop       2
#define motorUp         1
#define motorDown       0

 

 

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

На ТЫ очень согласен. С файлами разобрался (хорошая инструкция). Собрал все в кучу, попробовал программу от шторы со временем. Время уменьшил до 3х сек. драйвер использую л298н с 12в редуктор работает на ура. Сейчас хочу сделать крепеж и попробовать открыть формугу. Если все заработает буду мудрить дальше. Концевики на формугу буду лепить обязятельно. Жаль конечно что новый код не попробовать :(.

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

почему не попробовать ? ща адаптируем ( временно )

смотри коммент ВРЕМЕННО !!!!!!!!!!!!!!!!! ( файл *****.h - тот же )

#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
//volatile int posFramDelta =   0;    // приращение положения фрамуги
volatile int posFramDelta =   100;    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//boolean directFram = 0;             // направление = 0 - close , 1 - open
                                      // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte directFram = 2;                  // направление = 0 - close , 1 - open , 2 - стоять
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                      // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                        // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
    if( posFramCurrent > maxStepFr )
    {
      posFramCurrent = maxStepFr;
      posFramDelta = 0;
    }
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
    if( posFramCurrent < 0 )
    {
      posFramCurrent = 0;
      posFramDelta = 0;
    }
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          directFram = 1;                        // фрамугу приоткрыть
          posFramDelta = posFramDelta + microStepFr;
        }    
      if ( codeIRframClose == results.value )
        {
          directFram = 0;                        // фрамугу призакрыть
          posFramDelta = posFramDelta - microStepFr;
        } 
      if ( codeIRframAdjustOpen == results.value )
        {
          directFram = 1;                        // фрамугу юстировать +
          posFramDelta = adjustStepFr;
        }    
      if ( codeIRframAdjustClose == results.value )
        {
          directFram = 0;                        // фрамугу юстировать -
          posFramDelta = adjustStepFr;
        } 
      irrecv.resume(); 
    }
// управление фрамугой
  if( directFram && ( posFramDelta != 0 ) )      // фрамугу приоткрыть
  {
    MotorFram( motorUp );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
  if( !directFram && ( posFramDelta != 0 ) )     // фрамугу призакрыть
  {
    MotorFram( motorDown );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
}
//=====================================================

....только ардуину обучи новым кодам IR !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Вот небольшое видео, что удалось сделать. http://youtu.be/yMdl_kohBPg

пищит БП на 1А при старте мотора.

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

ошибка !!!!!

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012
#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
//volatile int posFramDelta =   0;    // приращение положения фрамуги
volatile int posFramDelta =   100;    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//boolean directFram = 0;             // направление = 0 - close , 1 - open
                                      // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte directFram = 2;                  // направление = 0 - close , 1 - open , 2 - стоять
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                       // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                         // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
    if( posFramCurrent > maxStepFr )
    {
      posFramCurrent = maxStepFr;
      posFramDelta = 0;
    }
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
    if( posFramCurrent < 0 )
    {
      posFramCurrent = 0;
      posFramDelta = 0;
    }
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          directFram = 1;                        // фрамугу приоткрыть
          posFramDelta = posFramDelta + microStepFr;
        }    
      if ( codeIRframClose == results.value )
        {
          directFram = 0;                        // фрамугу призакрыть
          posFramDelta = posFramDelta - microStepFr;
        } 
      if ( codeIRframAdjustOpen == results.value )
        {
          directFram = 1;                        // фрамугу юстировать +
          posFramDelta = adjustStepFr;
        }    
      if ( codeIRframAdjustClose == results.value )
        {
          directFram = 0;                        // фрамугу юстировать -
          posFramDelta = adjustStepFr;
        } 
      irrecv.resume(); 
    }
// управление фрамугой
//  if( directFram && ( posFramDelta != 0 ) )      // фрамугу приоткрыть
  if( ( 1 == directFram ) && ( posFramDelta != 0 ) )        // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  {
    MotorFram( motorUp );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
//  if( !directFram && ( posFramDelta != 0 ) )     // фрамугу призакрыть
  if( ( 0 == directFram ) && ( posFramDelta != 0 ) )        // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  {
    MotorFram( motorDown );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
}
//=====================================================

 

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

Vallu пишет:

Вот небольшое видео, что удалось сделать. http://youtu.be/yMdl_kohBPg

пищит БП на 1А при старте мотора.

шустрый редуктор.... не придушить ли ему скорость ШИМом ? можно в новый код и это добавить....

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

Vallu пишет:

Вот небольшое видео, что удалось сделать. http://youtu.be/yMdl_kohBPg

пищит БП на 1А при старте мотора.

шустрый редуктор.... не придушить ли ему скорость ШИМом ? можно в новый код и это добавить....

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

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

может и компенсируется, а может и сломать :(
с ШИМом

#include <IRremote.h>  
#include "ValluDef.h"  
IRrecv irrecv( recvPin );
decode_results results;
volatile int posFramCurrent = 0;      // текущее положение фрамуги
//volatile int posFramDelta =   0;    // приращение положения фрамуги
volatile int posFramDelta =   100;    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
//boolean directFram = 0;             // направление = 0 - close , 1 - open
                                      // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
byte directFram = 2;                  // направление = 0 - close , 1 - open , 2 - стоять
//=====================================================
//     setup
//=====================================================
void setup()
{
  irrecv.enableIRIn(); 
  pinMode( pinDriverStA, OUTPUT );
  pinMode( pinDriverStB, OUTPUT );
  pinMode( pinDriverFrA, OUTPUT );
  pinMode( pinDriverFrB, OUTPUT );
  pinMode( pinDriverFrPWM, OUTPUT );
  analogWrite( pinDriverFrPWM, motorFrSpeed );  // ШИМ мотора
  attachInterrupt( 0, InterruptFram,  CHANGE );
  pinMode( pinEncoderFr, INPUT );
  digitalWrite( pinEncoderFr, HIGH );  // подтяжка пина к VCC
  attachInterrupt( 0, InterruptFram, CHANGE );
}
//=====================================================
//     функция управления мотором шторы
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorStora( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverStA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverStB, !_motorContrl );   // может наоборот
    delay ( timeStoraDown );                       // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverStA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverStB,  _motorContrl );   // может наоборот
    delay ( timeStoraUp );                         // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverStA, LOW );
    digitalWrite( pinDriverStB, LOW );
  }
  digitalWrite( pinDriverStA, LOW );
  digitalWrite( pinDriverStB, LOW );
}
//=====================================================
//     функция управления мотором фрамуги
//  motorStop , motorUpmotorUp , motorDown
//=====================================================
void MotorFram( byte _motorContrl )
{
  if( 0 == _motorContrl )
  {
    digitalWrite( pinDriverFrA,  _motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB, !_motorContrl );   // может наоборот
  }
  if( 1 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, !_motorContrl );   // может наоборот
    digitalWrite( pinDriverFrB,  _motorContrl );   // может наоборот
  }
  if( 2 == _motorContrl )
  {
    digitalWrite( pinDriverFrA, LOW );
    digitalWrite( pinDriverFrB, LOW );
  }
}
//=====================================================
//     функция-обработчик прерываний от энкодера
//=====================================================
void InterruptFram( )
{
  if( directFram )
  {
    posFramCurrent++;
    posFramDelta--;
    if( posFramCurrent > maxStepFr )
    {
      posFramCurrent = maxStepFr;
      posFramDelta = 0;
    }
  }
  else
  {
    posFramCurrent--;
    posFramDelta--;
    if( posFramCurrent < 0 )
    {
      posFramCurrent = 0;
      posFramDelta = 0;
    }
  }
}
//=====================================================
//     loop
//=====================================================
void loop() 
{
// приём команд
  if ( irrecv.decode( &results) )
    {
      delay( timeIR ); 
// управление шторой
      if ( codeIRstoraUp == results.value )
        {
          MotorStora( motorUp );                 // штора вверх
        }
      if ( codeIRstoraDown == results.value )
        {
          MotorStora( motorDown );               // штора вниз
        }
// подготовка управления фрамугой
      if ( codeIRframOpen == results.value )
        {
          directFram = 1;                        // фрамугу приоткрыть
          posFramDelta = posFramDelta + microStepFr;
        }    
      if ( codeIRframClose == results.value )
        {
          directFram = 0;                        // фрамугу призакрыть
          posFramDelta = posFramDelta - microStepFr;
        } 
      if ( codeIRframAdjustOpen == results.value )
        {
          directFram = 1;                        // фрамугу юстировать +
          posFramDelta = adjustStepFr;
        }    
      if ( codeIRframAdjustClose == results.value )
        {
          directFram = 0;                        // фрамугу юстировать -
          posFramDelta = adjustStepFr;
        } 
      irrecv.resume(); 
    }
// управление фрамугой
//  if( directFram && ( posFramDelta != 0 ) )      // фрамугу приоткрыть
  if( ( 1 == directFram ) && ( posFramDelta != 0 ) )        // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  {
    MotorFram( motorUp );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
//  if( !directFram && ( posFramDelta != 0 ) )     // фрамугу призакрыть
  if( ( 0 == directFram ) && ( posFramDelta != 0 ) )        // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  {
    MotorFram( motorDown );
//    while( posFramDelta > 0 ) {}
    delay( 2000 );                    // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
    MotorFram( motorStop );
    directFram = 2;                   // ВРЕМЕННО !!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!!
  }
}
//=====================================================

 

 

#include "Arduino.h"

// определения

// IR
#define recvPin 11
#define timeIR 300
// коды
#define codeIRstoraUp         0xDAEA83EC  // штора вверх
#define codeIRstoraDown       0x2BAFCEEC  // штора вниз
#define codeIRframOpen        0xFEFEFEFE  // фрамугу приоткрыть               пример
#define codeIRframClose       0xACACACAC  // фрамугу призакрыть               пример
#define codeIRframAdjustOpen  0x78787878  // юстировка положения фрамуги +    пример
#define codeIRframAdjustClose 0x78787878  // юстировка положения фрамуги -    пример
// штора
#define pinDriverStA    3
#define pinDriverStB    5
#define timeStoraDown   25300  // подбор-настройка
#define timeStoraUp     42500  // подбор-настройка
// фрамуга
#define pinDriverFrA     7
#define pinDriverFrB     8
#define pinDriverFrPWM     6
#define pinEncoderFr     2      // прерывание "0"
#define motorFrSpeed       128
#define maxStepFr        2000   // шагов для максимального открытия фрамуги, подбор-настройка
#define microStepFr      400    // шагов для перемещения на одно нажатие кнопки, подбор-настройка
#define adjustStepFr 20     // шагов для регулировки положения и усилия "закрыто"
// мотор
#define motorStop       2
#define motorUp         1
#define motorDown       0

 

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

реклама приводов дверей, окон - http://www.youtube.com/watch?v=PbRQB586aNU&feature=youtu.be
интерессно , во сколько раз дороже твоего редуктора :) ?

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

Чойто не работает. наверно таймер для формуги не установлен.

Vallu
Vallu аватар
Offline
Зарегистрирован: 17.10.2014

SU-27-16 пишет:

реклама приводов дверей, окон - http://www.youtube.com/watch?v=PbRQB586aNU&feature=youtu.be
интерессно , во сколько раз дороже твоего редуктора :) ?

брательник работает на окнах сказал что от 9 тыров начинается механическая часть без мозгов