Buenas noches, me dirijo una vez mas a este foro para ver si entre todos me podéis ayudar, gracias de antemano.
Os pongo en situación, hace tiempo me venia abordando un problema para la medida de piezas grandes con precisión. El calibre que tengo llega hasta medidas de 200mm, pero claro si quieres medir algo que tenga por ejemplo 1034'45mm con bastante precisión, pues con el típico metro de toda la vida no se puede. Si que es cierto que venden incluso calibres digitales de hasta 1500mm pero a un precio de 2.000 y pico € y desde china son unos 350, mas 250 de portes, etc. Total, que decidí hacerlo yo. El sistema de los calibres es como el de las reglas métricas que muestran las cotas de las maquinas de cnc...era inviable imitar ese sistema, de modo que se me ocurrió hacerlo con un encoder de 2000 pulsos que tenia por casa. El encoder tiene montada una rueda de goma de vulkollan de 55'38mm de diámetro, el cual rueda por un perfil de aluminio que le sirve de bastidor. (Fotos).
La medida la hace correcta, pero el problema viene cuando deslizo rápido la rueda, mas que rápido, con bastante aceleración (girándolo con la mano también lo hace)....pero jamás igual de rápido que como lo haría un motor. El tema es que muestra en el monitor serie la cota que está midiendo, con una resolución de 0,03mm que para lo que quiero hacer me vale. Necesito poner la velocidad a 2.000.000 de baudios para que cuando deslizo el encoder, vaya viendo el resultado. Si lo pongo a 9600, 115200, etc, es imposible. Ni despacio puede hacerlo. Si giro la rueda mas rápido, pierde esa cota.
¿Puedo corregir esto para que no vaya tan lento abriendo y cerrando las uñas del calibre?
¿Puede ser que en una pantalla LCD vaya mejor que mostrarlo por monitor serial? ¿es lo mismo en cuanto a velocidad?
Os dejo unas fotos y los códigos. Si queréis recrearlo, os dejo también los archivos STL para la impresora 3D.
(Con este código puedo deslizarlo mas rápido pero no están preciso)
#define outputA 2
#define outputB 3
float counter = 0;
int aState;
int aLastState;
void setup() {
pinMode (outputA,INPUT_PULLUP);
pinMode (outputB,INPUT_PULLUP);
Serial.begin (2000000);
aLastState = digitalRead(outputA);
}
void loop() {
aState = digitalRead(outputA);
if (aState != aLastState){
/
if (digitalRead(outputB) != aState) {
counter ++;
} else {
counter --;
}
//Serial.print("Posicion: ");
Serial.println(counter*3.1415926*55.34/2000); //Cuenta los pulsos que lleva, lo multiplica por Pi, lo multiplica por el diametro del rodillo de vulkollan y lo dividimos entre 2000 pulsos
}
aLastState = aState;
}
(Este código es mas preciso pero no puedo moverme nada rápido sin que pierda resolución)
//#include <LiquidCrystal.h>
//LiquidCrystal lcd(5, 6, 7, 8, 9, 10);
int pin1 = 2;
int pin2 = 3;
int Pos = 0;
int State;
int LastState;
const float pi = 3.14159265;
const float R = 27.67; //Radio del rodillo de vulkollan
const int N = 2000; //pulsos del encoder
float distancia = 0;
void setup() {
pinMode (pin1 ,INPUT_PULLUP);
pinMode (pin2 ,INPUT_PULLUP);
Serial.begin(2000000);
// lcd.begin(16, 2);
// lcd.print("Medicion");
LastState = digitalRead(pin1);
}
void loop() {
State = digitalRead(pin1);
if (State != LastState){
if (digitalRead(pin2) != State) {
Pos ++;
}
else {
Pos --;
}
}
distance = ((2*pi*R)/N) * Pos ;
Serial.println( distancia);
//lcd.setCursor(0, 1);
//lcd.print( distancia);
//lcd.setCursor(5, 1);
//lcd.print("mm ");
LastState = State;
}
(Algunas fotillos del invento)
Gracias y un saludo