Drohnen Projekt

Hallo Community,

das hier ist mein erster Post bei euch, ich bin grade dabei eine Drohne zu bauen und hab mir einen Nano 33 BLE bestellt da unsere Drohne mit Ultraschallsensoren bestück sind und wir gleichzeitig auch die Sensoren vom Nano benutzen wollen. Ich hab aber ein kleines Problem mit meiner Seriellen Ausgabe hier einmal der Code. Dieser Code ist lediglich zum Testen gedacht, ist nicht der Code der später benutzt wird. Wir wollten erstmal nur die Sensoren damit Testen.
Das eingesetzte Delay ist dafür da um die Sensoren richtig einzustellen.

Die Drohne wird nicht über einen Arduino gesteuert, er gibt die Daten an einen Raspberry 4 weiter und wird dort verarbeitet. Zusetzlich benutzen wir noch einen Navio2.

//Initialisierung 
int trigger_1 = 13; // trigger Pin Sensor back left
int echo_1 = 8; // echo Pin Sensor back left

int trigger_2 = 12; //trigger Pin Sensor left
int echo_2 = 7; // echo Pin Sensor left

int trigger_3 = 11; //trigger Pin Sensor center
int echo_3 = 6; //echo Pin Sensor center

int trigger_4 = 10; //trigger Pin Sensor right
int echo_4 = 5; //echo Pin Sensor right

int trigger_5 = 9; //trigger Pin Sensor back right
int echo_5 = 4;  //echo Pin Sensor back right

long dauer = 0;
long entfernung  = 0;

//Funktion für alle Sensoren 
int Sensor (int trigger, int echo)
{
   digitalWrite(trigger, LOW);
   delayMicroseconds(5);                                
   digitalWrite(trigger, HIGH);     
   delayMicroseconds(10);     
   digitalWrite(trigger, LOW);  
   
   long us_alt = micros();
   while (digitalRead(echo) == 0);          //warten auf Burst
   while (digitalRead(echo) == 1);         //warten auf Burst ende   
   long t = micros () - us_alt ;               // Senden abschließen    
   entfernung = (t /2) * 0.03432;   // Die Zeit in den Weg in Zentimeter umrechnen
   return entfernung;  
}
 
//Setup
void setup()
{
 Serial.begin(9600);
 
 pinMode(trigger_1, OUTPUT);
 pinMode(trigger_2, OUTPUT);
 pinMode(trigger_3, OUTPUT);   //trigger Pins
 pinMode(trigger_4, OUTPUT);
 pinMode(trigger_5, OUTPUT);
 
 pinMode(echo_1, INPUT);
 pinMode(echo_2, INPUT);
 pinMode(echo_3, INPUT);   //echo Pins
 pinMode(echo_4, INPUT);
 pinMode(echo_5, INPUT);
}


void loop ()
{

 
   int back_left = Sensor(trigger_1, echo_1);
   Serial.print ("back left:   ");
   Serial.print (back_left);
   Serial.println(" cm"); 
   delay (1000);
 
   long left = Sensor(trigger_2, echo_2);
   Serial.print ("left:   ");
   Serial.print (left);
   Serial.println(" cm"); 
   delay (1000);
 
   long center = Sensor(trigger_3, echo_3);
   Serial.print ("center:   ");
   Serial.print (center);
   Serial.println(" cm"); 
   delay (1000);
 
   long right = Sensor(trigger_4, echo_4);
   Serial.print ("right:   ");
   Serial.print (right);
   Serial.println(" cm"); 
   delay (1000);
 
   long back_right = Sensor(trigger_5, echo_5);
   Serial.print ("back_right:   ");
   Serial.print (back_right);
   Serial.println(" cm"); 
   delay (1000);
}

Er lädt alles wunderbar hoch aber sobald ich den Monitor starte kommt keine Ausgabe mehr und ich weis einfach nicht mehr weiter.

Sobald ich aber ein paar Sachen auskommentiere printed er mir die gewünschten Sachen.

//Initialisierung 
int trigger_1 = 13;
int echo_1 = 8;

