No hace mucho tiempo, me preocupaba la cuesti贸n de c贸mo hacer un accionamiento para sistemas CNC en un motor colector, e incluso con retroalimentaci贸n, y eso funcionar铆a en Modbus RTU.
Ten铆a a mi disposici贸n, Arduino UNO, Conductor para L298N, un motor colector de una unidad de asiento de autom贸vil AEG para 12V, interruptor de fotos de 2 espacios.
Desde el principio, sol茅 una bufanda con 2 interruptores fotogr谩ficos, de acuerdo con este esquema.

En forma terminada, todo se ve as铆:

La esencia de esta cosa fea: una cerilla cruza el primer interruptor desde el principio, luego el segundo, para que el microcontrolador entienda en qu茅 direcci贸n gira el motor.
Todas las conexiones se ven as铆:
d2 es el primer fotointerruptor;
d3 es el segundo fotointerruptor;
d5 - Salida PWM para rotaci贸n hacia la izquierda;
d6 - Salida PWM para rotaci贸n hacia la derecha;
Todo estaba conectado y me sent茅 a escribir c贸digo, al final de mi tormento dio a luz lo siguiente:
#include <ModbusRtu.h> #define ID 1 // , , TX Modbus slave(ID, 0, 0); int8_t state = 0; // uint16_t au16data[11];// modbus #include <PID_v1.h> // double Setpoint1, Input1, Output1; double Setpoint2, Input2, Output2; double Kp = 1, Ki = 2.5, Kd = 0.5; PID myPID1(&Input1, &Output1, &Setpoint1, Kp, Ki, Kd, DIRECT); //1- PID myPID2(&Input2, &Output2, &Setpoint2, Kp, Ki, Kd, REVERSE); //2- int LeftPWM = 5; // int RightPWM = 6; // volatile byte EncA, EncB = 0; // volatile int Position = 0; // int SetPosition = 0; // void setup() { slave.begin(9600); pinMode (LeftPWM, OUTPUT); pinMode (RightPWM, OUTPUT); attachInterrupt(0, ChangePosition1, FALLING); // 0-(pin2) ChangePosition1() attachInterrupt(1, ChangePosition2, FALLING); // 1-(pin3) ChangePosition2() Setpoint1 = 0; Setpoint2 = 0; digitalWrite (LeftPWM, LOW); digitalWrite (RightPWM, LOW); } // 0 void ChangePosition1() // ! { EncA = 1; if (EncA == 1 && EncB == 1) { EncA = 0; EncB = 0; Position++; } } // 1 void ChangePosition2() { EncB = 1; if (EncA == 1 && EncB == 1) { EncA = 0; EncB = 0; Position--; } } void loop() { // ModBus // state = slave.poll(au16data, 11); // au16data[2] = Position;// // SetPosition = au16data[3];// // au16data[8] = slave.getInCnt(); // au16data[9] = slave.getOutCnt(); // au16data[10] = slave.getErrCnt();// if (SetPosition == Position) // { myPID1.SetMode(MANUAL); myPID2.SetMode(MANUAL); Output1 = 0; Output2 = 0; digitalWrite (LeftPWM, LOW); digitalWrite (RightPWM, LOW); } if (SetPosition < Position) { myPID2.SetMode(AUTOMATIC); Setpoint2 = SetPosition; Input2 = Position; myPID2.Compute(); analogWrite (LeftPWM, Output2); digitalWrite (RightPWM, LOW); } if (SetPosition > Position) { myPID1.SetMode(AUTOMATIC); Setpoint1 = SetPosition; Input1 = Position; myPID1.Compute(); analogWrite (RightPWM, Output1); digitalWrite (LeftPWM, LOW); } }
Y ahora es parte por parte en la computadora. SinplLight SCADA fue elegido por los chicos para que todo se moviera gratis. Entonces, as铆 es como se ve la configuraci贸n en el scud.



La interfaz se hizo as铆:

Como resultado, conseguimos que el motor est茅 subordinado al control deslizante en el scud, acelera y frena el motor suavemente, si desplaza manualmente el ancla del motor, no permite que esto se haga, y regresa. Gracias por su atencion Y aqu铆 hay una visi贸n general del desastre.
