Go Down

Topic: Selbstfahrendes Auto Code nicht funktionsfähig (Read 505 times) previous topic - next topic

jens069

Zuallererst danke allen, die mir geantwortet haben!

Ich habe alles neu aufgebaut und ein paar Sachen geändert. Der I2C-Bus ist nun korrekt angeschlossen (ich bekomme das Display zum laufen). Da dieser nun an den richtigen Pins ist bekomme ich auch nicht mehr das Problem, dass mein Code nicht anfängt zu starten. Jetzt stehe ich nur noch vor 2 Problemen:

1. Wie bekomme ich den Display (0x27) zum laufen zusammen mit dem MCP (3x GND -> 0x20)? Aktuell geht der Display, jedoch hat der MCP keine Funktion.

Code: [Select]
Adafruit_MCP23017 mcp1;
LiquidCrystal_I2C lcd1(0x27, 20, 4);

int keyinput_follow = 9;

...

void setup() {
mcp1.begin(0);
mcp1.pinMode(keyinput_follow, INPUT);

...

lcd1.init();
lcd1.clear();
}

...



2. Ich möchte den Trigger der 6x HC-SR04 über einen Pin machen. Jedoch habe ich festgestellt, dass dieser nur in der Lage ist einen HC-SR04 zum Triggern zu bringen. Sobald ich alle zusammen laufen lasse wird keiner getriggert (Abstand = 0). Gibt es eine Lösung dazu?


Ich danke schonmal im Voraus für alle Antworten!



Viele Grüße
Jens

zwieblum

@1) MCP funktioniert alleine (ohne Display)?
@1) immer nur einen triggern.

HotSystems

#32
Sep 02, 2020, 03:54 pm Last Edit: Sep 02, 2020, 03:55 pm by HotSystems
1. Wie bekomme ich den Display (0x27) zum laufen zusammen mit dem MCP (3x GND -> 0x20)? Aktuell geht der Display, jedoch hat der MCP keine Funktion.

2. Ich möchte den Trigger der 6x HC-SR04 über einen Pin machen. Jedoch habe ich festgestellt, dass dieser nur in der Lage ist einen HC-SR04 zum Triggern zu bringen. Sobald ich alle zusammen laufen lasse wird keiner getriggert (Abstand = 0). Gibt es eine Lösung dazu?
Schön, dass es jetzt bei dir soweit funktioniert.

1. Dann sieh dir mal die Beispiele zu MCP-Library an.
2. Ja, die Lösung ist, jeden US-Sensor einzeln ansprechen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jens069

#33
Sep 03, 2020, 07:11 am Last Edit: Sep 03, 2020, 07:59 am by jens069
Guten Morgen  :)

@1. Also ich habe mir mal die Library von Adafruit angeschaut. Der MCP hat bei 3x GND (A0-2) die Adresse 0x20, soweit richtig? Ich spreche ihn an mit mcp.begin();. Dabei ist keine Zahl in der Klammer notwendig, da dies die Standardadresse ist?

@2. Wie ist das Ansprechen jedes einzelnen gemeint? Für jeden einen Port am Arduino als Trigger? Dafür müsste ich die Analogen Pins nutzen, da sonst alles voll ist.. jedoch bekomme ich keinen digitalen Output durch die Analogen I/O-Ports vom Yun (REV 2). Hatte bereits alle separat angeschlossen: einen über Digital und 5 über Analog, einer funktionierte und 5 nicht  :smiley-sad-blue:

Dabei hatte ich versucht im Code die Analogen Ports anzusprechen mit digitalWrite(A0, HIGH);. Daraufhin kam nichts, dann habe ich es so versucht: digitalWrite(14, HIGH);.. wieder kein Erfolg. Hat jemand da einen Tipp, werde aus dem Netz auch nicht wirklich schlau  :smiley-red:

Ich hoffe ihr könnt mir noch etwas weiterhelfen.


Viele Grüße und Danke im Voraus
Jens

HotSystems

Zu 2. Du musst den Pin auch als Output definieren.
Und ja, du brauchst für jeden sensor einen Triggerpin, sowie einen Echopin.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jens069

Also der MCP funktioniert nun :D

Das letzte Problem wäre jetzt der Trigger.. Also brauche ich 6 Trigger Pins? Einen habe ich bei den digitalen unter bekommen, also noch 5 bei den analogen.

