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

prime.monk
Offline
Зарегистрирован: 07.11.2019
Доброго времени суток дамы и господа. В проекте для управления мини шторой понадобился шаговик. Стоит  28BYJ-48, с модулем  ULN2003. При включении дуни, ток 0.04 ампера, при запуске движка 0.20 ампер. Но в состоянии покоя 0.26 ампер. Часами может стоять без работы, но 0.26 ампера так и останется (при этом греется не плохо), до момента, пока я не перегружу дуню. И все по новой. Это не есть гуд...  Прошу совета, в чем подвох? Перезагрузить порты движка мб или еще что... А то мозг уже 2ую ночь ломаю... Выложил код, может я где-то на химичил...
 
prime.monk
Offline
Зарегистрирован: 07.11.2019
#include "Stepper.h"
#include "IRremote.h"

#define STEPS  32   // Количество шагов
int  Steps2Take;  // 2048 = 1 оборот
int receiver = 6; // ИК подключен к 6 пину
int rele1 = 0;           //переменная для хранения состония нагрузки
int led1=0;  // RGB
int led2=0;  // RGB
int led3=0;  // RGB
int led4=0;  // светодиод

Stepper small_stepper(STEPS, 8, 10, 9, 11);  // пины шагового двигателя
IRrecv irrecv(receiver);     //пин к которому подключени ик приемник
decode_results results;


void setup()   //установка
{        
  pinMode(3,OUTPUT); // реле
  pinMode(4,OUTPUT);  // RGB led1
  pinMode(12,OUTPUT); // RGB led2
  pinMode(13,OUTPUT); // RGB led3
  pinMode(2,OUTPUT); // светодиоды
  
  Serial.begin(9600); //
  irrecv.enableIRIn(); //включим инфракрасный приемник
}
void loop()     // общий цикл
{
           
  if ( irrecv.decode( &results ))   //если есть сигнал на входе ИК приемника, то
  {  
    Serial.println(results.value, HEX); //выведем в сериал в 16 ричном формате
    
       // цикл реле нагрузки
if (results.value==0xFF30CF&&rele1==0)   //поступил сигнал, запишем в переменную
{   
  digitalWrite( 3, HIGH );rele1=1;results.value=0; //включим нагрузку
}
if (results.value==0xFF30CF&&rele1==1)    //поступил сигнал, запишем в переменную
{  
  digitalWrite( 3, LOW );rele1=0;results.value=0; //выключим нагрузку
}
       // цикл простых светодиодов
if (results.value==0xFF10EF&&led4==0)   //поступил сигнал, запишем в переменную
{   
  digitalWrite( 2, HIGH );led4=1;results.value=0; //включим нагрузку
}
if (results.value==0xFF10EF&&led4==1)    //поступил сигнал, запишем в переменную
{  
  digitalWrite( 2, LOW );led4=0;results.value=0; //выключим нагрузку
}
       // цикл RGB светодиода
if (results.value==0xFF42BD&&led1==0){  //поступил сигнал, запишем в переменную
  digitalWrite( 4, HIGH );led1=1;results.value=0; //включим нагрузку
}
if (results.value==0xFF42BD&&led1==1){  //поступил сигнал, запишем в переменную
  digitalWrite( 4, LOW );led1=0;results.value=0;  //выключим нагрузку
}  
else if (results.value==0xFF4AB5&&led2==0){  //поступил сигнал, запишем в переменную
  digitalWrite( 12, HIGH );led2=1;results.value=0;  //включим нагрузку
}
if (results.value==0xFF4AB5&&led2==1){   //поступил сигнал, запишем в переменную
  digitalWrite( 12, LOW );led2=0;results.value=0;  //выключим нагрузку
}
else if (results.value==0xFF52AD&&led3==0){   //поступил сигнал, запишем в переменную
  digitalWrite( 13, HIGH );led3=1;results.value=0;  //включим нагрузку
}
if (results.value==0xFF52AD&&led3==1){   //поступил сигнал, запишем в переменную
  digitalWrite( 13, LOW );led3=0;results.value=0;   //выключим нагрузку
}
      // цикл управления шаговым двигателем
{
    switch(results.value)

       {

      case 0xFF18E7: // Вращение по часовой
                      small_stepper.setSpeed(700); //Макс 700 скорость
                      Steps2Take  =  4096;  // Сколько шагов по часовой
                      small_stepper.step(Steps2Take);
                      delay(100);
                      break;

      case 0xFF7A85: // Вращение против часовой
                      small_stepper.setSpeed(700);
                      Steps2Take  =  -2048;  // Сколько шагов против часовой
                      small_stepper.step(Steps2Take);
                      delay(100);
                      break;
}
 irrecv.resume();   //конец
  }
  }
  
}

 

rkit
Offline
Зарегистрирован: 23.11.2016

Это режим удержания положения. Если вас не волнует, что шаговик может свободно крутиться в выключенном состоянии, то в библиотеке accelstepper есть функция отключения.

sadman41
Offline
Зарегистрирован: 19.10.2016

Для переключения 28BYJ-48 в режим свободного вращения не обязательно менять библиотеку.

prime.monk
Offline
Зарегистрирован: 07.11.2019

Уважаемый, можно по подробнее?

prime.monk
Offline
Зарегистрирован: 07.11.2019

Я понимаю, что подается напряжение в состоянии покоя на все обмотки, дабы удержать его на 1 месте, но штора весит пару грамм. А 0.26 ампера очень много для питания от своего источника, по сравнению с 0.4 ампера. Хотелось бы отключать подачу тока на двигатель.

sadman41
Offline
Зарегистрирован: 19.10.2016

Подсказываю: на драйвере светодиоды видите? Они горят? Как в ардуине светодиоды выключают - помните?

prime.monk
Offline
Зарегистрирован: 07.11.2019

Конечно. Таким же образом отключить пины на модуле? щас по пробую, спасибо

prime.monk
Offline
Зарегистрирован: 07.11.2019

Stepper small_stepper(STEPS, 8, 10, 9, 11);

Уже пины задействованы в движке... Как я могу присвоить пин int led8=0; допустим... то-ли я дурак, то-ли лыжи не едут...

sadman41
Offline
Зарегистрирован: 19.10.2016

Просто переведите пин 8 (например) в LOW. Инициализация режима и пр. уже проделаны библиотекой.

prime.monk
Offline
Зарегистрирован: 07.11.2019

Уважаемый - вы просто космос) Спасибо огромное.... Заработало как надо!