1/*
2 * Author: Stan Gifford <stan@gifford.id.au>
3 * Copyright (c) 2015 Intel Corporation.
4 *
5 * Permission is hereby granted, free of charge, to any person obtaining
6 * a copy of this software and associated documentation files (the
7 * "Software"), to deal in the Software without restriction, including
8 * without limitation the rights to use, copy, modify, merge, publish,
9 * distribute, sublicense, and/or sell copies of the Software, and to
10 * permit persons to whom the Software is furnished to do so, subject to
11 * the following conditions:
12 *
13 * The above copyright notice and this permission notice shall be
14 * included in all copies or substantial portions of the Software.
15 *
16 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
17 * EXPRESS OR IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
18 * MERCHANTABILITY, FITNESS FOR A PARTICULAR PURPOSE AND
19 * NONINFRINGEMENT. IN NO EVENT SHALL THE AUTHORS OR COPYRIGHT HOLDERS BE
20 * LIABLE FOR ANY CLAIM, DAMAGES OR OTHER LIABILITY, WHETHER IN AN ACTION
21 * OF CONTRACT, TORT OR OTHERWISE, ARISING FROM, OUT OF OR IN CONNECTION
22 * WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN THE SOFTWARE.
23 */
24
25#pragma once
26
27#include <mraa/i2c.h>
28
29#define MAX_BUFFER_LENGTH 6
30
31#define SERVO_MIN       0
32#define SERVO_MAX       180
33#define SERVO_FREQ      60
34#define PCA9685_SUBADR1 0x2
35#define PCA9685_SUBADR2 0x3
36#define PCA9685_SUBADR3 0x4
37
38#define PCA9685_MODE1    0x0
39#define PCA9685_PRESCALE 0xFE
40
41#define LED0_ON_L  0x6
42#define LED0_ON_H  0x7
43#define LED0_OFF_L 0x8
44#define LED0_OFF_H 0x9
45
46#define ALLLED_ON_L  0xFA
47#define ALLLED_ON_H  0xFB
48#define ALLLED_OFF_L 0xFC
49#define ALLLED_OFF_H 0xFD
50
51#define PCA9685_MODE1_REG       0x00
52#define PCA9685_PRESCALE_REG    0xFE
53#define LED0_REG                0x06
54
55namespace upm {
56
57 /**
58  * @brief Adafruit PCA9685-based Servo Shield library
59  * @defgroup adafruitss libupm-adafruitss
60  * @ingroup adafruit i2c servos
61  */
62
63 /**
64  * @library adafruitss
65  * @sensor adafruitss
66  * @comname Adafruit Servo Shield
67  * @type servos
68  * @man adafruit
69  * @web http://www.adafruit.com/product/1411
70  * @con i2c
71  *
72  * @brief API for the Adafruit Servo Shield
73  *
74  * UPM library for the PCA9685-based Adafruit 16-channel servo shield. If 3
75  * or more GWS servos are attached, results could be unpredictable. Adafruit
76  * Industries recommend installing a capacitor on the board, which should
77  * alleviate the issue. Sizing depends on servos and their number.
78  *
79  * @image html adafruitss.jpg
80  * @snippet adafruitss.cxx Interesting
81  */
82
83  class adafruitss {
84  public:
85    /**
86     * Creates an adafruitss object
87     *
88     * @param bus Number of the used I2C bus
89     * @param i2c_address Address of the servo shield on the I2C bus
90     */
91    adafruitss(int bus, int i2c_address);
92    int update(void);
93    /**
94     * Sets the frequency of the servos
95     *
96     * @param freq Frequency at which the servos operate
97     */
98    void setPWMFreq(float freq);
99    /**
100     * Moves one of the servos to a specified angle
101     *
102     * @param port Port of the servo on the shield (servo number)
103     * @param servo_type Can be 0 = standard (1ms to 2ms), 1 = extended
104     * (0.6ms to 2.4ms), or 2 = extended (0.8ms to 2.2ms)
105     * @param degrees Angle to set the servo to
106     */
107    void servo(uint8_t port, uint8_t servo_type, float degrees);
108
109  private:
110
111    int pca9685_addr;
112    mraa_i2c_context m_i2c;
113    uint8_t m_rx_tx_buf[MAX_BUFFER_LENGTH];
114    float _duration_1ms;
115};
116
117}
118