Multiwii 2.4 + Integration SRF-08 Ultraschallsensor

Hallo Leute,

ich möchte bei meinem Copter den SRF-08 Ultraschallsensor zur höhensteuerung verwenden. Eine weitere optionale Ausbaumethode wäre noch eine Abstandshaltung zu den Seiten, wenn das höhe halten klappt.

Dafür muss ich natürlich erstmal einen Regler entwerfen, wofür ich das Regelverhalten des Copters aufzeichnen möchte.

Ich habe jetzt ein Programm geschrieben, welches mir über den Arduino die Abstände misst und auf eine SD Karte aufzeichnet. (Dient dann später dazu die Höhenveränderung im Verhältnis zum Schubwert darzustellen für den Reglerentwurf)

Soviel dazu, als nächstes muss das ganze in die Software der Flugsteuerung Multiwii 2.4 integriert werden woran es gerade hapert.

Wenn ich z.B. in die Maindatei die Klasse #include <SD.h> einfügen will kommt schon die erste fehlermeldung:
MultiWii.cpp:11:16: fatal error: SD.h: No such file or directory
#include <SD.h>

warum funktioniert das nicht?

Dann musst du die Library noch in deinem System installieren. Die gehört in den Libraries Ordner der IDE.

Hi, aber diese ist doch von Haus aus schon in der IDE?! zum funktioniert es in dem anderen Programm ja, nur eben in der Multiwii software nicht

iDaniel:
Hi, aber diese ist doch von Haus aus schon in der IDE?! zum funktioniert es in dem anderen Programm ja, nur eben in der Multiwii software nicht

Dann solltest du dein System nochmal überprüfen.
Evtl. Schreibfehler oder die Lib ist für den aktuellen Sketch zu alt.

Die Fehlermeldung sagt eindeutig, die Lib für die MultiWii findet die Lib nicht.

Besorge dir die aktuellen Librarys, mit älteren tritt oft solch ein Problem auf.

Also ich hab die aktuellste arduino version installiert. Es scheint auch egal zu sein welche library in einbinden möchte, das Multiwiiprogramm meckert an jeder rum.... erstelle ich einen anderen sketch geht es. Liegt es vielleicht an dem Aufbau des Multiwii programms?

iDaniel: Also ich hab die aktuellste arduino version installiert. Es scheint auch egal zu sein welche library in einbinden möchte, das Multiwiiprogramm meckert an jeder rum.... erstelle ich einen anderen sketch geht es. Liegt es vielleicht an dem Aufbau des Multiwii programms?

Dann solltest du uns dies mal zeigen, bitte in Code-Tags hochladen.

Das ist der Code der funktioniert, speichert 2 Werte in eine Textdatei auf SD. Einmal den Sonarwert und der zweite Wert ist der Gaswert…hier erstmal einfach nur eine Zahl.

#include <SD.h>
#include <SPI.h>
#include <SonarSRF08.h>
#include <Wire.h>

#define SRF_ADDRESS         0x74                                   // Address of the SRF08
#define CMD                 (byte)0x00                             // Command byte, values of 0 being sent with write have to be masked as a byte to stop them being misinterpreted as NULL this is a bug with arduino 1.0
#define LIGHTBYTE           0x01                                   // Byte to read light sensor
#define RANGEBYTE           0x02                                   // Byte for start of ranging data

byte highByte = 0x00;                             // Stores high byte from ranging
byte lowByte = 0x00;                              // Stored low byte from ranging
int CS_PIN = 10;
File file;
int rangeData;
int gaswert = 0;

void setup()
{
  Serial.begin(9600);
 
  Wire.begin();                               
  delay(100);                                     // Waits to make sure everything is powered up before sending or receiving data
  int softRev = getSoft();                        // Calls function to get software revision
    
  initializeSD();
  createFile("sonic.txt");
  file.println("[cm];[gaswert]");
  closeFile();
}
void loop()
{
  gaswert =1 ;
  rangeData = getRange();                     // Calls a function to get range
  int data[]={rangeData,gaswert};
  createFile("sonic.txt");
  file.print(data[0]);
  file.print(";");
  file.println(data[1]);
  Serial.println("Writing to file: ");
  Serial.print(data[0]);
  Serial.println(data[1]);
  closeFile();
  delay(50);     
}


////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////Ultraschallbereich////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////
int getRange(){                                   // This function gets a ranging from the SRF08
  
  int range = 0; 
  
  Wire.beginTransmission(SRF_ADDRESS);             // Start communticating with SRF08
  Wire.write(CMD);                                 // Send Command Byte
  Wire.write(0x51);                                // Send 0x51 to start a ranging
  Wire.endTransmission();
  
  delay(100);                                      // Wait for ranging to be complete
  
  Wire.beginTransmission(SRF_ADDRESS);             // start communicating with SRFmodule
  Wire.write(RANGEBYTE);                           // Call the register for start of ranging data
  Wire.endTransmission();
  
  Wire.requestFrom(SRF_ADDRESS, 2);                // Request 2 bytes from SRF module
  while(Wire.available() < 2);                     // Wait for data to arrive
  highByte = Wire.read();                          // Get high byte
  lowByte = Wire.read();                           // Get low byte

  range = (highByte << 8) + lowByte;               // Put them together
  
  return(range);                                   // Returns Range
}



int getSoft(){                                     // Function to get software revision
  
  Wire.beginTransmission(SRF_ADDRESS);             // Begin communication with the SRF module
  Wire.write(CMD);                                 // Sends the command bit, when this bit is read it returns the software revision
  Wire.endTransmission();
  
  Wire.requestFrom(SRF_ADDRESS, 1);                // Request 1 byte
  while(Wire.available() < 0);                     // While byte available
  int software = Wire.read();                      // Get byte
    
  return(software);                               
  
}

////////////////////////////////////////////////////////////////////////////////////////////////////////////////
//////////////////////////////////SD Leser Bereich////////////////////////////////////////////////////////
/////////////////////////////////////////////////////////////////////////////////////////////////////////

void initializeSD()
{
  Serial.println("Initializing SD card...");
  pinMode(CS_PIN, OUTPUT);

  if (SD.begin())
  {Serial.println("SD card is ready to use.");} 
  else
  {Serial.println("SD card initialization failed");
    return;
  }
}

int createFile(char filename[])
{
  file = SD.open(filename, FILE_WRITE);

  if (file)
  {
    Serial.println("File created successfully.");
    return 1;
  } else
  {
    Serial.println("Error while creating file.");
    return 0;
  }
}



void closeFile()
{
  if (file)
  {
    file.close();
    Serial.println("File closed");
  }
}

int openFile(char filename[])
{
  file = SD.open(filename);
  if (file)
  {
    Serial.println("File opened with success!");
    return 1;
  } else
  {
    Serial.println("Error opening file...");
    return 0;
  }
}

int writefile(char filename[])
{
  file = SD.open(filename);
  if (file)
  {
    Serial.println("File opened with success!");
    return 1;
  } else
  {
    Serial.println("Error opening file...");
    return 0;
  }
}

Der Multiwiicode wäre jetzt etwas zu groß um ihn hier reinzukopieren deshalb verweis ich an dieser Stelle einfach mal auf den offiziellen link von dem ich ihn auch her hab. wenn das ok ist :wink:

https://code.google.com/p/multiwii/