/*int trigger_2 = 12;
int echo_2 = 7;

int trigger_3 = 11;
int echo_3 = 6;

int trigger_4 = 10;
int echo_4 = 5;

int trigger_5 = 9;
int echo_5 = 4;*/

long dauer = 0;
long entfernung  = 0;

//Funktion für alle Sensoren 
int Sensor (int trigger, int echo)
{
   digitalWrite(trigger, LOW);
   delayMicroseconds(5);                                
   digitalWrite(trigger, HIGH);     
   delayMicroseconds(10);     
   digitalWrite(trigger, LOW);  
   
   long us_alt = micros();
   while (digitalRead(echo) == 0);          
   while (digitalRead(echo) == 1);            
   long t = micros () - us_alt ;     
   entfernung = (t /2) * 0.03432; 
   return entfernung;  
}
 
//Setup
void setup()
{
 Serial.begin(9600);
 
 pinMode(trigger_1, OUTPUT);
 /*pinMode(trigger_2, OUTPUT);
 pinMode(trigger_3, OUTPUT);   //trigger Pins
 pinMode(trigger_4, OUTPUT);
 pinMode(trigger_5, OUTPUT);*/
 
 pinMode(echo_1, INPUT);
 /*pinMode(echo_2, INPUT);
 pinMode(echo_3, INPUT);   //echo Pins
 pinMode(echo_4, INPUT);
 pinMode(echo_5, INPUT);*/
}


void loop ()
{

 
   //int back_left = Sensor(trigger_1, echo_1);
   Serial.print ("back left:   ");
   //Serial.print (back_left);
   Serial.println(" cm"); 
   delay (1000);
 
   /*long left = Sensor(trigger_2, echo_2);
   Serial.print ("left:   ");
   Serial.print (left);
   Serial.println(" cm"); 
   delay (1000);
 
   long center = Sensor(trigger_3, echo_3);
   Serial.print ("center:   ");
   Serial.print (center);
   Serial.println(" cm"); 
   delay (1000);
 
   long right = Sensor(trigger_4, echo_4);
   Serial.print ("right:   ");
   Serial.print (right);
   Serial.println(" cm"); 
   delay (1000);
 
   long back_right = Sensor(trigger_5, echo_5);
   Serial.print ("back_right:   ");
   Serial.print (back_right);
   Serial.println(" cm"); 
   delay (1000);*/
}

Kann mir da vielleicht einer weiterhelfen.

vielen lieben Dank im Vorraus.

long us_alt = micros();
/while (digitalRead(echo) == 0); //warten auf Burst
while (digitalRead(echo) == 1); //warten auf Burst Ende
/
long t = micros () - us_alt ; // Senden abschließen
entfernung = (t / 2) * 0.03432; // Die Zeit in den Weg in Zentimeter umrechnen
return entfernung;

Hab den fehler nun ein grenzen können. Sobald ich mein "digitalRead" mit ins Spiel bringe fängt die Serielle Ausgabe an zu spinnen und er gibt mir nichts mehr aus. Vielleicht weis jemand wie ich das unschreiben kann auch ohne "PulseIn".
Mit den Interrups bekomme ich es leider nicht am laufen.

LG

Bitte bitte:
Geh nochmal auf Dein Post - unten rechts auf Modify message und dann im Editor den Code markieren und oben auf das Symbol "</>" klicken.
Viel Viel Viel besser wäre es, wenn Du den Code vorher in der IDE mit STRG-T formatierst und dazu die ganzen Leerzeilen rauskommen - und dann wieder an genau der gleichen Stelle einfügen.

Danke!

(deleted)

Warum schreibst du nich mal dabei, was ein Sketch an welcher Stelle was machen soll ?
Wie sollen wir da durchsteigen ?

Und welcher Sketch ist jetzt der Richtige ?
Warum postest du den 3 mal ?

Du hättest doch einfach den ungültigen löschen können, dann macht es das ganze einfacher.

Also den richtigen kommentieren und neu in Code-Tags einstellen.
Alle überflüssigen Sketche löschen, dann sieht das nicht so unübersichtlich aus und wir können dann den richtigen auch besser lesen.

