2012-03-13 4 views
5

Для школы я строю робот, который должен иметь возможность обнаруживать линии, используя 3 силовых датчика QRE1113. (http://www.sparkfun.com/products/9454) Я создал 4 библиотеки, два для вождения (Motor() & Driver()), они отлично работают. Теперь я создал библиотеки Linesensor и Eye, это вызывает некоторые проблемы. Когда я хочу использовать эти библиотеки, функция setup() не будет выполнять команду. Даже не включайте светодиод. В чем проблема?Arduino: Setup() не запустится

Главный файл:

#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); 
} 

библиотека глаз:

/* 
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 

И 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

Может эта проблема есть что-то делать с ограниченным объемом памяти на плате Arduino? –

ответ

0

Похоже, у нас было слишком много классов, и ардуино не справлялось с этим.

3

Я помню, что были проблемы, когда intializing вещи в конструкторах для объектов, объявленных вне настроить(). Я не знаю, почему, я признаю, что не исследовал проблему. Но я пошел с мыслью, что слишком много вещей было инициализировано до начала программы.

Я не гарантирую, что это решение (и не может объяснить, почему), но я обошел свою проблему, инициализируя вещи в методах init() для моих объектов, а не их конструкторов. Затем я вызвал методы init() int my setup() после настройки объекта Serial. Что-то вроде этого:

#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() 
} 

Это всегда немного странно, чтобы построить объект в методе вместо конструктора. Но поскольку это программирование микроконтроллеров, а не обычная компьютерная программа, я считаю, что более функциональный подход иногда является самым простым.

Если у вас нет лучшего ответа, вы все равно можете попробовать это. Возможно, этого достаточно сделать только для вашей библиотеки Eye, поскольку вы сказали, что у вас нет проблем с классами Motor.

+1

Попытка этого, я получаю сообщение: ошибка: «класс Глаз» не имеет имени с именем «init» –

+1

Вы должны реализовать метод init() самостоятельно :) Например, создайте метод init(), помещенный внутри него что находится в вашем конструкторе и удаляет конструктор вашего класса. –

+0

По-прежнему не удалось решить мою проблему ... –

0

Я не думаю, что во многих классах было неправильно, или слишком много вещей было инициализировано. В моем случае у меня есть много классов, определенных мной (более 5 классов). Моя проблема была с тем, как я определил классы, например, одна ошибка была, когда я определил функции в файле заголовка, в файле CPP не добавлялась по имени класса .в Код языка:

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 
} 
Смежные вопросы