検索コード

レッスン86:ポテンショメータを使用してサーボモーターの位置を制御する

レッスン86:ポテンショメータを使用してサーボモーターの位置を制御する

#include <Servo.h>

Servo myservo;  // サーボを制御するためのサーボオブジェクトを作成

int potpin = A0;  // ポテンショメータを接続するアナログピン
int servoPin = 3; // サーボ用のデジタルピン(PWM対応)を定義。使用できるのはピン3、5、6、9、10、11のみ
int VCC2 = 8;// ポテンショメータ用の追加VCCを定義
int val;    // アナログピンから値を読み取る変数

setup()関数では、サーボを初期化し、追加の電源ピンを設定します。myservo.attach(servoPin)関数は、サーボの信号線がArduinoのどのピンに接続されているかを指定するため、不可欠です。

void setup() {
  Serial.begin(9600);          //  シリアル通信を設定
  myservo.attach(servoPin);  // ピン3のサーボをサーボオブジェクトに接続

  pinMode(VCC2, OUTPUT);// ピン8を出力として設定
  digitalWrite(VCC2, HIGH);// ピン8をHIGHにして5Vピンとして機能させる
}

中核となるロジックはloop()関数にあります。ポテンショメータの値を読み取り、角度に変換して、サーボに動くよう指示します。ここで重要な2つの関数はanalogRead()map()です。(ビデオの04:27)

void loop() {
  val = analogRead(potpin);            // ポテンショメータの値を読み取る(0から1023の間の値)
  val = map(val, 0, 1023, 0, 180);     // サーボで使用できるようにスケール変換(0から180の間の値)
  myservo.write(val);                  // スケール変換された値に応じてサーボの位置を設定
  Serial.print(val);
  Serial.println();
  delay(50);                           // サーボがその位置に到達するのを待つ
}

仕組みは次のとおりです:

  • analogRead(potpin):この関数はポテンショメータのワイパーから電圧を読み取り、0(0V)から1023(5V)の間の値を返します。
  • map(val, 0, 1023, 0, 180):これはプロジェクト全体の鍵です。ポテンショメータからの生の値(0から1023)を、比例的にサーボ角度(0から180度)に変換します。例えば、ポテンショメータが511(約半分)を読み取った場合、map()関数は90を返し、サーボを中央位置に動かします。
  • myservo.write(val):この関数は計算された角度(現在valに格納されている)を受け取り、サーボにその位置まで回転するよう指示します。
  • delay(50):各ループの最後に小さな一時停止を追加します。更新レートを制御します。より大きな遅延(200msなど)はサーボを段階的に動かし、より小さな遅延(50msなど)は動きを非常に滑らかにします。応答性を変えるためにこれを調整できます。(ビデオの07:26)

ライブプロジェクトデモンストレーション

ビデオでは、プロジェクトが動作している様子を見ることができます。ポテンショメータのつまみを回すと、サーボモータのアームがその位置に比例して追従します。シリアルモニタには現在の角度が表示され、マッピングが正しく機能していることを確認できます。ポテンショメータが最小位置にあるとき、サーボは0度です。つまみを最大まで回すと、サーボは滑らかに180度まで回転します。(ビデオの06:33)

このリアルタイムのフィードバックループは、アナログセンサとデジタルアクチュエータのシームレスな統合を示し、応答性が高く直感的な制御システムを生み出しています。

チャプター

  • [00:00] はじめにとプロジェクト概要
  • [01:05] 回路図と配線図
  • [02:07] 物理的な配線のデモンストレーション
  • [03:00] コードの説明
  • [06:33] ライブデモンストレーションとテスト
  • [07:26] サーボ応答速度の調整

画像

Arduino wiring or servo motor with pot
Arduino wiring or servo motor with pot
SG90_servo_motor-1
SG90_servo_motor-1
SG90_servo_motor-0
SG90_servo_motor-0
892-Lesson 86: Controlling a servo position using a potentiometer (variable resistor)
言語: C++
/*
 * Lesson 88: Controlling Servo motor a with Potentiometer
 * 📚⬇️ Download and resource page https://robojax.com/RJT763
 watch full video tutroial: https://www.youtube.com/watch?v=ntRW77mNFFk
 
 Controlling a servo position using a potentiometer (variable resistor)
 by Michal Rinott <http://people.interaction-ivrea.it/m.rinott>

 modified on 8 Nov 2013
 by Scott Fitzgerald
 http://www.arduino.cc/en/Tutorial/Knob

 Update by Ahmad Shamshiri on Jan 01, 2019  in Ajax, Ontario, Canada


*/

#include <Servo.h>

Servo myservo;  // create servo object to control a servo

int potpin = A0;  // analog pin used to connect the potentiometer
int servoPin = 3; // define a digital pin (with PWM) for servo. Can use only pin 3, 5, 6,9, 10, 11
int VCC2 = 8;// define extra VCC for potentiometer
int val;    // variable to read the value from the analog pin

void setup() {
  //
  Serial.begin(9600);          //  setup serial
  myservo.attach(servoPin);  // attaches the servo on pin 3 to the servo object

  pinMode(VCC2, OUTPUT);// set pin 8 as output
  digitalWrite(VCC2, HIGH);// set pin 8 HIGH so it acts as 5V pin
}

void loop() {
  
  val = analogRead(potpin);            // reads the value of the potentiometer (value between 0 and 1023)
  val = map(val, 0, 1023, 0, 180);     // scale it to use it with the servo (value between 0 and 180)
  myservo.write(val);                  // sets the servo position according to the scaled value
  Serial.print(val);
  Serial.println();
  delay(50);                           // waits for the servo to get there
}
 

必要かもしれないもの

ファイル📁

他のファイル