Как избавиться от установки сервопривода в нулевое положение при включении

cezarus
Offline
Зарегистрирован: 07.01.2019

Проблема такова: При включении дуни серво устанавливается в ноль, затем идёт движение. Я попробовал при инициализации в сетапе считывать текущее и сравнивать с надлежащим, так что теперь серво ставится в 90, потом доходит до нуля, уже потом заходит в loop(). Каким образом можно провести инициализацию, чтобы серва начинала с той же позиции, либо при выключении обращалась в ноль? Про eeprom знаю, но перезаписей планируется очень много, я так всю память убью

#include <Servo.h>


Servo serv1;

int pos = 0;
int oldpos;

void setup() {
  serv1.attach(36); 
  oldpos = serv1.read();
  while (oldpos > pos){
    oldpos -=1;
    serv1.write(oldpos);
    delay(10);
  }
}


void loop() {
  for (pos = 0; pos <= 170; pos += 1){
    serv1.write(pos); 
    delay(5);
  }
  for (pos = 170; pos >= 0; pos -= 1) {
    serv1.write(pos);
    delay(5);
  }
}

 

b707
Offline
Зарегистрирован: 26.05.2017

странные вопросы задаете. Вы сами ставите серву в положение 0 в строке 21

Попытайтесь четче сформулировать (в первую очередь для себя самого) - что именно вы хотите.

И перепишите программу под свою задачу.

cezarus
Offline
Зарегистрирован: 07.01.2019

ну так я и сказал, что этот код пытается считывать текущее положение и выводить его в ноль. Только вместо текущего ставит 90 (как я понял, в строке 11)

cezarus
Offline
Зарегистрирован: 07.01.2019

Ладно, другой пример, раз меня в неточности уличают
 

#include <Servo.h>

Servo finger1;

int servoPin1 = 35;
int lightPin1 = 30;
int flexPin1 = A1;

void setup()
{
  finger1.attach(servoPin1)
  pinMode(lightPin1, OUTPUT);
  pinMode(flexPin1, INPUT);
}

void loop()
{
  int flex1 = analogRead(flexPin1);
 
  int pos1 = map(flex1, 100, 800, 0, 180);
  pos1 = constrain(pos1, 0, 180);
  
  finger1.write(pos1);
}

Здесь нет ни одного программного выставления в ноль, но при включении это всё равно происходит

nik182
Offline
Зарегистрирован: 04.05.2015

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

andriano
andriano аватар
Offline
Зарегистрирован: 20.06.2015

cezarus пишет:

...серво... Про eeprom знаю, но перезаписей планируется очень много, я так всю память убью

Вы думаете, что ресурс серво больше ресурса EEPROM?

cezarus
Offline
Зарегистрирован: 07.01.2019

Ресурс серво - нет конечно, но проект долгоиграющий, года на два со всеми тестами, так что включений-выключений будет нное количество тысяч

Jeka_M
Jeka_M аватар
Offline
Зарегистрирован: 06.07.2014

По даташиту ресурс EEPROM 100000 (сто тысяч), по факту говорят ещё больше.