Arduino mit 10 Ultraschallsensoren + 10 Infrarotsensoren

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 ? :wink:

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

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:

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

Mooo:
Aus den Infrarotsensoren kommen analoge Daten (GP2Y0A02YK0F).

Zu dem Problem mit dem MCP23017:

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

Tutorial: Maximising your Arduino’s I/O ports with MCP23017 | tronixstuff.com

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.

Schade, wie könnte ich das hinbekommen mit den analogen Signalen?

Hier der Sketch für die Ansteuerung der Ultraschallsensoren über MCP23017:

#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

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.

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?

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.

#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);

}

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

Edit:
Danke Uwe

Und wie muss ich das verstehen?

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:

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.

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.

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

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.

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.

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

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.

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)

Ok, das habe ich auch schon vorher so verstanden.

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.

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.

.

Wie gesagt, den mcp habe ich bereits betreiben können mit high/low, leds usw, wie im tutorial.

Das soll der erste schritt sein um dpäter 10 statt 1 us Sensor anzuschließen.

Mooo:
Wie gesagt, den mcp habe ich bereits betreiben können mit high/low, leds usw, wie im tutorial.
Das soll der erste schritt sein um dpäter 10 statt 1 us Sensor anzuschließen.

Ein US-Sensor ist keine Led!

Das ändert ja nichts daran, dass du die Grundlagen verstehen musst und die Sensoren richtig anschließen musst. Verstehe es bitte.

So wie du es machen möchtest, funktioniert es nicht. Das ist halt so.

Hier findest du ein paar Grundlagen.

Und wenn das nicht reich, poste ich dir gern noch ein paar Links.

Ich habe mir die Grundlagen durchgelesen, aber es gab nichts, was mir bei meinem Problem weiter helfen könnte. Ich habe gerade die Ultraschallsignale gemessen. Diese sind sehr klein (im mV-Bereich). Vermutlich werden sie vom Port-Expander nicht wahrgenommen.

Mooo:
Ich habe mir die Grundlagen durchgelesen, aber es gab nichts, was mir bei meinem Problem weiter helfen könnte. Ich habe gerade die Ultraschallsignale gemessen. Diese sind sehr klein (im mV-Bereich). Vermutlich werden sie vom Port-Expander nicht wahrgenommen.

Hast du es mal so programmiert, wie in meinem Beispiel in Post #8?
Wenn du das anders machst, kann ich dir nicht helfen.

Womit misst du ?

Ich hoffe mit einem Oszilloskop?
Und wenn die Signale, wie du sie gemessen hast, tatsächlich im mV-Bereich sind, könnte der Arduino direkt auch nichts damit anfangen. Also ist deine Messung grundsätzlich falsch!

Im übrigen sind das schnelle, digitale Signale!

Und die Grundlagen sind wichtig, um I2C zu verstehen. Wenn dir das nicht hilft, dann vergiss einfach I2C und mache es mit einem MEGA, der hat mehr Ports.

Ja, das Beispiel in deinem Post #8 habe ich auch so im moment aufgebaut. Es funktioniert ja mit den LEDs, habe dazu allerdings einen anderen Code und eine andere Libary als dort vorgegeben.

Ich hatte grad wohl leider ein Denkfehler, natürlich misst man digitale Signale nicht mit einem Multimeter.

Ich habe zum I2C Folgendes verstanden. Es ist ein Bus, an dem sämtliche Leitungen angeschlossen werden können. Es muss eine Adresse des IC vorliegen, damit die Kommunikation stattfinden kann. Wenn A0-A2 mit GND verbunden werden, ist die Adresse eindeutig.

Jedoch wüsste ich nicht konkret, wie ich digitale Signale am MCP-Pin7 übertragen kann auf MCP-Pin8. Und später soll die Anzahl der Sensoranschlüsse erhöht werden. Weiß aber nicht, wie ich dies erst nur mit einem Sensor hinbekommen soll.

Soll ich dir den ganzen Code mit der Libary und den genauen Beschaltungsplan mit dem US-Sensor zuschicken?

Mooo:
Ich habe zum I2C Folgendes verstanden. Es ist ein Bus, an dem sämtliche Leitungen angeschlossen werden können. Es muss eine Adresse des IC vorliegen, damit die Kommunikation stattfinden kann. Wenn A0-A2 mit GND verbunden werden, ist die Adresse eindeutig.

Hää?????? Was meinst du?

I2C ist fest an die PINs A4 und A5 des UNO gebunden. Über diese beiden Pins läuft grundsätzlich alle Kommunikation. Die Adresse des ICs wird im Programm und nicht durch die Beschaltung von Arduino-Pins vorgenommen. Manche I2C-ICs haben Pins über die man die Adresse des ICs ändern kann. Die werden dazu fest auf GND oder VCC gezogen.

Mit einem Mega hast du alle Probleme nicht. Dort kannst du alle Sensoren direkt anschließen und werden ohne Aufwand von den Üblichen Librarys angesprochen.