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

diod8989

✩✩✩✩✩✩✩
9 Окт 2024
3
0
помогите сделать чтобы крутился неизвестный шаговый двигатель:
у меня вращается и работает куупленный мною комплект : униполярный шаговый двигатель 28BYJ-48 5V, и драйвер на базе микросхемы ULN2003 со скетчем алекса гайвера работет на ура.
или какой еще более подходящий драйвер посоветуете?
сервопривод на фото выше, его партномер автоваза OEM T1009914P.
Я хочу сделать только на одну заслонку регулировку, чтобы тремя кнопками можно было выбрать в ноги, в лице или возду на лобовуху.
А остальные моторы я хочу оставить на тросиках.
 

Вложения

Изменено:

diod8989

✩✩✩✩✩✩✩
9 Окт 2024
3
0
Помгите пж написать код. ЧТобы положение молтора сохранялось в памяти ардуино в еепром. Мотор без условия в условии крутится. Опытым путем установил что ход его 2900 в одну сторону и 2900 в другую. По кругу нельзя.
Но если пишу условие в услвоии (чтобы можно было туда сюда крутить мотор по нажатии кнопки (на лицо, на ноги заслонку печки, на лобовуху).
И при отключении питания сохранялись данные.
C++:
#include <GyverStepper.h>
#include <EEPROM.h>
#include "button.h"
button btn1(3); // указываем пин
button btn2(4);
struct Data {
  byte bright = 0;
  int counter = 0;
  float fvalue = 0;
};
// глобальный экземпляр для личного использования
Data data;
//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 10, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 8, 10, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 10, 9, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 8, 10, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 10, 9, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 10, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 11, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 11, 9, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 11, 10, 9);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 9, 8, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 9, 11, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 8, 9, 11);
GStepper<STEPPER4WIRE> stepper(4078, 10, 8, 11, 9);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 11, 8, 9);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 11, 9, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 8, 10, 9);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 9, 8, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 10, 9, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 9, 10, 8);
// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами
// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2
void setup() {
  Serial.begin(115200);
  //Serial.begin(9600);
  // режим следования к целевй позиции
  stepper.setRunMode(FOLLOW_POS);
  // установка макс. скорости в шагах/сек
  stepper.setMaxSpeed(300);
  // установка ускорения в шагах/сек/сек
  stepper.setAcceleration(500);
  EEPROM.get(0, data);   // прочитать из адреса 0
 
  //stepper.getCurrent() = data;
  // меняем
  data.bright = 10;
  //data.counter = 1234;
  data.fvalue = 3.14;
  //EEPROM.put(0, data);   // поместить в EEPROM по адресу 0
 // отключать мотор при достижении цели
 // можно установить позицию
  stepper.setTarget(0);    // в шагах

  stepper.autoPower(true);
}
void loop() {
    if (btn1.click()) Serial.println("press 1");
 Serial.println("считано");
//Serial.println(data);
 // stepper.getCurrent() = data.counter;
EEPROM.get(0, data);   // прочитать из адреса 0
 Serial.println(data.counter);
//Serial.println(data);
  // просто крутим туды-сюды
  if (!stepper.tick()) {
    static bool dir;
    dir = !dir;
    if (data.counter > 3000) {
  //stepper.setTarget( -3060 );
    //EEPROM.put(0, stepper.getCurrent()); 
    }
    if (data.counter < 100) {
   // stepper.setTarget( -3060 );
    // EEPROM.put(0, stepper.getCurrent()); 
    }
  }

  if (btn1.click()) {
    stepper.setTarget( 2900 );
  }

if (btn2.click()) {
    stepper.setTarget( 0 );
  }

  //if (data > 0{})
   // stepper.setTarget(dir ? -3200 : 3200);
  //}

    EEPROM.put(0, stepper.getCurrent()); 
    // записываем
   // EEPROM.put(STR_ADDR, str);
    
    Serial.print("Save text: ");
    Serial.println(stepper.getCurrent());
  
  // график положения
  static uint32_t tmr2;
  if (millis() - tmr2 > 20) {
    tmr2 = millis();
    Serial.println(stepper.getCurrent());
  }
}

}
 
Изменено:

diod8989

