jueves, 26 de marzo de 2015

Movimiento de servomotores usando acelerómetro ADXL345

Para el desarrollo de la práctica, se tiene que cumplir con los siguientes puntos:
  1. Controlar dos servomotores con el acelerómetro (Uno con el eje x; el otro con y).
  2. Encender un Led con un tapsimple.
  3. Encender dos Leds con un doble tap.
  4. Parpadeo de un led después de caída libre
Para el desarrollo de la práctica, se utilizó:
  • Acelerómetro ADXL345
  • 2 servomotores
  • 3 Leds
  • Microcontrolador de 8-bits PSoC 1
  • Raspberry Pi modelo B+
  • Bluetooth HC05

 Acelerómetro ADXL345

 

El dispositivo ADXL345 es un acelerómetro de tres ejes (X, Y, Z) que utiliza las interfaces de comunicación I2C y SPI . Posee un regulador de 3.3V lo que permite elegir el voltaje lógico de interfaz, ya sea 3V o 5V.

Utilizando las interfaces se puede definir la  sensibilidad del sensor, el cual ofrece los niveles de sensibilidad de +-2g, +-4g, +-8g, +-16g. El menor rango de medición, por lo regular, es utilizado para medir movimientos lentos, mientras que el mayor rango ofrece cambios a movimientos rápidos.

La resolución del acelerómetro ADXL345 es de 10 a 13 bits, por lo que se requiere dos bytes para alojar el resultado completo de cada eje. Esto quiere decir que en total recibiremos 6 bytes, que será necesario convertir a solo 1 byte por eje. El primer byte de cada eje contiene el valor menos significativo.

Entre sus aplicaciones podemos encontrar:
  • Telefonía móvil
  • Instrumentación médica
  • Juegos y dispositivos señaladores
  • Instrumentación industrial
  • Dispositivos de navegación personal
  • Protección de discos duros
  • Equipo para ejercitarse


Características

  • 2.0-3.6VDC de voltaje de alimentación
  • Ultra Bajo Consumo: 40uA tiempo de medición, 0.1uA en standby @ 2.5V
  • Detección de Tap/Doble Tap
  • Detección de caída libre
  • Interfaces I2C y SPI
Acelerómetro ADXL345
Las características completas del sensor, así como cada uno de los registros que usa, se pueden ver en el datasheet.

 Servomotores

 

Los servomotores son motores especiales que incluyen circuitería interna para poder controlarse con mucha precisión. Son utilizados para controlar posición (ángulo) de giro. Normalmente pueden girar dentro de un rango de 0-180° y se controlan por PWM.

Servomotor
Comúnmente, el tiempo del pulso en estado alto debe ser entre 1-2ms y la posición cero queda en 1.5ms, mientras que 0°y 180°corresponden a 1ms y 2ms, respectivamente, lo que significa que el movimiento del servomotor no tiene que ser estrictamente lineal. La relación del ancho de pulso respecto al ángulo del eje es lineal. Para mantener la posición del motor es necesario seguir enviando los pulsos continuamente por lo tanto si se deja de enviar pulsos o se excede el tiempo de estado bajo, el motor puede perder fuerza y cambiar su posición.
  

 Desarrollo del programa


El programa se desarrollo en 2 partes, para dar solución al problema de que el microcontrolador tenga que estar conectado mediante cables a la alimentación.

Pseudocódigo de PSoC1

Proceso ProgramaPSoC
    Definir Registros Como Caracter
    Dimension BytesEscritura[2]
    
    ConfiguracionInicial()
    BytesEscritura[0] <- DireccionRegistro
    BytesEscritura[1] <- ConfiguracionRegistro
    EscribirRegistro(BytesEscritura)
    
    Mientras Verdadero es Verdadero
        Dimension Lecturas[9]
        
        Lecturas[0] <- DireccionRegistro
        EscribirRegistro(Lecturas[0])
        
        LeerRegistro(Lecturas)
        EscribirEnLCD(Lecturas)
        MandarPorUART(Lecturas)
    FinMientras
FinProceso


Interrupciones TAP - DOBLE TAP - CAIDA LIBRE

 

SubProceso GPIO_ISR()

    Dimension ISR[2]

    Definir TAP_ISR como Entero

    Definir DOBLE_TAP_ISR como Entero

    Definir CAIDA_ISR como Entero

    

    ISR[0] <- DireccionRegistro

    EscribirRegistro(ISR[0])

    LeerRegistro(ISR[1])

    

    Si ISR[1] = TAP_ISR Entonces

        Encender_1_LED()

    FinSi

    Si ISR[1] = DOBLE_TAP_ISR Entonces

        Encender_2_LEDs()

    FinSi

    Si ISR[1] = CAIDA_ISR Entonces

        Parpadear_LED()

    FinSi 

FinSubProceso







Imágenes de los dispositivos funcionando independientemente


Código de control de servomotores en Python (Raspberry)

 

try:
 import serial
 import RPi.GPIO as GPIO

 port = "/dev/ttyAMA0"

 serie = serial.Serial(port,9600)
 serie.flushInput()
 serie.flush()
 GPIO.setmode(GPIO.BCM)
 GPIO.setup(13, GPIO.OUT)
 p = GPIO.PWM(13, 1000)

 p.start(0)

 while True:
  if (serie.inWaiting() > 0):
   input = serie.read(5)
   lect = bytearray(input)
  
   x = (lect[1] << 8) | lect[0]
   y = (lect[3] << 8) | lect[2]
  
   if(x & (1 << 16) - 1):
    x = x - (1 << 16)
  
   if(y & (1 << 16) - 1):
    y = y - (1 << 16)
   
   strX = str(x)
   strY = str(y)
   strISR = str(lect[4])
  
   print(strX, strY, strISR)

