Добрый день.хочу сделать автоматическое открывание и закрывание дверцы кормушки по таймеру(с помощью датчика реального времени),с возможностью ручного открывания по кнопке.Все работает,однако присутствует постоянное дребезжание сервы,которое приводит к сгоранию оной.Буду благодарен за помощь в решении проблемы. Используется плата искра нео,тройка шилд,,серво привод https://amperka.ru/product/servo-fs5113r. Питание платы идет через блок питания 5v(через usb порт),питание нервы через отдельный блок питания 6v. Серва подключается так. красный провод- к блоку питания коричневый провод-к блоку питания-к контакту g желтый провод -к контакту d скрипт такой Код (C++): // библиотека для работы I²C #include <Wire.h> // библиотека для работы с часами реального времени #include "TroykaRTC.h" //i переменная для повората серв по кнопке int i=0; // EEPROM — энергонезависимая память // библиотека для записи и считывания информации с EEPROM #include <EEPROM.h> //задаем пин кнопки #define FIRST_KEY_PIN 10 // первый пин с клавишей (англ. «key») #define BUZZER_PIN 12 // размер массива для времени с учётом завершающего нуля #define LEN_TIME 12 // размер массива для даты с учётом завершающего нуля #define LEN_DATE 12 // размер массива для дня недели с учётом завершающего нуля #define LEN_DOW 12 // создаём объект для работы с часами реального времени RTC clock; #include <Servo.h> Servo myservo; int val; void setup() { // открываем последовательный порт Serial.begin(9600); // инициализация часов clock.begin(); // метод установки времени и даты в модуль вручную // clock.set(10,25,45,27,07,2005,THURSDAY); // метод установки времени и даты автоматически при компиляции clock.set(__TIMESTAMP__); pinMode(BUZZER_PIN, OUTPUT); } void loop() { // массив для хранения текущего времени char time[LEN_TIME]={0}; // массив для хранения текущей даты char date[LEN_DATE]={0}; // массив для хранения текущего дня недели char dow[LEN_DOW]={0}; // запрашиваем данные с часов clock.read(); // сохраняем текущее время в массив time clock.getTimeStr(time, LEN_TIME); // сохраняем текущую дату в массив date clock.getDateStr(date, LEN_DATE); // сохраняем текущий день недели в массив dow clock.getDOWStr(dow, LEN_DOW); // выводим в serial порт текущее время, дату и день недели Serial.print(time); Serial.print("--"); Serial.print(date); Serial.print("--"); Serial.println(dow); // ждём одну секунду delay(300); int hour=clock.getHour(); int minute=clock.getMinute(); int second=clock.getSecond(); //устанавливаем время открывания двери // утреннее кормление,серво 0 открыто,160 закрыто if (hour==8 & minute==1 & second==00) {pinMode(0, INPUT); myservo.attach(0); myservo.write (0); tone(BUZZER_PIN, 4500, 5000); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} if (hour==8 & minute==21 & second==00) {tone(BUZZER_PIN, 4500, 5000); delay(5000); pinMode(0, INPUT); myservo.attach(0); myservo.write (160); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} // дневное кормление if (hour==15 & minute==1 & second==00) {tone(BUZZER_PIN, 4500, 5000); pinMode(0, INPUT); myservo.attach(0); myservo.write (0); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} if (hour==15 & minute==21 & second==00) {tone(BUZZER_PIN, 4500, 5000); delay(5000); pinMode(0, INPUT); myservo.attach(0); myservo.write (160); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} //вечернее кормление if (hour==20 & minute==1 & second==00) {tone(BUZZER_PIN, 4500, 5000); pinMode(0, INPUT); myservo.attach(0); myservo.write (0); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} if (hour==20 & minute==21 & second==00) {tone(BUZZER_PIN, 4500, 5000); delay(5000); pinMode(0, INPUT); myservo.attach(0); myservo.write (160); delay(1000); myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} //ручное управление с помошью кнопки // считываем значение с кнопки. Возможны всего 2 варианта: // * высокий сигнал, 5 вольт, истина — кнопка отпущена // * низкий сигнал, земля, ложь — кнопка зажата boolean keyUp = digitalRead(FIRST_KEY_PIN); // проверяем условие «если не кнопка отпущена». Знак «!» // перед булевой переменной означает отрицание, т.е. «не». /* * Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом: Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1 Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала. Оператор % работает только с целыми операндами.Оператор X % Y дает остаток от деления X на Y. Если X меньше Y, т.е. целая часть результата деления равна 0, оператор % будет возвращать X. Таким образом: Пока brightness + 1 меньше 256, в brightness записывается значение brightness + 1 Как только brightness + 1 принимает значение 256, результатом (brightness + 1) % 256 становится 0 и на следующей итерации loop() всё начинается сначала. Оператор % работает только с целыми операндами. */ if (!keyUp) {pinMode(0, INPUT); myservo.attach(0); myservo.write (0+i); tone(BUZZER_PIN, 4500, 5000); delay(1000); i = (i + 160) % 320; myservo.detach(); pinMode(0, OUTPUT); digitalWrite(0, LOW);} {Serial.print(i);} }
Про дрожащие сервы только на этом форуме поднимались темы раз несколько. Если проблема не в нехватке питания, что бывает часто, то в настройках самой сервы, точнее нулевого положения ее. Если нуль за пределами ограничителя, то она упрется и будет гудеть пока не сгорит. Потому: проверьте питание, оикуда оно идет вообще? И поиграйте настройками min-max при инициализации сервы.
Да, и еще, не используйте пин 0, он же для UART, который в вашей программе задействован для печати в сериал порт!
Используется Iskra Neo, для неё на этой ноге Serial1, а он не используется. ТС не указал пару моментов - расстояние между искрой и сервой ~2м. Я грешу на помехи.
проблема скорее всего в блоке питания,который идет на плату.Я использую блок питания 500мА,5 v.Если вместо него ,в качестве питания подключаю макбук аир,дребезжание отсутсвует.Теперь вопрос,какой блок питания подобрать
я уже пробовал подключать серву близко (10 см) к плате.дребезг остается.пин переписал на 1,ситуация не изменилась
Я бы предостерёг именно от 12 В. Я так понимаю теперь Ардуино питается от БП, а серва от ардуины? Нагрузка на регулятор напряжения в таком случае большая. Он будет сильно греться. Ему и так нужно превратить в тепло лишние 7В, а тут ещё и серва. Лучше в такой схеме использовать БП хотя бы на 9 В, а ещё лучше - на 7.5
Нет,я по прежнему использую 2 блока питания.12v записывает ардуину,а 6v отдельно стерву.Так нормально будет?