domingo, 21 de septiembre de 2014

Integrar un teclado capacitivo a Raspberry PI Parte 1

Hola amigos, en este proyecto, veremos como agregarle un teclado capacitivo a nuestra Raspberry, para hacer esto, utilizaremos una tarjeta Launchpad MSP430G2 y una booster pack con teclado capacitivo.


MSP430 Capacitive Touch BoosterPack with LaunchPad (sold separately)



Una de las ventajas del microcontrolador MSP430G2553 es que tiene integrado en sus pines, la electrónica necesaria para convertirlos en botones capacitivos con la ayuda de la placa, haciendo de electrodos. No planeo explicar los principios de un teclado capacitivo, esto está muy bien explicado en el siguiente link.
Energia ha realizado una libreria para utilizar fácilmente estos pines como sensores capacitivos, cuando el microcontrolador detecte que hemos presionado el pad, enviará un comando por el puerto serial, el programador integrado en la placa de launchpad crea un puerto COM virtual, por el cual podemos enviar información desde el puerto serial del microcontrolador, evitándonos tener que usar un convertidor serial usb. De esta forma, podemos conectar la tarjeta Launchpad al puerto USB de la Raspberry y recibir los comandos del puerto serial.


La librería Capacitive Touch puedes descargarla desde el siguiente link
Solo tienes que descargar la librería, copiar y pegar en la carpeta  C:\Users\TuNombreDeUsuario\Documents\Energia
Automáticamente aparece en los ejemplos y librerías




Con los ejemplos, pude realizar una adaptación del programa que necesitaba para enviar un carácter en especifico cuando detectará un determinado botón.

El codigo es el siguiente


#include <CapTouch.h>

#define PROXIMITY_SENSOR P2_0
#define LEFT_BUTTON P2_1
#define DOWN_BUTTON P2_2
#define RIGHT_BUTTON P2_3
#define UP_BUTTON P2_4

#define LED_SELECT P1_3

#define MIDDLE_LED P1_0

/* LED1, LED2, LED3 and LED4 are active high
 * P1.3 needs to be LOW to turn on these LED's 
 * LED4, LED5, LED6 and LED7 are active low 
 * P1.3 needs to be HIGH to turn on these LED's */

#define LED1_OR_4 P1_4
#define LED2_OR_5 P1_5
#define LED3_OR_6 P1_6
#define LED4_OR_7 P1_7

#define MASK7 BIT4
#define MASK6 BIT5
#define MASK5 BIT6
#define MASK4 BIT7
#define MASK3 (BIT3+BIT4+BIT5+BIT6)
#define MASK2 (BIT3+BIT4+BIT5+BIT7)
#define MASK1 (BIT3+BIT4+BIT6+BIT7)
#define MASK0 (BIT3+BIT5+BIT6+BIT7)

const unsigned char startSequence[8] = 

  MASK0,
  MASK1,
  MASK2,
  MASK3,
  MASK4,
  MASK5,
  MASK6,
  MASK7
};

CapTouch left = CapTouch(LEFT_BUTTON, TOUCH_BUTTON);
CapTouch down = CapTouch(DOWN_BUTTON, TOUCH_BUTTON);
CapTouch right = CapTouch(RIGHT_BUTTON, TOUCH_BUTTON);
CapTouch up = CapTouch(UP_BUTTON, TOUCH_BUTTON);
CapTouch proximity = CapTouch(PROXIMITY_SENSOR, TOUCH_PROXIMITY);

unsigned long now, then;
uint8_t state = false;
uint8_t flag1 = false;
uint8_t flag2 = false;
uint8_t flag3 = false;
uint8_t flag4 = false;

void setup() {
  
  pinMode(MIDDLE_LED, OUTPUT);
  pinMode(LED_SELECT, OUTPUT);
  pinMode(LED1_OR_4, OUTPUT);
  pinMode(LED2_OR_5, OUTPUT);
  pinMode(LED3_OR_6, OUTPUT);
  pinMode(LED4_OR_7, OUTPUT);

  
  proximity.setThreshold(150);
  
  Serial.begin(9600);
}

void loop() {
  scanButtons();
  ledSequence();
}



void scanButtons() {

  now = millis();
  then = now;

    
  do {
    now = millis();
        
    
    state = left.isTouched();
    state |= down.isTouched();
    state |= right.isTouched();
    state |= up.isTouched();
    
    flag1 = left.isTouched();
    flag2 = down.isTouched();
    flag3 = right.isTouched();
    flag4 = up.isTouched();
  
  
    if(flag1==1){
    Serial.println("L");
    }
    if(flag2==2){
    Serial.println("D");
    }
    if(flag3==1){
    Serial.println("R");
    }
    if(flag4==1){
    Serial.println("U");
    }
  
    if(state) {
      /* If a touch is detected, ajust the time */
      then = now;
    }

    digitalWrite(MIDDLE_LED, state);

  } while((now - then) < 1000);
}

void ledSequence() {
  uint8_t i;
  
  /* Blink LED's clockwise */
  for(i=0; i<8; i++) {
    P1OUT = startSequence[i];
    delay(150);
  }
  
  /* Blink LED' counter closkwise */
  while(i) {
    i--;
    P1OUT = startSequence[i];
    delay(50);
  }    
  
  /* Turn all LED's off */
  P1OUT = 0;
}









No hay comentarios:

Publicar un comentario