Drohne und Delay kann sicher nicht funktionieren!

themanfrommoon:
Drohne und Delay kann sicher nicht funktionieren!

Doch.

Delay ist immer blockierend. Wenn eine Drohne nicht ausgesteuert wird, stürzt sie ab. -> Die Drohne kann mit Delay sicher nicht fliegen.

themanfrommoon:
Drohne und Delay kann sicher nicht funktionieren!

Wo siehst du in dem Sketch ne Drohnensteuerung? Finde den Hinweis nicht falsch aber am Thema vorbei. Soweit ich das sehe testet der TO an diesem Punkt seines Projekts gerade Sensoren.

Zum Thema:
Auf den ersten Blick: du verwendest offenbar Pin 1. (falsch geguckt) Pin 0 und 1 müssen aber frei bleiben, weil die für serielle Kommunikation sind.

(deleted)

long us_alt = micros();
   while (digitalRead(echo) == 0);        
   while (digitalRead(echo) == 1);          
   long t = micros () - us_alt ;

Delay() ist eine Sache, Die obrige Konstruktin ist zwar kein delay() aber eine ebenso bremsende Programmierung. Das Programm verweilt in den Whileschleifen bis die Entfernungsmessung fertig ist. Das dauert unter Umständen unendlich lange. Das normalerweise verwendete pulseIn() hat wenigstens ein Timeout und endet nach einer Sekunde.

Wenn der gleiche Arduino Abstandsmessungen und die Ansteuerung der Motoren machen soll dann gilt das von themanfrommoon gesagte: "Wenn eine Drohne nicht ausgesteuert wird, stürzt sie ab."
Ich hoffe durch meine Annahme daß der Arduino die Drohne steuern soll bin ich auch mit Mahimus in reinen.

Grüße Uwe

Peter-CAD-HST:
Moin drohnenbau,

manchmal ist es extrem schlau mal zu gucken wie die Anderen das Thema bearbeiten :slight_smile:

Gruss Peter
und gesund bleiben

Hallo Peter,

dies hab ich leider schon Probiert aber bei PulseIn gibt der mir einen fehler an und sagt mir das diese Funktion nicht für meinen Nano bestimmt ist. Oder gibt es dort eine Bestimmte Bibliothek die ich einbinden muss?

(deleted)

Mahimus:
Wo siehst du in dem Sketch ne Drohnensteuerung? Finde den Hinweis nicht falsch aber am Thema vorbei. Soweit ich das sehe testet der TO an diesem Punkt seines Projekts gerade Sensoren.

Zum Thema:
Auf den ersten Blick: du verwendest offenbar Pin 1. Pin 0 und 1 müssen aber frei bleiben, weil die für serielle Kommunikation sind.

Hallo,

genau richtig ich teste nur die Sensoren mehr nicht die Drohne hat damit grade nichts zu tun. Pin 1 und Pin 0 werden nicht benutzt. Oder übersehe ich da grade was?

LG

Moin,

als erstes der Hinweis: Wenn Du eine Funktion mehrfach verwenden willst, dann mach das mit einem Sensor erstmal komplett funktionsfähig.
Ich sehe das erste Problem schon hier:

//Initialisierung 

long dauer = 0;
long entfernung  = 0;

//Funktion für alle Sensoren 
int Sensor (int trigger, int echo)
{
[...]
   long t = micros () - us_alt ;               // Senden abschließen    
   entfernung = (t /2) * 0.03432;   // Die Zeit in den Weg in Zentimeter umrechnen
   return entfernung;  
}

(Hinweis: Die Klammer um t/2 kannst Du weglassen)
später machst Du:

   int back_left = Sensor(trigger_1, echo_1);
   Serial.print ("back left:   ");
   Serial.print (back_left);
   Serial.println(" cm"); 
   delay (1000);
 
   long left = Sensor(trigger_2, echo_2);
   Serial.print ("left:   ");
   Serial.print (left);
   Serial.println(" cm"); 
   delay (1000);

