Go Down

Topic: Arduino mit 10 Ultraschallsensoren + 10 Infrarotsensoren (Read 2073 times) previous topic - next topic

Mooo

Hallo zusammen,

ich möchte an meinem Arduino 10 Ultraschallsensoren und 10 Infrarotsensoren anschließen. Dafür sind aber leider am Arduino zu wenig Ports vorhanden. Die Ultraschalsensoren schließe ich an den digitalen Ports an, die Infrarotsensoren an den analogen Ports. Zur Erweiterung der Ports habe ich mir den Expander MCP23017 gekauft, aber bisher keine Erfolge. Ich weiß nicht, ob das damit auch funkionieren wird. Weitergehende Rechersche hat gezeigt, dass man mit dem Schieberegister 74HC595 Ports erweitern kann. Allerdings zeigen viele Tutorials dies nur mit LED Lampen. Ich weiß nicht, ob mir dieser Schieberegister für die Erweiterung der analogen+digitalen Port helfen würde, um die Ultraschall- und Infrarotsensoren anzuschließen. Kann mir vielleicht bitte jemand sagen, wie der beste Weg ist, je 10 Ultraschall- und Infrarotsensoren am Arduino anzuschließen?

Gruß
Markus

Kickboxer

Hallo Markus,

MCP23017 läuft perfekt. Zahlreiche Beispiele im Netz.
Habe ich selber verwendet. Billig, viele Kanäle. Als Eingang und Ausgang nutzbar. SMD und THT verfügbar. Was willst Du mehr ? ;-)


Ich gehe davon aus, dass aus den Sensoren tatsächlich keine Analogwerte kommen?
Dann gehst Du den richtigen Weg mit dem MCP
Woran scheitert es denn ? Schaltbild? Skizze ? Code?

Dann kann Dir bestimmmt jemand helfen.

Viele Grüße

Jörg
Deutsches Forum zum ESP8266:

WWW.ESP-FORUM.DE

Mooo

Hallo Jörg,

zunächst einmal vielen Dank für die schnelle Antwort.

Aus den Infrarotsensoren kommen analoge Daten (GP2Y0A02YK0F).

Zu dem Problem mit dem MCP23017:

Ich nutze die Schaltung, die unter diesem Link abgebildet ist:

http://tronixstuff.com/2011/08/26/tutorial-maximising-your-arduinos-io-ports/

Ich habe es hinbekommen, dass ich zwei beliebige Ports am MCP23017 gleichsetzen kann. Das heißt zB Port 7 ist gleich Port B. Allerdings habe ich hierbei immer 5V an Port 7 angeschlossen und es kam auch 5V an Port b - wie erwartet.

Sobald ich aber den Ultraschallsensor an Port 7 anschließe, kommen bei Port 8 keine Signale an. Woran liegt es? Kann der MCP23017 die Signale vom Ultraschallsensor nicht verarbeiten?


Gruß
Markus

HotSystems

Aus den Infrarotsensoren kommen analoge Daten (GP2Y0A02YK0F).

Zu dem Problem mit dem MCP23017:

Ich nutze die Schaltung, die unter diesem Link abgebildet ist:

http://tronixstuff.com/2011/08/26/tutorial-maximising-your-arduinos-io-ports/

Ich habe es hinbekommen, dass ich zwei beliebige Ports am MCP23017 gleichsetzen kann. Das heißt zB Port 7 ist gleich Port B. Allerdings habe ich hierbei immer 5V an Port 7 angeschlossen und es kam auch 5V an Port b - wie erwartet.

Sobald ich aber den Ultraschallsensor an Port 7 anschließe, kommen bei Port 8 keine Signale an. Woran liegt es? Kann der MCP23017 die Signale vom Ultraschallsensor nicht verarbeiten?
Für die analogen Sensoren wird das nicht funktionieren.
Mit den digitalen schon.
Zeige uns mal deinen Sketch, dann können wir sicher helfen.
Gruß Dieter

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

Mooo

#4
Jun 29, 2016, 06:55 pm Last Edit: Jun 29, 2016, 09:46 pm by uwefed Reason: add [CODE] TAGs </>
Schade, wie könnte ich das hinbekommen mit den analogen Signalen?

Hier der Sketch für die Ansteuerung der Ultraschallsensoren über MCP23017:
Code: [Select]
#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;


int trig = 7;
int echo = 8;
int cm;
int duration;


void setup() {  
mcp.begin(0);      // use default address 0
mcp.pinMode(6, INPUT);
mcp.pinMode(7, INPUT);
mcp.pinMode(8, OUTPUT);
mcp.pinMode(9, OUTPUT);


for (int i=0;i<16;i++)
 mcp.digitalWrite(i, LOW);

pinMode(trig,OUTPUT);
pinMode(echo,INPUT);
Serial.begin(9600);
}


