My Marlin configs for Fabrikator Mini and CTC i3 Pro B
You can not select more than 25 topics Topics must start with a letter or number, can include dashes ('-') and can be up to 35 characters long.

servo.h 6.3KB

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