Arduino Code
You will need the Adafruit_SoftServo library to run this sketch.
Plug your Trinket into your computer's USB port, press the reset button and upload the following sketch:
// SPDX-FileCopyrightText: 2018 Mikey Sklar for Adafruit Industries
//
// SPDX-License-Identifier: MIT
/*******************************************************************
SoftServo sketch for Adafruit Trinket. Increments values to change position on the servo
(0 = zero degrees, full = 180 degrees)
Required library is the Adafruit_SoftServo library
available at https://github.com/adafruit/Adafruit_SoftServo
The standard Arduino IDE servo library will not work with 8 bit
AVR microcontrollers like Trinket and Gemma due to differences
in available timer hardware and programming. We simply refresh
by piggy-backing on the timer0 millis() counter
Required hardware includes an Adafruit Trinket microcontroller
a servo motor, and a potentiometer (nominally 1Kohm to 100Kohm
As written, this is specifically for the Trinket although it should
be Gemma or other boards (Arduino Uno, etc.) with proper pin mappings
Trinket: USB+ Gnd Pin #0
Connection: Servo+ - Servo1
*******************************************************************/
#include <Adafruit_SoftServo.h> // SoftwareServo (works on non PWM pins)
#define SERVO1PIN 0 // Servo control line (orange) on Trinket Pin #0
int moveAmount = 1; // change this value to change speed of servo
int servoPos = 0; // variable for servo position
Adafruit_SoftServo myServo1; //create servo object
void setup() {
// Set up the interrupt that will refresh the servo for us automagically
OCR0A = 0xAF; // any number is OK
TIMSK |= _BV(OCIE0A); // Turn on the compare interrupt (below!)
myServo1.attach(SERVO1PIN); // Attach the servo to pin 0 on Trinket
myServo1.write(90); // Tell servo to go to position per quirk
delay(15); // Wait 15ms for the servo to reach the position
}
void loop() {
myServo1.write(servoPos); // tell servo to go to position
servoPos = servoPos + moveAmount; // increment servo position (value between 0 and 180)
if (servoPos == 0 || servoPos == 180){
moveAmount = -moveAmount; //reverse incrementer at bounds
}
delay(15); // waits 15ms for the servo to reach the position
}
// We'll take advantage of the built in millis() timer that goes off
// to keep track of time, and refresh the servo every 20 milliseconds
// The SIGNAL(TIMER0_COMPA_vect) function is the interrupt that will be
// Called by the microcontroller every 2 milliseconds
volatile uint8_t counter = 0;
SIGNAL(TIMER0_COMPA_vect) {
// this gets called every 2 milliseconds
counter += 2;
// every 20 milliseconds, refresh the servos!
if (counter >= 20) {
counter = 0;
myServo1.refresh();
}
}
When the variable moveAmount is increased, the motor moves faster and makes more noise. A squeaking motor next to your dog's ear is not nice, so keep it slow and quiet!
Adjust the position of the flat paddle servo attachment on the servo's toothed shaft until you're happy with the alignment.
Without removing the flat paddle from the servo, untape the laser and use one of the included screws to secure the paddle to the servo. Retape the laser to the paddle.
Page last edited January 22, 2025
Text editor powered by tinymce.