Arduino: Setup () не запускается - PullRequest
5 голосов
/ 13 марта 2012

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

Основной файл:

#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

И линейный сенсор:

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

Ответы [ 3 ]

3 голосов
/ 13 марта 2012

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

Я не гарантирую, что это решение (и не могу объяснить, почему), но я обошел свою проблему, инициализируя вещи в методах init () для своих объектов вместо их конструкторов. Затем я вызвал методы init () в моей настройке () после настройки объекта 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.

0 голосов
/ 09 января 2016

Я не думаю, что что-то не так со многими классами или слишком много вещей было инициализировано. В моем случае у меня есть много классов, определенных мной (более 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 
}  
0 голосов
/ 01 июня 2012

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

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...