Код для поиска

Управление положением сервопривода с помощью жестов рук для Arduino

Управление положением сервопривода с помощью жестов рук для Arduino

В этом уроке мы научимся управлять сервомотором с помощью жестов рук. Двигая рукой влево или вправо, вы можете заставить сервомотор реагировать соответствующим образом. Этот проект использует датчик жестов APDS-9960 для обнаружения движений рук и их преобразования в позиции сервомотора. Для подробного визуального объяснения обязательно посмотрите видео (в видео на 00:30).

APDS-9960 gesture sensor module -1

Основные компоненты, которые мы будем использовать, включают сервомотор и датчик жестов APDS-9960. Сервомотор будет вращаться под определенными углами в зависимости от обнаруженных жестов, в то время как датчик APDS-9960 будет интерпретировать движения рук. Эта конфигурация позволяет интуитивно управлять сервомотором без физического контакта.

Объяснение аппаратного обеспечения

Сервомотор — это небольшое устройство, которое может вращаться на определенные углы, что делает его идеальным для приложений, требующих точного позиционирования. Обычно у него три провода: питание (красный), земля (черный) и сигнал (оранжевый). Сигнальный провод получает команды на перемещение сервомотора в заданный угол.

APDS-9960 — это универсальный датчик, который может обнаруживать жесты, окружающий свет и цвет. Он общается с Arduino через I2C и требует несколько контактов для питания и передачи данных. Датчик может обнаруживать движения, такие как вверх, вниз, влево и вправо, которые мы будем использовать для управления сервоприводом.

Технические характеристики

ПроизводительБродком
Номер деталиAPDS-9960
Логическое/входное напряжение2.4 - 3.6 В
Напряжение питания2.4 - 3.6 В
Выходной ток (на канал)20 мА макс
Руководство по частоте ШИМНе применимо
Входные логические пороги0.3 В (низкое), 0.7 В (высокое)
Падение напряжения / RДС(включено)/ насыщениеНе применимо
Термические пределы-40 до 85 °C
Пакет6,0 x 3,0 мм
Заметки / вариантыДатчик жестов, датчик RGB света
  • Убедитесь, что сервопривод питается от достаточного напряжения (обычно 5В).
  • Подключите APDS-9960 к Arduino с использованием I2C-связи.
  • Обратите внимание на вывод прерывания для сенсора жестов.
  • Используйте подтягивающие резисторы, если это необходимо для стабильного обнаружения сигнала.
  • Убедитесь, что вы откалибровали сенсор в различных условиях освещения для большей точности.
Arduino wiring of APDS9960 to control Servo motor using hand gesture

Чтобы подключить компоненты, начните с сервомотора. Подключите красный провод к 5V пину Arduino, черный провод к земле (GND), а оранжевый сигнальный провод к пину.9Это позволит Arduino управлять положением сервопривода.

Далее подключите датчик жестов APDS-9960. ПодключитеV_Nподключите к 3.3V Arduino, иGNDприжмите к земле. ЭтотINTпин должен быть подключен к пину2на Arduino, в то время какSDAиSCLштифты идут к штифтамA4иA5, соответственно. Эта конфигурация позволяет датчику эффективно взаимодействовать с Arduino.

Примеры кода и пошаговое руководство

В функции настройки мы инициализируем сервопривод и сенсор жестов. Строкаmyservo.attach(9);привязывает сервопривод к пину 9, который мы ранее подключили. Это позволяет сервоприводу получать команды от 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);
}

Далее мы определяем, как система обрабатывает жесты в функции цикла. МетодhandleGesture();проверяет доступные жесты и выполняет соответствующие действия. Например, если обнаруженный жест - это влево, сервопривод переместится на 180 градусов.

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

Наконец, цикл постоянно проверяет жесты и обновляет положение сервопривода в зависимости от обнаруженного жеста. Убедитесь, что вы протестировали установку в различных условиях освещения, чтобы получить точное распознавание жестов.

Демонстрация / Что ожидать

Как только все будет подключено и код загружен, вы сможете управлять сервоприводом, двигая рукой влево или вправо. Сервопривод повернется на 180 градусов для жеста влево и вернется в 0 градусов для жеста вправо. Если жесты не распознаются, проверьте положение датчика и условия освещения вокруг (в видео на 05:30).

Главы

  • Введение - 00:00
  • Обзор оборудования - 01:30
  • Инструкции по проводке - 03:00
  • Объяснение кода - 04:30
  • Демонстрация - 06:00

Изображения

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
Язык: C++
++
/*
 * Изменено для RoboJax А.Б.С. 9 мая 2017 года в Айджа, Онтарио, Канада. www.RoboJax.com
 * 
 * Исходный источник:
 * Датчик RGB и жестов APDS-9960
 * Шон Химел @ SparkFun Electronics
 * 30 мая 2014 года
 * https://github.com/sparkfun/APDS-9960_RGB_and_Gesture_Sensor
 * 
 * Распространяется в том виде, в каком есть; гарантии не предоставляется.
 */

#include <Wire.h>

 // добавлено RoboJax
#include <Servo.h>

#include <SparkFun_APDS9960.h>


Servo myservo; // создать объект сервопривода для управления сервоприводом // добавлено RoboJax

 // Штифты
#define APDS9960_INT    2 // Должен быть вывод прерывания.

 // Константы

 // Глобальные переменные
SparkFun_APDS9960 apds = SparkFun_APDS9960();
int isr_flag = 0;

void setup() {
 myservo.attach(9); // присоединяет сервопривод к объекту сервопривода на контакте 9
 // Установите пин прерывания как вход.
  pinMode(APDS9960_INT, INPUT);

 // Инициализировать последовательный порт
  Serial.begin(9600);
  Serial.println();
  Serial.println(F("--------------------------------"));
  Serial.println(F("SparkFun APDS-9960 - GestureTest"));
  Serial.println(F("--------------------------------"));

 // Инициализируйте обработчик прерываний
  attachInterrupt(0, interruptRoutine, FALLING);

 // Инициализировать APDS-9960 (настроить I2C и начальные значения)
  if ( apds.init() ) {
    Serial.println(F("APDS-9960 initialization complete"));
  } else {
    Serial.println(F("Something went wrong during APDS-9960 init!"));
  }

 // Запустите двигатель сенсора жестов 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); // добавлено RoboJax
        break;
      case DIR_RIGHT:
        Serial.println("RIGHT");
        myservo.write(0); // добавлено RoboJax
        break;
      case DIR_NEAR:
        Serial.println("NEAR");
        break;
      case DIR_FAR:
        Serial.println("FAR");
        break;
      default:
        Serial.println("NONE");
    }
  }
}

Ресурсы и ссылки

Ресурсов пока нет.

Файлы📁

Нет доступных файлов.