void loop() {

mcp.digitalWrite(8, mcp.digitalRead(7));
mcp.digitalWrite(9, mcp.digitalRead(6));

digitalWrite(trig,LOW);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
duration = pulseIn(echo,HIGH);
cm = duration/58;


Serial.print(cm);
Serial.println(" cm ");

delay(500);

}

Vielen Dank im Voraus!

Gruß
Markus

HotSystems

Die Steuerung deines Portexpanders ist etwas merkwürdig.
Ohne Kommentare steig ich da nicht durch.
Ich habe den mal ohne eigene Library getestet und so wie hier angesteuert.

http://tronixstuff.com/2011/08/26/tutorial-maximising-your-arduinos-io-ports/

Das solltest du mal auch so machen.

Und bitte den Sketch in Code-Tags setzen. Schaltfläche </> verwenden, oben links im Fenster, das geht auch nachträglich.

Und evtl. auch Kommentare einfügen. Warum nutzt du Atmega Pins und die vom Expander?

Gruß Dieter

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

Mooo

#6
Jun 29, 2016, 09:39 pm Last Edit: Jun 29, 2016, 09:47 pm by uwefed Reason: add [CODE] TAGs </>
Ich habe mal den Code kommentiert. Nochmal zur Erinnerung. An sich konnte ich mit dem Portexpander mit einer LED arbeiten; d.h. mit mcp.digitalWrite(8, mcp.digitalRead(7)); konnte ich 5V Signale, die ich an Pin7 anlege auch an Pin 8 messen. Nur wenn ich den Ultraschallsensor dort anschließe, dann funktioniert die Signalübertragung innerhalb des Portexpanders nicht.
Ich benutze Pins von Arduino und Portexpander, weil ich zunächst versuche, nur einen Ultraschallsensor über den Portexpander zu steuern. Wenn ich beispielsweise den Ultraschallsensor OHNE Portexpander beschalte, dann muss ich die Anschlusspins des Ultraschallsensors am Arduino definieren.
Code: [Select]
#include <Wire.h>
#include "Adafruit_MCP23017.h"

Adafruit_MCP23017 mcp;


int trig = 7;                           //Pin7 am Arduino ist Trigger von Ultraschall
int echo = 8;                           //Pin8 am Arduino ist Echo von Ultraschall
int cm;
int duration;


void setup() {  
mcp.begin(0);                           // use default address 0
mcp.pinMode(6, INPUT);                  //Pin6 am MCP ist Input
mcp.pinMode(7, INPUT);                  //Pin7 am MCP ist Input
mcp.pinMode(8, OUTPUT);                 //Pin8 am MCP ist Output
mcp.pinMode(9, OUTPUT);                 //Pin9 am MCP ist Output


for (int i=0;i<16;i++)
 mcp.digitalWrite(i, LOW);

pinMode(trig,OUTPUT);                   //Pin7 (Trigger) ist Output
pinMode(echo,INPUT);                    //Pin8 (Echo) ist Output
Serial.begin(9600);
}


void loop() {

mcp.digitalWrite(8, mcp.digitalRead(7));    //am MCP soll Signal von Pin7 nach Pin8 übertragen werden
mcp.digitalWrite(9, mcp.digitalRead(6));    //am MCP soll Signal von Pin6 nach Pin9 übertragen werden


//Berechnung des Abstandes
digitalWrite(trig,LOW);
digitalWrite(trig,HIGH);
delayMicroseconds(10);
digitalWrite(trig,LOW);
duration = pulseIn(echo,HIGH);
cm = duration/58;


Serial.print(cm);
Serial.println(" cm ");

delay(500);

}

HotSystems

Und warum verwendest du keine Code-Tags, der ist so schlecht lesbar.

Edit:
Danke Uwe
Gruß Dieter

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

HotSystems

Und wie muss ich das verstehen?

Code: [Select]
mcp.digitalWrite(8, mcp.digitalRead(7));    //am MCP soll Signal von Pin7 nach Pin8 übertragen werden
mcp.digitalWrite(9, mcp.digitalRead(6));    //am MCP soll Signal von Pin6 nach Pin9 übertragen werden



Was willst du da übertragen?
Für die US-Messung muss ein Pin als Ausgang den Ping absetzen und der andere Pin den Ping empfangen und dann rechnen.

So wie du es auch mit den Controllerpins (Trigger und Pulsin) gemacht hast.

Also wie in diesem Beispiel:

Code: [Select]
mcp.digitalWrite(8,LOW);
mcp.digitalWrite(8,HIGH);
delayMicroseconds(10);
mcp.digitalWrite(8,LOW);
duration = pulseIn(7,HIGH);
cm = duration/58;


