хочу собрать климат на авто

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
хочу собрать климат на авто . три тросика подключить к сервоприводам и управлять кнопками. но такая проблема,что серво при отключении и подаче питания прыгает в исходное положение в 90градусов. как сделать чтоб серво оставалась в том же положении что и при выключении?
 

bort707

★★★★★★✩
21 Сен 2020
3,161
930
не использовать сервы, а использовать шаговый мотор
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
573
169
Проверьте, как себя ведет ваш сервопривод если включить его без Ардуино. для двух вариантов включения:
1. Подключен только GND и +Питания. Управляющий сигнал не подключен.
2. Подключен GND и +Питания. Управляющий сигнал подключен к GND
Если в обоих случаях дерганье есть, то программно это не устранить. Можно попытаться разместить серво так, чтобы это дерганье не приводило к ошибкам.
 
  • Лойс +1
Реакции: seregaksm

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
@Bruzzer,
Он не дергается. Он встает в исходное положение в прямой угол 📐 как только подлючашь питалово. Он видимо так запрограммирован, что встает в исходную точку и из нее считает градусы наклона влево вправо. Sg90
 

Bruzzer

★★★✩✩✩✩
23 Май 2020
573
169
Я спрашивал как ведет себя при подключении без Ардуино. При двух варианта подключения.
 
  • Лойс +1
Реакции: seregaksm

Bruzzer

★★★✩✩✩✩
23 Май 2020
573
169
@seregaksm,
Если у вас UNO или NANO, тогда попробуйте подключать серво с запрещенными прерываниями, и сразу устанавливать угол в котором серво находится в настоящее время.
Примерно так
C++:
void setup() {
  noInterrupts();     // Запрет трерываний
  myservo.attach(PIN_SERV_1);  // Подключаем серво. Но движения не будет, т.к. прерывания запрещены.
  myservo.write(startPos_1);   // startPos_1 - надо указать текущее положение
  interrupts();       // Разрешение прерываний.
  );
}
Если будет дергаться, то добавьте резистор на 1 КОм между управляющим сигналом и GND.
 
  • Лойс +1
Реакции: seregaksm

Bruzzer

★★★✩✩✩✩
23 Май 2020
573
169
C++:
#include <Servo.h>

Servo myServo;  //

const int button1Pin = 2; // пин для первой кнопки
const int button2Pin = 3; // пин для второй кнопки
int pos = 90; // начальная позиция сервомотора

void setup() {
  noInterrupts();     // Запрет трерываний
  myServo.attach(9); //  сервомотор к пину 9 Но движения не будет, т.к. прерывания запрещены.
  myservo.write(pos);   // pos - надо указать текущее положение, чтобы не было рывка.
  interrupts();       // Разрешение прерываний.

  pinMode(button1Pin, INPUT_PULLUP); // устанавливаем пин кнопки 1 как вход с подтяжкой
  pinMode(button2Pin, INPUT_PULLUP); // устанавливаем пин кнопки 2 как вход с подтяжкой
}

void loop() {
  if (digitalRead(button1Pin) == LOW) { // если нажата первая кнопка
    pos += 1; // увеличиваем позицию
    if (pos > 180) pos = 180; // ограничиваем до 180 градусов
    myServo.write(pos); // устанавливаем позицию сервомотора
    delay(15); // небольшая задержка для плавности
  }

  if (digitalRead(button2Pin) == LOW) { // если нажата вторая кнопка
    pos -= 1; // уменьшаем позицию
    if (pos < 0) pos = 0; // ограничиваем до 0 градусов
    myServo.write(pos); // устанавливаем позицию сервомотора
    delay(15); // небольшая задержка для плавности
  }
}
В первом сообщении вы писали, что серва должна быть в том же положении, что и при выключении.
В этом коде у вас всегда используется 90 как начальное значение. Это противоречит первому сообщению.

Если вам надо запоминать значение угла при выключении, чтобы указать его же при включении, то надо придумать, как это делать. И если придумать не получится, то возможно отказаться от этого метода.

П.С. Я указал на некоторые особенности подключения Серво. Решать же эту задачу целиком я не готов.
 
  • Лойс +1
Реакции: seregaksm

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
прыгает в исходное положение в 90градусов
Ну значит так и должно быть, вы же сами говорите:
у меня позиция исходная int pos = 90
Как прописали так и работает.
во вложение вставил код
Вот я несколько раз пролистал и не нашел. Где же он?
Для начала, почитайте как работает сервопривод и многие вопросы, а-ля
видимо так запрограммирован, что встает в исходную точку и из нее считает градусы наклона
пропадут и придёт понимание как нужно делать.
 
Изменено:

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
Покажите код, что куда ставите. Может вы не туда ставите или еще что-то не так с командами.
PS. Для вставки кода пользуйтесь символом </>
C++:
#include <Servo.h>

Servo myServo; // создаем объект сервомотора

const int button1Pin = 2; // пин для первой кнопки
const int button2Pin = 3; // пин для второй кнопки
int pos = 90; // начальная позиция сервомотора

