1

2 つのサーボを制御する新しいクラスを作成しようとしています。私のコードは問題なくコンパイルされます。しかし、私がそれを実行すると、サーボは一方向に完全に回転します。これは、クラスをインスタンス化しようとすると発生するようです (コンストラクターで、クラス内のサーボをピンに接続するとき)。

私のクラスのヘッダーファイルには、[更新済み]があります

#ifndef ServoController_h
#define ServoController_h

#include "Arduino.h"
#include <Servo.h>

class ServoController
{
    public:
        ServoController(int rotateServoPin, int elevateServoPin);
        void rotate(int degrees);
        void elevate(int degrees);
    private:
        Servo rotateServo;
        Servo elevateServo;
        int elevationAngle;
        int azimuthAngle;
};

#endif

私のクラスのこれまでのコード:

#include "Arduino.h"
#include "ServoController.h"

ServoController::ServoController(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
    elevateServo.attach(elevateServoPin);
    rotateServo.attach(rotateServoPin);
}


void ServoController::rotate(int degrees)
{
    //TO DO
    rotateServo.write(degrees); 
}


void ServoController::elevate(int degrees)
{
    //TO DO
    elevateServo.write(degrees);    
}

そして最後に、これまでのarduinoのスケッチは次のとおりです。

#include <ServoController.h>
#include <Servo.h>

ServoController sc(2 , 3);

void setup()
{

}

void loop()
{
}  

クラスを使用せず、arduino ファイルで直接サーボ ライブラリを使用すると、サーボが正しく動作するため、使用している回路は問題ないと確信しています。

なぜこれが起こるのでしょうか?

[アップデート]

私は実際にこれを機能させました。コンストラクターで、サーボをピンに取り付けるための線を削除しました。代わりに、添付を行う別のメソッドをクラスに追加しました。

ServoController::ServoController(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
//  elevateServo.attach(elevateServoPin);
//  rotateServo.attach(rotateServoPin);
}


void ServoController::attachPins(int rotateServoPin, int elevateServoPin)
{
    azimuthAngle = 0;
    elevationAngle = 0;
    elevateServo.attach(elevateServoPin);
    rotateServo.attach(rotateServoPin);

}

次に、スケッチの setup() 関数でこれを呼び出します。

void setup()
{
  sc.attachPins(2,3);

}

setup() 関数の外にサーボを取り付けると、問題が発生するようです。

[7月27日午後9時13分更新]

別のテストで何かを確認しました:

setup() の前にサーボを取り付けた新しいスケッチを作成しました。

#include <Servo.h>

Servo servo0;
servo0.attach(2);

void setup()
{

}


void loop() // this function runs repeatedly after setup() finishes
{
  servo0.write(90);
  delay(2000);  
  servo0.write(135);
  delay(2000);
  servo0.write(45);
  delay(2000);
}

コンパイルしようとすると、Arduino がエラーをスローします。

"testservotest:4: エラー: '.' の前にコンストラクタ、デストラクタ、または型変換が必要です。トークン"

エラーが発生しましたが、クラスから attach メソッドが呼び出されたときにスローされませんでした

どうもありがとう

4

2 に答える 2

0

クラスで必要な場合は、クラスにピン割り当てを行うメソッドが必要であり、このメソッドをsetup()(1 回限りの割り当て) またはloop()(プログラム実行中の動的割り当て) で呼び出す必要があります。

Servo.hオブジェクトを作成してから実行するまでの間に、サーボ出力を管理するためのタイマーが壊れるため、ライブラリを使用する場合、グローバル変数のコンストラクターでピン割り当てを行うことができませんsetup()

于 2015-01-05T17:24:06.463 に答える