🐭 Ratón sin contacto 🖱️

Usando un sensor de flujo óptico para convertir los gestos en el aire en movimientos del mouse.

 

Componentes y suministros

Desglose de flujo 585px 1 9tqjtxglmt
Escape de flujo Bitcraze
× 1
A000057 Destacado
arduino leonardo
× 1

Acerca de este proyecto

Este proyecto implementa un ratón sin contacto.

los Bitcraze flujo de escape contiene un sensor de flujo óptico capaz de detectar cómo se mueven las cosas frente a él y un sensor de rango para detectar la distancia al objeto más cercano. El sensor de flujo es básicamente un sensor de ratón óptico equipado con una lente enfocada para rastrear objetos distantes.

El mouse sin contacto puede detectar que una mano se acerca y detectar cómo se mueve, los movimientos se traducen en movimientos del mouse mediante un Arduino.

Usando un Arduino Leonardo (o cualquier otro Arduino compatible con un dispositivo USB), este proyecto se considera un mouse normal, por lo que funciona de inmediato en cualquier computadora.

configuración de hardware

La plataforma de flujo está conectada a dos buses Arduino:

  • El sensor de seguimiento óptico PMW3901 está conectado al bus SPI
  • El telémetro VL53 está conectado al bus i2C

También necesitamos alimentar el puente de flujo, esto se hace conectándolo al pin 5V y GND del Arduino. Tenga en cuenta que en Arduino Leonardo, solo se puede acceder al bus SPI en el encabezado del pin ICSP.

Biblioteca requerida

Ambos sensores requieren bibliotecas para funcionar. Al usar el Administrador de la biblioteca Arduino IDE cargamos las dos bibliotecas:

  • VL53L0x para el sensor de telemetría
  • bitcraze_pmw3901 para sensor de flujo óptico

¡El código!

El código está adaptado de Inicio de distribución de flujoacabamos de agregar la parte del mouse:

#include "Bitcraze_PMW3901.h" 
#include <Wire.h> 
#include <VL53L0X.h> 
#include <Mouse.h> 
VL53L0X rangeSensor; 
// Using digital pin 10 for chip select 
Bitcraze_PMW3901 flow(10); 
void setup() { 
 Serial.begin(9600); 
 // Initialize flow sensor 
 if (!flow.begin()) { 
   Serial.println("Initialization of the flow sensor failed"); 
   while(1) { } 
 } 
 // Initialize range sensor 
 Wire.begin(); 
 rangeSensor.init(); 
 rangeSensor.setTimeout(500); 
 // Initialize Mouse 
 Mouse.begin(); 
} 
int16_t deltaX,deltaY; 
void loop() { 
 // Get motion count since last call 
 flow.readMotionCount(&deltaX, &deltaY); 
 // Get single range measurement 
 float range = rangeSensor.readRangeSingleMillimeters(); 
 // Send motion as mouse movement when the hand is between 80 and 200mm
 if (range < 200 && range > 80) { 
   Mouse.move(deltaX, -deltaY, 0); 
 }
 // Press the left mouse button when the hand is bellow 50mm
 if (range < 50) { 
   Mouse.press(); 
 } else { 
   Mouse.release(); 
 } 
} 

Cuando el sensor de telemetría detecta un objeto, a una distancia entre 80 mm y 200 mm, el movimiento medido por el sensor de flujo se envía como un movimiento de ratón. Cuando el objeto detectado es inferior a 50 mm, pulsamos el botón del ratón. La razón para mantener de 50 mm a 80 mm sin detección de movimiento o clic es garantizar que el mouse haga clic sin ningún movimiento: sin este espacio, el mouse siempre se movería un poco cuando la mano se moviera hacia abajo para hacer clic.

Manifestación

Ahora el video obligatorio:

codificado

ratón sin contactoarduino
Funciona en Arduino que tiene capacidad de dispositivo USB. Probado en Arduino Leonardo.
#include "Bitcraze_PMW3901.h" 
#include <Wire.h> 
#include <VL53L0X.h> 
#include <Mouse.h> 

VL53L0X rangeSensor; 

// Using digital pin 10 for chip select 
Bitcraze_PMW3901 flow(10); 

void setup() { 
 Serial.begin(9600); 
 // Initialize flow sensor 
 if (!flow.begin()) { 
   Serial.println("Initialization of the flow sensor failed"); 
   while(1) { } 
 } 
 // Initialize range sensor 
 Wire.begin(); 
 rangeSensor.init(); 
 rangeSensor.setTimeout(500); 
 // Initialize Mouse 
 Mouse.begin(); 
} 

int16_t deltaX,deltaY; 

void loop() { 
 // Get motion count since last call 
 flow.readMotionCount(&deltaX, &deltaY); 
 // Get single range measurement 
 float range = rangeSensor.readRangeSingleMillimeters(); 

 // Send motion as mouse movement when the hand is between 80 and 200mm
 if (range < 200 && range > 80) { 
   Mouse.move(deltaX, -deltaY, 0); 
 }

 // Press the left mouse button when the hand is bellow 50mm
 if (range < 50) { 
   Mouse.press(); 
 } else { 
   Mouse.release(); 
 } 
} 

diagramas

Diagrama del ratón sin contacto
Descargar
Diagrama del ratón sin contacto i3c2fomggq

Fuente Arduino.cc