ported to CircuitPython
This commit is contained in:
parent
a2dba4f43b
commit
9dcd0ebe04
3 changed files with 97 additions and 0 deletions
4
Trinket_Gemma_Servo_Control/README.md
Normal file
4
Trinket_Gemma_Servo_Control/README.md
Normal file
|
|
@ -0,0 +1,4 @@
|
|||
# Trinket_Gemma_Servo_Control
|
||||
|
||||
Code to accompany this Adafruit tutorial:
|
||||
https://learn.adafruit.com/trinket-gemma-servo-control
|
||||
65
Trinket_Gemma_Servo_Control/Trinket_Gemma_Servo_Control.ino
Normal file
65
Trinket_Gemma_Servo_Control/Trinket_Gemma_Servo_Control.ino
Normal file
|
|
@ -0,0 +1,65 @@
|
|||
/*******************************************************************
|
||||
SoftServo sketch for Adafruit Trinket. Turn the potentiometer knob
|
||||
to set the corresponding 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 Pin #2 A1
|
||||
Connection: Servo+ - Servo1 Potentiometer wiper
|
||||
|
||||
*******************************************************************/
|
||||
|
||||
#include <Adafruit_SoftServo.h> // SoftwareServo (works on non PWM pins)
|
||||
|
||||
#define SERVO1PIN 0 // Servo control line (orange) on Trinket Pin #0
|
||||
|
||||
#define POTPIN 1 // Potentiometer sweep (center) on Trinket Pin #2 (Analog 1)
|
||||
|
||||
Adafruit_SoftServo myServo1, myServo2; //create TWO servo objects
|
||||
|
||||
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() {
|
||||
int potValue; // variable to read potentiometer
|
||||
int servoPos; // variable to convert voltage on pot to servo position
|
||||
potValue=analogRead(POTPIN); // Read voltage on potentiometer
|
||||
servoPos = map(potValue, 0, 1023, 0, 179); // scale it to use it with the servo (value between 0 and 180)
|
||||
myServo1.write(servoPos); // tell servo to go to position
|
||||
|
||||
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();
|
||||
}
|
||||
}
|
||||
28
Trinket_Gemma_Servo_Control/Trinket_Gemma_Servo_Control.py
Normal file
28
Trinket_Gemma_Servo_Control/Trinket_Gemma_Servo_Control.py
Normal file
|
|
@ -0,0 +1,28 @@
|
|||
import time
|
||||
import board
|
||||
from analogio import AnalogIn
|
||||
import simpleio
|
||||
|
||||
# servo pin for the M0 boards:
|
||||
servo = simpleio.Servo(board.A2)
|
||||
angle = 0
|
||||
|
||||
# potentiometer
|
||||
trimpot = AnalogIn(board.A1) # pot pin for servo control
|
||||
|
||||
def remapRange(value, leftMin, leftMax, rightMin, rightMax):
|
||||
# this remaps a value from original (left) range to new (right) range
|
||||
# Figure out how 'wide' each range is
|
||||
leftSpan = leftMax - leftMin
|
||||
rightSpan = rightMax - rightMin
|
||||
|
||||
# Convert the left range into a 0-1 range (int)
|
||||
valueScaled = int(value - leftMin) / int(leftSpan)
|
||||
|
||||
# Convert the 0-1 range into a value in the right range.
|
||||
return int(rightMin + (valueScaled * rightSpan))
|
||||
|
||||
while True:
|
||||
angle = remapRange(trimpot.value, 0, 65535, 0, 180)
|
||||
servo.angle = angle
|
||||
#time.sleep(0.05)
|
||||
Loading…
Reference in a new issue