except KeyboardInterrupt:
 GPIO.cleanup()

 

 

Finalmente se muestra en video el funcionamiento de los dos dispositivos independientes, sin cables y utilizando un bluetooth para comunicación.




Unidad 2

Sensores y actuadores FIUADY. Unidad 2


domingo, 8 de marzo de 2015

Medición de corriente alterna 220V - 35 amp. Pt. 2

Objetivos


Objetivo general


Diseñar una placa PCB para la medición de diferentes variables eléctricas.

Objetivos particulares


Realizar el diseño del circuito de medición de las diferentes variables eléctricas.
Realizar el diseño del PCB del circuito.
Generar el pseudocódigo y diagrama de flujo del proceso de obtención de datos, así mismo del procesamiento de los mismos usando un microcontrolador.

Descripción del problema


Se desea realizar una medición de las variables eléctricas de voltaje, corriente, potencia y energía en corriente alterna de 220 volts a 35 amp. Para eso se diseñará una placa que integre diferente tipo de sensores y un microcontrolador que procese las lecturas obtenidas de manera que la placa PCB diseñada pueda arrojar resultados que puedan ser utilizados de forma inmediata.

Materiales


En la siguiente tabla se mencionarán los materiales que son utilizados para la realización del PCB.



Descripción Cantidad Precio unitario Total
1 Regulador DC-DC 3.3V 1 $ 5.48 $5.48
2 Regulador AC-DC 5V 1 $ 13.25 $ 13.25
3 Op-amp 2 $ 0.55 $ 1.10
4 Atmel ARM Cortex M4 1 $ 8.10 $ 8.10
5 Conector JTAG 10pin 1
6 Capacitor 100 nF 7 $ 0.10 $ 0.70
7 Capacitor 10uF 2 $ 0.53 $ 1.06
8 Resistencia 220 ohms 1 $ 0.10 $ 0.10
9 Capacitor 15pF 2 $ 0.50 $ 1.00
10 Cristal 12Mhz 1 $ 0.79 $ 0.79
11 Sensor de corriente ACS7566 1 $ 6.57 $ 6.57
12 Sensor de voltaje 1 $ 115.00 $ 115.00
Total $ 168.15


Diseño de la placa


Esquemático


Los sensores de voltaje y corriente tienen aislamiento. Los sensores de corriente y voltaje ya poseen aislamiento por lo que no será necesario aislar esa parte de la placa, sin embargo para la detección del cruce por cero, el circuito no se encuentra aislado.

El proceso de aislamiento se realizará, primero en un transformador 220V – 5V y luego en un optoacoplador, la salida de este último irá directo al microcontrolador. El esquemático del circuito se muestra en la figura anterior.

PCB


El diseño de la placa PCB se muestra en la siguiente figura.


Alimentación


La tarjeta tiene una alimentación de la misma línea de corriente alterna, esto se realiza usando un convertidor AC-DC, con los parámetros de corriente alterna entre 80 – 250V, con un voltaje de corriente directa de 5V.
Además cuenta con un regulador de 5V a 3.3V para la alimentación de los demás componentes del sistema.

Metodología


La característica del microcontrolador de que pueda realizar tareas paralelas permite que el procesamiento sea muy rápido con el mínimo de error en cada una de las lecturas. El proceso general, siguiente diagrama, propone que las lecturas de los sensores se realicen de manera simultánea, al haber elegido los sensores mencionados en la tabla, también facilitó que la parte de medición no necesite un pre-procesamiento de la señal riguroso.


Pseudocódigo



Main.psc
Proceso Main
    

    Leer SensorV, SensorI

    V = Voltaje(SensorV)

    I = Corriente(SensorI)

    

    //Ejecutar asíncronamente o en interrupciones

    F = Frecuencia()

    P = Potencia(F, V, I)

    E = Energia(F, V)

    

    Escribir "Voltaje: ", V

    Escribir "Corriente: ", I

    Escribir "Frecuencia: ", F

    Escribir "Potencia: ", P

    Escribir "Energia: ", E

    
FinProceso


SubProceso V<- Voltaje(ValorSensor)

    

    V= 250*ValorSensor/5



FinSubProceso



SubProceso I <- Corriente(sensor)

    

    I = 0

    Imax = I

    

    Repetir

        I = sensor/.04

        Si I > Imax Entonces

            Imax = I

        FinSi

    Hasta Que Falso

    

FinSubProceso



SubProceso freq <- Frecuencia

    tiempo = 0

    pulsos = 0;

    Mientras tiempo < 1 Hacer

        Si DetectoFlancoAscendente Entonces

            pulsos = pulsos + 1

        Fin Si

    Fin Mientras

    

    freq = pulsos

FinSubProceso


SubProceso pot <- Potencia(freq, V, I)

    

    tiempo = 0

    T = 1/freq

    pot = 0

    Mientras tiempo<T Hacer

        pot = pot + V*I

    Fin Mientras

    pot = pot/T

FinSubProceso



SubProceso E <- Energia(freq, v)

    tiempo = 0

    T = 1/freq

    E = 0

    Mientras tiempo<T Hacer

        E = E + abs(v^2)

    Fin Mientras

    Escribir E

FinSubProceso