viernes, 13 de junio de 2014

Actuadores - Motores paso a paso P.A.P


Con repecto a los motores paso a paso existen dos tipos bipolares y unipolares como distinguirlos



Los unipolares poseen 6 cables y los bipolares 4 cables A(1A) B(1B) C(2A)D(2B) y dos comunes.
un motor gira 360 gados, segun segun el datasheet del fabricante de motor te da los datos de su funcionamiento y seguridad intrinseca, por lo general son de 1,8° por paso 5V - 12V - 24V etc.

o sea que por regla de tres simple:


1,8°   ---  1 paso
360°  ---  200 pasos


por lo que 360° es un revolucion ahora que tener en cuenta a que velocidad gira y cuantas revoluciones

pasos
revoluciones por tiempo o RPM o RPS revoluciones por minuto o segundo.


como controlarlos bueno se conmuta  de la siguiente manera logica y secuencial entonces tenes que tener en cuenta la logica electrica y luego la logica la pasas a binario es una tabla de verdad no tenes que limitarte en el lenguaje lo principal es entender que vas a manejar como funciona lo demas no es tan importante podes usar visual basic - c -vbs -gambas - python - etc.







Esta secuencia es binaria es para un paso si queres que siga girando tenes que seguir repitiendo la secuencia bit a bit dentro de un bucle la velocidad se la das con un delay

ON OFF OFF OFF   1000
OFF ON OFF OFF   0100
OFF OFF ON OFF   0010
OFF OFF OFF ON   0001

Se que soy complicado para explicar tengo muchas cosas en la cabeza prometo mejorarlo y subir codigo :P...

Sldos...

Varios - Funcionamiento del Puerto Paralelo LPT en windows


Puerto Paralelo


Esta es la imagen del la ficha hembra DB-25 del puerto paralelo

Este puerto entrega 4.92V aproximadamente y 20ma esta formado por tres partes

Puerto de datos el cual nos permite escribir 8 bits (00000000) a la dirección 888 en decimal 378H en hexadecimal

PIN:2-3-4-5-6-7-8-9

D7 D6 D5 D4 D3 D2 D1 D0
0 0 0 0 0 0 0 0

Puerto de estados no sirve para leer datos del exterior lo cual nos da 5 bytes de entrada digitales o pasadas por un convertidor analógico a digital de 5bits en la direccion 889 en decimal 379H en hexadecimal

PIN:10-11-12-13-15

E7 invertido E6 E5 E4 E3
1 invierte 0 0 0 0 0

Puerto de control este es un puerto bidireccional nos permite enviar y recibir 4bit a la direccion 890 en decimal 37AH en hexadecimal

PIN:1-14-16-17

C3 invertido C2 C1 invertido C0 invertido
1 invierte 0 0 1 invierte 0 1 invierte 0


MASA: Este corresponde al negativo.
PIN:18 al 25


encontre de casualidad esta foto de un codigo muy viejo para gambas2 y puerto paralelo no ha mas estas cosas porque es obsoleto




Varios - LPT.DLL

(Este proyecto esta desactualizado es para vbnet bajo windows lo deje a pedido)

 Esto es un pequeño driver DLL que te permite usar VBscript para automatizar el control de motores paso a paso unipolares para robotica y/o entretenimiento.

Este es mi pequeño lpt driver script LPT.DLL es un active x lo pueden descargar y probar...

Ejemplo para invocar el active x

**00.vbs*****************************************************************
'aqui se crea el objeto es la clase PAP de la libreria lpt.dll
set lpt = CreateObject("LPT.PAP")

lpt.cero 'pone a cero la salida del puerto paralelo registro de datos
lpt.cero_2 'pone a cero la salida del puerto paralelo registro de control


'se define la cantidad de pasos
lpt.cant_pasos=50
'se define la velocidad de giro en milisegundos
lpt.vel_mil=10

'se acciona el motor 1 hacia la derecha logica en hexadecimal pasada a long
'&HC, &H6, &H3, &H9) en decimal 12 - 6 - 3 - 9
'Matriz hexadecimal a mayor torque conmutndo dos bobinas usando la salida del LPT mas baja(low byte)

'1100 12 C
'0110 6 6
'0011 3 3
'1001 9 9

lpt.mot_1_der
'se pone a cero el puerto paralelo
lpt.cero

'se acciona el motor 1 hacia la izquierda &H3, &H6, &HC, &H9)
lpt.mot_1_izq
'se pone a cero el puerto paralelo
lpt.cero

'Matriz hexadecimal a mayor torque conmutndo dos bobinas usando la salida del LPT mas alta(high byte) &HC0, &H60, &H30, &H90

'D7 D6 D5 D4 D3 D2 D1 D0
' high low

'11000000 dec(192) hex(C0)
'01100000 96 60
'00110000 48 30
'10010000 144 90
' se pueden combinar para manejar dos motores a la ves jeje para otro dia lo hago....
lpt.mot_2_izq
lpt.cero



lpt.mot_2_der
lpt.cero


