Go Down

Topic: medidor distancia y movimiento motor (Read 263 times) previous topic - next topic

devil86

Nov 13, 2017, 03:10 pm Last Edit: Nov 13, 2017, 06:54 pm by devil86
Hola muy buenas, soy nuevo en el foro, y me gustaría hacer una pregunta.

E estado mirando por Youtube, pero no encuentro como hacerlo.

Tengo unos Arduino y no los uso, quería ver si les sacaba provecho.

el tema que me gustaría hacer un medidor de distancia con Arduino, en milímetros. con una pantalla que se vean los dígitos.

me e fijado que hay sensores, de ultasonido, laser, ... hay alguno que pueda mirar el giro de una rueda, había pensado en hacerle una rueda piñón con una cadena

el tema que quiero hacer esto, http://www.strongbull.es/wp-content/uploads/2017/10/CAMINOS-DE-RODILLOS-CRM-1.pdf un medidor para un camino de rodillos que tengo.

Ya sea de movimiento manual como automático, la finalidad es que me lo diga en milímetros.

me he fijado en este vídeo, https://www.youtube.com/watch?v=BGq_DEEIgQY y lo veo muy interesante.

alguien podría informarme dónde puedo encontrar una pequeña guía de cómo hacer esto.

saludo y gracias

surbyte

#1
Nov 13, 2017, 03:34 pm Last Edit: Nov 13, 2017, 03:37 pm by surbyte
En el pdf lo que se ve es un posible encoder que al girar la rueda lleva los desplazamientos angulares traducidos a milimetros. Solo debes mantener la posicion para que eso funcione. Digo porque si lo apagas pierdes los datos de la posición relativa de la rueda.

En el video de youtube lo que se ve no es un medidor de milimetros como tu lo llamas.
Eso es un motor paso a paso cuyo desplazamiento se traduce luego en milimetros recorridos.

En los dos casos se traduce movimiento angular en desplazamiento.

devil86

#2
Nov 13, 2017, 06:56 pm Last Edit: Nov 13, 2017, 09:46 pm by surbyte
Primero gracias por responder,
del video del youtube, hay algún manual para seguir como se hace?

surbyte

#3
Nov 13, 2017, 09:46 pm Last Edit: Nov 13, 2017, 09:56 pm by surbyte
Me corrijo.
El video dice Usando CNY70 para medir distancia o sea que usa un sensor reflexivo para poder medir mm de distancia.

Te voy a decir algo que le digo a todo el mundo: Lee e interpreta las normas del foro. Porque insisto con esto: en el 95% de los casos la gente subestima los proyectos con microcontroladores, porque todo le parece facil. Ven una placa un sensor que se consigue en una tienda online y cree que todo es soplar y hacer botellas. Si fuera asi, no existiría un foro?

Antes de preguntar hay que agotar la búsqueda y las normas dicen que algo tan simple como : Arduino CNY70 debería darte alguna respuesta

Ademas yo puse en google : Arduino CNY70 measurement  y obtuve esto

http://forum.arduino.cc/index.php?topic=101156.0

Asi que tienes algo con que comenzar.

Aca tienes otro mejor https://create.arduino.cc/projecthub/jenniferchen/distance-measuring-sensor-900520
En este busque ir sensor distance measurement arduino

Insisto con el hecho de que si usas un motor paso a paso casda desplazamiento angular es fácilmente traducible a distancia desplazada.

devil86

muchas gracias iré mirando un poco más

los sensores cny70 por lo que lei, a distancias de 3 metros no son muy exactos y creo q ya no llegan. tendre q mirar otro sensor ya que quiero que llegue a los 3 metros por lo menos


surbyte

#5
Nov 14, 2017, 03:02 pm Last Edit: Nov 14, 2017, 03:10 pm by surbyte
Donde leiste eso? Es una locura..
Perdona por este comentario pero denotas no saber de electrónica o hablas de un sensor CNY70 diferente al que yo refiero.
Esta es la hoja de datos del CNY70

Al comenzar dice

DISTANCE RANGE FOR RELATIVE Iout > 20 %  0 a 5 mm (milimetros)



Esta imagen muestra que como múcho podrias medir hasta 10mm con un buen circuito desde el colector del sensor.

Entonces metros descartado. Y no hay sensor que mida metros a menos que sea laser y use tecnicas mas avanzadas que algo tan simple como un CNY70

devil86

pues tal vez me confundí.
encontré una web donde explican de un sistema que buscaba

aqui

lo único que no entiendo pq el motor no me gira al introducirle las medidas, lo demás me va bien.

alguien me podría ayudar, o es tema de las librerias que tal vez no las e instalado bien?

gracias

surbyte

Pero ese es un metodo de los que yo te describí antes. Un stepper es un motor que gira N pasos por vuelta.
Supongamos que tuviera 360 pasos, entonces cada paso es un grado.
Ahora supongamos que tienes un tornillo sin fin adherido al motor. El motor gira, el tornillo gira.
En el tornillo una tuerca o algo roscado que al girar en uno u otro sentido se desplaza.
Segun el paso del tornillo una vuelta del motor serán X mm, y un paso del motor serán esos X/360 mm. Asi que ya vez la precisión con la que puedes manejarte.

