ATtiny85 5V и использование сервопривода

У меня есть ATtiny85, который я хотел бы переместить сервопривод на I/O "4" для этого проекта.

Кажется, я не могу заставить его работать, что бы я ни делал. У меня было множество проблем с его программированием, но я добрался до того места, где он запрограммирует мигание, а также мигнет светодиод на схеме в приведенной ссылке. У меня есть сервопривод, и я чертовски уверен, что проводка правильная (когда мы будем уверены на 100%?). Я пробовал эти программы, но безуспешно:

// Trinket Servo Monster sketch
// Hardware: Adafruit Trinket (3V or 5V), micro servo, LED + resistor
// Libraries: uses Adafruit_TiCoServo library to manage servo pulses,
// even though NeoPixels are NOT being used here.

#if !defined(__AVR_ATtiny85__)
 #error "This code is for ATtiny boards"
#endif
//#include <Adafruit_TiCoServo.h>
#include <ServoManager.h>
#include <avr/power.h>

// Servo parameters.  Pin MUST be 1 or 4 on a Trinket.  Servo position
// is specified in raw timer/counter ticks (1 tick = 0.128 milliseconds).
// Servo pulse timing is typically 1-2 ms, but can vary slightly among
// servos, so you may need to tweak these limits to match your reality.
#define SERVO_PIN  4 // Pins 1 or 4 are supported on Trinket
#define SERVO_MIN  4 // ~1 ms pulse
#define SERVO_MAX 26 // ~2 ms pulse

#define LED_PIN    0 // "Eye" LED is connected here

PrecisionServo* servo;

void setup(void) {
  ServoManager::setup(1);
  servo = ServoManager::createServo(4);
  //servo->setSetting(SERVO_MEDIUM_ENDPOINT);

//#if (F_CPU == 16000000L)
  // 16 MHz Trinket requires setting prescale for correct timing.
  // This MUST be done BEFORE servo.attach()!
//  clock_prescale_set(clock_div_1);
//#endif
  //servo.attach(SERVO_PIN);
  pinMode(LED_PIN, OUTPUT);
  digitalWrite(LED_PIN, HIGH);
}

uint32_t lastLookTime = 0; // Time of last head-turn

void loop(void) {

  //unsigned long t = millis(); // Current time

  // If more than 1/2 second has passed since last head turn...
  servo->setTarget(0);
  ServoManager::waitUntilFinished();

  servo->setTarget(180);
  ServoManager::waitUntilFinished();

  // Unrelated to head-turn check,
  if(random(10) == 0) { // there's a 1-in-10 chance...
    // ...of an "eye blink":
    digitalWrite(LED_PIN, LOW);  // The LED turns OFF
    delay(random(50, 250));      // for just a short random moment
    digitalWrite(LED_PIN, HIGH); // then back ON
  }

  //delay(1000); // Repeat loop() about 10 times/second
}

ПОЭТОМУ я сократил масштаб и просто попытался записать максимум следующим образом:

void setup() {
  pinMode(4, OUTPUT);
}

void loop() {
  digitalWrite(4, HIGH);
  delayMicroseconds(1000);
  // 1 миллисекунда определяет сервопривод, идущий вперед
  digitalWrite(4, LOW);
  delay(19);
}

Но и это не сработало.

Разве сервопривод не должен двигаться только с записью в "high" и "low"?

, 👍-1

Обсуждение

нет, это не должно быть хобби серво ... в Интернете есть много учебных пособий о работе сервоприводов хобби и о том, как ими управлять, @jsotola

Можете ли вы связать? Ничто из того, что я нашел до сих пор, не помогло., @Perplexing Pies

https://duckduckgo.com/?q=arduino+хобби+servo&ia=веб, @jsotola


1 ответ


2

Для перемещения сервопривода требуется ШИМ - сигнал на управляющий провод.

Эта таблица данных как бы подтверждает это...

http://www.datasheetcafe.com/sg90-datasheet-pdf-9-g-micro-servo/

,