このチュートリアルはの一部です: サーボモーター
サーボモーターに関連するすべてのビデオをここに掲載しています。他のビデオへのリンクはこの記事の下にあります。
Arduino用の手のジェスチャーによるサーボ位置の制御
このチュートリアルでは、手のジェスチャーを使ってサーボモーターを制御する方法を学びます。手を左または右に動かすことで、サーボモーターがそれに応じて反応します。このプロジェクトでは、APDS-9960ジェスチャーセンサーを使用して手の動きを検出し、それをサーボの位置に変換します。詳細な視覚的説明については、(動画の00:30で)動画をチェックしてください。

使用する主要なコンポーネントには、サーボモーターとAPDS-9960ジェスチャーセンサーが含まれます。サーボモーターは、検出されたジェスチャーに基づいて特定の角度に回転し、APDS-9960センサーは手の動きを解釈します。このセットアップにより、物理的な接触なしでサーボを直感的に制御することが可能になります。
ハードウェアの解説
サーボモーターは特定の角度に回転できる小型デバイスで、精密な位置決めを必要とするアプリケーションに最適です。通常、電源(赤)、グラウンド(黒)、信号(オレンジ)の3本のワイヤがあります。信号ワイヤは、サーボを指定された角度に移動させるためのコマンドを受信します。
APDS-9960は、ジェスチャー、周囲光、色を検出できる多用途センサーです。I2Cを介してArduinoと通信し、電源とデータ転送のためにいくつかのピンが必要です。このセンサーは、上、下、左、右などの動きを検出でき、これを使用してサーボを制御します。
データシートの詳細
| 製造業者 | ブロードコム |
|---|---|
| 部品番号 | APDS-9960 |
| ロジック/IO電圧 | 2.4 - 3.6 V |
| 供給電圧 | 2.4 - 3.6 V |
| 出力電流(チャネルごと) | 最大20 mA |
| PWM周波数ガイダンス | 該当なし |
| 入力ロジック閾値 | 0.3 V(低)、0.7 V(高) |
| 電圧降下 / RDS(on)/ 飽和度 | 該当なし |
| 熱的限界 | -40から85 °C |
| パッケージ | 6.0 x 3.0 mm |
| ノート / バリアント | ジェスチャーセンサー、RGB光センサー |
- サーボに適切な電圧(通常は5V)が供給されていることを確認してください。
- APDS-9960をI2C通信を使用してArduinoに接続します。
- ジェスチャーセンサーの割り込みピンに注意してください。
- 必要に応じてプルアップ抵抗を使用して、安定した信号検出を行ってください。
- 異なる照明条件でセンサーをキャリブレーションして、より高い精度を確保してください。

コンポーネントを配線するには、サーボモーターから始めます。赤いワイヤーをArduinoの5Vピンに接続し、黒いワイヤーをグラウンド(GND)に接続し、オレンジの信号ワイヤーをピンに接続します。9これにより、Arduinoがサーボの位置を制御できるようになります。
次に、APDS-9960 ジェスチャーセンサーを配線します。接続するV_NArduinoの3.3Vにピンを接続し、GND地面にピンを刺す。INTピンはピンに接続する必要があります。2Arduino上で、〜の間にSDAとSCLピンはピンに行くA4とA5それぞれ。この構成により、センサーはArduinoと効果的に通信できるようになります。
コード例とウォークスルー
セットアップ関数では、サーボとジェスチャーセンサーを初期化します。行myservo.attach(9);サーボを以前接続したピン9にバインドします。これにより、サーボはArduinoからコマンドを受け取ることができます。

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
このチュートリアルはの一部です: サーボモーター
- Arduinoを使ってプッシュボタンでサーボを制御する
- Control a Servo Motor with a Push Button: Move Servo and Return SPB-1
- Control a Servo Motor with a Push Button: Move Servo in One Direction SPB-2
- Controlling a Servo Motor with a Push Button: Move Servo While Button Is Pressed (SPB-3)
- Arduinoを使ってポテンショメータでサーボを制御する
- Arduinoを使ってポテンショメータとLCD1602でサーボを制御する
- Arduinoを使った赤外線リモコンによるサーボモーターの制御
- ポテンショメーターを使用したArduinoサーボモーター制御
- Controlling Two or More Servos with Potentiometers Using an Arduino
- How to Control a 360° Servo with Three Push-Button Switches
- How to Use Continuous 360° Servo with Arduino
- PCA9685 16チャンネル 12ビット サーボコントローラ V1 用の Arduino コードとビデオ
- Build an Arduino Servo Toggle Switch with a Push Button
++
/*
* RoboJax用にA.B.S.によって修正されました。2017年5月9日、カナダ・オンタリオ州エイジャックスにて。www.RoboJax.com
*
* 原著:
* APDS-9960 RGBおよびジェスチャーセンサー
* ショーン・ハイメル @ SparkFun Electronics
* 2014年5月30日
* 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");
}
}
}
リソースと参考文献
まだリソースはありません。
ファイル📁
ファイルは利用できません。