Ich habe folgende Definitionen gemacht für die analogen Pins.

Code: [Select]
pinMode(A0, OUTPUT);
pinMode(A1, OUTPUT);
pinMode(A2, OUTPUT);
pinMode(A3, OUTPUT);
pinMode(A4, OUTPUT);

digitalWrite(A0, LOW);
digitalWrite(A1, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);
delayMicroseconds(20);
digitalWrite(A0, HIGH);
digitalWrite(A1, HIGH);
digitalWrite(A2, HIGH);
digitalWrite(A3, HIGH);
digitalWrite(A4, HIGH);
delayMicroseconds(10);
digitalWrite(A0, LOW);
digitalWrite(A1, LOW);
digitalWrite(A2, LOW);
digitalWrite(A3, LOW);
digitalWrite(A4, LOW);


Also genau das gleiche wie bei dem digitalen Pin.. nur der ist der einzige, welcher den Befehl umsetzt? :/

Irgendeine Idee?

jens069


zwieblum

du triggerst alle gleichzeitig - wie oben beschrieben wird das nicht fnktionieren. Was die Pins angeht: schreib' ein Testprogramm und probier's aus.

HotSystems

Kann mir keiner weiterhelfen? :(
Poste bitte den kompletten Sketch.
Und wie zwieblum schrieb, gleichzeitig geht nicht.
Du musst erst einen Triggern, den per echo auswerten und dann den nächsten usw.
Mit genügenderPause zwischendrin, damit die sich nicht gegenseitig stören.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jens069

Code: [Select]
  //Start Trigger for Distance Measurement
  //Calculate and safe Distances
  digitalWrite(trigger1, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger1, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger1, LOW);
  dauer1 = pulseIn(echo1, HIGH);
  entfernung1 = dauer1 / 58.2;
  delay(1000);
 
  digitalWrite(trigger2, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger2, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger2, LOW);
  dauer2 = pulseIn(echo2, HIGH);
  entfernung2 = dauer2 / 58.2;
  delay(1000);
 
  digitalWrite(trigger3, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger3, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger3, LOW);
  dauer3 = pulseIn(echo3, HIGH);
  entfernung3 = dauer3 / 58.2;
  delay(1000);
 
  digitalWrite(trigger4, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger4, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger4, LOW);
  dauer4 = pulseIn(echo4, HIGH);
  entfernung4 = dauer4 / 58.2;
  delay(1000);
 
  digitalWrite(trigger5, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger5, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger5, LOW);
  dauer5 = pulseIn(echo5, HIGH);
  entfernung5 = dauer5 / 58.2;
  delay(1000);
 
  digitalWrite(trigger6, LOW);
  delayMicroseconds(20);
  digitalWrite(trigger6, HIGH);
  delayMicroseconds(10);
  digitalWrite(trigger6, LOW);
  dauer6 = pulseIn(echo6, HIGH);
  entfernung6 = dauer6 / 58.2;
  delay(1000);


Ich habe es jetzt so probiert: es wird nun von zwei Sensoren der Wert ausgelesen.. aber mehr funktioniert immernoch nicht :(

PS: Den kompletten Code habe ich einmal in den Anhang.


Viele Grüße
Jens

HotSystems

Was funktioniert nicht ?
Und was funktioniert jetzt ?

Vermute einen Fehler im Aufbau.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jens069

Es funktionieren zwei der sechs Sensoren. Diese sind alle mit Vcc und GND angeschlossen. Außerdem gehen auf die Pins 10,9,6,5,4,1 jeweils separate Echo Leitungen. Die Trigger kommen von den Pins 11,8,7,A3,A4,A5.

Ich erkenne keinen Fehler :(

HotSystems

Leider ist dein Sketch sehr unübersichtlich und sehr schwer zu lesen.

Kannst du die Funktion "distanceMeasurement()" nich mal direkt in der loop aufrufen.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

jens069

Ich habe es getestet gerade so wie du meintest, den Inhalt der distanceMeasurement direkt in die Loop zu packen ohne if davor, etc. -> selbes Ergebnis wie davor. 2 Stück funktionieren, 4 nicht.

Grüße

HotSystems

Dann tausche die Sensoren mal gegeneinander aus.

Und schreib doch mal, welche funktionieren und welche nicht.
Gruß Dieter

I2C = weniger ist mehr: weniger Kabel, mehr Probleme. 8)

Go Up