ARDUINO Управление стрелкой от приборной панели.

Управление стрелкой от приборной панели.
Доброго времени суток ...
Имеется механизм от стрелки спидометра ПБ , какой не известно да и не важно.
Задумка использовать с датчиком (куплен ПО настроено и отлажено) оборотов , для просчёта и вывода скорости.
Проблема : Механизм по сути шаговый двигатель с двумя катушками и ограничением ушла поворота , куплена плата (контроллером язык не повернёться назвать) но всё же управления шаговыми двигателями, запустить получилось крутить также получилось паралельно тестирова две библиотеки от Гайвера и <AccelStepper.h> обе работають. однако проблема мотор при повышении скорости производит поворот после возвращаеться на 0 положение , если в этот момент подать сигнал скорости мотор улетает в - и упераясь в огранечитель трещит после пытаюсь вернуться на 0 уходит на положительное значение и считает его за 0. что можно с этим сделать?
а также время от времени сам по себе 0 позици сдвигаеться . в общем код сырой у меня лапки и вообще это первый мой проект. Буду благодарен за любые подсказки . добавлю код + фото похожего моторчика.
C++:
#include <AccelStepper.h>

AccelStepper mystepper(4, 5,3 ,4 ,6 );
unsigned long lastturn, time_press; //переменные хранения времени
float SPEED; //переменная хранения скорости в виде десятичной дроби
float w_length=0.1; //длина окружности колеса в метрах
float obor;
    const int samplePin = SPEED; 
void setup() {
mystepper.setMaxSpeed(5000);
mystepper.setAcceleration(5000);



 attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала 
  Serial.begin(9200);           
}



void sens() {
    SPEED=w_length/((float)(millis()-lastturn)/1000)*3.6;  //расчет скорости, км/ч
    lastturn=millis();  //запомнить время последнего оборота
  poz=mystepper.currentPosition();
}

void loop() {
 
  
 if ((SPEED)<1){
  mystepper.setAcceleration(50000);
  }
   if ((SPEED)>1){
  mystepper.setAcceleration(500);
  }

  Serial.print(SPEED); 

  if ((millis()-lastturn)>2000){ //если сигнала нет больше 2 секунды
    SPEED=0;  //считаем что SPEED 0
    mystepper.moveTo(0);
  mystepper.run();
  }
 if ((SPEED)>1){
  mystepper.moveTo(SPEED);
  mystepper.run();
  }
 
   if ((millis()-lastturn)>1000){
  mystepper.moveTo(0);
  mystepper.run();
 
 }  }
DAAAAgOmruA-960.jpg
 

Комментарии

Геннадий П

★★★★★★✩
14 Апр 2021
1,834
589
44
Скорее всего возвратная пружина в нем стоит и при отпускании катушек он соответственно возвращается на ноль.
А скорость, они не предназначены для большой скорости поворота.
 

nikkeij6j5

✩✩✩✩✩✩✩
4 Июн 2022
6
0
Скорее всего возвратная пружина в нем стоит и при отпускании катушек он соответственно возвращается на ноль.
А скорость, они не предназначены для большой скорости поворота.
Моторчик вскрывал пружин нет так же как и на фото , возврат на 0 (строки 49 50 и 51 ) осуществляеться через подсчёт шагов , самой ардуиной по крайней мере в порт она отсылает правельное положение до момента когда при исполнении возврата на 0 появляеться данные скорости. вопрос состоял в том каким образом прервать перемещение на 0 не потеряв изначального положения координат 0 и продолжить отображать скорость.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
Шаговый двигатель может пропускать шаги, отсюда и может получиться несоответствие реального положения с запрограммированным. Добавьте физический "датчик 0" (геркон/ик/концевик...) и сбрасывайте по нему. Можно пойти и более простым путем - взять сервопривод.
 

nikkeij6j5

