miércoles, 1 de junio de 2016

DRO calibres digitales en el torno.



DRO para el torno.

Este es mi proyecto terminado de DRO -Digital ReadOut- 

He utilizado cuatro calibres o calliper o vernier digitales chinos que son bastante accesibles.
Hay que fijarse bien sacando la tapita del costado que tengan los cuatros contactos de salida. Los hay con dos contactos que no sirven.
Utilicé una placa Arduino Uno como prueba y también lo usé para grabar el bootloader en los dos chips clones atmega328p con sus respectivos cristales, capacitores de 25pf, con led al PIN 13 y botón de Reset. (fotos 6 y 7). EL circuito está expresado genéricamente en las figuras 1 y 2. También le he colocado un regulador 7805 por plaqueta.
En la últimas fotos está la lámpara con lupa a LED que me hice torneando un cilindro de aluminio para las articulaciones que me resultó muy práctica.
El sketch completo y funcionando esta al final en "mas información » "


Calibres instalados y funcionando.




esquema genérico




















 
Primera prueba en protoboard


 
antes de armar los pruebo.




 Mejorado la colocación del calibre en la torre portaherramientas.







Mejorado la colocación del calibre en carro.



Arduino - Sketch

//versión 2.5 FINAL OK 1/5/16
//mi.arduino.ar@gmail.com
// OK funca excelente!!!!!
// con LCD


#include <LiquidCrystal.h>
LiquidCrystal lcd(12, 11, 5, 4, 3, 2);

int i;
int g;
int g1;
int sign1;
int sign2;
long value1;
long value2;
float result1;
float result2;
int clockpin = 8;  //calibre1  8----verde clock
int datapin = 9;   //calibre1  9----blanco data
int clock2 = 6;  //calibre 6----verde clock
int data2 = 7;  //calibre 7-----blanco data

unsigned long tempmicros;
unsigned long tempmicros2;

void setup() {
    lcd.begin(16,2);
  Serial.begin(9600);
  pinMode(clockpin, INPUT);
  pinMode(datapin, INPUT);
  pinMode(clock2, INPUT);
  pinMode(data2, INPUT);
}

 void loop () {
  while (digitalRead(clockpin)==HIGH) {}
  tempmicros=micros();
  while (digitalRead(clockpin)==LOW) {}
  if ((micros()-tempmicros)>500) {
    calibre1();
  }

  while (digitalRead(clock2)==HIGH) {}
  tempmicros2=micros();
  while (digitalRead(clock2)==LOW) {}
  if ((micros()-tempmicros2)>500) {
    calibre2();
  }
 

  //----borrado de LCD
  String unacadena=String(value1*sign1);
    g = unacadena.length();
    if (g |= g1) { lcd.clear();
   }
   g1 = g;
  
 //----escribe en LCD
 lcd.setCursor(0,0);
 lcd.print("TORRE ");
 lcd.setCursor(9,0);
 lcd.print(result1,2);

 lcd.setCursor(0,1);
 lcd.print("TRANSVER");
 lcd.setCursor(9,1);
 lcd.print(result2,2);
  //delay(100);
}

void calibre1() {
  sign1=1;
  value1=0;
  for (i=0;i<23;i++) {
    while (digitalRead(clockpin)==HIGH) { }
    while (digitalRead(clockpin)==LOW) {}
    if (digitalRead(datapin)==LOW) {
      if (i<20) {
        value1|= 1<<i;
      }
      if (i==20) {
        sign1=-1;
      }
    }
  }
   result1=(value1*sign1)/100.00; 
}

void calibre2() {
  sign2=1;
  value2=0;
  for (i=0;i<23;i++) {
    while (digitalRead(clock2)==HIGH) { }
    while (digitalRead(clock2)==LOW) {}
    if (digitalRead(data2)==LOW) {
      if (i<20) {
        value2|= 1<<i;
      }
      if (i==20) {
        sign2=-1;
      }
    }
  }
    result2=(value2*sign2)/100.00;  
}

