Search Code

Kontrolowanie pozycji serwomechanizmu za pomocą gestów ręcznych dla Arduino

Kontrolowanie pozycji serwomechanizmu za pomocą gestów ręcznych dla Arduino

W tym samouczku nauczymy się, jak kontrolować serwomotor za pomocą gestów ręki. Przesuwając rękę w lewo lub w prawo, możesz sprawić, że serwomotor zareaguje odpowiednio. Ten projekt wykorzystuje czujnik gestów APDS-9960 do wykrywania ruchów ręki i przekształcania ich w pozycje serwomotoru. Aby uzyskać szczegółowe wizualne wyjaśnienie, upewnij się, że sprawdzisz wideo (w wideo o 00:30).

APDS-9960 gesture sensor module -1

Główne komponenty, które będziemy używać, to silnik serwo i czujnik gestów APDS-9960. Silnik serwo będzie obracał się do określonych kątów w zależności od wykrytych gestów, podczas gdy czujnik APDS-9960 będzie interpretował ruchy rąk. Ta konfiguracja umożliwia intuicyjne sterowanie serwem bez fizycznego dotyku.

Wyjaśnienie sprzętu

Serwomotor to małe urządzenie, które może obracać się do określonych kątów, co czyni je idealnym do zastosowań wymagających precyzyjnego pozycjonowania. Zazwyczaj ma trzy przewody: zasilanie (czerwony), masa (czarny) i sygnał (pomarańczowy). Przewód sygnałowy odbiera polecenia, aby przesunąć serwomotor do określonego kąta.

APDS-9960 to wszechstronny czujnik, który może wykrywać gesty, światło otoczenia i kolor. Komunikuje się z Arduino za pomocą I2C i wymaga kilku pinów do zasilania i transferu danych. Czujnik może wykrywać ruchy takie jak w górę, w dół, w lewo i w prawo, które wykorzystamy do sterowania serwomechanizmem.

Szczegóły karty katalogowej

ProducentBroadcom
Numer częściAPDS-9960
Napięcie logiczne/IO2,4 - 3,6 V
Napięcie zasilania2,4 - 3,6 V
Prąd wyjściowy (na kanał)20 mA max
Wskazówki dotyczące częstotliwości PWMNie dotyczy
Progi logiki wejściowej0,3 V (niski), 0,7 V (wysoki)
Spadek napięcia / RDS(on)/ nasycenieNie dotyczy
Limity termiczne-40 do 85 °C
Pakiet6,0 x 3,0 mm
Notatki / wariantyWykrywanie gestów, wykrywanie światła RGB
  • Upewnij się, że serwomechanizm jest zasilany odpowiednim napięciem (zwykle 5V).
  • Podłącz APDS-9960 do Arduino za pomocą komunikacji I2C.
  • Zwróć uwagę na pin przerwania dla czujnika gestów.
  • Użyj rezystorów podciągających, jeśli to konieczne, dla stabilnego wykrywania sygnału.
  • Upewnij się, że skalibrujesz czujnik w różnych warunkach oświetleniowych, aby uzyskać lepszą dokładność.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Aby podłączyć komponenty, zacznij od serwomotoru. Podłącz czerwony przewód do pinu 5V Arduino, czarny przewód do masy (GND), a pomarańczowy przewód sygnałowy do pinu.9To pozwoli Arduino kontrolować pozycję serwomechanizmu.

Następnie podłącz czujnik gestów APDS-9960. PodłączV_Npodłącz do 3.3V Arduino, a następnieGNDprzypnij do ziemi. TheINTpin powinien być podłączony do pinu2na Arduino, podczas gdy SDAiSCLpiny idą do pinówA4iA5, odpowiednio. Ta konfiguracja pozwala czujnikowi skutecznie komunikować się z Arduino.

Przykłady kodu i przewodnik

W funkcji setup inicjalizujemy serwomechanizm i czujnik gestów. Liniamyservo.attach(9);wiąże serwomechanizm z pinem 9, który wcześniej podłączyliśmy. To pozwala serwomechanizmowi odbierać polecenia z 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);
}

Następnie definiujemy, jak system obsługuje gesty w funkcji pętli. MetodahandleGesture();sprawdza dostępne gesty i wykonuje odpowiadające akcje. Na przykład, jeśli wykryty gest to lewy, serwo przesunie się do 180 stopni.

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;
    }
  }
}

Na koniec pętla nieprzerwanie sprawdza gesty i aktualizuje pozycję serwomechanizmu na podstawie wykrytego gestu. Upewnij się, że przetestujesz konfigurację w różnych warunkach oświetleniowych, aby uzyskać dokładne rozpoznawanie gestów.

Demonstracja / Czego się spodziewać

Gdy wszystko jest podłączone, a kod jest załadowany, powinieneś być w stanie kontrolować serwomechanizm, poruszając ręką w lewo lub w prawo. Serwomechanizm obróci się o 180 stopni w przypadku gestu w lewo i wróci do 0 stopni w przypadku gestu w prawo. Jeśli gesty nie są wykrywane, sprawdź położenie czujnika i warunki oświetleniowe w otoczeniu (w wideo o 05:30).

Rozdziały

  • Wprowadzenie - 00:00
  • Przegląd sprzętu - 01:30
  • Instrukcje dotyczące okablowania - 03:00
  • Wyjaśnienie kodu - 04:30
  • Demonstracja - 06:00

Obrazy

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
Język: C++
++
/****************************************************************
Modified for RoboJax by A.B.S. on May 09, 2017
in Ajax, Ontario, Canada. www.RoboJax.com


Original Source:
APDS-9960 RGB and Gesture Sensor
Shawn Hymel @ SparkFun Electronics
May 30, 2014
https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor


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

#include <Wire.h>

// added by RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo;  // create servo object to control a servo // added by RoboJax

// 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(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);
  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");
        break;
      case DIR_DOWN:
        Serial.println("DOWN");
        break;
      case DIR_LEFT:
        Serial.println("LEFT");
        myservo.write(180);  // added by RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0);   // added by RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Zasoby i odniesienia

Brak zasobów.

Pliki📁

Brak dostępnych plików.