root / arduino-1.0 / libraries / Servo / Servo.h @ 58d82c77
History | View | Annotate | Download (5.4 KB)
1 | 58d82c77 | Tom Mullins | /*
|
---|---|---|---|
2 | Servo.h - Interrupt driven Servo library for Arduino using 16 bit timers- Version 2
|
||
3 | Copyright (c) 2009 Michael Margolis. All right reserved.
|
||
4 | |||
5 | This library is free software; you can redistribute it and/or
|
||
6 | modify it under the terms of the GNU Lesser General Public
|
||
7 | License as published by the Free Software Foundation; either
|
||
8 | version 2.1 of the License, or (at your option) any later version.
|
||
9 | |||
10 | This library is distributed in the hope that it will be useful,
|
||
11 | but WITHOUT ANY WARRANTY; without even the implied warranty of
|
||
12 | MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the GNU
|
||
13 | Lesser General Public License for more details.
|
||
14 | |||
15 | You should have received a copy of the GNU Lesser General Public
|
||
16 | License along with this library; if not, write to the Free Software
|
||
17 | Foundation, Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA
|
||
18 | */
|
||
19 | |||
20 | /*
|
||
21 |
|
||
22 | A servo is activated by creating an instance of the Servo class passing the desired pin to the attach() method.
|
||
23 | The servos are pulsed in the background using the value most recently written using the write() method
|
||
24 | |||
25 | Note that analogWrite of PWM on pins associated with the timer are disabled when the first servo is attached.
|
||
26 | Timers are seized as needed in groups of 12 servos - 24 servos use two timers, 48 servos will use four.
|
||
27 | The sequence used to sieze timers is defined in timers.h
|
||
28 | |||
29 | The methods are:
|
||
30 | |||
31 | Servo - Class for manipulating servo motors connected to Arduino pins.
|
||
32 | |||
33 | attach(pin ) - Attaches a servo motor to an i/o pin.
|
||
34 | attach(pin, min, max ) - Attaches to a pin setting min and max values in microseconds
|
||
35 | default min is 544, max is 2400
|
||
36 |
|
||
37 | write() - Sets the servo angle in degrees. (invalid angle that is valid as pulse in microseconds is treated as microseconds)
|
||
38 | writeMicroseconds() - Sets the servo pulse width in microseconds
|
||
39 | read() - Gets the last written servo pulse width as an angle between 0 and 180.
|
||
40 | readMicroseconds() - Gets the last written servo pulse width in microseconds. (was read_us() in first release)
|
||
41 | attached() - Returns true if there is a servo attached.
|
||
42 | detach() - Stops an attached servos from pulsing its i/o pin.
|
||
43 | */
|
||
44 | |||
45 | #ifndef Servo_h
|
||
46 | #define Servo_h
|
||
47 | |||
48 | #include <inttypes.h> |
||
49 | |||
50 | /*
|
||
51 | * Defines for 16 bit timers used with Servo library
|
||
52 | *
|
||
53 | * If _useTimerX is defined then TimerX is a 16 bit timer on the curent board
|
||
54 | * timer16_Sequence_t enumerates the sequence that the timers should be allocated
|
||
55 | * _Nbr_16timers indicates how many 16 bit timers are available.
|
||
56 | *
|
||
57 | */
|
||
58 | |||
59 | // Say which 16 bit timers can be used and in what order
|
||
60 | #if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
|
||
61 | #define _useTimer5
|
||
62 | #define _useTimer1
|
||
63 | #define _useTimer3
|
||
64 | #define _useTimer4
|
||
65 | typedef enum { _timer5, _timer1, _timer3, _timer4, _Nbr_16timers } timer16_Sequence_t ; |
||
66 | |||
67 | #elif defined(__AVR_ATmega32U4__)
|
||
68 | #define _useTimer3
|
||
69 | #define _useTimer1
|
||
70 | typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; |
||
71 | |||
72 | #elif defined(__AVR_AT90USB646__) || defined(__AVR_AT90USB1286__)
|
||
73 | #define _useTimer3
|
||
74 | #define _useTimer1
|
||
75 | typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; |
||
76 | |||
77 | #elif defined(__AVR_ATmega128__) ||defined(__AVR_ATmega1281__)||defined(__AVR_ATmega2561__)
|
||
78 | #define _useTimer3
|
||
79 | #define _useTimer1
|
||
80 | typedef enum { _timer3, _timer1, _Nbr_16timers } timer16_Sequence_t ; |
||
81 | |||
82 | #else // everything else |
||
83 | #define _useTimer1
|
||
84 | typedef enum { _timer1, _Nbr_16timers } timer16_Sequence_t ; |
||
85 | #endif
|
||
86 | |||
87 | #define Servo_VERSION 2 // software version of this library |
||
88 | |||
89 | #define MIN_PULSE_WIDTH 544 // the shortest pulse sent to a servo |
||
90 | #define MAX_PULSE_WIDTH 2400 // the longest pulse sent to a servo |
||
91 | #define DEFAULT_PULSE_WIDTH 1500 // default pulse width when servo is attached |
||
92 | #define REFRESH_INTERVAL 20000 // minumim time to refresh servos in microseconds |
||
93 | |||
94 | #define SERVOS_PER_TIMER 12 // the maximum number of servos controlled by one timer |
||
95 | #define MAX_SERVOS (_Nbr_16timers * SERVOS_PER_TIMER)
|
||
96 | |||
97 | #define INVALID_SERVO 255 // flag indicating an invalid servo index |
||
98 | |||
99 | typedef struct { |
||
100 | uint8_t nbr :6 ; // a pin number from 0 to 63 |
||
101 | uint8_t isActive :1 ; // true if this channel is enabled, pin not pulsed if false |
||
102 | } ServoPin_t ; |
||
103 | |||
104 | typedef struct { |
||
105 | ServoPin_t Pin; |
||
106 | unsigned int ticks; |
||
107 | } servo_t; |
||
108 | |||
109 | class Servo |
||
110 | { |
||
111 | public:
|
||
112 | Servo(); |
||
113 | uint8_t attach(int pin); // attach the given pin to the next free channel, sets pinMode, returns channel number or 0 if failure |
||
114 | uint8_t attach(int pin, int min, int max); // as above but also sets min and max values for writes. |
||
115 | void detach();
|
||
116 | void write(int value); // if value is < 200 its treated as an angle, otherwise as pulse width in microseconds |
||
117 | void writeMicroseconds(int value); // Write pulse width in microseconds |
||
118 | int read(); // returns current pulse width as an angle between 0 and 180 degrees |
||
119 | int readMicroseconds(); // returns current pulse width in microseconds for this servo (was read_us() in first release) |
||
120 | bool attached(); // return true if this servo is attached, otherwise false |
||
121 | private:
|
||
122 | uint8_t servoIndex; // index into the channel data for this servo
|
||
123 | int8_t min; // minimum is this value times 4 added to MIN_PULSE_WIDTH
|
||
124 | int8_t max; // maximum is this value times 4 added to MAX_PULSE_WIDTH
|
||
125 | }; |
||
126 | |||
127 | #endif |