7 comentarios:

  1. Ayuda. No pudo hacerlo funcionar, respete todas las conexiones tal cuál el diagrama, el programa lo copié y pegué, luego lo cargué en el arduino uno, pero no funciona. enciende la pantalla y no aparece ningún texto. Por favor ayuda.

    ResponderEliminar
  2. Hola Ricardo, lo primero que debes hacer es probar si el LCD está bien conectado y funcionando. Para ello debes cargar el sketch llamado: Hello World que se encuentra en
    ejemplos-->LiquidCrystal--->Hello World
    Mira bien las conexiones de los PIN del LCD que coincidan con los PIN en tu Arduino y en el sketch.
    También recuerda que debes iluminar el LCD con un potenciómetro, si la conexión es la correcta cuando mueves el pote debes ver el incremento del contraste sobre el led que ilumina al LCD. Saludos

    ResponderEliminar
  3. Ante todo quería felicitarte por el proyecto. Y quería agregar un pequeño comentario: los calibres chinos que sólo tienen dos contactos también sirven. Inclusive tienen un protocolo de comunicación más sencillo. Lo descubrí tratando de hacer un proyecto similar al tuyo. Hacía tiempo tenía comprado uno de esos calibres el cuál usaba para simples mediciones. Cuando ví tu blog se me ocurrió encarar el mismo proyecto. Al destapar la tapita del conector de datos me encuentro que solamente tenía dos contactos. Empecé a maldecir en arameo, pero un día me armé de paciencia y me dije no puede no servir y puse manos a la obra. Los dos contactos que tiene uno es DATA y el otro CLOCK. Soldé con cuidado 4 cables al calibre y obtuve +V, negativo, DATA y CLOCK. Inclusive descubrí que el calibre tenía conectado negativo a masa (la parte metálica del calibre), cosa que he leído por ahí que los que tienen cuatro contactos tienen el positivo a la parte metálica. Tener negativo a masa tiene la ventaja que no es necesario aislar el calibre del torno al montarlo.
    Con ayuda de un osciloscopio digital obtuve ambas señales, y para mi sorpresa no tenían nada que ver con todo lo que había leido sobre protocolos chinos (2 series de 48 bits donde la primera da la posición absoluta y la segunda la relativa al cero elegido). Luego de algunas pruebas descubrí lo siguente: la línea de CLOCK consta de 6 nibbles de 4 bits cada uno. Eso me hizo pensar primeramente en un protocolo BCD parecido al utilizado en los calibres de alta calidad. Finalmente descubrí que la cosa no era así y al descifrarla me resultó que la idea del que hizo el protocolo era muy simple. Lo que hace es leer bit a bit la linea DATA en base al CLOCK, como en toda línea sincrónica, y los va acumulando uno detrás del otro en los 5 primeros nibbles. El nibble 6 lo utiliza para indicar si el desplazamiento es positivo (el calibre se abre) o si es negativo (calibre cerrandose), y para indicar la unidad de medida, si es en milímetros o en pulgadas.
    Con un ejemplo se ve mucho más sencillo de explicar:
    Supongamos que el calibre mide 0,01mm (la mínima medida que puede medir). En los 5 primeros nibbles se almacena el siguiente número binario: 1000 0000 0000 0000 0000. Este número binario convertido a decimal representa el valor 1. Dividiendo por 100 (ya que cuando el calibre está en milímetros la máxima resolución es la centésima de milímetro) obtenemos el valor 0,01 que es lo indicado en el dislay del calibre. En el nibble 6 se almacena el valor 0000. El bit 1 de este nibble indica el sentido del desplazamiento (0 positivo, 1 negativo), y el bit 4 de este nibble indica la unidad de medida (0 milímetros, 1 pulgadas).

    0000 => desplazamiento positivo, medida en milímetros
    1000 => desplazamiento negativo, medida en milímetros
    0001 => desplazamiento positivo, medida en pulgadas
    1001 => desplazamiento negativo, medida en pulgadas

    Supongamos ahora que la lectura del calibre es 25,42mm
    En los primeros 5 nibbles se almacena: 0111 0111 1001 0000 0000. Este número binario convertido a decimal resulta 2542. Dividiendo por 100 obtenemos 25,42 que es la lectura del calibre. El nibble 6 sigue siendo 0000.

    Cuando la unidad de medida es pulgadas el valor de los 5 primeros nibbles hay que dividirlo por 1000 ya que el calibre (al menos el que tengo yo) llega a la milésima de pulgada.

    Espero todo esto le sirva a alguien que tenga el mismo calibre y se esté agarrado la cabeza como me sucedió a mi.
    Cordial saludo.

    ResponderEliminar
  4. Muchas gracias por subirlo! hace mucho lo quería hacer, pero no tenia informacion sobre la codificacion y señales. Lo hice con un arduino pro mini y lo dejé sin pantalla, a modo de sensor. Saludos!

    ResponderEliminar
  5. hola, muy buen proyecto lo felicito. acabo de copiar el circuito para un calibre pero en el capacitor no recibo voltaje y no se si es por la resistencia de 330 ohm o el capacitor de 100 microfaradios 16v? alguna sugerencia . saludos.

    ResponderEliminar
  6. bueno gente resolví el problema, le tiro unos tips que les podrían servir según lo fui armando y resolviendo problemas que aparecían.
    1- valla a saber por que mi tierra y vcc de los 2 calibres estaban en corto , lo resolví sacando directamente el positivo del conector de la pila y dejando inutilizado el primer pin +1,5 vcc, las otras conexiones quedan iguales (gnd,data,clock). Luego con respecto al código solo faltaría la parte de liquidCristal (que a mi me funciono).

    #include

    const int rs = 12, en = 11, d4 = 5, d5 = 4, d6 = 3, d7 = 2;
    LiquidCrystal lcd(rs, en, d4, d5, d6, d7);

    me tomo un par de horas resolverlo pero quedo funcionando de maravilla. un saludo.

    ResponderEliminar
  7. Este comentario ha sido eliminado por un administrador del blog.

    ResponderEliminar