Forum: PC-Programmierung Arduino zu Arduino Seriell


von Tobias G. (tobiasg)


Angehängte Dateien:

Lesenswert?

Hallo Leute,

Basierend auf dem Multiwii Projekt(www.multiwii.com) habe ich mir einen 
Quadrocopter zusammengebaut und dieser fliegt auch wunderbar.

Jetzt möchte ich diesen um eine automatisch Höhen Regelung mit einen 
Ultraschallsensor erweitern.

Verwendet habe ich folgende Bauteile:
1x Arduino ProMini mit ATmega 328p
1x Arduino Uno mit Atmega 328p
1x Ultraschallsensor SRF02

Dazu habe ich mir den Ultraschallsensor SRF02 gekauft der über I2C 
ausgelesen werden kann.

Der Multiwii Code:
http://code.google.com/p/multiwii/source/browse/tags

Zuerst habe ich versucht den Ultraschallsensor direkt mit dem ProMini 
auszulesen, was auch geklappt hat, nur war dann die Zykluszeit extrem 
beschissen(26ms ohne SRF02 4ms). Eventuell liegt es an meinem 
verwendeten Code oder es ist eben Bauteilbedingt nicht anders möglich.

Dann habe ich versucht den Srf02 über einen zweiten Mikrocontroller 
auszulesen und über die Serielle Schnittstelle die Daten zum Arduino 
ProMini zu schicken. Das hat auch geklappt, nur war die Zykluszeit 
wieder extrem schlecht.


Diesen Code habe ich auf dem UNO laufen, zum senden über die UART:
Aus einem Buch entnommen!

#include <Wire.h>

#define srf02Address (0xE0 >> 1)
#define cmdByte 0x00   //Startbefehl zum messen
#define rangeByte 0x02
#define startMessung 0x51

byte MSB = 0x00;
byte LSB = 0x00;


void setup()
{
  Serial.begin(115200);
  Wire.begin();
}

void loop()
{
  int rangeData = getRange();

  Serial.println(rangeData);

  delay(200);

}

  int getRange()

{
  int range = 0;

  Wire.beginTransmission(srf02Address);
  Wire.send(cmdByte);                    //Startbefehl zum messen
  Wire.send(startMessung);               //Startet Messvorgang in cm
  Wire.endTransmission();

  delay(100);

  Wire.beginTransmission(srf02Address);
  Wire.send(rangeByte);
  Wire.endTransmission();

  Wire.requestFrom(srf02Address, 2);
  while(Wire.available() < 2);
  MSB = Wire.receive();
  LSB = Wire.receive();

  range = (MSB << 8) + LSB;

  return(range);
}

______________________________________________________________________ 
_

Und diesen Code auf dem ProMini zum empfangen der Daten:

void srf02_serial()
{

  //  #define INLENGTH 20
  //  #define INTERMINATOR 13

    char inString[21];
    int  inCount;

      inCount = 0;

      do
      {
        while (Serial.available()==0);
        inString[inCount] = Serial.read();
        if(inString[inCount]==13) break;
      }

      while(++inCount < 20);

      inString[inCount] = 0;

      Serial.print("inString:");
      Serial.println(inString);

}

______________________________________________________________________ 
_



Wie kann ich den Sensor so auslesen, dass er meine Zykluszeit kaum 
beeinträchtigt????

hoffentlich kann mir jemand helfen!!


Ich habe ein Bild von meiner Schaltung mal angehängt!

lg Tobias

Bitte melde dich an um einen Beitrag zu schreiben. Anmeldung ist kostenlos und dauert nur eine Minute.
Bestehender Account
Schon ein Account bei Google/GoogleMail? Keine Anmeldung erforderlich!
Mit Google-Account einloggen
Noch kein Account? Hier anmelden.