AP1017 library for the Rev.E hardware with expanded capabilities.
Fork of AP1017 by
AP1017.cpp@9:1ca7d16de1c4, 2017-05-19 (annotated)
- Committer:
- tkstreet
- Date:
- Fri May 19 23:09:27 2017 +0000
- Revision:
- 9:1ca7d16de1c4
- Parent:
- 8:bc70a421ef4c
- Child:
- 10:16d45e3f4be3
Transferred DigitalOut and I2C definitions to control class to make AP1017 class more generic.
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
tkstreet | 0:a0435a630c5d | 1 | #include "AP1017.h" |
tkstreet | 4:c36159701cde | 2 | #include "debug.h" |
tkstreet | 0:a0435a630c5d | 3 | |
tkstreet | 0:a0435a630c5d | 4 | /******************** Constructors & Destructors ****************************/ |
tkstreet | 0:a0435a630c5d | 5 | |
tkstreet | 0:a0435a630c5d | 6 | // Default constructor |
tkstreet | 9:1ca7d16de1c4 | 7 | AP1017::AP1017(DigitalOut* A, DigitalOut* B, I2C* M) : motorOn(false), dutyCycle(0.0) |
tkstreet | 0:a0435a630c5d | 8 | { |
tkstreet | 9:1ca7d16de1c4 | 9 | i2cMotor = M; |
tkstreet | 9:1ca7d16de1c4 | 10 | inA = A; |
tkstreet | 9:1ca7d16de1c4 | 11 | inB = B; |
tkstreet | 9:1ca7d16de1c4 | 12 | |
tkstreet | 6:d4d3bc82d446 | 13 | // Instantiate TCA9554A |
tkstreet | 6:d4d3bc82d446 | 14 | motor = new TCA9554A(i2cMotor, TCA9554A::SLAVE_ADDRESS_38H); // 38H->Port 0->RSV |
tkstreet | 6:d4d3bc82d446 | 15 | |
tkstreet | 6:d4d3bc82d446 | 16 | // Initialize RSV as output |
tkstreet | 6:d4d3bc82d446 | 17 | if (motor->configurePort(TCA9554A::PORT_0, TCA9554A::DIR_OUTPUT)!= TCA9554A::SUCCESS) { |
tkstreet | 6:d4d3bc82d446 | 18 | MSG("#AP1017: Error configuring TCA9554A port.\r\n"); |
tkstreet | 6:d4d3bc82d446 | 19 | } |
tkstreet | 6:d4d3bc82d446 | 20 | motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // Turn motor off |
tkstreet | 0:a0435a630c5d | 21 | } |
tkstreet | 0:a0435a630c5d | 22 | |
tkstreet | 0:a0435a630c5d | 23 | // Default destructor |
tkstreet | 0:a0435a630c5d | 24 | AP1017::~AP1017(void) |
tkstreet | 0:a0435a630c5d | 25 | { |
tkstreet | 3:f8e70f639ed0 | 26 | stop(); |
tkstreet | 6:d4d3bc82d446 | 27 | delete inA, inB, motor, i2cMotor; |
tkstreet | 0:a0435a630c5d | 28 | } |
tkstreet | 0:a0435a630c5d | 29 | |
tkstreet | 0:a0435a630c5d | 30 | /*********************** Member Functions ***********************************/ |
tkstreet | 0:a0435a630c5d | 31 | |
tkstreet | 4:c36159701cde | 32 | AP1017::Status AP1017::setDirection(AP1017::Rotation dir) |
tkstreet | 0:a0435a630c5d | 33 | { |
tkstreet | 3:f8e70f639ed0 | 34 | direction = dir; |
tkstreet | 4:c36159701cde | 35 | |
tkstreet | 3:f8e70f639ed0 | 36 | switch(direction){ |
tkstreet | 4:c36159701cde | 37 | case DIRECTION_CW: // direction = 0x00 |
tkstreet | 4:c36159701cde | 38 | if(isMotorOn()) |
tkstreet | 4:c36159701cde | 39 | { |
tkstreet | 4:c36159701cde | 40 | MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n"); |
tkstreet | 0:a0435a630c5d | 41 | return ERROR_MOTORON; |
tkstreet | 4:c36159701cde | 42 | }else |
tkstreet | 4:c36159701cde | 43 | { |
tkstreet | 4:c36159701cde | 44 | inA->write(1); |
tkstreet | 4:c36159701cde | 45 | inB->write(0); |
tkstreet | 4:c36159701cde | 46 | MSG("#AP1017.cpp: Direction: CCW\r\n"); |
tkstreet | 4:c36159701cde | 47 | } |
tkstreet | 0:a0435a630c5d | 48 | break; |
tkstreet | 4:c36159701cde | 49 | case DIRECTION_CCW: // direction = 0x01 |
tkstreet | 4:c36159701cde | 50 | if(isMotorOn()) |
tkstreet | 4:c36159701cde | 51 | { |
tkstreet | 4:c36159701cde | 52 | MSG("#AP1017.cpp: Error. Cannot change direction while motor is running.\r\n"); |
tkstreet | 0:a0435a630c5d | 53 | return ERROR_MOTORON; |
tkstreet | 4:c36159701cde | 54 | }else |
tkstreet | 4:c36159701cde | 55 | { |
tkstreet | 4:c36159701cde | 56 | inA->write(0); |
tkstreet | 4:c36159701cde | 57 | inB->write(1); |
tkstreet | 4:c36159701cde | 58 | MSG("#AP1017.cpp: Direction: CW\r\n"); |
tkstreet | 4:c36159701cde | 59 | } |
tkstreet | 0:a0435a630c5d | 60 | break; |
tkstreet | 4:c36159701cde | 61 | case DIRECTION_BRAKE: // direction = 0x03 |
tkstreet | 1:4d4c77589134 | 62 | inA->write(1); |
tkstreet | 1:4d4c77589134 | 63 | inB->write(1); |
tkstreet | 4:c36159701cde | 64 | MSG("#AP1017.cpp: Direction: Brake\r\n"); |
tkstreet | 0:a0435a630c5d | 65 | break; |
tkstreet | 4:c36159701cde | 66 | case DIRECTION_COAST: // direction = 0x04 |
tkstreet | 1:4d4c77589134 | 67 | inA->write(0); |
tkstreet | 1:4d4c77589134 | 68 | inB->write(0); |
tkstreet | 0:a0435a630c5d | 69 | motorOn = false; |
tkstreet | 4:c36159701cde | 70 | MSG("#AP1017.cpp: Direction: Coast\r\n"); |
tkstreet | 0:a0435a630c5d | 71 | break; |
tkstreet | 0:a0435a630c5d | 72 | default: |
tkstreet | 0:a0435a630c5d | 73 | return ERROR_DIRECTION; |
tkstreet | 0:a0435a630c5d | 74 | } |
tkstreet | 0:a0435a630c5d | 75 | |
tkstreet | 0:a0435a630c5d | 76 | return SUCCESS; |
tkstreet | 0:a0435a630c5d | 77 | } |
tkstreet | 0:a0435a630c5d | 78 | |
tkstreet | 3:f8e70f639ed0 | 79 | |
tkstreet | 3:f8e70f639ed0 | 80 | AP1017::Rotation AP1017::getDirection(void) |
tkstreet | 0:a0435a630c5d | 81 | { |
tkstreet | 3:f8e70f639ed0 | 82 | return direction; |
tkstreet | 3:f8e70f639ed0 | 83 | } |
tkstreet | 3:f8e70f639ed0 | 84 | |
tkstreet | 0:a0435a630c5d | 85 | |
tkstreet | 3:f8e70f639ed0 | 86 | AP1017::Status AP1017::setSpeed(float dc) |
tkstreet | 3:f8e70f639ed0 | 87 | { |
tkstreet | 9:1ca7d16de1c4 | 88 | if((dc <= 100.0) && (dc >= 0.0)) |
tkstreet | 9:1ca7d16de1c4 | 89 | { |
tkstreet | 3:f8e70f639ed0 | 90 | dutyCycle = dc/100.0; |
tkstreet | 0:a0435a630c5d | 91 | |
tkstreet | 0:a0435a630c5d | 92 | if(motorOn == true){ |
tkstreet | 4:c36159701cde | 93 | MSG("#AP1017.cpp: Changed running motor speed.\r\n"); |
tkstreet | 0:a0435a630c5d | 94 | } |
tkstreet | 0:a0435a630c5d | 95 | } |
tkstreet | 9:1ca7d16de1c4 | 96 | else |
tkstreet | 9:1ca7d16de1c4 | 97 | { |
tkstreet | 0:a0435a630c5d | 98 | dutyCycle = 0.0; |
tkstreet | 0:a0435a630c5d | 99 | |
tkstreet | 0:a0435a630c5d | 100 | return ERROR_DUTY_CYCLE; |
tkstreet | 0:a0435a630c5d | 101 | } |
tkstreet | 0:a0435a630c5d | 102 | |
tkstreet | 0:a0435a630c5d | 103 | return SUCCESS; |
tkstreet | 0:a0435a630c5d | 104 | } |
tkstreet | 0:a0435a630c5d | 105 | |
tkstreet | 0:a0435a630c5d | 106 | |
tkstreet | 3:f8e70f639ed0 | 107 | float AP1017::getSpeed(void) |
tkstreet | 0:a0435a630c5d | 108 | { |
tkstreet | 3:f8e70f639ed0 | 109 | return dutyCycle*100.0; |
tkstreet | 0:a0435a630c5d | 110 | } |
tkstreet | 0:a0435a630c5d | 111 | |
tkstreet | 0:a0435a630c5d | 112 | |
tkstreet | 3:f8e70f639ed0 | 113 | AP1017::Status AP1017::start(void) |
tkstreet | 0:a0435a630c5d | 114 | { |
tkstreet | 6:d4d3bc82d446 | 115 | motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::HIGH); // set RSV high |
tkstreet | 0:a0435a630c5d | 116 | motorOn = true; // Set ON flag |
tkstreet | 0:a0435a630c5d | 117 | |
tkstreet | 0:a0435a630c5d | 118 | return SUCCESS; |
tkstreet | 0:a0435a630c5d | 119 | } |
tkstreet | 0:a0435a630c5d | 120 | |
tkstreet | 0:a0435a630c5d | 121 | |
tkstreet | 3:f8e70f639ed0 | 122 | AP1017::Status AP1017::stop(void) |
tkstreet | 0:a0435a630c5d | 123 | { |
tkstreet | 6:d4d3bc82d446 | 124 | motor->setPortLevel(TCA9554A::PORT_0, TCA9554A::LOW); // set RSV low |
tkstreet | 0:a0435a630c5d | 125 | motorOn = false; // Set OFF flag |
tkstreet | 0:a0435a630c5d | 126 | |
tkstreet | 0:a0435a630c5d | 127 | return SUCCESS; |
tkstreet | 0:a0435a630c5d | 128 | } |
tkstreet | 0:a0435a630c5d | 129 | |
tkstreet | 3:f8e70f639ed0 | 130 | AP1017::Status AP1017::brake(void) |
tkstreet | 0:a0435a630c5d | 131 | { |
tkstreet | 0:a0435a630c5d | 132 | setDirection(DIRECTION_BRAKE); |
tkstreet | 0:a0435a630c5d | 133 | return SUCCESS; |
tkstreet | 0:a0435a630c5d | 134 | } |
tkstreet | 0:a0435a630c5d | 135 | |
tkstreet | 3:f8e70f639ed0 | 136 | AP1017::Status AP1017::coast(void) |
tkstreet | 0:a0435a630c5d | 137 | { |
tkstreet | 0:a0435a630c5d | 138 | setDirection(DIRECTION_COAST); |
tkstreet | 0:a0435a630c5d | 139 | return SUCCESS; |
tkstreet | 4:c36159701cde | 140 | } |
tkstreet | 4:c36159701cde | 141 | |
tkstreet | 4:c36159701cde | 142 | bool AP1017::isMotorOn(void) |
tkstreet | 4:c36159701cde | 143 | { |
tkstreet | 4:c36159701cde | 144 | return motorOn; |
tkstreet | 0:a0435a630c5d | 145 | } |