✩✩✩✩✩✩✩
4 Июн 2022
6
0
Спасибо всем за советы , серва так же как и переменный резистор не подходят так как ресурс у них не достаточный (каждые пол года вскрывать торпеду и вскрывать приборку не вариант) датчик тоже обдумывал но физически места нет в приборной панели для этого дела. был бы вариант програмно это наладить . Есть одна мысль но как реализовать не могу додуматься ибо не хватает знаний в написание кода , мысль такова давать положительный сигнал на одну из обмоток и после этого начинать движения двигателя , сея причуда по задумке должна дать возможность контролировать направление вращения вала, однако используя библиотеку так и не понял как это возможно реализовать таку же неизвестно насколько снизиться скорость реакции на показания.*(так же имеется такой же скетч переписанный под библиотеку Гайвера ) . Покоя не даёт тот факт что приборка крайне плавно и без ложных направлений управляет этими моторчиками (если кто знает как и чем опишите буду благодарен) так же и без всяких датчиков , соответственно возможно определять чётко положение и изменять его плавно програмно , к сожалению у моей донорской приборки был выгоревший контроллер по этой причине год назад и полетел в урну вместе с платой (всё живое и нужное было снято)
 

Forgetweb

★✩✩✩✩✩✩
8 Май 2022
61
20
Обычно с отскоком именно стрелочных шаговиков борются двойным возвратом на 0. Первое быстрое, потом остановка(тут отскок), потом с малой скоростью несколько шагов назад - отскока уже не будет. Совсем точно на 0 он не встанет, но ошибка будет незаметна при стрелке 100мм и короче, а более длинные для таких моторов перебор. Плавное управление движением просто шимом, причем этот шим вполне тянут выводы МК напрямую. Эти шаговики с редуктором, но сам мотор 1 полный шаг на оборот(делится на 12). Не стандартный в общем шаговик. В пдф-ке расчет шима для аналогичного движка. Еще почитайте AN3208 от STM. Там довольно подробно принципы описаны.
 

Вложения

Изменено:

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@Старик Похабыч, если к шаговому двигателю добавить потенциометр, то и получится сервопривод, только с иным управлением.

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

viktor1703

★★★✩✩✩✩
9 Дек 2021
540
133
Покоя не даёт тот факт что приборка крайне плавно и без ложных направлений управляет
А с чего ты взял, что стандартная приборка двигает стрелкой спидометра со скорость 5000 и ускорением то 500, то 50000? Хочешь плавности убавь скорость и ускорения ШД. Пропуски шагов на больших скоростях никто не отменял ещё. Обязательно ли задавать перемещение стрелки в цикле несколько тысяч раз в секунду, да ещё и изменять ускорение? Разве авто может изменять скорость движения так быстро? Скорость выводить раза 3 - 4 в секунду, сопоставив максимальное ускорение авто со максимальной скоростью перемещения стрелки. Например, разгоняется авто за каждую секунду на 10 км/ч, ну и установи количество шагов(градусов) в секунду на 10 км/ч за 1 секунду +10-15%), зачем 5000 шагов в секунду. После каждого включения ( в setup() ) можно двигать стрелку в минус, а все последующие перемещения делать в относительных значениях, а не абсолютных.
 

nikkeij6j5

✩✩✩✩✩✩✩
4 Июн 2022
6
0
Решение нашёл всем спасибо , организовал управление без библиотек , прлавность устраивает шаги считаються самой ардуиной точность на высоком уровне . Делюсь кодом может кому пригодиться) ПАРАМЕТРЫ НУЖНО РЕДАКТИРОВАТЬ ПОД СВОЙ ДАТЧИК
C++:
unsigned long lastturn, time_press; //переменные хранения времени
float SPEED; //переменная хранения скорости в виде десятичной дроби
float POL; //переменная хранения положения  в виде десятичной дроби
float w_length=1; //длина окружности колеса в метрах
#define in1 11
#define in2 10
#define in3 9
#define in4 8
int a = 3;
float SPED;

