Проблема, шаговый двигатель греется в состоянии покоя.
- Войдите на сайт для отправки комментариев
Сб, 09/11/2019 - 03:50
Доброго времени суток дамы и господа. В проекте для управления мини шторой понадобился шаговик. Стоит 28BYJ-48, с модулем ULN2003. При включении дуни, ток 0.04 ампера, при запуске движка 0.20 ампер. Но в состоянии покоя 0.26 ампер. Часами может стоять без работы, но 0.26 ампера так и останется (при этом греется не плохо), до момента, пока я не перегружу дуню. И все по новой. Это не есть гуд... Прошу совета, в чем подвох? Перезагрузить порты движка мб или еще что... А то мозг уже 2ую ночь ломаю... Выложил код, может я где-то на химичил...
#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(); //конец } } }Это режим удержания положения. Если вас не волнует, что шаговик может свободно крутиться в выключенном состоянии, то в библиотеке accelstepper есть функция отключения.
Для переключения 28BYJ-48 в режим свободного вращения не обязательно менять библиотеку.
Уважаемый, можно по подробнее?
Я понимаю, что подается напряжение в состоянии покоя на все обмотки, дабы удержать его на 1 месте, но штора весит пару грамм. А 0.26 ампера очень много для питания от своего источника, по сравнению с 0.4 ампера. Хотелось бы отключать подачу тока на двигатель.
Подсказываю: на драйвере светодиоды видите? Они горят? Как в ардуине светодиоды выключают - помните?
Конечно. Таким же образом отключить пины на модуле? щас по пробую, спасибо
Stepper small_stepper(STEPS, 8, 10, 9, 11);
Уже пины задействованы в движке... Как я могу присвоить пин int led8=0; допустим... то-ли я дурак, то-ли лыжи не едут...
Просто переведите пин 8 (например) в LOW. Инициализация режима и пр. уже проделаны библиотекой.
Уважаемый - вы просто космос) Спасибо огромное.... Заработало как надо!
Ребята выручайте, греется шаговый двигатель на 5 в, скетч создавал в FL PROG так как не владею письменными языками, суть в том, что у двигателя при остановке работаю две обмотки на удержание , читал форум , что надо перевести в режим LOW вот только куда тут и что вставить в этот код не фига не пойму вообще, выручайте народ плз, всю голову уже сломал.
#include <Stepper.h> #include <IRremote.h> IRrecv irRessPin2(2); decode_results irRessPin2Res; bool irRessPin2FE80AA55 = 0; Stepper _StM1(48,10,12,11,13); int _PWDC = 0; bool _tim1I = 0; bool _tim1O = 0; unsigned long _tim1P = 0UL; bool _trgs1 = 0; bool _trgt2 = 0; bool _trgt2I = 0; int stM_steps1 = 0; bool stM_Ost1 = 0; bool stM_Out1 = 0; void setup() { TCCR2A = 0x00; TCCR2B = 0x07; TIMSK2=0x01; TCNT2=100; _StM1.setSpeed(300); pinMode(9, OUTPUT); irRessPin2.enableIRIn(); } void loop() {_PWDC = 0; if (irRessPin2.decode(&irRessPin2Res)) { irRessPin2FillVar(&irRessPin2Res); irRessPin2.resume(); }else {irRessPin2ResVar(); } //Плата:1 if(irRessPin2FE80AA55) _trgs1 = 1; if(!(stM_Out1)) _trgs1 = 0; if(( (_trgs1) && (_trgt2) )) {_tim1O = 1; _tim1I = 1;} else { if(_tim1I) {_tim1I = 0; _tim1P = millis();} else { if (_tim1O) {if ( _isTimer(_tim1P, 12000)) _tim1O = 0;}}} bool _tmp2 = _trgs1; if (_tmp2) { if (! _trgt2I) _trgt2 = ! _trgt2; } _trgt2I = _tmp2; digitalWrite(9, _tim1O); _StM1.setSpeed( abs(150)); int b1temp1_StM1; if (_trgt2) { b1temp1_StM1 = 1;} else {b1temp1_StM1 = -1;} if (_trgs1) { if( !stM_Ost1) {stM_steps1 = abs(500); stM_Ost1 = 1;}} else {stM_Ost1 = 0 ;} if (stM_steps1 > 0 ) { _StM1.step(b1temp1_StM1); stM_steps1-- ;} _StM1.setSpeed(300); stM_Out1 = !(stM_steps1>0); } bool _isTimer(unsigned long startTime, unsigned long period ) { unsigned long currentTime; currentTime = millis(); if (currentTime>= startTime) {return (currentTime>=(startTime + period));} else {return (currentTime >=(4294967295-startTime+period));} } ISR(TIMER2_OVF_vect) { TCNT2=100; if(_PWDC >= 1000){asm volatile ("jmp 0x0000");}else{_PWDC = _PWDC+1;}; } void irRessPin2FillVar(decode_results *irRessPin2Res) { long tempRes; byte tempType; tempRes=(irRessPin2Res->value); tempType=(irRessPin2Res->decode_type); if(!(tempRes == -1)) {if ((tempRes == (0xFE80AA55))&&(tempType == 3)) {irRessPin2FE80AA55 = 1;} else {irRessPin2FE80AA55=0;} }} void irRessPin2ResVar() { irRessPin2FE80AA55 = 0; }а с ФЛПрогом всегда так. Не думаю. что кто-нибудь захочет в нем разбираться, проще новый написать
Ребята выручайте, ......, скетч создавал в FL PROG
Вот пусть он тебя и выручает
Помогите плз , не бесплатно конечно ребят
Помогите плз , не бесплатно конечно ребят
Реально, никто в этом криво сгенерированном авне ковыряться не будет, даже за деньги. Ну, если только за большие.
Может есть библиотеки какие нибудь которые отключают эту функцию
К FLPROG-у можно только флпрожное что-то подрубить. Вы или целиком пишете всё в нём или абсолютно без него. Конечно, если Вы не безумец.
Да у меня простая схема на самом деле , в одну сторону мотор крутится , делает определенное кол-во шагов, потом прекращает свое движение, в этом время светится светодиод, в другую сторону ровно такое кол-во шагов , светится другой светодиод, прекращение вращения, управление ик пультом с одной кнопки , можно с двух
Да у меня простая схема на самом деле , в одну сторону мотор крутится , делает определенное кол-во шагов, потом прекращает свое движение, в этом время светится светодиод, в другую сторону ровно такое кол-во шагов , светится другой светодиод, прекращение вращения, управление ик пультом с одной кнопки , можно с двух
ФуФелпрог такое точно не потянет, там тока диодами мигать и то с оглядкой.
напишите норм ТЗ и в платный раздел там точно помогут, раз есть вариант возмезной помощи... ценник будет зависить от "памагите переделать я в ТЗ не все написал"
UPD составить ТЗ со слов заказчика с такими вводными, может стоить дороже чем код написать.
Да решил проблему уже , в фуфел проге)) просто ограничил ток идущий на обмотки стал меньше греться )
напишите норм ТЗ и в платный раздел там точно помогут, раз есть вариант возмезной помощи... ценник будет зависить от "памагите переделать я в ТЗ не все написал"
Гриша, он уже отписался в стиле "за что там платить - там работы на полчаса".
Вот пусть сам за полчаса и слабает.
напишите норм ТЗ и в платный раздел там точно помогут, раз есть вариант возмезной помощи... ценник будет зависить от "памагите переделать я в ТЗ не все написал"
Гриша, он уже отписался в стиле "за что там платить - там работы на полчаса".
Вот пусть сам за полчаса и слабает.
Ну так формат форума помогать и направлять, а не делать вместо... дня 2 на ТЗ и 30 минут на код вполне реально.
Ребята выручайте, ......, скетч создавал в FL PROG
Вот пусть он тебя и выручает
"Он словом острым и шутливым
Любил свою приправить речь,
Своим воинственным призывом
Умел он форум сей "зажечь""...
;-)))
PS почти C. Белоброву "Богиня Байдымат"