Para llevarlo a la practica. Debes saber que fuerza o peso deberá mover tu motor. Esa Peso debe traducirse en torque, que es la fuerza por cm que permite que ese peso se desplace. Con esos datos podras determinar el motor y el driver que controle dicho motor. recién ahi entra arduino + LCD + Teclado.

Espero que te sirva la guia.

devil86

#8
Nov 21, 2017, 10:35 am Last Edit: Nov 21, 2017, 10:46 am by devil86
muchas gracias, si efectivamente mire lo que tu me has comentado y creo que es esta linea del codigo

Code: [Select]
int calculatedmove=((z*1600)/80);

lo que no gira el motor, se queda temblando solamente y la placa  A3967 IC parece que se calienta.

Tal vez sea la placa que a venido defectuosa

el codigo completo que e usado es:

Code: [Select]
/* Arduino Control Stepper with Keypad and LCD

Created by Yvan / https://Brainy-Bits.com
This code is in the public domain...
You can: copy it, use it, modify it, share it or just plain ignore it!
Thx!

*/

#include <AccelStepper.h>  // AccelStepper Library
#include <Keypad.h>  // Keypad Library
#include "U8glib.h"  // U8glib for Nokia LCD

// Variables to hold entered number on Keypad
volatile int firstnumber=99;  // used to tell how many numbers were entered on keypad
volatile int secondnumber=99;
volatile int thirdnumber=99;

// Variables to hold Distance and CurrentPosition
int keyfullnumber=0;  // used to store the final calculated distance value
String currentposition = "";  // Used for display on Nokia LCD


// Keypad Setup
const byte ROWS = 4; // Four Rows
const byte COLS = 4; // Four Columns
char keys[ROWS][COLS] = {
  {'1','2','3','A'},
  {'4','5','6','B'},
  {'7','8','9','C'},
  {'*','0','#','D'}
};
byte rowPins[ROWS] = {22, 24, 26, 28}; // Arduino pins connected to the row pins of the keypad
byte colPins[COLS] = {31, 33, 35, 37}; // Arduino pins connected to the column pins of the keypad
Keypad keypad = Keypad( makeKeymap(keys), rowPins, colPins, ROWS, COLS );  // Keypad Library definition


// U8glib Setup for Nokia LCD
#define backlight_pin 11
U8GLIB_PCD8544 u8g(3, 4, 6, 5, 7);  // Arduino pins connected to Nokia pins:
                                    // CLK=3, DIN=4, CE=6, DC=5, RST=7
                                   
                                   
// AccelStepper Setup
AccelStepper stepper(1, A0, A1);  // 1 = Easy Driver interface
                                  // Arduino A0 connected to STEP pin of Easy Driver
                                  // Arduino A1 connected to DIR pin of Easy Driver
                                 


void setup(void) {
 
  //  Light up the LCD backlight LEDS
  analogWrite(backlight_pin, 0);  // Set the Backlight intensity (0=Bright, 255=Dim)
   
  //  AccelStepper speed and acceleration setup
  stepper.setMaxSpeed(1500);  // Not to fast or you will have missed steps
  stepper.setAcceleration(400);  //  Same here
 
  // Draw starting screen on Nokia LCD
  u8g.firstPage();
  do {
  u8g.drawHLine(0, 15, 84);
  u8g.drawVLine(50, 16, 38);
  u8g.drawHLine(0, 35, 84);
  u8g.setFont(u8g_font_profont11);
  u8g.drawStr(0, 10, "ENTER DISTANCE");
  u8g.drawStr(62, 29, "MM");
  u8g.drawStr(4, 46, "cur-pos");
  }
  while( u8g.nextPage() );
 
}


void loop(){
 
  char keypressed = keypad.getKey();  // Get value of keypad button if pressed
  if (keypressed != NO_KEY){  // If keypad button pressed check which key it was
    switch (keypressed) {
     
      case '1':
        checknumber(1);
      break;
       
      case '2':
        checknumber(2);
      break;

      case '3':
        checknumber(3);
      break;

      case '4':
        checknumber(4);
      break;

      case '5':
        checknumber(5);
      break;

      case '6':
        checknumber(6);
      break;

      case '7':
        checknumber(7);
      break;

      case '8':
        checknumber(8);
      break;

      case '9':
        checknumber(9);
      break;

      case '0':
        checknumber(0);
      break;

      case '*':
        deletenumber();
      break;

      case '#':
        calculatedistance();
      break;
    }
  }

}

