2012-03-13 31 views
5

Đối với trường học, tôi đang xây dựng một rô-bốt cần có khả năng phát hiện các đường bằng 3 đường dây QRE1113. (http://www.sparkfun.com/products/9454) Tôi đã tạo 4 thư viện, hai thư viện để điều khiển (Motor() & Trình điều khiển()) chúng hoạt động tốt. Bây giờ tôi đã tạo ra các thư viện Linesensor và Eye, chúng đang gây ra một số rắc rối. Khi tôi muốn sử dụng các thư viện này, hàm setup() sẽ không làm đội hình. Thậm chí không bật đèn LED. Hình như có vấn đề gì thì phải?Arduino: Thiết lập() sẽ không bắt đầu

tập tin chi tiết:

#include "Motor.h" 
#include "Driver.h" 
#include "Lichtsensor.h" 
#include "Eye.h" 

Motor motor1(5, 4, true); 
Motor motor2(6, 7, false); 
Driver driver(motor1, motor2); 
Eye eye1; 

void setup(){ 
    pinMode(13, OUTPUT); 
    digitalWrite(13, HIGH); 
    Serial.begin(9600); 
    Serial.println("#################################################"); 
    Serial.println("# This sketch communicates with the arduino and #"); 
    Serial.println("# makes the robot drive, and react to a sensor. #"); 
    Serial.println("#################################################\n"); 
} 

void loop(){ 
    if (eye1.getDikkeLijn() == true) { 
     Serial.println("Lijn"); 
    } 
    else { 
    Serial.println("Niks"); 
    } 
    delay(1000); 
} 

thư viện Mắt:

/* 
Controls Lichtsensors 
*/ 
#ifndef Eye_h 
#define Eye_h 

#include "Arduino.h" 
#include "Lichtsensor.h" 

class Eye 
    public: 
    Eye(); 
    Eye(Lichtsensor l1, Lichtsensor l2, Lichtsensor l3); 
    boolean getDikkeLijn(); 
    boolean getDunneLijn(); 
private: 
    Lichtsensor _l1; 
    Lichtsensor _l2; 
    Lichtsensor _l3; 
}; 

#endif 

Và linesensor:

/* 
Library to get values from a light sensor 
*/ 
#ifndef Lichtsensor_h 
#define Lichtsensor_h 

#include "Arduino.h" 

class Lichtsensor { 
public: 
    Lichtsensor(); 
    Lichtsensor(int analogPin); 
    int getCalibreerWaarde(); 
    int getLichtWaarde(); 
    boolean isDonker(); 
private: 
    int _lichtCalibreerWaarde; 
    int _analogPin; 
}; 

#endif 
+0

thể vấn đề này có làm gì đó với số lượng bộ nhớ hạn chế trên bảng Arduino? –

Trả lời

0

Có vẻ như chúng tôi có quá nhiều lớp và Arduino không thể xử lý được nữa.

3

Tôi nhớ gặp vấn đề có khi intializing thứ trong nhà xây dựng cho các đối tượng tuyên bố bên ngoài thiết lập(). Tôi không chắc chắn lý do tại sao, tôi thừa nhận không có điều tra vấn đề. Nhưng tôi đã đi với ý tưởng rằng quá nhiều thứ đã được khởi tạo trước khi chương trình bắt đầu.

Tôi không đảm bảo rằng nó là giải pháp (và không thể giải thích lý do tại sao), nhưng tôi đã đi xung quanh vấn đề của tôi bằng cách khởi tạo mọi thứ trong init() phương pháp cho các đối tượng của tôi thay vì các nhà xây dựng của họ. Sau đó, tôi đã gọi phương thức init() trong cài đặt của tôi() sau khi đã thiết lập đối tượng Nối tiếp. Một cái gì đó như thế:

#include "Motor.h" 
#include "Driver.h" 
#include "Lichtsensor.h" 
#include "Eye.h" 

Motor motor1; // I do not use any more my constructor 
Motor motor2; // I do not use any more my constructor 
Driver driver; // I do not use any more my constructor 
Eye eye1; // I do not use any more my constructor 

void setup(){ 
    pinMode(13, OUTPUT); 
    digitalWrite(13, HIGH); 
    Serial.begin(9600); 
    Serial.println("#################################################"); 
    Serial.println("# This sketch communicates with the arduino and #"); 
    Serial.println("# makes the robot drive, and react to a sensor. #"); 
    Serial.println("#################################################\n"); 
    motor1.init(5, 4, true); // My object is initialized here 
    motor2.init(6, 7, false); // My object is initialized here 
    driver.init(motor1, motor2); // My object is initialized here 
    eye1.init() 
} 

Nó luôn luôn là một chút kỳ lạ để xây dựng một đối tượng trong một phương pháp thay vì các nhà xây dựng. Nhưng vì nó là lập trình vi điều khiển và không phải là một chương trình máy tính thông thường, tôi đoán sử dụng một cách tiếp cận chức năng hơn đôi khi là đơn giản nhất.

Nếu bạn không có câu trả lời hay hơn, bạn vẫn có thể dùng thử. Có lẽ nó là đủ để làm điều đó chỉ cho thư viện mắt của bạn như bạn nói với bạn không có vấn đề với các lớp học động cơ.

+1

Thử điều này, tôi nhận được thông báo: lỗi: 'class Eye' không có thành viên có tên 'init' –

+1

Bạn phải tự thực hiện phương thức init() :) Ví dụ, tạo phương thức init(), đặt bên trong nó những gì có trong constructor của bạn và loại bỏ hàm tạo của lớp của bạn. –

+0

Vẫn không giải quyết được sự cố của tôi ... –

0

Tôi không nghĩ có sai với nhiều lớp hoặc quá nhiều thứ đã được khởi tạo. Trong trường hợp của tôi, tôi có nhiều lớp do tôi xác định (hơn 5 lớp). Vấn đề của tôi là với cách tôi định nghĩa các lớp ví dụ một sai lầm là khi tôi định nghĩa hàm trong file header, trong file cpp không được thêm vào phía trước của tên lớp .Tại mã ngôn ngữ:

void begin(); // this is a function defined in the header file 
void begin(){//this is in the cpp file and this is wrong definition 

} 
void NameOfTheClass::begin(){ // this is the correct way in the cpp file 
    //code goes here 
} 
Các vấn đề liên quan