Hola, Estoy tratando de hacer un código cnc para arduino due, espero y pueda aportar información y me puedan aportar para terminar mi proyecto
primeramente ocupa saber el tiempo del scan para poder calcular la aceleración y desaceleración
void loop()
{
Timer = micros();
Timer_Scan = micros() - Timer;
}
con esta parte ya tenia el tiempo del scan, mas sin embargo si el tiempo del scan era variable tenia que hacer calculo para cada scan, por lo que decidí tener un tiempo fijo de scan
void loop()
{
Timer = micros();
esperar:
Timer_Scan = micros() - Timer;
if (Timer_Scan < 10)goto esperar;
}
Ya de esta forma tengo un tiempo de scan fijo o muy cercano uno del otro 10 u 11 useg, ahora ocupo leer la informacion que viene del puerto serial
void loop()
{
Timer = micros();
Leer_Datos_Serial();
esperar:
Timer_Scan = micros() - Timer;
if (Timer_Scan < 10)goto esperar;
}
void Leer_Datos_Serial()
{
if (Serial.available() > 0)
{
char inChar = SerialUSB.read();
inBuffer[Serial_cont++] = inChar;
if (inChar == '\n')
{
inBuffer[Serial_cont++] = 0;
copy(inBuffer, outBuffer, Serial_cont);
Dato_Serial = true;
Tam_Dato = Serial_cont;
Serial_cont = 0;
}
}
}
De esta forma si hay datos serie presentes leo un byte por scan para poder hacer otras actividades sin tener que ciclarme leyendo todo el puerto, cuando termine de leer el puerto, copio a outBuffer el dato recibido, activo una bandera (Dato_Serial) y habilito el puerto serie para leer otro dato si estuviera presente o en el momento de estar procesando el dato recibido, hora ocupo procesar el recibido, el dato no lo puedo procesar en un scan ya que dependiendo el tamaño puede llegar hasta 900 useg, por lo cual lo tengo que dividir en partes
void loop()
{
Timer = micros();
Leer_Datos_Serial();
if (Dato_Serial)
{
Procesar_Dato();
Dato_Serial=0;
}
esperar:
Timer_Scan = micros() - Timer;
if (Timer_Scan < 10)goto esperar;
}
En la función Procesar_Dato realizo lo mismo qeu los programas normales arduino pero lo divido en pasos, en el primer scan leo si el dato recibido es un comando G, un comando M o es algún otro dato, en ese caso termino el proceso, en el segundo scan, si es comando M leo el valor de M y termino el proceso, si es G leo el valor de G, en el tercer scan pregunto si tiene valor X y leo el valor, en el cuarto leo Y y así sucesivamente hasta terminar. con esto no le quito tiempo al procesamiento y puedo hacer varias cosas al mismo tiempo.
Ya después de haber procesado el dato y ver que era un comando de movimiento activo una bandera, Mover, y entro a rutina de aceleración.
void loop()
{
Timer = micros();
Leer_Datos_Serial();
if (Dato_Serial)
{
Procesar_Dato();
Dato_Serial=0;
}
if (Move)
{
Acceleracion();
if (Permiso_Mover)
{
Mov_Linear();
Permiso_Mover = 0;
}
}
esperar:
Timer_Scan = micros() - Timer;
if (Timer_Scan < 10)goto esperar;
}
En la rutina de Aceleración se calcula de acuerdo a la velocidad cada cuando se debe de mover un pulso del motor