Statistics
| Branch: | Revision:

root / arduino-1.0 / libraries / Servo / Servo.h @ 58d82c77

History | View | Annotate | Download (5.4 KB)

1
/*
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