Programme d'utilisation servomotors MX12 V1

Committer:
R66Y
Date:
Fri May 19 14:32:14 2017 +0000
Revision:
0:80df663dd15e
programme pour utiliser les servomoteurs MX12.

Who changed what in which revision?

UserRevisionLine numberNew contents of line
R66Y 0:80df663dd15e 1 /* mbed Microcontroller Library - can
R66Y 0:80df663dd15e 2 * Copyright (c) 2009-2011 ARM Limited. All rights reserved.
R66Y 0:80df663dd15e 3 */
R66Y 0:80df663dd15e 4
R66Y 0:80df663dd15e 5 #ifndef MBED_CAN_H
R66Y 0:80df663dd15e 6 #define MBED_CAN_H
R66Y 0:80df663dd15e 7
R66Y 0:80df663dd15e 8 #include "device.h"
R66Y 0:80df663dd15e 9
R66Y 0:80df663dd15e 10 #if DEVICE_CAN
R66Y 0:80df663dd15e 11
R66Y 0:80df663dd15e 12 #include "Base.h"
R66Y 0:80df663dd15e 13 #include "platform.h"
R66Y 0:80df663dd15e 14 #include "PinNames.h"
R66Y 0:80df663dd15e 15 #include "PeripheralNames.h"
R66Y 0:80df663dd15e 16
R66Y 0:80df663dd15e 17 #include "can_helper.h"
R66Y 0:80df663dd15e 18 #include "FunctionPointer.h"
R66Y 0:80df663dd15e 19
R66Y 0:80df663dd15e 20 #include <string.h>
R66Y 0:80df663dd15e 21
R66Y 0:80df663dd15e 22 namespace mbed {
R66Y 0:80df663dd15e 23
R66Y 0:80df663dd15e 24 /* Class: CANMessage
R66Y 0:80df663dd15e 25 *
R66Y 0:80df663dd15e 26 */
R66Y 0:80df663dd15e 27 class CANMessage : public CAN_Message {
R66Y 0:80df663dd15e 28
R66Y 0:80df663dd15e 29 public:
R66Y 0:80df663dd15e 30
R66Y 0:80df663dd15e 31 /* Constructor: CANMessage
R66Y 0:80df663dd15e 32 * Creates empty CAN message.
R66Y 0:80df663dd15e 33 */
R66Y 0:80df663dd15e 34 CANMessage() {
R66Y 0:80df663dd15e 35 len = 8;
R66Y 0:80df663dd15e 36 type = CANData;
R66Y 0:80df663dd15e 37 format = CANStandard;
R66Y 0:80df663dd15e 38 id = 0;
R66Y 0:80df663dd15e 39 memset(data, 0, 8);
R66Y 0:80df663dd15e 40 }
R66Y 0:80df663dd15e 41
R66Y 0:80df663dd15e 42 /* Constructor: CANMessage
R66Y 0:80df663dd15e 43 * Creates CAN message with specific content.
R66Y 0:80df663dd15e 44 */
R66Y 0:80df663dd15e 45 CANMessage(int _id, const char *_data, char _len = 8, CANType _type = CANData, CANFormat _format = CANStandard) {
R66Y 0:80df663dd15e 46 len = _len & 0xF;
R66Y 0:80df663dd15e 47 type = _type;
R66Y 0:80df663dd15e 48 format = _format;
R66Y 0:80df663dd15e 49 id = _id;
R66Y 0:80df663dd15e 50 memcpy(data, _data, _len);
R66Y 0:80df663dd15e 51 }
R66Y 0:80df663dd15e 52
R66Y 0:80df663dd15e 53 /* Constructor: CANMessage
R66Y 0:80df663dd15e 54 * Creates CAN remote message.
R66Y 0:80df663dd15e 55 */
R66Y 0:80df663dd15e 56 CANMessage(int _id, CANFormat _format = CANStandard) {
R66Y 0:80df663dd15e 57 len = 0;
R66Y 0:80df663dd15e 58 type = CANRemote;
R66Y 0:80df663dd15e 59 format = _format;
R66Y 0:80df663dd15e 60 id = _id;
R66Y 0:80df663dd15e 61 memset(data, 0, 8);
R66Y 0:80df663dd15e 62 }
R66Y 0:80df663dd15e 63 #if 0 // Inhereted from CAN_Message, for documentation only
R66Y 0:80df663dd15e 64
R66Y 0:80df663dd15e 65 /* Variable: id
R66Y 0:80df663dd15e 66 * The message id.
R66Y 0:80df663dd15e 67 *
R66Y 0:80df663dd15e 68 * If format is CANStandard it must be an 11 bit long id
R66Y 0:80df663dd15e 69 * If format is CANExtended it must be an 29 bit long id
R66Y 0:80df663dd15e 70 */
R66Y 0:80df663dd15e 71 unsigned int id;
R66Y 0:80df663dd15e 72
R66Y 0:80df663dd15e 73 /* Variable: data
R66Y 0:80df663dd15e 74 * Space for 8 byte payload.
R66Y 0:80df663dd15e 75 *
R66Y 0:80df663dd15e 76 * If type is CANData data can store up to 8 byte data.
R66Y 0:80df663dd15e 77 */
R66Y 0:80df663dd15e 78 unsigned char data[8];
R66Y 0:80df663dd15e 79
R66Y 0:80df663dd15e 80 /* Variable: len
R66Y 0:80df663dd15e 81 * Length of data in bytes.
R66Y 0:80df663dd15e 82 *
R66Y 0:80df663dd15e 83 * If type is CANData data can store up to 8 byte data.
R66Y 0:80df663dd15e 84 */
R66Y 0:80df663dd15e 85 unsigned char len;
R66Y 0:80df663dd15e 86
R66Y 0:80df663dd15e 87 /* Variable: format
R66Y 0:80df663dd15e 88 * Defines if the message has standard or extended format.
R66Y 0:80df663dd15e 89 *
R66Y 0:80df663dd15e 90 * Defines the type of message id:
R66Y 0:80df663dd15e 91 * Default is CANStandard which implies 11 bit id.
R66Y 0:80df663dd15e 92 * CANExtended means 29 bit message id.
R66Y 0:80df663dd15e 93 */
R66Y 0:80df663dd15e 94 CANFormat format;
R66Y 0:80df663dd15e 95
R66Y 0:80df663dd15e 96 /* Variable: type
R66Y 0:80df663dd15e 97 * Defines the type of a message.
R66Y 0:80df663dd15e 98 *
R66Y 0:80df663dd15e 99 * The message type can rather be CANData for a message with data (default).
R66Y 0:80df663dd15e 100 * Or CANRemote for a request of a specific CAN message.
R66Y 0:80df663dd15e 101 */
R66Y 0:80df663dd15e 102 CANType type; // 0 - DATA FRAME, 1 - REMOTE FRAME
R66Y 0:80df663dd15e 103 #endif
R66Y 0:80df663dd15e 104 };
R66Y 0:80df663dd15e 105
R66Y 0:80df663dd15e 106 /* Class: CAN
R66Y 0:80df663dd15e 107 * A can bus client, used for communicating with can devices
R66Y 0:80df663dd15e 108 */
R66Y 0:80df663dd15e 109 class CAN : public Base {
R66Y 0:80df663dd15e 110
R66Y 0:80df663dd15e 111 public:
R66Y 0:80df663dd15e 112
R66Y 0:80df663dd15e 113 /* Constructor: CAN
R66Y 0:80df663dd15e 114 * Creates an CAN interface connected to specific pins.
R66Y 0:80df663dd15e 115 *
R66Y 0:80df663dd15e 116 * Example:
R66Y 0:80df663dd15e 117 * > #include "mbed.h"
R66Y 0:80df663dd15e 118 * >
R66Y 0:80df663dd15e 119 * > Ticker ticker;
R66Y 0:80df663dd15e 120 * > DigitalOut led1(LED1);
R66Y 0:80df663dd15e 121 * > DigitalOut led2(LED2);
R66Y 0:80df663dd15e 122 * > CAN can1(p9, p10);
R66Y 0:80df663dd15e 123 * > CAN can2(p30, p29);
R66Y 0:80df663dd15e 124 * >
R66Y 0:80df663dd15e 125 * > char counter = 0;
R66Y 0:80df663dd15e 126 * >
R66Y 0:80df663dd15e 127 * > void send() {
R66Y 0:80df663dd15e 128 * > if(can1.write(CANMessage(1337, &counter, 1))) {
R66Y 0:80df663dd15e 129 * > printf("Message sent: %d\n", counter);
R66Y 0:80df663dd15e 130 * > counter++;
R66Y 0:80df663dd15e 131 * > }
R66Y 0:80df663dd15e 132 * > led1 = !led1;
R66Y 0:80df663dd15e 133 * > }
R66Y 0:80df663dd15e 134 * >
R66Y 0:80df663dd15e 135 * > int main() {
R66Y 0:80df663dd15e 136 * > ticker.attach(&send, 1);
R66Y 0:80df663dd15e 137 * > CANMessage msg;
R66Y 0:80df663dd15e 138 * > while(1) {
R66Y 0:80df663dd15e 139 * > if(can2.read(msg)) {
R66Y 0:80df663dd15e 140 * > printf("Message received: %d\n\n", msg.data[0]);
R66Y 0:80df663dd15e 141 * > led2 = !led2;
R66Y 0:80df663dd15e 142 * > }
R66Y 0:80df663dd15e 143 * > wait(0.2);
R66Y 0:80df663dd15e 144 * > }
R66Y 0:80df663dd15e 145 * > }
R66Y 0:80df663dd15e 146 *
R66Y 0:80df663dd15e 147 * Variables:
R66Y 0:80df663dd15e 148 * rd - read from transmitter
R66Y 0:80df663dd15e 149 * td - transmit to transmitter
R66Y 0:80df663dd15e 150 */
R66Y 0:80df663dd15e 151 CAN(PinName rd, PinName td);
R66Y 0:80df663dd15e 152 virtual ~CAN();
R66Y 0:80df663dd15e 153
R66Y 0:80df663dd15e 154 /* Function: frequency
R66Y 0:80df663dd15e 155 * Set the frequency of the CAN interface
R66Y 0:80df663dd15e 156 *
R66Y 0:80df663dd15e 157 * Variables:
R66Y 0:80df663dd15e 158 * hz - The bus frequency in hertz
R66Y 0:80df663dd15e 159 * returns - 1 if successful, 0 otherwise
R66Y 0:80df663dd15e 160 */
R66Y 0:80df663dd15e 161 int frequency(int hz);
R66Y 0:80df663dd15e 162
R66Y 0:80df663dd15e 163 /* Function: write
R66Y 0:80df663dd15e 164 * Write a CANMessage to the bus.
R66Y 0:80df663dd15e 165 *
R66Y 0:80df663dd15e 166 * Variables:
R66Y 0:80df663dd15e 167 * msg - The CANMessage to write.
R66Y 0:80df663dd15e 168 *
R66Y 0:80df663dd15e 169 * Returns:
R66Y 0:80df663dd15e 170 * 0 - If write failed.
R66Y 0:80df663dd15e 171 * 1 - If write was successful.
R66Y 0:80df663dd15e 172 */
R66Y 0:80df663dd15e 173 int write(CANMessage msg);
R66Y 0:80df663dd15e 174
R66Y 0:80df663dd15e 175 /* Function: read
R66Y 0:80df663dd15e 176 * Read a CANMessage from the bus.
R66Y 0:80df663dd15e 177 *
R66Y 0:80df663dd15e 178 * Variables:
R66Y 0:80df663dd15e 179 * msg - A CANMessage to read to.
R66Y 0:80df663dd15e 180 *
R66Y 0:80df663dd15e 181 * Returns:
R66Y 0:80df663dd15e 182 * 0 - If no message arrived.
R66Y 0:80df663dd15e 183 * 1 - If message arrived.
R66Y 0:80df663dd15e 184 */
R66Y 0:80df663dd15e 185 int read(CANMessage &msg);
R66Y 0:80df663dd15e 186
R66Y 0:80df663dd15e 187 /* Function: reset
R66Y 0:80df663dd15e 188 * Reset CAN interface.
R66Y 0:80df663dd15e 189 *
R66Y 0:80df663dd15e 190 * To use after error overflow.
R66Y 0:80df663dd15e 191 */
R66Y 0:80df663dd15e 192 void reset();
R66Y 0:80df663dd15e 193
R66Y 0:80df663dd15e 194 /* Function: monitor
R66Y 0:80df663dd15e 195 * Puts or removes the CAN interface into silent monitoring mode
R66Y 0:80df663dd15e 196 *
R66Y 0:80df663dd15e 197 * Variables:
R66Y 0:80df663dd15e 198 * silent - boolean indicating whether to go into silent mode or not
R66Y 0:80df663dd15e 199 */
R66Y 0:80df663dd15e 200 void monitor(bool silent);
R66Y 0:80df663dd15e 201
R66Y 0:80df663dd15e 202 /* Function: rderror
R66Y 0:80df663dd15e 203 * Returns number of read errors to detect read overflow errors.
R66Y 0:80df663dd15e 204 */
R66Y 0:80df663dd15e 205 unsigned char rderror();
R66Y 0:80df663dd15e 206
R66Y 0:80df663dd15e 207 /* Function: tderror
R66Y 0:80df663dd15e 208 * Returns number of write errors to detect write overflow errors.
R66Y 0:80df663dd15e 209 */
R66Y 0:80df663dd15e 210 unsigned char tderror();
R66Y 0:80df663dd15e 211
R66Y 0:80df663dd15e 212 /* Function: attach
R66Y 0:80df663dd15e 213 * Attach a function to call whenever a CAN frame received interrupt is
R66Y 0:80df663dd15e 214 * generated.
R66Y 0:80df663dd15e 215 *
R66Y 0:80df663dd15e 216 * Variables:
R66Y 0:80df663dd15e 217 * fptr - A pointer to a void function, or 0 to set as none
R66Y 0:80df663dd15e 218 */
R66Y 0:80df663dd15e 219 void attach(void (*fptr)(void));
R66Y 0:80df663dd15e 220
R66Y 0:80df663dd15e 221 /* Function attach
R66Y 0:80df663dd15e 222 * Attach a member function to call whenever a CAN frame received interrupt
R66Y 0:80df663dd15e 223 * is generated.
R66Y 0:80df663dd15e 224 *
R66Y 0:80df663dd15e 225 * Variables:
R66Y 0:80df663dd15e 226 * tptr - pointer to the object to call the member function on
R66Y 0:80df663dd15e 227 * mptr - pointer to the member function to be called
R66Y 0:80df663dd15e 228 */
R66Y 0:80df663dd15e 229 template<typename T>
R66Y 0:80df663dd15e 230 void attach(T* tptr, void (T::*mptr)(void)) {
R66Y 0:80df663dd15e 231 if((mptr != NULL) && (tptr != NULL)) {
R66Y 0:80df663dd15e 232 _rxirq.attach(tptr, mptr);
R66Y 0:80df663dd15e 233 setup_interrupt();
R66Y 0:80df663dd15e 234 } else {
R66Y 0:80df663dd15e 235 remove_interrupt();
R66Y 0:80df663dd15e 236 }
R66Y 0:80df663dd15e 237 }
R66Y 0:80df663dd15e 238
R66Y 0:80df663dd15e 239 private:
R66Y 0:80df663dd15e 240
R66Y 0:80df663dd15e 241 CANName _id;
R66Y 0:80df663dd15e 242 FunctionPointer _rxirq;
R66Y 0:80df663dd15e 243
R66Y 0:80df663dd15e 244 void setup_interrupt(void);
R66Y 0:80df663dd15e 245 void remove_interrupt(void);
R66Y 0:80df663dd15e 246 };
R66Y 0:80df663dd15e 247
R66Y 0:80df663dd15e 248 } // namespace mbed
R66Y 0:80df663dd15e 249
R66Y 0:80df663dd15e 250 #endif // MBED_CAN_H
R66Y 0:80df663dd15e 251
R66Y 0:80df663dd15e 252 #endif