Ich kann es allerdings nicht testen, da ich keinen Baustein mehr hier habe.
Evtl. müssen HIGH und LOW getauscht werden, kann ich aktuell nicht sagen, einfach probieren.

Und besser wäre es, wenn du den Sketch etwas übersichtlicher gestaltest, als raus was nicht gebraucht wird. Du kannst den Sketch ja als Sicherheit unter anderem Namen speichern.


Und zu der Frage mit den analogen Sensoren, das geht nur über die analogen Pins A0 - A5.
Du kannst aber auch Infrarot-Sensoren nehmen, mit einem digitalen Ausgang.
Gruß Dieter

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

Mooo

Was ich eigentlich möchte, ist, dass ich einfach nur am mcp pin7 (input) gleichsetze mit pin8 (output). Wenn das klappt, dann möchte ich pin7 gleich setzen mit je zeitschritt pin8,9,10 (multiplexen). Das ziel soll sein, 10 ultraschallsensoren über so wenig Arduino-pins wie es geht, anzubinden ubd zu steuern.

Mooo

stimmt, ultraschall hat 2 Pins, eins zum senden und eins zum empfangen,, daher 4 mcp-pins.

HotSystems

#11
Jun 29, 2016, 10:58 pm Last Edit: Jun 29, 2016, 11:03 pm by HotSystems
Was ich eigentlich möchte, ist, dass ich einfach nur am mcp pin7 (input) gleichsetze mit pin8 (output). Wenn das klappt, dann möchte ich pin7 gleich setzen mit je zeitschritt pin8,9,10 (multiplexen). Das ziel soll sein, 10 ultraschallsensoren über so wenig Arduino-pins wie es geht, anzubinden ubd zu steuern.
Sorry, das versteh ich nicht.

Bitte nochmal verständlicher.


Edit:
Und wenn ich es nachrechne, dann brauchst du so 2 Expander für deine 10 Sensoren. Einer für 8 Sensoren, der nächste für 2 Sensoren.

Und nur 2 I2C-Leitungen, die allerdings schon mal 2 analoge Pins benutzen.

Gruß Dieter

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

Theseus

Eigentlich ist das ein Projekt, wofür der Mega einfach nur prädestiniert wäre.

Mooo

Also, ich versuch es nochmal deutlicher zu erklären:

Ziel: 10 ultraschallsensoren am arduino über den Portexpander anschließen

Vorgehensweise: erst soll nur ein ultraschallsensor über den Portexpander zum Arduino verbunden werden (dazu der Code den ich gepostet habe)

Anschlüsse: Anstatt dass ich den Sensor direkt am Arduino anschliesse, möchte ich zwischen Sensor und Arduino den Portexpander tun. Das heißt: Sender von Sensor soll mit Pin6(Mcp-Input) verbunden werden. Pin8(mcp-putput) soll mit digitaleingang des Arduino verbunden werden. Der digitalausgang des Arduino soll mit pin7(mcp-input) verbubden werden und der pin9(mcp-output) mit dem Empfänger am sensor.

Im code schrieb ich:

Pin6=pin8
Pin7=pin9

Somit müssten Signale von einem mcp-input übertragen werden in das jeweilige mcp-output.


HotSystems

Also, ich versuch es nochmal deutlicher zu erklären:

Ziel: 10 ultraschallsensoren am arduino über den Portexpander anschließen

Vorgehensweise: erst soll nur ein ultraschallsensor über den Portexpander zum Arduino verbunden werden (dazu der Code den ich gepostet habe)
Ok, das habe ich auch schon vorher so verstanden.

Quote
Anschlüsse: Anstatt dass ich den Sensor direkt am Arduino anschliesse, möchte ich zwischen Sensor und Arduino den Portexpander tun.
Dazu setzt man üblicherweise Portexpander ein.

Quote
Das heißt: Sender von Sensor soll mit Pin6(Mcp-Input) verbunden werden. Pin8(mcp-putput) soll mit digitaleingang des Arduino verbunden werden. Der digitalausgang des Arduino soll mit pin7(mcp-input) verbubden werden und der pin9(mcp-output) mit dem Empfänger am sensor.

Somit müssten Signale von einem mcp-input übertragen werden in das jeweilige mcp-output.
Und wozu soll das gut sein?

Der Portexpander braucht einen  analogen Eingang am Arduino und die Sensoren kommen jeweils an einen Eingang und Ausgang des
Expanders.

Du hast die Funktion des I2C-Portexpander nicht verstanden.
Bitte lies dir erst mal die Funktionen des I2C-Portexpanders durch und dann reden wir weiter.

So geht das nicht.



.
Gruß Dieter

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

Go Up