Программирование сервопривода на ATtiny85
Плата: "ATtiny25/45/85"
Процессор: "ATtiny85"
Часы: "Внутренний 1 МГц"
Программатор: "Arduino как ISP"
Я хочу запустить сервопривод вперед и назад на ATtiny85. Библиотека сервоприводов не совместима с ATtiny85, поэтому мне пришлось писать код с нуля. В этот момент код, который заставляет сервопривод двигаться вперед (по часовой стрелке), является:
void setup() {
pinMode(PB1, OUTPUT);
}
void loop() {
digitalWrite(PB1, HIGH);
delayMicroseconds(1000);
// 1 миллисекунда определяет сервопривод, идущий вперед
digitalWrite(PB1, LOW);
delay(19);
}
И код, который заставляет сервопривод идти назад (против часовой стрелки), просто меняет количество микросекунд на:
delayMicroseconds(2000);
Я хочу, чтобы серводвигатель двигался вперед на один цикл в течение нескольких секунд, а затем на несколько секунд назад. Я хочу, чтобы это продолжалось. На данный момент мой код:
void setup() {
pinMode(PB1, OUTPUT);
}
void loop() {
digitalWrite(PB1, HIGH);
delayMicroseconds(1000);
digitalWrite(PB1, LOW);
delay(19);
digitalWrite(PB1, HIGH);
delayMicroseconds(2000);
digitalWrite(PB1, LOW);
delay(19);
}
Это, однако, просто заставляет серво двигаться вперед и назад в одном и том же месте навсегда. Я понимаю, что мне может понадобиться цикл for для этого, но я запутался, как я это сделаю.
@Utsav, 👍2
Обсуждение1 ответ
Лучший ответ:
Сервопривод не может двигаться вперед и назад за 40 миллисекунд. Это будет больше похоже на дрожь между обоими.
Попробуйте сделать что-то вроде этого:
// продолжайте посылать 0 позиций примерно в течение 400 мс
for(int i = 0; i<20; ++i) {
digitalWrite(PB1, HIGH);
delayMicroseconds(1000);
digitalWrite(PB1, LOW);
delay(19);
}
// продолжайте посылать вторую позицию примерно в течение 400 мс
for(int i = 0; i<20; ++i) {
digitalWrite(PB1, HIGH);
delayMicroseconds(2000);
digitalWrite(PB1, LOW);
delay(18);
}
Привет, большое спасибо, это действительно помогло, и это тоже имеет смысл. У меня есть только один вопрос, что задержка(19) при изменении на задержку(20) сервопривод ведет себя по-другому. Почему эта задержка держится на уровне 19 миллисекунд, а не на чем-то другом? еще раз спасибо., @Utsav
Серво ожидает импульсов со скоростью 20 мс (= 50 Гц) , включая высокую боковую ширину импульса., @KIIV
В попытке найти базовый код для работы сервопривода это очень помогло. Спасибо!, @Devin Carpenter
- Возникли проблемы с определением CTC на таймере 1 с помощью ATTiny85.
- Программирование микроконтроллера Attiny85 без arduino
- Проблема с программированием ATtiny85: Error - avrdude: Yikes! Invalid device signature
- Digispark ATtiny 85 - не распознается как HID устройство
- Клавиатура Digispark ATtiny85
- Связь I2C между Attiny85 в качестве ведущего устройства и Arduino UNO в качестве ведомого устройства
- I2C запрашивает более одного байта
- Digispark Atinny85 не распознан (проблема с загрузчиком)
Вы пробовали использовать **8 МГц**?, @Allen Chak
@AllenChak да, я действительно пробовал это сделать, но это все равно не дает желаемого результата, потому что я хочу, чтобы сервопривод вращался вперед и назад подряд, а не отдельно., @Utsav
Попробуйте эту ссылку: https://forum.arduino.cc/index.php?topic=62912.msg459183#msg459183, @Allen Chak