void setup() {
  Serial.begin(9600);  //открыть порт
  attachInterrupt(0,sens,RISING); //подключить прерывание на 2 пин при повышении сигнала
  pinMode(3, OUTPUT);   //3 пин как выход

}

void sens() {
    SPEED=w_length/((float)(millis()-lastturn)/1000)*3.6; //расчет скорости, км/ч
    lastturn=millis();  //запомнить время последнего оборота
    SPED = round(SPEED) ;
 
  }

void loop() {
  if ((millis()-lastturn)>100){ //если сигнала нет больше 0.5 секунды
    SPED=0;  //считаем что SPEED 0
    }
Serial.println (SPED);
Serial.println (POL);
    if (SPED>1 && POL < SPED ) {
       digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
  delay(a);
    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
   delay(a);

    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
    delay(a);

    digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
    delay(a);
           digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
  delay(a);
 
    POL = POL+1;
    }
    

 if (POL > SPED ){
      digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, HIGH);
delay(a);
    
    digitalWrite(in1, LOW);
    digitalWrite(in2, HIGH);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
delay(a);
        digitalWrite(in1, LOW);
    digitalWrite(in2, LOW);
    digitalWrite(in3, HIGH);
    digitalWrite(in4, LOW);
delay(a);
       digitalWrite(in1, HIGH);
    digitalWrite(in2, LOW);
    digitalWrite(in3, LOW);
    digitalWrite(in4, LOW);
delay(a);
POL = POL-1;
    
 }
}
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@nikkeij6j5, это не решение. Если нагрузка на двигатель будет больше чем его момент, то он не провернется, а контроллер будет считать что провернулся. Рано или поздно ошибка расхождения появится.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
540
133
Нормально всё будет. На родной паршивке этот моторчик как-то работал без сбоев и здесь будет. В 3д принтерах моторы шагают туда- сюда сутками без обратной связи и не сбиваются.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
В 3д принтерах моторы шагают туда- сюда сутками без обратной связи и не сбиваются.
кто вас так обманул?!
в 3д принтерах есть концевики, по которым и калибруется начальное/конечное положение осей
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@Старик Похабыч, включили - откалибровал - пошла печать.Все правильно. Соответственно если ошибка и возникнет,то при следующей печати её уже не будет (помним про калибровку), а в варианте выше - будет, и, продолжит накапливаться.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@Старик Похабыч, не имеет значение сколько длится печать, речь о другом, цена ошибки в случае калибровке при старте - 1 цикл работы, а при отсутствии калибровки - все последующие циклы, причем с накоплением ошибок

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

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
@IamNikolay,
Обычно стрелки спидометра калибруются при включении авто (во всяком случае есть подобие).
Если стрелку в начале положить в нулевое положение, то как раз и будет калибровкой. И на протяжении цикла работы (зажигание включено) этого должно хватить.
 

Старик Похабыч

★★★★★★★
14 Авг 2019
4,188
1,280
Москва
А датчик не нужен по сути. Если мотор упрет стрелку, ну потарахтит немного , и остановиться. Все , ноль. Так вебки некоторые работают китайские. Главное что бы мотор не сильно мощный был и ничего не сломал.
 

IamNikolay

★★★✩✩✩✩
15 Янв 2020
820
175
@Старик Похабыч, во-первых, в коде этого нету, а во-вторых, это не надежный вариант и для его использования нужно детально смотреть какие компоненты используются(так можно и обмотку спалить)....
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
540
133
Да не нужен тут никакой датчик, согласно коду, мотор работает в полношаговом режиме. Пришел он в позицию, сняли напряжение с обмоток (выключил зажигание) ротор и останется в этом положении до следующего включения. Это же не микрошаг. Ошибка может возникнуть, если только во время движения выключить зажигание, вот тогда, конечно, будет начинать отсчёт от последнего положения, считая его нолем. Но @nikkeij6j5 обязательно допишет код калибровки стрелки в setup(), а мы все ему поможем.