Pages: [1]   Go Down
Author Topic: Comprobar lecturas en Arduino  (Read 1075 times)
0 Members and 1 Guest are viewing this topic.
Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenos dias:

Se puede comprobar de alguna forma visual la lectura de un encoder conectado a Arduino?

http://www.circuitsathome.com/mcu/reading-rotary-encoder-on-arduino

No estoy muy puesto, quizas la respuesta seria emplear writer o editor similar, y reflejar las lecturas como un pulso de teclado o bien empleando dos leds alumbrando uno u otro en función del sentido de giro del rotary.

Gracias a todos por las respuestas.

inigohe
Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hola inigohe,
claro que puedes.

Lo de los leds es la forma más sencilla. Solo necesitas una función bastante sencillita que detecta en que sentido gira el encoder. Entonces enciendes un led u otro.

Si lo que quieres es porder verlo en tu ordenador. Entonces en lugar de encender un led, envias el resultado por el puerto serie. Tan sencillo como esto:
- en el setup() incluyes: "Serial.begin(115200);" // aquí indicas la velocidad de transmisión.
- y para enviar el estado del encoder incluyes en el loop(): "Serial.println(estado);" // aquí enviarás la variable de estado.

Aquí te dejo una función con la que yo leía mi encoder.
Tendrás que mirarte el datasheet del encoder que utilices y modificar la función.

Code:
// pins del encoder
const int encoder0PinA = 2;
const int encoder0PinB = 4;

// donde almacenas el valor actual del encoder
int valueEncoder = 0;
int encoderParityPlus = 0;
int encoderParityMinus = 0;

setup(){
  // defines las entradas del encoder
  pinMode(encoder0PinA, INPUT);   
  pinMode(encoder0PinB, INPUT);
 
  // creas una interrupción para detectar cuando ha cambiado el estado del enconder, y que se ejecute la función que tu quieras
  attachInterrupt(0, doEncoder, CHANGE); 
}

loop(){
 // aquí va tu programa.

}

// y esta es la función que se ejecuta cuando cambia el estado del encoder
void doEncoder() { 
  if (digitalRead(encoder0PinA) == digitalRead(encoder0PinB)) {
    encoderParityPlus++; // esta linea se ejecuta cuando gira a la derecha
    if (encoderParityPlus%2 == 0){ valueEncoder++; }
    delay(100);
  } else {
    encoderParityMinus++; // esta linea se ejecuta cuando gira a la izquierda
    if (encoderParityMinus%2 == 0){ valueEncoder--; }
    delay(100);
  }
}


El programita es mio, así que no esperes gran cosa.
Pero yo lo estoy usando en una máquinita y me va de lujo.

Si tienes alguna duda, pregunta.
Un saludo!
Logged

garden explorer - Remotely Operated Vehicle
http://ge-rov.blogspot.com

Offline Offline
Newbie
*
Karma: 0
Posts: 48
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Buenas...

Gracias por el aporte, respecto de la hoja de especificaciones del encoder, sinceramente no la tengo. Hace tres años pille en ebay un lote de rotarys y no tengo datos.

Tienen un switch, en realidad tiene tres patillas por un lado y dos patillas por el otro. Entiendo que su funcionamiento es seleccionas un valor con el rotary y con el switch lo fijas, memorizas o como sea.

Me da la impresión que son como estos:

