Archive for Novembro, 2011

Função para debounce de botão de pressão

27 de Novembro de 2011

Desta vez decidi reinventar a roda para perceber e experimentar o exemplo de debounce que se encontra no site do Arduino e recordar como funcionam as passagens por ponteiro ou por valor nas funções em C.

Existe uma biblioteca Arduino que implementa o mesmo algoritmo ou também se pode usar um condensador de 100 nF nos terminais do botão de pressão como solução por hardware.

Quando for necessário fazer o debounce de mais que um botão de pressão num sketch posso sempre recorrer a esta função e simplificar o código.

Sketch

/*
 * Debounce function test program
 *
 * 20111126 Luis Sismeiro
 */

/* Arduino pin definition */
const int pinButton1 = 9; // Switch pin
const int pinLed1 = 13; // LED pin

/* Switch debounce variables */
int switchValueBefore1 = 0; // aux var
int buttonStatus1 = 0; // Debounced status of switch
long debounceBegin1 = 0; // aux var
long debounceTime1 = 50; // Debounce time

void setup() {
  pinMode(pinButton1, INPUT);
  pinMode(pinLed1, OUTPUT);
}

void loop() {
  switchDebounce(&switchValueBefore1, &debounceBegin1, &buttonStatus1, pinButton1, debounceTime1);

  if (buttonStatus1 == HIGH) {
    digitalWrite(pinLed1, HIGH);
  }
  else {
    digitalWrite(pinLed1, LOW);
  }
}

/*
 * Function: switch debounce
 *
 * Based on the debounce code from
 * http://www.arduino.cc/en/Tutorial/Debounce
 *
 * switchValueBefore: temporary variable for the value read before
 * debounceBegin: variable for time count when switch is pressed
 * buttonStatus: variable for the status of the switch after debounce
 * pinSwitch: pin of the switch
 * debounceTime: debounce time definition
 *
 * Output: NA
 *
 * 20111126 Luis Sismeiro
 */
void switchDebounce(int *switchValueBefore, long *debounceBegin, int *buttonStatus, int pinSwitch, long debounceTime) {
  int switchValue = 0;

  switchValue = digitalRead(pinSwitch);

  if (switchValue != *switchValueBefore) {
    *debounceBegin = millis();
  }

  if (millis() - *debounceBegin > debounceTime) {
    *buttonStatus = switchValue;
  }

  *switchValueBefore = switchValue;
}

Robot Light Chaser

10 de Novembro de 2011

Com o chassi de um carro telecomandado encontrado ao pé de casa, fiz um robot para “perseguir” luz. Usando o Arduino, uma breadboard, um L298, três LDRs e umas resistências, montei o carro que se pode ver no video a ser testado.

Video

Esquema

Código


/*
* LDR direction test with the wheels and motor
*
* 20111109 Luis Sismeiro
*/

//#define DEBUG

/* LDR pins */
const int pinLdrRight = A0;
const int pinLdrCenter = A1;
const int pinLdrLeft = A2;

/* Direction pins */
const int dirInput1 = 7;
const int dirInput2 = 8;
const int dirEnable = 12;

(more…)