void setup() {
myServo.attach(9); // подключаем сервомотор к пину 9
pinMode(button1Pin, INPUT_PULLUP); // устанавливаем пин кнопки 1 как вход с подтяжкой
pinMode(button2Pin, INPUT_PULLUP); // устанавливаем пин кнопки 2 как вход с подтяжкой
}

void loop() {
if (digitalRead(button1Pin) == LOW) { // если нажата первая кнопка
pos += 1; // увеличиваем позицию
if (pos > 180) pos = 180; // ограничиваем до 180 градусов
myServo.write(pos); // устанавливаем позицию сервомотора
delay(15); // небольшая задержка для плавности
}

if (digitalRead(button2Pin) == LOW) { // если нажата вторая кнопка
pos -= 1; // уменьшаем позицию
if (pos < 0) pos = 0; // ограничиваем до 0 градусов
myServo.write(pos); // устанавливаем позицию сервомотора
delay(15); // небольшая задержка для плавности
}
}
 

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
Вот я несколько раз пролистал и не нашел. Где же он?
#include <Servo.h>

Servo myServo; // создаем объект сервомотора

const int button1Pin = 2; // пин для первой кнопки
const int button2Pin = 3; // пин для второй кнопки
int pos = 90; // начальная позиция сервомотора

void setup() {
myServo.attach(9); // подключаем сервомотор к пину 9
pinMode(button1Pin, INPUT_PULLUP); // устанавливаем пин кнопки 1 как вход с подтяжкой
pinMode(button2Pin, INPUT_PULLUP); // устанавливаем пин кнопки 2 как вход с подтяжкой
}

void loop() {
if (digitalRead(button1Pin) == LOW) { // если нажата первая кнопка
pos += 1; // увеличиваем позицию
if (pos > 180) pos = 180; // ограничиваем до 180 градусов
myServo.write(pos); // устанавливаем позицию сервомотора
delay(15); // небольшая задержка для плавности
}

if (digitalRead(button2Pin) == LOW) { // если нажата вторая кнопка
pos -= 1; // уменьшаем позицию
if (pos < 0) pos = 0; // ограничиваем до 0 градусов
myServo.write(pos); // устанавливаем позицию сервомотора
delay(15); // небольшая задержка для плавности
}
}

Покажите код, что куда ставите. Может вы не туда ставите или еще что-то не так с командами.
7я строка
int pos = 90; // начальная позиция сервомотора
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
Ну, правильно, так и должно быть. При включении серво становится на 90°
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
Блин, вы заставили меня сомневаться в простейшем коде. Пришлось взять ардуйню, откопать серву, макетку, провода родить, собрать всё. И всё работает так как прописано. При включении серва становится на 90°. Если тыкать "землёй" в D2 или D3, то как и написано она вращается тудым-сюдым.
Меняю 90 например на 9 он все равно на 90 встает
Попробовал другие значения, тоже после перепрошивки и после включения встаёт в них. Вы послеизменения переменной pos нажимали кнопку "Загрузить"?
 

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
Попробовал другие значения, тоже после перепрошивки и после включения встаёт в них. Вы послеизменения переменной pos нажимали кнопку "Загрузить"?
Да все работает как мне и надо. Но получается когда отключу зажигание и включу он встанет встанет в другое положение.
Ну конечно проверяю код и загружаю.все работает ,когда плату передергивает из УСБ,он встает в 90.Мож плата или привод косяченные. Самые дешевые с озона
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
Самые дешевые с озона
У меня, как и большинства, самые дешевые с али экспресса, ваши тоже, только озоновцы еще с вас поимели. Цена тут не решает. Даже если бы она миллион стоила, то работала точно так же. Почитайте как выполняются программы. При каждом запуске серва будет устанавливаться в ту позицию, в которую прописано в программе. Вам уже @Bruzzer писал, что
вам надо запоминать значение угла при выключении, чтобы указать его же при включении
Screenshot_2025-04-08-19-05-17-104_com.yandex.browser-edit.jpg
Самый простой способ
 
Изменено:
  • Лойс +1
Реакции: seregaksm

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
Разобрался с помощью АИ . Вот что он мне подсказал
include <EEPROM.h> // Подключаем библиотеку для работы с EEPROM.
Вопрос решен всем спасибо большое
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
Рано радуетесь, не забывайте, что ресурс EEPROM ограничен, а ИИ хорошего не посоветует
 

seregaksm

✩✩✩✩✩✩✩
8 Апр 2025
10
0
Рано радуетесь, не забывайте, что ресурс EEPROM ограничен, а ИИ хорошего не посоветует
в автомобиле куча епромок стоит. Да и мне на печку за зиму несколько десятков раз мож ползунок подвигу. Или в ардуинках какие то особенные? Тут же вроде на ресурсе написано о тысячах миллионах пере записей https://alexgyver.ru/lessons/eeprom/#:~:text=Производитель гарантирует 100 000 циклов,е.
 

viktor1703

★★★✩✩✩✩
9 Дек 2021
688
164
написано о тысячах миллионах пере записей
А вот это уже зависит от того на сколько часто перезаписывать данные вам подсказал ИИ. Может каждый цикл loop, тогда эти сотни тысяч раз пройдут за несколько секунд.
 
Изменено: