Código de Pesquisa

Controlando a Posição do Servo com Gestos de Mão para Arduino

Controlando a Posição do Servo com Gestos de Mão para Arduino

Neste tutorial, aprenderemos como controlar um motor servo usando gestos das mãos. Ao mover sua mão para a esquerda ou para a direita, você pode fazer o motor servo responder de acordo. Este projeto utiliza o sensor de gestos APDS-9960 para detectar movimentos das mãos e traduzi-los em posições do servo. Para uma explicação visual detalhada, não deixe de conferir o vídeo (no vídeo em 00:30).

APDS-9960 gesture sensor module -1

Os componentes principais que usaremos incluem um motor servo e o sensor de gestos APDS-9960. O motor servo irá girar para ângulos específicos com base nos gestos detectados, enquanto o sensor APDS-9960 interpretará os movimentos das mãos. Essa configuração permite uma maneira intuitiva de controlar o servo sem toque físico.

Hardware Explicado

O motor servo é um pequeno dispositivo que pode girar em ângulos específicos, tornando-o ideal para aplicações que requerem posicionamento preciso. Ele geralmente possui três fios: alimentação (vermelho), terra (preto) e sinal (laranja). O fio de sinal recebe comandos para mover o servo para um ângulo especificado.

O APDS-9960 é um sensor versátil que pode detectar gestos, luz ambiente e cor. Ele se comunica com o Arduino via I2C e requer alguns pinos para alimentação e transferência de dados. O sensor pode detectar movimentos como para cima, para baixo, para a esquerda e para a direita, que usaremos para controlar o servo.

Detalhes da Ficha Técnica

FabricanteBroadcom
Número da peçaAPDS-9960
Tensão de lógica/IO2,4 - 3,6 V
Tensão de alimentação2,4 - 3,6 V
Corrente de saída (por canal)20 mA máximo
Orientação sobre a frequência PWMNão aplicável
Limiares de lógica de entrada0,3 V (baixo), 0,7 V (alto)
Queda de tensão / RDS(on)/ saturaçãoNão aplicável
Limites térmicos-40 a 85 °C
Pacote6,0 x 3,0 mm
Notas / variantesDetecção de gestos, detecção de luz RGB
  • Certifique-se de que o servo está alimentado com uma voltagem adequada (tipicamente 5V).
  • Conecte o APDS-9960 ao Arduino usando comunicação I2C.
  • Preste atenção ao pino de interrupção do sensor de gestos.
  • Use resistores de pull-up se necessário para uma detecção de sinal estável.
  • Certifique-se de calibrar o sensor em diferentes condições de iluminação para melhor precisão.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Para conectar os componentes, comece com o motor servo. Conecte o fio vermelho ao pino de 5V do Arduino, o fio preto ao terra (GND) e o fio de sinal laranja ao pino.9. Isso permitirá que o Arduino controle a posição do servo.

Em seguida, conecte o sensor de gestos APDS-9960. Conecte oV_Npino para o 3,3V do Arduino, e oGNDpino ao chão. OINTo pino deve ser conectado ao pino2no Arduino, enquanto oSDAeSCLpinos vão para pinosA4eA5, respectivamente. Esta configuração permite que o sensor se comunique efetivamente com o Arduino.

Exemplos de Código e Passo a Passo

Na função de configuração, inicializamos o servo e o sensor de gestos. A linhamyservo.attach(9);vincula o servo ao pino 9, que conectamos anteriormente. Isso permite que o servo receba comandos do Arduino.

APDS-9960 gesture sensor -3
void setup() {
 myservo.attach(9);  // attaches the servo on pin 9 to the servo object
 // Set interrupt pin as input
 pinMode(APDS9960_INT, INPUT);
 // Initialize Serial port
 Serial.begin(9600);
}

Em seguida, definimos como o sistema lida com gestos na função de loop. O métodohandleGesture();verifica gestos disponíveis e executa ações correspondentes. Por exemplo, se o gesto detectado for à esquerda, o servo se moverá para 180 graus.

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_LEFT:
        myservo.write(180);  // added by RoboJax
        break;
      case DIR_RIGHT:
        myservo.write(0);   // added by RoboJax
        break;
    }
  }
}

Finalmente, o loop verifica continuamente os gestos e atualiza a posição do servo com base no gesto detectado. Certifique-se de testar a configuração em várias condições de iluminação para obter um reconhecimento de gestos preciso.

Demonstração / O que Esperar

Uma vez que tudo esteja conectado e o código esteja carregado, você deve ser capaz de controlar o servo movendo sua mão para a esquerda ou para a direita. O servo irá girar para 180 graus para um gesto à esquerda e retornar a 0 graus para um gesto à direita. Se os gestos não forem detectados, verifique a posição do sensor e as condições de luz ao redor (no vídeo às 05:30).

Capítulos

  • Introdução - 00:00
  • Visão Geral do Hardware - 01:30
  • Instruções de Fiação - 03:00
  • Explicação do Código - 04:30
  • Demonstração - 06:00

Imagens

APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -2
APDS-9960 gesture sensor module -1
APDS-9960 gesture sensor module -1
Arduino wiring of APDS9960 to control Servo motor using hand gesture
Arduino wiring of APDS9960 to control Servo motor using hand gesture
APDS-9960 gesture sensor -3
APDS-9960 gesture sensor -3
12-Source code for controlling a servo with your hand
Idioma: C++
++
/*
 * Modificado para RoboJax por A.B.S. em 09 de maio de 2017 em Ajax, Ontário, Canadá. www.RoboJax.com
 * 
 * Fonte Original:
 * Sensor RGB e de Gestos APDS-9960
 * Shawn Hymel @ SparkFun Electronics
 * 30 de maio de 2014
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Distribuído como está; nenhuma garantia é dada.
 */

#include <Wire.h>

 // adicionado por RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // criar objeto servo para controlar um servo // adicionado por RoboJax

 // Pinos
#define APDS9960_INT    2 // Precisa ser um pino de interrupção

 // Constantes

 // Variáveis Globais
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // anexa o servo no pino 9 ao objeto servo
 // Configure o pino de interrupção como entrada
  pinMode(APDS9960_INT, INPUT);

 // Inicialize a porta Serial
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Inicializar a rotina de serviço de interrupção
  attachInterrupt(0, interruptRoutine, FALLING);

 // Inicializar APDS-9960 (configurar I2C e valores iniciais)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Inicie o motor do sensor de gestos APDS-9960.
  if ( apds.enableGestureSensor(true) ) {
    Serial.println(F("Gesture sensor is now running"));
  } else {
    Serial.println(F("Something went wrong during gesture sensor init!"));
  }
}

void loop() {
  if( isr_flag == 1 ) {
    detachInterrupt(0);
    handleGesture();
    isr_flag = 0;
    attachInterrupt(0, interruptRoutine, FALLING);
  }
}

void interruptRoutine() {
  isr_flag = 1;
}

void handleGesture() {
    if ( apds.isGestureAvailable() ) {
    switch ( apds.readGesture() ) {
      case DIR_UP:
        Serial.println("UP");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(180); // adicionado por RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // adicionado por RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Recursos e referências

Ainda não há recursos.

Arquivos📁

Nenhum arquivo disponível.