'esto es un chorrada que se me ocurrio la idea es manejar toda la cantida posible de motores con la menor cantidad de componentes
'una cuestion de ahorro(soy un rata) obio se puede multiplexar y comandar hasta 38 salidas (en teoria) usando el regstro de control el cual use
'sus cuatro bits para comandar un motor mas jeje y funciona perfecto si multiplexas usas los cuatro bits de control * los 8 de salida = 32
'este no es el casooooo.


lpt.mot_3_izq
lpt.cero_2



lpt.mot_3_der
lpt.cero_2
'jaja algo de credito lo pueden borrar y no aparece el mensaje payload
lpt.ban


*********************************************************************************************************

Estre es un video demo de la libreria LPT.DLL y el uso de Activex con VBscript / JScript o VBAplication(Word - Excel,etc)
Sldos...



**********************************************************************
Option Strict Off

Option Explicit On

Module InpOut32_Declarations

'Inp and Out declarations for port I/O using inpout32.dll.

Public Declare Function Inp Lib "inpout32.dll" Alias "Inp32" (ByVal PortAddress As Short) As Short

Public Declare Sub Out Lib "inpout32.dll" Alias "Out32" (ByVal PortAddress As Short, ByVal Value As Short)

End Module

jueves, 5 de junio de 2014

Arduino - AVR LIB C vs Librerias Arduino

Bueno me lleve una sorpresa compilando codigo con la librerias de avr en C con respecto a las librerias que utiliza arduino ide y es alarmante el tamaño del codigo generado por las librerias de arduino admito que estan buenas esta todo hecho la descargas y sale andando aca esta el viejo ejemplo del blink que hace parpadear el led e el pin D13 un segundo ambos codigos hacen lo mismo la diferencia esta en el tamaño y las librarias usadas.

Esta es la cadena de compilacion o compilerchain o toolchain como se ve podemos generar nuestro codigo en asembler y ensamblarlo con AVR-AS o hacerlo en C y compilarlo con AVR-GCC y generar el OBJ enlazarlo a librerias y bootloaders generar el .hex y cargarlo...




esta cadena es usadas por las librerias de arduino IDE el cual nos evitan mucho trabajo de programacion de registros binario y hexadecimal pero generan codigo basura aumentando el tamaño y rendimiento.



Libreria de arduino IDE - (1.084bytes)




Librerias de AVR C o AVR-LIBC (214 bytes)



O sea imaginense todo el espacio ocupado en nuestro arduino o micro atmega328p (ATMEL AVR) con codigo mas complejo :O

ahora usar avr-lib es toda una batalla a medida que bajamos de nivel aumentamos rendimiento, reducimos tamaño pero se hace mas dificil entender el codigo estas intrucciones o macros en C nos permiten configurar los registros del (uP) atmega328p

DDRx  --> Registro de Direccion de Datos "X corresponde al puerto  B - C - D entrada o salida"
PORTx -->Sirve para poner en alto o bajo un pin o varios pines digitales.
PINx -->Sirve para leer un pin o varios pines digitales

Atmega328p

PB7      PB6   PB5  PB4  PB3  PB2  PB1 PB0 (8 bits - 1 byte - PORT B)
(xtal1) (xtal1)  D13  D12  D11  D10  D9   D8
0             0         1      0         0     0        0     0   ej. binario


PD7  PD6  PD5  PD4  PD3  PD2  PD1       PD0    (8 bits - 1 byte - PORT D)
D7     D6    D5    D4    D3     D2   D1(tx)    D0(rx)

entonces primero le decimos al micro uP que vamos a usar los puertos como entradas o salidas digitales
en binario o hex los ponemos a uno como salida o a cero como entrada.

DDRB=0B00100000   //solo pusimos a PB5 como salida corresponde al pin D13
o
DDRB=0x20 // lo mis mismo en hex prefiero el binario

ahora lo ponemos a alto

PORTB=0B00100000 //pusimos el bit PB5 en alto
o
PORTB=0x20 //lo mismo en hex pone a alto el pin PB5 o pin D13


ahora lo ponemos en bajo
PORTB=0B00000000 //pusimos el bit PB5 en bajo
PORTB=0x0


y los podemos combinar :)


DDRB=0B00111111   //decimos que del pin D8 al D13 son salidas
o
DDRB=0x3F //en hex

PORTB=0B00100001 //pusimos a alto solo el pin D8 y el D3
o
PORTB=0x21 //en hex




#include <avr/io.h>
#define F_CPU 16000000UL //este el clock externo 16MHZ al compilar se especifica..
                                                //en delay.h figura a 1MHZ no me queda claro es como default.
                                             
                                               //el clock es el tiempo por intruccion 1/16E6 =6.3E-8 segundos
#include <util/delay.h>          //deberian ser 16MHZ ??? investigare un poco este tema...

int main(void)
{
  DDRB=0B00100000;

 //ponemos el pin D13 como salida


 while(1) //este es el bucle loop :) infinito
  {
 
    PORTB=0B00100000;
   //ponemos en alto el pin D13 del PORT B
    _delay_ms(1000);
  //es el delay el mismo usado delay(1000)
    PORTB=0B00000000;
//ponemos en bajo el pin D13 del PORT B    
 _delay_ms(1000);
  }

  return 0;
}



Sldos..