Clase Motor. Se usa para crear objetos del tipo motor, que pueden ser continuos o PAP. se especifica los pines a los cuales estara conectado cada Motor. Se puede controlar la velocidad con encoders, encontrar la posición inicial. Se debe especificar la cantidad de pasos y se podrá girar por ángulos.
Motor.cpp@0:87460b90b143, 2021-09-03 (annotated)
- Committer:
- CCastrop1012
- Date:
- Fri Sep 03 05:02:09 2021 +0000
- Revision:
- 0:87460b90b143
Clase Motor. Se usa para crear objetos del tipo motor, que pueden ser continuos o PAP. se especifica los pines a los cuales estara conectado cada Motor. Se puede controlar la velocidad con encoders, encontrar la posicion inicial. ;
Who changed what in which revision?
User | Revision | Line number | New contents of line |
---|---|---|---|
CCastrop1012 | 0:87460b90b143 | 1 | #include "mbed.h" |
CCastrop1012 | 0:87460b90b143 | 2 | #include "Motor.h" |
CCastrop1012 | 0:87460b90b143 | 3 | #include "Ticker.h" |
CCastrop1012 | 0:87460b90b143 | 4 | |
CCastrop1012 | 0:87460b90b143 | 5 | #define Pi 3.14159265 |
CCastrop1012 | 0:87460b90b143 | 6 | #define Horario 1 |
CCastrop1012 | 0:87460b90b143 | 7 | #define AntiHorario 0 |
CCastrop1012 | 0:87460b90b143 | 8 | |
CCastrop1012 | 0:87460b90b143 | 9 | ///************ MOTOR CONTINUO ********************************// |
CCastrop1012 | 0:87460b90b143 | 10 | MotorContinuo::MotorContinuo()// speedPin(_speedPin) |
CCastrop1012 | 0:87460b90b143 | 11 | { |
CCastrop1012 | 0:87460b90b143 | 12 | |
CCastrop1012 | 0:87460b90b143 | 13 | |
CCastrop1012 | 0:87460b90b143 | 14 | }; |
CCastrop1012 | 0:87460b90b143 | 15 | MotorContinuo::MotorContinuo(int q)// speedPin(_speedPin) |
CCastrop1012 | 0:87460b90b143 | 16 | { |
CCastrop1012 | 0:87460b90b143 | 17 | |
CCastrop1012 | 0:87460b90b143 | 18 | |
CCastrop1012 | 0:87460b90b143 | 19 | }; |
CCastrop1012 | 0:87460b90b143 | 20 | |
CCastrop1012 | 0:87460b90b143 | 21 | /// CONSTRUCTOR |
CCastrop1012 | 0:87460b90b143 | 22 | |
CCastrop1012 | 0:87460b90b143 | 23 | /* |
CCastrop1012 | 0:87460b90b143 | 24 | MotorContinuo::MotorContinuo(PinName _L1, PinName _L2, PinName _speedPin, PinName _encodin, PinName _PosInicial, int _EncodPulses) : |
CCastrop1012 | 0:87460b90b143 | 25 | L1(_L1), L2(_L2), speedPin(_speedPin), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses) |
CCastrop1012 | 0:87460b90b143 | 26 | { |
CCastrop1012 | 0:87460b90b143 | 27 | speedPin.period_ms(2); |
CCastrop1012 | 0:87460b90b143 | 28 | speedPin.write(0); |
CCastrop1012 | 0:87460b90b143 | 29 | |
CCastrop1012 | 0:87460b90b143 | 30 | }; |
CCastrop1012 | 0:87460b90b143 | 31 | |
CCastrop1012 | 0:87460b90b143 | 32 | |
CCastrop1012 | 0:87460b90b143 | 33 | |
CCastrop1012 | 0:87460b90b143 | 34 | |
CCastrop1012 | 0:87460b90b143 | 35 | |
CCastrop1012 | 0:87460b90b143 | 36 | void MotorContinuo::Forward() { L1=1; L2=0;} |
CCastrop1012 | 0:87460b90b143 | 37 | void MotorContinuo::Back() { L1=0; L2=1;} |
CCastrop1012 | 0:87460b90b143 | 38 | void MotorContinuo::Stop() { L1=0; L2=0;} |
CCastrop1012 | 0:87460b90b143 | 39 | void MotorContinuo::StopT() { L1=1; L2=1;} |
CCastrop1012 | 0:87460b90b143 | 40 | void MotorContinuo::SpeedDuty(int v) { speedPin.write(float(v/100.0));} |
CCastrop1012 | 0:87460b90b143 | 41 | void MotorContinuo::SpinLength_ms(float t) { t++;}// Duración del giro en ms |
CCastrop1012 | 0:87460b90b143 | 42 | void MotorContinuo::SpinLength(float t) { t++;}; |
CCastrop1012 | 0:87460b90b143 | 43 | |
CCastrop1012 | 0:87460b90b143 | 44 | /* |
CCastrop1012 | 0:87460b90b143 | 45 | |
CCastrop1012 | 0:87460b90b143 | 46 | ///************ MOTOR DISCRETO ******************************** // |
CCastrop1012 | 0:87460b90b143 | 47 | |
CCastrop1012 | 0:87460b90b143 | 48 | /// CONSTRUCTOR |
CCastrop1012 | 0:87460b90b143 | 49 | MotorDiscreto::MotorDiscreto(PinName _Dir, PinName _Step, int _NPasos, PinName _encodin, PinName _PosInicial, int _EncodPulses) : |
CCastrop1012 | 0:87460b90b143 | 50 | Dir(_Dir), Step(_Step), NPasos(_NPasos), encodin(_encodin), PosInicial(_PosInicial), EncodPulses(_EncodPulses) |
CCastrop1012 | 0:87460b90b143 | 51 | { |
CCastrop1012 | 0:87460b90b143 | 52 | }; |
CCastrop1012 | 0:87460b90b143 | 53 | |
CCastrop1012 | 0:87460b90b143 | 54 | |
CCastrop1012 | 0:87460b90b143 | 55 | // ************* METODOS ***************** /// |
CCastrop1012 | 0:87460b90b143 | 56 | |
CCastrop1012 | 0:87460b90b143 | 57 | void MotorDiscreto::moveMotor(void) |
CCastrop1012 | 0:87460b90b143 | 58 | { |
CCastrop1012 | 0:87460b90b143 | 59 | if (StepOnHold != 0 && _moveMotorStopped == false) |
CCastrop1012 | 0:87460b90b143 | 60 | { |
CCastrop1012 | 0:87460b90b143 | 61 | Step = !Step; // Se hace elcambio de estado en el pin Step |
CCastrop1012 | 0:87460b90b143 | 62 | entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas |
CCastrop1012 | 0:87460b90b143 | 63 | // 1ra entrada: tiempo en Bajo |
CCastrop1012 | 0:87460b90b143 | 64 | // 2da entrada: tiempo en Alto |
CCastrop1012 | 0:87460b90b143 | 65 | // Es decir cuando Step cumple un periodo. |
CCastrop1012 | 0:87460b90b143 | 66 | if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso |
CCastrop1012 | 0:87460b90b143 | 67 | { |
CCastrop1012 | 0:87460b90b143 | 68 | StepOnHold--; // Se elimina 1 paso de los pendientes |
CCastrop1012 | 0:87460b90b143 | 69 | entradas = 0; |
CCastrop1012 | 0:87460b90b143 | 70 | } |
CCastrop1012 | 0:87460b90b143 | 71 | |
CCastrop1012 | 0:87460b90b143 | 72 | Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion |
CCastrop1012 | 0:87460b90b143 | 73 | |
CCastrop1012 | 0:87460b90b143 | 74 | } |
CCastrop1012 | 0:87460b90b143 | 75 | else if (StepOnHold == 0 || _moveMotorStopped == true) // si no hay mas pasos pendientes |
CCastrop1012 | 0:87460b90b143 | 76 | { |
CCastrop1012 | 0:87460b90b143 | 77 | Move.detach(); // desabilita la interrupcion |
CCastrop1012 | 0:87460b90b143 | 78 | entradas = 0; |
CCastrop1012 | 0:87460b90b143 | 79 | } |
CCastrop1012 | 0:87460b90b143 | 80 | } |
CCastrop1012 | 0:87460b90b143 | 81 | |
CCastrop1012 | 0:87460b90b143 | 82 | |
CCastrop1012 | 0:87460b90b143 | 83 | void MotorDiscreto::Forward() { Dir=1;} |
CCastrop1012 | 0:87460b90b143 | 84 | void MotorDiscreto::Back() { Dir=0;} |
CCastrop1012 | 0:87460b90b143 | 85 | void MotorDiscreto::Stop() { EnablePin = 0; _moveMotorStopped = true;} |
CCastrop1012 | 0:87460b90b143 | 86 | void MotorDiscreto::StopT() { Move.detach(); _moveMotorStopped = true;} |
CCastrop1012 | 0:87460b90b143 | 87 | void MotorDiscreto::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));} |
CCastrop1012 | 0:87460b90b143 | 88 | void MotorDiscreto::RunStep(long n) { StepOnHold = n; Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; }// Duración del giro en ms |
CCastrop1012 | 0:87460b90b143 | 89 | void MotorDiscreto::Run(float t) { StepOnHold = long(t/TStep); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; } |
CCastrop1012 | 0:87460b90b143 | 90 | void MotorDiscreto::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&MotorDiscreto::moveMotor), (TStep/2) ); _moveMotorStopped = false; } |
CCastrop1012 | 0:87460b90b143 | 91 | long MotorDiscreto::getStepOnHold(void){return StepOnHold; } |
CCastrop1012 | 0:87460b90b143 | 92 | |
CCastrop1012 | 0:87460b90b143 | 93 | void Ustep(int resolucion, DigitalOut* _M0, DigitalOut* _M1, DigitalOut* _M2) |
CCastrop1012 | 0:87460b90b143 | 94 | { |
CCastrop1012 | 0:87460b90b143 | 95 | |
CCastrop1012 | 0:87460b90b143 | 96 | switch(resolucion) |
CCastrop1012 | 0:87460b90b143 | 97 | { |
CCastrop1012 | 0:87460b90b143 | 98 | case 1: *_M0 = 0; *_M1 = 0; *_M2 = 0; |
CCastrop1012 | 0:87460b90b143 | 99 | break; |
CCastrop1012 | 0:87460b90b143 | 100 | case 2: *_M0 = 1; *_M1 = 0; *_M2 = 0; |
CCastrop1012 | 0:87460b90b143 | 101 | break; |
CCastrop1012 | 0:87460b90b143 | 102 | case 4: *_M0 = 0; *_M1 = 1; *_M2 = 0; |
CCastrop1012 | 0:87460b90b143 | 103 | break; |
CCastrop1012 | 0:87460b90b143 | 104 | case 8: *_M0 = 1; *_M1 = 1; *_M2 = 1; |
CCastrop1012 | 0:87460b90b143 | 105 | break; |
CCastrop1012 | 0:87460b90b143 | 106 | case 16: *_M0 = 0; *_M1 = 0; *_M2 = 1; |
CCastrop1012 | 0:87460b90b143 | 107 | break; |
CCastrop1012 | 0:87460b90b143 | 108 | case 32: *_M0 = 1; *_M1 = 0; *_M2 = 1; |
CCastrop1012 | 0:87460b90b143 | 109 | break; |
CCastrop1012 | 0:87460b90b143 | 110 | |
CCastrop1012 | 0:87460b90b143 | 111 | default: *_M0 = 0; *_M1 = 0; *_M2 = 0; |
CCastrop1012 | 0:87460b90b143 | 112 | |
CCastrop1012 | 0:87460b90b143 | 113 | |
CCastrop1012 | 0:87460b90b143 | 114 | } |
CCastrop1012 | 0:87460b90b143 | 115 | |
CCastrop1012 | 0:87460b90b143 | 116 | |
CCastrop1012 | 0:87460b90b143 | 117 | } |
CCastrop1012 | 0:87460b90b143 | 118 | |
CCastrop1012 | 0:87460b90b143 | 119 | |
CCastrop1012 | 0:87460b90b143 | 120 | ///************ TRACCIONDISCRETA ******************************** // |
CCastrop1012 | 0:87460b90b143 | 121 | |
CCastrop1012 | 0:87460b90b143 | 122 | |
CCastrop1012 | 0:87460b90b143 | 123 | /// ***************** CONSTRUCTOR ********************** /// |
CCastrop1012 | 0:87460b90b143 | 124 | TraccionD::TraccionD(PinName _StepMI, PinName _DirMI, PinName _StepMD, PinName _DirMD, int _NPasos, float _r, float _L ): |
CCastrop1012 | 0:87460b90b143 | 125 | StepMI(_StepMI), DirMI(_DirMI), StepMD(_StepMD), DirMD(_DirMD), NPasos(_NPasos), r(_r), L(_L) |
CCastrop1012 | 0:87460b90b143 | 126 | { |
CCastrop1012 | 0:87460b90b143 | 127 | // 1. se halla la Relacion(Rl) de distacia entre los dos Radios(r y L) |
CCastrop1012 | 0:87460b90b143 | 128 | Rl = (L / r); |
CCastrop1012 | 0:87460b90b143 | 129 | |
CCastrop1012 | 0:87460b90b143 | 130 | }; |
CCastrop1012 | 0:87460b90b143 | 131 | |
CCastrop1012 | 0:87460b90b143 | 132 | // ************* METODOS ***************** /// |
CCastrop1012 | 0:87460b90b143 | 133 | |
CCastrop1012 | 0:87460b90b143 | 134 | void TraccionD::moveMotor(void) |
CCastrop1012 | 0:87460b90b143 | 135 | { |
CCastrop1012 | 0:87460b90b143 | 136 | if (StepOnHold != 0) |
CCastrop1012 | 0:87460b90b143 | 137 | { |
CCastrop1012 | 0:87460b90b143 | 138 | |
CCastrop1012 | 0:87460b90b143 | 139 | |
CCastrop1012 | 0:87460b90b143 | 140 | StepMI = !StepMI; // Se hace elcambio de estado en el pin Step para ambos motores |
CCastrop1012 | 0:87460b90b143 | 141 | StepMD = StepMD; |
CCastrop1012 | 0:87460b90b143 | 142 | |
CCastrop1012 | 0:87460b90b143 | 143 | entradas++; // se registra cada paso efectivo el cual es valido cada 2 entradas |
CCastrop1012 | 0:87460b90b143 | 144 | // 1ra entrada: tiempo en Bajo |
CCastrop1012 | 0:87460b90b143 | 145 | // 2da entrada: tiempo en Alto |
CCastrop1012 | 0:87460b90b143 | 146 | // Es decir cuando Step cumple un periodo. |
CCastrop1012 | 0:87460b90b143 | 147 | if (entradas >= 2) // cuando se registran 2 entradas se disminuye un paso |
CCastrop1012 | 0:87460b90b143 | 148 | { |
CCastrop1012 | 0:87460b90b143 | 149 | StepOnHold--; // Se elimina 1 paso de los pendientes |
CCastrop1012 | 0:87460b90b143 | 150 | entradas = 0; |
CCastrop1012 | 0:87460b90b143 | 151 | } |
CCastrop1012 | 0:87460b90b143 | 152 | |
CCastrop1012 | 0:87460b90b143 | 153 | Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); // Reiniciamos el tiempo de imterrupcion |
CCastrop1012 | 0:87460b90b143 | 154 | |
CCastrop1012 | 0:87460b90b143 | 155 | } |
CCastrop1012 | 0:87460b90b143 | 156 | else if (StepOnHold == 0) // si no hay mas pasos para dar se deshabilita las interrupciones. |
CCastrop1012 | 0:87460b90b143 | 157 | { |
CCastrop1012 | 0:87460b90b143 | 158 | Move.detach(); |
CCastrop1012 | 0:87460b90b143 | 159 | } |
CCastrop1012 | 0:87460b90b143 | 160 | } |
CCastrop1012 | 0:87460b90b143 | 161 | |
CCastrop1012 | 0:87460b90b143 | 162 | |
CCastrop1012 | 0:87460b90b143 | 163 | void TraccionD::Forward() { DirMI=1; DirMD=1;} // Configua de giro de ambos motores el el mismo sentido para avanzar hacia adelante |
CCastrop1012 | 0:87460b90b143 | 164 | void TraccionD::Back() { DirMI=0; DirMD=0;} // Configua el sentido giro en ambos motores contrario al de Forward(), para avanzar hacia atras |
CCastrop1012 | 0:87460b90b143 | 165 | void TraccionD::Left() { DirMI=0; DirMD=1;} // Configura el sentido de giro de ambos motores de manera contraria para girar hacia la izquierda |
CCastrop1012 | 0:87460b90b143 | 166 | void TraccionD::Right() { DirMI=1; DirMD=0;} // Configura el sentido de giro de ambos motores de manera contraria e inverso al de Left() para girar hacia la derecha |
CCastrop1012 | 0:87460b90b143 | 167 | void TraccionD::Stop() { EnablePinM1 = 0; EnablePinM2 = 0;} |
CCastrop1012 | 0:87460b90b143 | 168 | void TraccionD::StopT() { Move.detach();} |
CCastrop1012 | 0:87460b90b143 | 169 | void TraccionD::StepFreq(long n) { StepsBySecond = n; TStep = (1/float(n));} |
CCastrop1012 | 0:87460b90b143 | 170 | void TraccionD::RunStep(long n){ StepOnHold = n; Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); }// Duración del giro en ms |
CCastrop1012 | 0:87460b90b143 | 171 | void TraccionD::Run(float t) { StepOnHold = long(t/TStep); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); } |
CCastrop1012 | 0:87460b90b143 | 172 | void TraccionD::RunRound(int n) { StepOnHold = (NPasos * n); Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); } |
CCastrop1012 | 0:87460b90b143 | 173 | long TraccionD::getStepOnHold(void){return StepOnHold; } |
CCastrop1012 | 0:87460b90b143 | 174 | |
CCastrop1012 | 0:87460b90b143 | 175 | void TraccionD::Giro(long grados, bool sentido) |
CCastrop1012 | 0:87460b90b143 | 176 | { |
CCastrop1012 | 0:87460b90b143 | 177 | |
CCastrop1012 | 0:87460b90b143 | 178 | StepOnHold = grados * int(Rl * NPasos); |
CCastrop1012 | 0:87460b90b143 | 179 | StepOnHold /= 360; |
CCastrop1012 | 0:87460b90b143 | 180 | Move.attach(callback(this,&TraccionD::moveMotor), (TStep/2) ); |
CCastrop1012 | 0:87460b90b143 | 181 | |
CCastrop1012 | 0:87460b90b143 | 182 | } |
CCastrop1012 | 0:87460b90b143 | 183 | |
CCastrop1012 | 0:87460b90b143 | 184 | */ |
CCastrop1012 | 0:87460b90b143 | 185 | |
CCastrop1012 | 0:87460b90b143 | 186 | |
CCastrop1012 | 0:87460b90b143 | 187 | |
CCastrop1012 | 0:87460b90b143 | 188 | |
CCastrop1012 | 0:87460b90b143 | 189 | |
CCastrop1012 | 0:87460b90b143 | 190 | |
CCastrop1012 | 0:87460b90b143 | 191 | |
CCastrop1012 | 0:87460b90b143 | 192 | |
CCastrop1012 | 0:87460b90b143 | 193 | |
CCastrop1012 | 0:87460b90b143 | 194 |