Hallo zusammen!
Zur Zeit arbeite ich an einem Projekt, und zwar will ich ein Interface bauen um
Druckbare Version
Hallo zusammen!
Zur Zeit arbeite ich an einem Projekt, und zwar will ich ein Interface bauen um
Hi, Eidechse.
Erst mal willkommen im Forum!
Was mir zuallererst auffällt, sind die fehlenden Basiswiderstände und die untypische Schalttransistor-Beschaltung: Üblich -weil sehr sinnvoll- ist es, den Basisstrom direkt von der Basis über den Emitter nach "0V" fließen zu lassen, der Verbraucher hingegen gehört zwischen +5V und den Kollektor.
Funktional habe ich mir deinen Schaltplan nicht angesehen.
Wo sind denn Eingänge?
Warum bist du am verzweifeln? Die Bilder geben keine Anhaltspunkte dafür.
Gruß
RoboHolIC
1. Wenn die LEDs mit Vorwiderständen in den Platinen gemeinsam gegen GND verschaltet sind, kannst du die Treibertransistoren so verschalten, wie du das gemacht hast. Allerdings kann man diese Treiber dann nicht direkt mit dem PCF8574 ansteuern, sondern man braucht noch für jeden Kanal einen weiteren Transistor in Emitterschaltung. Dazu gehören dann auch noch je 2 Widerstände (Basiswiderstand und Kollektorwiderstand). Alternativ nimmt man einen PNP-Typ als Treiber für die LEDs.
2. Wenn die LEDs auch anders zu beschalten sind (also gegen Plus), kriegt man das auch mit 1 Transistor hin.
3. Bei den Eingängen weiss ich nicht genau, was der NXT erwartet, daher kann ich dazu nichts sagen. Ich kann auch aus deinem Schaltplan nicht sicher erkennen, wo die Eingänge anliegen.
Wenn du weitere Hilfe brauchst, müßtest du auch beschreiben, WAS genau nicht funktioniert.
die Pull-Up Widerstände für SDA und SCL sind meiner Meinung nach auch deutlich zu hoch. Üblicherweise verwende ich dafür 4k7 und keine 82k! Dann sollte man die auch nur einmal pro Bus verwenden - üblicherweise direkt am Master und nicht auf den Slave-Platinen. Dafür fehlen die Basis-Widerstände an den Transistoren. Darüber, dass die Last üblicherweise im Collector-Pfad hängt wurde ja schon erwähnt.
Hm okay, danke schon mal für die Antworten und Tipps.
Um einen PCF8574 als Eingang zu benutzen musst Du zuerst schreibend alle Pins auf HIGH setzen. Die externe Beschaltung zieht die Pegel dann auf LOW indem sie die Pins auf Masse schaltet. Diesen Low-Pegel kannst Du dann beim Einlesen des Portexpanders erkennen.
Hier ein Beispiel, wie man das mit C z. B. für einen Arduiono machen kann: http://cboden.de/mikro-controller/di.../45-pin-finder Dabei wird ein PCF8574 so angesteuert, dass seine Pins als Eingänge fungieren. Wenn Du die ganzen lcd Aufrufe weg lässt, bleibt nicht mehr viel Code für den PCF8574 übrig. Der Code sollte mehr oder weniger selbsterklärend sein. Bei Fragen dazu kann ich Dir aber gerne helfen. Anpassen auf Deine Programmierumgebung musst Du ihn aber selbst ;-)
- - - Aktualisiert - - -
hier mal der zusammengekürzte Programmcode, der nur noch die für den PCF8574 relevanten Teile beinhaltet:
Code:// --------------------------------
// Benötigte Bibliotheken einbinden
// --------------------------------
#include <TinyWireM.h> // I2C
// ---------------------
// Konstanten definieren
// ---------------------
#define PORT_ADDR 0x20 // I2C-Adresse für Port-Expander
// -------------------------
// globale Variablen anlegen
// -------------------------
boolean data_received = false; // Flag zum erkennen, ob Daten gelesen werden konnten
// --------------------------------------------------------
// Setup-Routine (wird automatisch beim Starten ausgeführt)
// --------------------------------------------------------
void setup(){
// I2C Schnittstelle initialisieren
TinyWireM.begin();
// Port-Expander initialisieren
writePort(PORT_ADDR, 0xff);
}
// ------------------------------------------------------------
// Haupt-Routine (wird kontinuierlich als Schleife durchlaufen)
// ------------------------------------------------------------
void loop(){
byte data;
// Eingänge lesen
data=readPort(PORT_ADDR);
// prüfen, ob valide Ergebnisse geliefert wurden
if (data_received){
// Ab hier stehen die Stati des Portexpanders in der Variable
// data zur Verfügung
}
}
// --------------------------------------------
// Routinen zur Kommunikation mit dem Expander
// --------------------------------------------
byte readPort(int address) {
byte data=0xff;
TinyWireM.requestFrom(address,1);
if(TinyWireM.available()){
data=TinyWireM.receive();
data_received=true;
}
else {
data_received=false;
}
return data;
}
void writePort(int address, byte data) {
TinyWireM.beginTransmission(address);
TinyWireM.send(data);
TinyWireM.endTransmission();
delay(5);
}
Danke redround,
aber ich werde nichts programmieren, das Signal was kommt soll vom Lego NXT kommen.
dann wie gesagt einfach die Pins, die als Eingang genutzt werden sollen z. B. mit einem Taster gegen Masse schalten ... fertig :-)
Ich will dazwischen noch ein
Der ULN2003 ist ein Darlington-Treiber ... was willst Du damit erreichen? Und was verstehst Du unter einem Puffer?
Ich will das die LEDs geschützt sind.
Du würfelst da einiges durcheinander. Entweder der PIN soll als Eingang genutzt werden. Dann einfach
PCF Pin X --> Schalter gegen Masse
Oder der Pin soll als Ausgang genutzt werden. Dann im einfachsten Fall
PCF Pin X --> Widerstand --> LED --> Masse
Wenn der Strom, den die LED aufnimmt größer ist, als der Strom den der PCF zur Verfügung stellen kann, dann braucht man einen Treiber. Das kann ein ULN sein oder einfach ein Transistor. Wenn Du einen ULN verwendest brauchst Du zusätzlich auch noch einen Inverter, da er bei LOW des PCF-Pin leitet und bei HIGH sperrt.
Pin + LED + Treiber + Schalter gegen Masse macht jedoch keinen Sinn
und wovor willst Du die LED schützen? Wichtig ist nur, dass der Vorwiderstand zur LED passt ... mehr Schutz ist nicht erforderlich und macht auch keinen Sinn.
Also zum Ausgang:
Hier nochmal besser erkennbar:
Noch wer da?
Naja, wie soll ich sagen - auf mich wirkt das schaltungstechnisch etwas überfordert.
Bei den Ausgängen:
Transistoren T9 .. T16, offenbar als potentialfreie Schaltausgänge geplant (analog zu Relais): das geht so nicht. Die Schalttransistoren müssten dann extern an ein Potential der Leistungsversorgung angebunden werden. Da wären dann NPN-Transistoren mit Emitter an GND besser, dann wäre die zu schaltende Spannung in ziemlich weitem Bereich variierbar. (Allerdings sollten dann auch die Diagnose-LEDs elektrisch anders drangeschaltet werden.
LED9 würde ich nicht direkt vom INT/-Ausgang treiben zu lassen. Die Abkopplung vom Bus ist für sich betrachtet schon richtig, damit nicht andere Busteilnehmer diese LED zum Leuchten bringen können.
Die Adressierung des PCF würde ich mit Pullups und Jumper gegen GND realisieren, dann sind keine undefinierten Pegel möglich.
Bei den Eingängen:
Warum die Pullups an IC2, wenn da zugleich die LEDs von (+) geschaltet werden? Die schaden nicht, sind aber überflüssig.
Was soll das mit den 1:1-Eingangsteilern (47k-47k) an IC2? Das ist zumindest eine untypische Beschaltung. Da sollen doch 5V-Logikpegel dran, oder? Dann besser keinen Eingangsteiler, zumal die Längswiderstände jeweils die Basisströme der ULN-Treiber unnötig reduzieren; die Vorwiderstände sind beim ULN2803 bereits passend für 5V-Logik integriert.
Zur Adressierung:
A0 ist die niederwertigste Adressleitung; die Zustände an A2, A1 und A0 sind in der Software als Dualzahl zu interpretieren.
Zum INT/:
T1 und T2 bilden eine scheinbar nutzlose doppelte Negierung. Stammt dieser Schaltungsteil aus LEGO-Quellen? Dann wäre der Grund für diesen Extraaufwand interessant zu wissen.
Die 82k-Pullups am I2C-Bus sind weiterhin hinterfragungswürdig.
Dankeschön.
Allem Anschein nach keiner.
Der INT/ des PCF informiert über einen Pegelwechsel an irgend einem der als Inputs arbeitenden I/O-Kanäle. Dieser Pin kann als externer Interruptauslöser am Controller verwendet werden oder aber unbeschaltet bleiben.
In dem von dir verlinkten Wikipedia-Artikel kann ich -genau wie du- keinen Interrupteingang beim NXT-Steckanschluss finden.