Arduino Servo sẽ không di chuyển khi sử dụng các lớp


7

Tôi đang cố gắng để làm cho một lớp hoạt động với Arduino, tuy nhiên nó dường như không kích hoạt đúng. Các code được biên soạn một cách hoàn hảo, và đó là nghĩa vụ để kiểm soát chân của một hexapod . Ngoài ra, quét ví dụ hoạt động trên servo này, vì vậy không có vấn đề ở đây. Tuy nhiên, servo không thực sự di chuyển. Tôi nghĩ rằng nó có liên quan đến thứ tự khai báo các biến:

#include <Servo.h>

// Abstract each leg, so only those functions can be accessed
class Leg {
  // Actions that can be triggered from outside
  public:
    Leg(int hipPin, int kneePin);
    void up();

  // These should be only available for the leg
  private:
    Servo hip;
    Servo knee;
  };

Leg::Leg(int hipPin, int kneePin) {
  hip.attach(hipPin);
  knee.attach(kneePin);
  }

// Testing the leg: move it up
void Leg::up() {
  for(int pos = 0; pos < 180; pos += 1) {
    hip.write(pos);
    delay(15);
    }
  }


// Initialize the leg
Leg topLeft(9, 10);

void setup() {
  }

// Test the function up()
void loop() {
  topLeft.up();
  }

Tôi chỉ kiểm tra chân 9 (để trống 10). Có vẻ như đau đớn , có nghĩa là, bạn có thể thấy servo rung lắc nhưng không di chuyển thực sự ở 0 độ.


Lưu ý: câu hỏi tương tự với câu hỏi này , nhưng vì giải pháp không hiệu quả với tôi, tôi cho rằng đó không phải là vấn đề tương tự. Bất kỳ trợ giúp gỡ lỗi nào cũng được chào đón (:
Francisco Presencia

Có cùng một thiết lập hoạt động với cùng một pin khi bạn chỉ kiểm tra mã servo hông bên ngoài lớp không? Có phải vấn đề chỉ xảy ra khi mã nằm trong lớp Leg?
Omer

Vấn đề của bạn có thể giống với câu hỏi này: arduino.stackexchange.com/questions/830/NH
jfpoilpret

Câu trả lời:


5

Có vẻ như vấn đề này có thể là do thứ tự xấu của các lệnh gọi khởi tạo cho các biến toàn cục.

Trong C ++, thứ tự khởi tạo biến toàn cục là không thể đoán trước trên các đơn vị biên dịch khác nhau (ví dụ: tệp nguồn C ++, không phải tệp tiêu đề). Thứ tự khởi tạo chỉ được tôn trọng trong một đơn vị biên dịch.

Trong chương trình của bạn, có một số biến toàn cục, nếu khởi tạo sai thứ tự, sẽ làm hỏng chương trình của bạn:

  • Leg topLeft; đây là ví dụ lớp học của bạn
  • servo_t servos[MAX_SERVOS];, int8_t Channel[_Nbr_16timers ];uint8_t ServoCount = 0;tất cả các quy định tạiServo.cpp

Gọi điện Servo.attach()yêu cầu 3 biến ở trên đã được khởi tạo, bạn không thể chắc chắn.

Làm thế nào bạn có thể khắc phục điều đó?

Bằng cách không thực hiện attach()trong Legconstructor nhưng ủy quyền cho một số loại init()phương pháp mà bạn có thể gọi từ setup():

class Leg {
    // Actions that can be triggered from outside
    public:
    void init(int hipPin, int kneePin);
    void up();

    // These should be only available for the leg
    private:
    Servo hip;
    Servo knee;
};

Leg::init(int hipPin, int kneePin) {
    hip.attach(hipPin);
    knee.attach(kneePin);
}

// Testing the leg: move it up
void Leg::up() {
    for(int pos = 0; pos < 180; pos += 1) {
        hip.write(pos);
        delay(15);
    }
}

// Declare the leg
Leg topLeft;

void setup() {
    // Initialize the leg
    topLeft.init(9, 10);
}

// Test the function up()
void loop() {
    topLeft.up();
}

Chỉ cần làm rõ, thứ tự khởi tạo của các biến toàn cục không chỉ được xác định giữa các đơn vị dịch khác nhau. Trong cùng một đơn vị dịch thuật, đó là thứ tự các định nghĩa của họ.
Omer

+1 đây là vàng, lời giải thích chỉ giải quyết được khoảng 100% các vấn đề chưa được giải quyết mà tôi từng gặp phải với arduino và C ++. Cảm ơn bạn, tôi sẽ kiểm tra nó khi tôi về nhà.
Francisco Presencia

@Omer cảm ơn vì đã làm rõ mà tôi đã quên bao gồm. Tôi vừa chỉnh sửa câu trả lời của tôi.
jfpoilpret
Khi sử dụng trang web của chúng tôi, bạn xác nhận rằng bạn đã đọc và hiểu Chính sách cookieChính sách bảo mật của chúng tôi.
Licensed under cc by-sa 3.0 with attribution required.