✩✩✩✩✩✩✩
9 Окт 2024
3
0
итог. Работает. Но не могу разобраться почему иногда сбиваются кнопки - точнее на кнопку надивмаешь а моторчик крутиттся уже не в ноги, а в лицо.
Посмотрите переменную старт я каждому значению яркости светодиода задал свое поление мотора.
При включении из еепром досается значение.
А вот скорее всего глюк - при нажатии на кнопку я задал абсолютное значение. И надо наверное как-то условие указать - в каком случае влево крутить мотор, а в каком случае вправо (если мотор был по середине (значение 1450)
полуРабочий код:
#include <GyverStepper.h>
#include <EEPROM.h>
//#include "button.h"
#include <GyverButton.h>
//void setRunMode(FOLLOW_POS );
#define BTN_UP_PIN 3    // пин кнопки вверх
#define BTN_DOWN_PIN 4  // пин кнопки вниз
#define BTN_MEDIANA_PIN 6  // пин кнопки вниз
#define LED_PIN 8       // пин светодиода
GButton btnUP(BTN_UP_PIN); // кнопка "яркость вверх"
GButton btnDOWN(BTN_DOWN_PIN); // кнопка "яркость вниз"
GButton btnMEDIANA(BTN_MEDIANA_PIN); // кнопка "яркость вниз"

int LEDbright = 0;
int start = 0;
// глобальный экземпляр для личного использования

//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 10, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 8, 10, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 10, 9, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 9, 8, 10, 8);

//GStepper<STEPPER4WIRE> stepper(4078, 8, 10, 9, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 10, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 9, 11, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 11, 9, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 8, 11, 10, 9);

//GStepper<STEPPER4WIRE> stepper(4078, 10, 9, 8, 11);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 9, 11, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 10, 8, 9, 11);
GStepper<STEPPER4WIRE> stepper(4078, 10, 8, 11, 9); //робит1
//GStepper<STEPPER4WIRE> stepper(4078, 10, 8, 9, 11); тожерорбит
//GStepper<STEPPER4WIRE> stepper(4078, 10, 11, 9, 8);

//GStepper<STEPPER4WIRE> stepper(4078, 11, 8, 10, 9);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 9, 8, 10); слегка помощнее
//GStepper<STEPPER4WIRE> stepper(4078, 11, 8, 9, 10);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 10, 9, 8);
//GStepper<STEPPER4WIRE> stepper(4078, 11, 9, 10, 8); тоже крутит
// мотор с драйвером ULN2003 подключается по порядку пинов, но крайние нужно поменять местами
// то есть у меня подключено D2-IN1, D3-IN2, D4-IN3, D5-IN4, но в программе поменял 5 и 2
void setup() {
  Serial.begin(115200);
  //Serial.begin(9600);
  // режим следования к целевй позиции
  //stepper.setRunMode(FOLLOW_POS);
  // установка макс. скорости в шагах/сек
  stepper.setMaxSpeed(100);
  // установка ускорения в шагах/сек/сек
  stepper.setAcceleration(500);

   pinMode(LED_PIN, OUTPUT); // пин светодиода как выход
  EEPROM.get(0, LEDbright); // прочитали яркость из адреса 0
  //analogWrite(LED_PIN, LEDbright);  // включили
 if(LEDbright == 0)   start = 0;

 if(LEDbright == 120)   start = 1450;

  if(LEDbright == 240)   start = 2900;

 // отключать мотор при достижении цели

 // можно установить позицию
     // в шагах


  stepper.autoPower(true);

}
void loop() {
  

//Serial.println(data);
 // stepper.getCurrent() = data.counter;


//Serial.println(data);

  // просто крутим туды-сюды
  if (!stepper.tick()) {
    static bool dir;
    dir = !dir;

  

 
   // stepper.setTarget( 2900, ABSOLUTE );
    
    //reset(); 
 

}

 // void setTarget(long pos);
   // stepper.setTarget( -2900, ABSOLUTE );
    
     // опрос кнопок
  btnUP.tick();
  btnDOWN.tick();
  btnMEDIANA.tick();

  if (btnUP.isClick())   {
    // увеличение по клику
    LEDbright = 240;
    stepper.setTarget( start+-2900, ABSOLUTE );
    setBright();
  }



  if (btnDOWN.isClick()) {
    // уменьшение по клику
    LEDbright = 0;
    stepper.setTarget( start+0, ABSOLUTE );
    setBright();
  }
 
   if (btnMEDIANA.isClick()) {
    // уменьшение по клику
    LEDbright = 120;
    stepper.setTarget( start+-1450, ABSOLUTE );
    setBright();
  }
 


  //if (data > 0{})
   // stepper.setTarget(dir ? -3200 : 3200);
  //}


    
    // записываем
   // EEPROM.put(STR_ADDR, str);
    
    //Serial.print("Save text: ");
   // Serial.println(stepper.getCurrent());
 
  // график положения
  static uint32_t tmr2;
  if (millis() - tmr2 > 20) {
    tmr2 = millis();
    Serial.println(stepper.getCurrent());
  }

}



void setBright() {
  LEDbright = constrain(LEDbright, 0, 240); // ограничили
  EEPROM.put(0, LEDbright);           // записали по адресу 0
  analogWrite(LED_PIN, LEDbright);    // изменили яркость
  Serial.println(LEDbright);
}
 

VAF

✩✩✩✩✩✩✩
15 Июл 2023
49
1
Москва
Чтобы все понять, попробуйте без библиотеки подавать HIGH LOW на ноги в любом порядке и смотрите, что получается.