Da bist Du offensichtlich noch in der Entscheidungsfindung :wink:

my_xy_projekt:
Moin,

als erstes der Hinweis: Wenn Du eine Funktion mehrfach verwenden willst, dann mach das mit einem Sensor erstmal komplett funktionsfähig.
Ich sehe das erste Problem schon hier:

//Initialisierung 

long dauer = 0;
long entfernung  = 0;

//Funktion für alle Sensoren
int Sensor (int trigger, int echo)
{
[...]
  long t = micros () - us_alt ;              // Senden abschließen   
  entfernung = (t /2) * 0.03432;  // Die Zeit in den Weg in Zentimeter umrechnen
  return entfernung; 
}





(Hinweis: Die Klammer um t/2 kannst Du weglassen)
später machst Du:



int back_left = Sensor(trigger_1, echo_1);
  Serial.print ("back left:  ");
  Serial.print (back_left);
  Serial.println(" cm");
  delay (1000);

long left = Sensor(trigger_2, echo_2);
  Serial.print ("left:  ");
  Serial.print (left);
  Serial.println(" cm");
  delay (1000);




Da bist Du offensichtlich noch in der Entscheidungsfindung ;)

Moin,

das hatte ich auch schon versucht. Hab aber leider genau das selbe Problem.

int trigger = 9; // Der Trigger Pin
int echo= 8 ; // Der Echo Pin
long dauer = 0; // Hier wird die Zeitdauer abgespeichert
// die die Ultraschallwelle braucht
// um zum Sensor zurückzukomme
long entfernung = 0; // Hier wird die Entfernung vom

// Hindernis abgespeichert

int Sensor ( int trigger, int echo)
{
digitalWrite (trigger, LOW);
delayMicroseconds (5);

digitalWrite (trigger, HIGH);
delayMicroseconds (10);

digitalWrite (trigger, LOW);

long us_alt = micros();
while (digitalRead(echo) == 0);
while (digitalRead(echo) == 1);
long t = micros () - us_alt ;
entfernung = (t /2) * 0.03432;
return entfernung;
}

void setup()
{
Serial.begin (9600); // Die serielle Kommunikation starten

pinMode(trigger, OUTPUT); // Trigger Pin als Ausgang definieren

pinMode(echo, INPUT); // Echo Pin als Eingang defnieren

}

void loop()

{
int left = Sensor (trigger, echo);
Serial.print ("Test: ");
Serial.print(left);
Serial.println (" cm ");
delay(1000);

}

LG

Und warum den Sketch ohne Code-Tags ?
Das hast du doch schon gekonnt ?

drohnenbau:
das hatte ich auch schon versucht. Hab aber leider genau das selbe Problem.

formatiere Deinen Sketch vor dem Einstellen mit STRG-T
Setze ihn in Codetags.
Und schau Dir noch einmal an, was ich Dir als Aufgabe gegeben habe.

drohnenbau:
Pin 1 und Pin 0 werden nicht benutzt.

Hast recht. Hab das trigger_1 als 1 gelesen. Da war ich wohl schon etwas zu müde für den Scheiß. =D

uwefed:
Delay() ist eine Sache, Die obrige Konstruktin ist zwar kein delay() aber eine ebenso bremsende Programmierung. Das Programm verweilt in den Whileschleifen bis die Entfernungsmessung fertig ist.

Das hatte ich gar nicht gesehen. Das wäre tatsächlich schlecht. Entfernungsmessung geht auch per Interrupt.

Alles in allem ein sehr ambitioniertes Projekt, weil alles hoch zeitkritisch ist und nicht wenige Funktionen untergebracht werden müssen (Flugregler, Abstandsmessung, Fernsteuerung). While und Delay an sich sind nicht verboten. Wichtig ist aber, dass alles in allem ein Loopdurchlauf nicht länger als grob geschätzt 5ms dauert. Kommt auch auf die Größe der Drohne an. Ich kann den Wert auch nur schätzen von meiner Erfahrung mit einer anderen zeitkritischen (weil instabilen) Regelaufgabe.

(deleted)