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