void checknumber(int x){
  if (firstnumber == 99) { // Check if this is the first number entered
    firstnumber=x;
    String displayvalue = String(firstnumber);  //  Transform int to a string for display
    drawnokiascreen(displayvalue); // Redraw Nokia lcd
   
  } else {
    if (secondnumber == 99) {  // Check if it's the second number entered
      secondnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    } else {  // It must be the 3rd number entered
      thirdnumber=x;
      String displayvalue = (String(firstnumber) + String(secondnumber) + String(thirdnumber));
      drawnokiascreen(displayvalue);

    }
  }
}

 
void deletenumber() {  // Used to backspace entered numbers
  if (thirdnumber !=99) {
      String displayvalue = (String(firstnumber) + String(secondnumber));
      drawnokiascreen(displayvalue);

    thirdnumber=99;
  }
  else {
    if (secondnumber !=99) {
      String displayvalue = String(firstnumber);
      drawnokiascreen(displayvalue);

      secondnumber=99;
   }
   else {
     if (firstnumber !=99) {
       String displayvalue = "";
       drawnokiascreen(displayvalue);

       firstnumber=99;
      }
    }
  }
}
 
void calculatedistance() {  // Used to create a full number from entered numbers

    if (thirdnumber == 99 && secondnumber == 99 && firstnumber != 99) {
      keyfullnumber=firstnumber;
      movestepper(keyfullnumber);
    }
   
    if (secondnumber != 99 && thirdnumber == 99) {
      keyfullnumber=(firstnumber*10)+secondnumber;
      movestepper(keyfullnumber);
    }
   
    if (thirdnumber != 99) {
      keyfullnumber=(firstnumber*100)+(secondnumber*10)+thirdnumber;
      movestepper(keyfullnumber);
    }
   
    resetnumbers(); // Reset numbers to get ready for new entry
  }


void movestepper(int z) {  //  Move the stepper

  int calculatedmove=((z*1600)/80);  //  Calculate number of steps needed in mm
  stepper.runToNewPosition(calculatedmove);
  currentposition = String(z);
  u8g.firstPage();
  do {
    u8g.drawHLine(0, 15, 84);
    u8g.drawVLine(50, 16, 38);
    u8g.drawHLine(0, 35, 84);
    u8g.setFont(u8g_font_profont11);
    u8g.drawStr(0, 10, "ENTER DISTANCE");
    u8g.drawStr(62, 29, "MM");
    u8g.drawStr(4, 46, "cur-pos");
    u8g.setPrintPos(57,47);
    u8g.print(currentposition);       
  }
  while( u8g.nextPage() );
}
               
void resetnumbers() {  // Reset numbers for next entry
  firstnumber=99;
  secondnumber=99;
  thirdnumber=99;
}
 

void drawnokiascreen(String y) {

    u8g.firstPage();
    do {
      u8g.drawHLine(0, 15, 84);
      u8g.drawVLine(50, 16, 38);
      u8g.drawHLine(0, 35, 84);
      u8g.setFont(u8g_font_profont11);
      u8g.drawStr(0, 10, "ENTER DISTANCE");
      u8g.setPrintPos(0,29);
      u8g.print(y);  // Put entered number on Nokia lcd   
      u8g.drawStr(62, 29, "MM");
      u8g.drawStr(4, 46, "cur-pos");
      u8g.setPrintPos(57,47);
      u8g.print(currentposition);  //  Display current position of stepper
    }
      while( u8g.nextPage() );

}


También dejo lo que e utilizado

Placa Motor

Placa Arduino Mega

Motor paso a paso

saludos

surbyte

Una búsqueda de 5 seg en internet de tu stepper motor arrojó esta hoja de datos

Quote
Specifications:

Rated current (one-phase): 1.2A DC.
Stepping angle: 1.8°.
Environment Temperature: -20~50℃.
RH: 90%MAX
Mounting Position: Axis horizontal or vertical installation
Direct-current winding resistance (25℃): 3.4Ω±10%
Wnding inductance: 5mH±20%
Cogging torque: 12mN.m REF..
Holding torque: ≥320mN.m(I=1.2A)
Rescato que dice 1.2A y que el controlador que compraste dice 750mA por fase máximo. Asi que ahi tienes el problema..
No has comentado la fuente que usas y su corriente.

Tienes que buscar un controlador mas apropiado.

devil86

usaba uno de 1A, de ahí debe de venir el problema, voy a usar una fuente q tengo que da 5A a ver si va bien

gracias maestro

surbyte

Pero tu controlador no entrega mas de 750mA (placa  A3967) asi que no cambia nada tener una fuente de 5A

devil86

Pero tu controlador no entrega mas de 750mA (placa  A3967) asi que no cambia nada tener una fuente de 5A
Aaaa ok, lo entendí mal pues.
en el tuto el chaval lo hace arrancar bien y en el vídeo se ve como gira bien, lo q el mio por muchas pruebas que le haga, simplemente vibra el motor, no llega a moverse hacia ningún lado. por eso pensé que algo e echo mal.

gracias por la aclaración

surbyte

Pero no se que motor usa el, el tuyo dice 1.2A y tu controlador 0.75A. Simple.. matemática 1.2 > 0.75. Nunca va a funcionar.

devil86

tienes toda la razón, q controladora usarias tu para poder usar ese motor?

gracias

Go Up