Servo.h library stört vorhandenen Code

Hi Leute, ich habe im Anhang einen voll funktionsfähigen code. Als nächsten Schritt im Projekt will ich einen Servo zu einer bestimmten Zeit ansteuern, jedoch sobald ich die standart Library "Servo.h" in den vorhanden Code inkludiere, gibt der Serielle Monitor nur folgende Zeilen wieder:

"Card ready
Adafruit MPU6050 test!
MP"

Jetzt ist meine Frage ob man entweder diese Library inkludieren kann ohne dieser Probleme , oder ob es einen anderen Weg gibt um einen Servo anzusteuern.

laufen sollte es auf einem Arduino Uno
der Sketch verwendet 75% des Programmspeicherplatzes

Vielen Dank im Voraus!

#include <Arduino.h>
#include <Wire.h>
#include <BMP180I2C.h>//BMP
#define I2C_ADDRESS 0x77//BMP
#include <Adafruit_MPU6050.h>//MPU
#include <Adafruit_Sensor.h>//MPU
#include <SD.h>//Sd Library
#include <SPI.h>//Sd Library

BMP180I2C bmp180(I2C_ADDRESS);//create an BMP180 object using the I2C interface
Adafruit_MPU6050 mpu;//MPU


bool startTimeSet = false;
unsigned long StartTime = 0;
unsigned long elapsedTime = 0;
int started = 0;

const   int ChipSelect = 4;
  
int Lcard = 6;
int Lmpu = 8;
int Lbmp = 9;
int Lfalse = 7;


void setup() {
  pinMode(Lcard, OUTPUT);
  pinMode(Lmpu, OUTPUT);
  pinMode(Lbmp, OUTPUT);
  pinMode(Lfalse, OUTPUT);
 
  Wire.begin();
  Serial.begin(9600);

  if (!SD.begin(ChipSelect)) {
    Serial.println("Card failed");
    digitalWrite(Lfalse, HIGH);
    while (1);
  }
  Serial.println("Card ready");
  digitalWrite(Lcard, HIGH);
  while (!Serial);
  if (!bmp180.begin()) {
    Serial.println("begin() failed. check your BMP180 Interface and I2C Address.");
    digitalWrite(Lfalse, HIGH);
    while (1);
  }

  digitalWrite(Lbmp, HIGH);
  bmp180.resetToDefaults();
  bmp180.setSamplingMode(BMP180MI::MODE_UHR);
  Serial.println("Adafruit MPU6050 test!");
  if (!mpu.begin()) { // Try to initialize!
    Serial.println("Failed to find MPU6050 chip");
    digitalWrite(Lfalse, HIGH);
    while (1) {}
  }
  Serial.println("MPU6050 Found!");
  digitalWrite(Lmpu, HIGH);

  mpu.setAccelerometerRange(MPU6050_RANGE_16_G);
  Serial.print("Accelerometer range set to: ");
  switch (mpu.getAccelerometerRange()) {

    case MPU6050_RANGE_16_G:
      Serial.println("+-16G");
      break;
  }
  mpu.setGyroRange(MPU6050_RANGE_2000_DEG);
  Serial.print("Gyro range set to: ");
  switch (mpu.getGyroRange()) {

    case MPU6050_RANGE_2000_DEG:
      Serial.println("+- 2000 deg/s");
      break;
  }
  mpu.setFilterBandwidth(MPU6050_BAND_44_HZ);
  Serial.print(F("Filter bandwidth set to: "));
  switch (mpu.getFilterBandwidth()) {

    case MPU6050_BAND_44_HZ:
      Serial.println("44 Hz");
      break;
  }
  Serial.println("");

  SD.begin(ChipSelect);
}

void loop() {
  if (!bmp180.measureTemperature())
  {
    Serial.println(F("could not start temperature measurement, is a measurement already running?"));
    return;
  }
  do { }
  while (!bmp180.hasValue());
  if (!bmp180.measurePressure()) {
    Serial.println(F("could not start perssure measurement, is a measurement already running?"));
    return;
  }
  do { }
  while (!bmp180.hasValue());


  sensors_event_t a, g, temp;
  mpu.getEvent(&a, &g, &temp);

  Serial.print("ok  ");

  delay(10);

  File Data = SD.open("TestRII.txt", FILE_WRITE);
  if (Data) {
    Data.print(a.acceleration.x);
    Data.print("          ");
    Data.print(a.acceleration.y );
    Data.print("          ");
    Data.print(a.acceleration.z);
    Data.print("          ");
    Data.print(g.gyro.x );
    Data.print("          ");
    Data.print(g.gyro.y);
    Data.print("          ");
    Data.print(g.gyro.z);
    Data.print("          ");
    Data.print( bmp180.getPressure() / 100);
    Data.print("          ");
    Data.println( bmp180.getTemperature());
    Data.close();
  } else {
    Serial.println("SD Fail");
    digitalWrite(Lfalse, HIGH);
  }


float sens = a.acceleration.x;

Serial.print(a.acceleration.x);
Serial.print("     ");
Serial.print(a.acceleration.y);
Serial.print("     ");
Serial.println(a.acceleration.z);




  if (sens > 3 && !startTimeSet) {
    started = 1;
    StartTime = millis();
   startTimeSet = true;
  
  }
  
  

  if (started == 1) {
      Serial.print(" countdown");
     elapsedTime = millis() - StartTime;  


       if (elapsedTime >= 3000) {
    Serial.print("ejected");
   }
 }
}

Im englischen Teil des Forum müssen die Beiträge und Diskussionen in englischer Sprache verfasst werden.
Deswegen wurde diese Diskussion in den deutschen Teil des Forums verschoben.

mfg ein Moderator.

das klingt aber sehr nach einen Reset wegen Unterspannung durch die Servo-Bewegung.

Zeig mal einen Schaltplan deiner Verkabelung sowie echte Bilder deines Aufbaus.

Programmspeicher ist die eine Sache, wie siehts aber mit SRAM/globale Variablen aus? Poste mal das gesamte Ergebnis des Kompilers.

Danke für die schnelle Rückmeldung, hier ist ein gezeichneter Schaltplan des Aufbaus und aufgebaut ist es auf einem Steckbrett mit Jumper-kabeln

Hier ist auch noch das ganze Ergebnis des Kompilers:
"Der Sketch verwendet 25472 Bytes (78%) des Programmspeicherplatzes. Das Maximum sind 32256 Bytes.
Globale Variablen verwenden 1579 Bytes (77%) des dynamischen Speichers, 469 Bytes für lokale Variablen verbleiben. Das Maximum sind 2048 Bytes.
Wenig Arbeitsspeicher verfügbar, es können Stabilitätsprobleme auftreten."

Gruß
bames_Jond

a) versorge den Servo separat von sauberen 6V und NICHT über den Arduino 5V pin.
b)

lies dich ein zum Thema Arduino F-Makro und adaptiere deine Serial-Ausgaben und Data.print entsprechend. Da lässt du 100te Bytes liegen, weil du es bisher nur an zwei Stellen verwendest.

1 Like

Vielen Dank! Es funktioniert
wie vorgeschlagen hab ich den Servo an eine andere Stromquelle gehängt, und konnte mir mit den F-Makros knapp über 250 Bytes sparen!

1 Like

This topic was automatically closed 180 days after the last reply. New replies are no longer allowed.