Electrical Characteristics
Output .........................2-bit gray code
Closed Circuit Resistance ......3 ohms maximums
Contact Rating .................1 mA @ 5 VDC
Insulation Resistance ..........10 megohms @ 250 VDC
Dielectric Withstanding Voltage
Sea Level ......................50 VAC minimum
Electrical Travel ..............Continuous
Contact Bounce (15 RPM).........5.0 ms. maximum
RPM (Operating) ................100 maximum
Environmental Characteristics
Operating Temperature Range .....-30 °C to +70 °C (-22 °F to +158 °F)
Storage Temperature Range .......-40 °C to +85 °C (-40 °F to +185 °F)
Humidity.........................MIL-STD-202, Method 103B, Condition B
Vibration .......................30 G
Contact Bounce ..................10~55~10 Hz / 1 min. / Amplitude 1.5 mm
Shock ...........................100 G
Rotational Life..................30,000 cycles minimum
Switch Life .....................20,000 cycles minimum
IP Rating........................IP 40
Mechanical Characteristics
Mechanical Angle ................360 ° continuous
Running Torque ..................30.6 to 204 g-cm (0.42 to 2.83 oz.-in.)
Shaft Side Load (Static) ........2.04 kgf (4.5 lbs.) minimum
Weight ..........................3 gm (0.1 oz.) maximum
Terminals .......................Printed circuit board terminals
Terminals .......................Printed circuit board terminals
Soldering Condition
Wave Soldering...................Sn95.5/Ag2.8/Cu0.7 solder with no-clean flux: 260 °C max. for 3-5 seconds
Hand Soldering...................Not recommended
Hardware.........................Konb
Switch Characteristics
Switch Type .....................Contact Push ON Momentary SPST
Power Rating (Resistive Load) ...10 mA at 5 V DC
Switch Travel....................0.5 +0.4/-0.3 mm
Switch Actuation Force ..........360 +153/-102 gf (5 +2.1/-1.4 oz.-in.)

http://www.sure-electronics.net/DC,IC%20chips/CS-CO043-5.jpg


Code:
/* Rotary encoder read example */
#define ENC_A 12
#define ENC_B 13
#define ENC_PORT PINC
 
void setup()
{
  /* Setup encoder pins as inputs */
  pinMode(ENC_A, INPUT);
  digitalWrite(ENC_A, HIGH);
  pinMode(ENC_B, INPUT);
  digitalWrite(ENC_B, HIGH);
  Serial.begin (115200);
  Serial.println("Start");
}
 
void loop()
{
 static uint8_t counter = 0;      //this variable will be changed by encoder input
 int8_t tmpdata;
 /**/
  tmpdata = read_encoder();
  if( tmpdata ) {
    Serial.print("Counter value: ");
    Serial.println(counter, DEC);
    counter += tmpdata;
  }
}
 
/* returns change in encoder state (-1,0,1) */
int8_t read_encoder()
{
  static int8_t enc_states[] = {0,-1,1,0,1,0,0,-1,-1,0,0,1,0,1,-1,0};
  static uint8_t old_AB = 0;
  /**/
  old_AB <<= 2;                   //remember previous state
  old_AB |= ( ENC_PORT & 0x03 );  //add current state
  return ( enc_states[( old_AB & 0x0f )]);
}

Este sketch lo saque de una web y a pesar de que tiene los comandos comentados, no se representa en el ordenador. Seria posible, en vez de números, cada pulso representase una letra, por ejemplo A para el sentido horario y B para el sentido antihorario????

Corrijo el sketch funciona bien en la terminal del puerto serie del Arduino, el problema seria lograr lo anteriormente citado, vamos un pulso para el sentido horario y otro para el antihorario y que windows lo interpretara como una letra


No se si existe algun método de identificar, porque estos carecen de numero de serie, marcas o similar.

inigohe
« Last Edit: July 23, 2011, 04:27:53 pm by inigohe » Logged

Offline Offline
Newbie
*
Karma: 0
Posts: 15
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Según entiendo quieres asignar un caracter a cada sentido de giro para luego enviárselo a windows.
Lo de asignar un caracter si que es posible, pero antes tienes que decodificar el sentido de giro, y luego asignarle la letra a la variable que pretendas utilizar.
En lo de enviárselo a windows no te puedo ayudar, no lo he hecho nunca.

Por lo del datasheet no creo que te tengas que preocupar. Yo he utilizado varios encoders y todos funcionaban igual. Al final solo sin microswitches que se van abriendo y cerrando en un orden u otro. Incluso con un tester lo puedes probar.

Si el código que has encontrado te sirve, entonces ya lo tienes. Solo tienes que enviárselo a windows por el socket que toque y listo.
Logged

garden explorer - Remotely Operated Vehicle
http://ge-rov.blogspot.com

Pages: [1]   Go Up
Jump to: