Suchcode

Lektion 100: Steuern Sie einen Servomotor mit Ihren Handgesten

Lektion 100: Steuern Sie einen Servomotor mit Ihren Handgesten

Stellen Sie sich vor, Sie steuern einen Servomotor mit nichts weiter als einer Handbewegung. Dieses Projekt verwendet den APDS-9960-Gesten-Sensor, um Handbewegungen (links, rechts, oben, unten, nah und fern) zu erkennen und sie in Servopositionen umzusetzen. Es ist eine unterhaltsame und intuitive Möglichkeit, gestenbasierte Steuerung zu Ihren Arduino-Projekten hinzuzufügen. Sie können damit eine freihändige Kamera-Gimbal, einen gestengesteuerten Roboterarm, einen berührungslosen Lautstärkeregler für einen Musikplayer oder eine interaktive Kunstinstallation, die auf Bewegungen reagiert, erstellen. Der Sensor erkennt die Richtung Ihrer Hand und der Servo folgt, während der serielle Monitor die erkannte Geste in Echtzeit anzeigt.

APDS-9960 gesture sensor -3
APDS-9960 Gesten-Sensor -3

Hardware-Komponenten

  • Arduino Uno (oder ein beliebiges kompatibles Board)
  • APDS-9960 RGB- und Gesten-Sensor
  • Servomotor (z. B. SG90 oder ähnlich)
  • Jumper-Kabel

Der APDS-9960-Sensor ist eine vielseitige Komponente, die Gesten, Nähe und Umgebungslicht erkennen kann. Das spezifische Board, das Sie haben, kann in Form oder Farbe variieren, aber der zugrunde liegende Sensor und die Pin-Funktionen bleiben gleich. Für dieses Projekt konzentrieren wir uns auf die Gestenerkennungsfähigkeiten und verwenden die I2C-Pins (SDA und SCL) zusammen mit dem Interrupt-Pin, um mit dem Arduino zu kommunizieren. Der Sensor muss mit 3,3 V versorgt werden, da er nicht 5-V-tolerant ist. Der Servomotor ist ein standardmäßiger analoger Servo, den wir mit einem PWM-fähigen Pin steuern.

Verdrahtungsanleitung

Arduino-Verdrahtung des APDS9960 zur Steuerung eines Servomotors per Handgeste

Hier ist das Verdrahtungsdiagramm für den Anschluss des APDS-9960-Sensors und des Servomotors an den Arduino Uno. (im Video bei 01:45)

APDS-9960 Gesten-Sensor Verbindungen

  • VCC → Arduino 3.3V (der Sensor ist nicht 5-V-tolerant)
  • GND → Arduino GND
  • SDA → Arduino A4 (I2C-Daten)
  • SCL → Arduino A5 (I2C-Takt)
  • INT → Arduino Pin 2 (muss ein interruptfähiger Pin sein)

Servomotor Verbindungen

  • Signal (orangefarbenes oder weißes Kabel) → Arduino Pin 9 (PWM-fähiger Pin)
  • Strom (mittleres Kabel, normalerweise rot) → Arduino 5V
  • Masse (braunes oder schwarzes Kabel) → Arduino GND

Es ist entscheidend, den Interrupt-Pin des Sensors mit einem der Interrupt-Pins des Arduino zu verbinden (Pins 2 oder 3 auf dem Uno). Dadurch kann der Sensor den Mikrocontroller sofort signalisieren, wenn eine Geste erkannt wird, anstatt den Sensor ständig abzufragen. Für den Servo stellen Sie sicher, dass Sie einen PWM-fähigen Pin verwenden (auf dem Board mit einer Tilde "~" gekennzeichnet). Das Anschließen des Servos an einen Nicht-PWM-Pin wie Pin 4 verhindert, dass er korrekt funktioniert. (im Video bei 02:14)

Code-Erklärung

Bevor Sie den Code hochladen, müssen Sie die SparkFun APDS-9960-Bibliothek installieren. Gehen Sie in der Arduino-IDE zu Sketch → Bibliothek einbinden → Bibliotheken verwalten, suchen Sie nach "APDS9960" und installieren Sie die Bibliothek von SparkFun. (im Video bei 02:38)

Der Code für dieses Projekt ist unkompliziert. Die wichtigsten benutzerkonfigurierbaren Teile sind die Variablen am Anfang des Sketches. Sie können diese anpassen, um das Verhalten des Servos zu ändern, ohne den Rest des Codes zu berühren.

int servoPin  = 9;          // Pin für das Servosignal
int downAngle = 135;        // Servowinkel für die UNTEN-Geste
int upAngle = 45;           // Servowinkel für die OBEN-Geste
int rightAngle = 0;         // Servowinkel für die RECHTS-Geste
int leftAngle = 180;        // Servowinkel für die LINKS-Geste
int angleStep = 2;          // Schrittgröße für das Schwenken des Servos
int angle = 90;             // Anfangswinkel des Servos

Diese Variablen definieren die Zielpositionen des Servos für jede Geste. Zum Beispiel ist leftAngle auf 180 Grad eingestellt, sodass sich der Servo auf 180 Grad dreht, wenn Sie Ihre Hand nach links bewegen. Sie können diese Werte ändern, um sie an Ihren mechanischen Aufbau anzupassen. Die Variable angleStep steuert die Geschwindigkeit und Glätte des Servoschwenks, wenn eine NAH-Geste erkannt wird; ein kleinerer Wert führt zu einer langsameren, glatteren Bewegung.

APDS-9960 gesture sensor -3

Die Funktion nearAction() ist eine benutzerdefinierte Routine, die den Servo von seinem minimalen Winkel zu seinem maximalen Winkel und dann wieder zurück schwenkt. Dies wird ausgelöst, wenn Sie Ihre Hand nahe an den Sensor bewegen. Die Funktion farAction() ist ein Platzhalter, in dem Sie Ihren eigenen Code hinzufügen können, um zu definieren, was passiert, wenn eine FERN-Geste erkannt wird.

Live-Projektdemonstration

Sobald der Code hochgeladen ist, ist der Sensor bereit. In der Demonstration bewegt sich der Servo nach links (180 Grad), wenn eine Hand nach links gewischt wird; bei einer Bewegung nach rechts bewegt er sich nach rechts (0 Grad). Der serielle Monitor zeigt die erkannte Geste an. Bei UP- und DOWN-Gesten bewegt sich der Servo zu den von Ihnen definierten Winkeln. Eine NEAR-Geste löst eine Schwenkbewegung von 0 bis 180 Grad und zurück aus, während eine FAR-Geste erkannt wird, wenn Ihre Hand entfernt wird. Das System reagiert zuverlässig auf alle Gesten und ist ein großartiger Ausgangspunkt für komplexere gestensteuerungsbasierte Projekte. (im Video bei 03:26)

Video-Kapitel

  • [00:00] Einführung und Projektdemonstration
  • [00:47] Hardware-Überblick: APDS-9960-Sensor und Servo
  • [01:45] Verdrahtungsanleitung für Sensor und Servo
  • [02:38] Installation der SparkFun APDS-9960-Bibliothek
  • [03:26] Live-Demonstration und serielle Monitorausgabe
  • [04:27] Abschlussbemerkungen und Unterstützung

Bilder

SG90 Mini Servo Motor
SG90 Mini Servo Motor
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
SG90 servo
SG90 servo
414-Lesson 100: Control a Servo Motor with Your Hand Gestures
Sprache: C++
/*
 * Arduino Step by Step Course by Robojax 
 * Lesson 100: Control Servo Motor with your hand gesture 
 * Using hand gesture RIGHT, LEFT, UP, DOWN, FAR, NEAR we control the motor in any way we want
 * video details: https://youtu.be/BUSqppjNw-Y
 * Code written based on sample from this code https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * on February 13, 2022 by Ahmad Shamshiri.
 * 
 * This code is part of Arduino Step by Step Course which starts here:  https://youtu.be/-6qSrDUA5a8
 * 
 * for library of this code visit http://robojax.com/
 * 
If you found this tutorial helpful, please support me so I can continue creating 
content like this. Make a donation using PayPal by credit card https://bit.ly/donate-robojax
  
 * This code is "AS IS" without warranty or liability. Free to be used as long as you keep this note intact.* 
 * This code has been downloaded from Robojax.com
    This program is free software: you can redistribute it and/or modify
    it under the terms of the GNU General Public License as published by
    the Free Software Foundation, either version 3 of the License, or
    (at your option) any later version.

    This program is distributed in the hope that it will be useful,
    but WITHOUT ANY WARRANTY; without even the implied warranty of
    MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the
    GNU General Public License for more details.

    You should have received a copy of the GNU General Public License
    along with this program.  If not, see <https://www.gnu.org/licenses/>.
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor

Tests the gesture sensing abilities of the APDS-9960. Configures
APDS-9960 over I2C and waits for gesture events. Calculates the
direction of the swipe (up, down, left, right) and displays it
on a serial console. 

To perform a NEAR gesture, hold your hand
far above the sensor and move it close to the sensor (within 2
inches). Hold your hand there for at least 1 second and move it
away.

To perform a FAR gesture, hold your hand within 2 inches of the
sensor for at least 1 second and then move it above (out of
range) of the sensor.

Hardware Connections:

IMPORTANT: The APDS-9960 can only accept 3.3V!
 
 Arduino Pin  APDS-9960 Board  Function
 
 3.3V         VCC              Power
 GND          GND              Ground
 A4           SDA              I2C Data
 A5           SCL              I2C Clock
 2            INT              Interrupt

Resources:
Include Wire.h and SparkFun_APDS-9960.h

This code is beerware; if you see me (or any other SparkFun 
employee) at the local, and you've found our code helpful, please
buy us a round!

Distributed as-is; no warranty is given.
****************************************************************/

#include <Wire.h>
#include <Servo.h>
#include <SparkFun_APDS9960.h>
//see details in this video: https://youtu.be/BUSqppjNw-Y
int servoPin  =9;
int downAngle =135;
int upAngle = 45;
int rightAngle = 0;
int leftAngle = 180;

int angleStep =2;
int angle =90; //initial Angle

const int minAngle = 0;
const int maxAngle = 180;
Servo myservo;  // create servo object to control a servo

// Pins
#define APDS9960_INT    2 // Needs to be an interrupt pin

// Constants

// Global Variables
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(servoPin);  // 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);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));
  
  // Initialize interrupt service routine
  attachInterrupt(0, interruptRoutine, FALLING);

  // Initialize APDS-9960 (configure I2C and initial values)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }
  
  // Start running the APDS-9960 gesture sensor engine
  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");
        myservo.write(upAngle); 
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        myservo.write(downAngle);  
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(leftAngle);  
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(rightAngle);  
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        nearAction();
        break;
      case DIR_FAR:
        Serial.println("FAR");
        farAction();
        break;
      default:
        Serial.println("NONE");
    }
  }
}

void nearAction()
{

  for (angle = minAngle; angle <= maxAngle; angle += angleStep) { 
    // in steps of angleStep degree
    myservo.write(angle); 
    delay(15);                   
  }
  for (angle = maxAngle; angle >= minAngle; angle -= angleStep) { 
    myservo.write(angle);              
    delay(15);                      
  }  
}//nearAction() ends


 void farAction()
{

 //do something here
}//farAction() ends

Ressourcen & Referenzen

Noch keine Ressourcen vorhanden.

Dateien📁

Andere Dateien