-
-
Erfahrener Benutzer
Robotik Einstein
Hallöle,
Dein Vorsatz, an einem Projekt zu wachsen ehrt Dich
Du hast ein entscheidendes Problem ja schon erkannt: um frustfrei erweitern zu können musst Du ein Bussystem o.ä. haben, an das Du Module anstöpseln kannst, die dann jeweils mehrere Sensoren oder Aktoren steuern können. Ich verwende für sowas RS485, ein bidirektionales Halbduplex-Protokoll über ein symmetrisches Aderpaar. Man muss anfangs natürlich ein Protokoll definieren und sich dann auch dran halten. Du könntest auf der Softwareseite zB so vorgehen:
Master (PC) schickt sowas wie "17 3A <CR>" auf den Bus. Die Vereinbarung hierzu könnte lauten: erstes Hexzahlenpaar Adresse, zweite Sensornummer, alles bis zum CR ignorieren.
Alle Slaves (Deine Module) hören das, ignorieren es aber bis auf das Modul, in dessen Software Du die Adresse 17 verankert hast. Dieses fragt daraufhin seinen Sensor mit der Nummer 3A ab und sendet "17 3A 1E <CR>". Der PC hört die Antwort und weiss: Modul 17 antwortet, Sensor 3A weiss zu berichten 1E=30, also misst da wohl was 30 Grad.
Wenn die Antwort nicht kommt (Modul kaputt, falsche Adresse abgefragt) sollte nach kurzer Zeit (länger als die maximale Messdauer natürlich) ein Timeout eintreten, heisst: nach Ablauf der definierten Zeit darf auch ein angesprochenes Modul nicht mehr senden und der PC darf das nächste abfragen. Wie Du das Protokoll definierst, liegt natürlich an Deinen Sensoren und Bedürfnissen, es lohnt sich, von vornherein intenstiv darüber nachzudenken!
Nun die elektronische Seite: für die PC-Seite kannst Du einen fertigen RS232-nach-RS485-Wandler benutzen, meistens wird die Senderichtung bei den Dingern mit den Handshakeleitungen gesteuert, aber die solltest Du unter C++ ja ansprechen könnnen (unter Linux hatte ich damit nie Probleme, ich wüsste also nicht, warum es nicht auch unter Windows gehen sollte).
Auf Deinen Modulen müsstest Du dann jeweils einen RS485-Transceiver-Chip (LTC1487 habe ich zuletzt benutzt) einbauen, dessen Datenleitungen verbindest Du direkt mit den UART-Anschlüssen RxD und TxD Deines Controllers. Ich plädiere hier wie üblich für einen ATmega. Mit einer Portleitung steuerst Du dann die Sende-/Empfangsumschaltung des LTC1487. Den ATmega kannst Du auch in C programmieren, so dass die Eingewöhnung nicht so schwer fallen dürfte, nur die Eigenarten der hardwarenahen Programmierung könnten Dich anfangs etwas verwirren. Nun haben wir also einen RS485-Baustein, einen ATmega. Der braucht jetzt noch einen Quarz für genauen Takt, falls Du mal irgendwelche Timings erzeugen musst und einen Programmierstecker, das ist einfach nur eine 10polige Pfostenleiste, an die Du einen Programmieradapter (wurde hier desöfteren vorgestellt, im Grossen und Ganzen ein 74HC244, der am Parallelport des PC hängt) stecken und den ATmega in Deiner Schaltung programmieren kannst.
Messen kann er so natürlich noch nichts. Aber die Controller dieser Familie haben (fast?) alle einen 10-bit-A/D-Umsetzer mit max. 8 Kanälen eingebaut, den Du verwenden könntest. Als Temperatursensor bietet sich dann etwas an, was bereits eine zur Temperatur linear proportionale Ausgangsspannung liefert (zB. LM35) und nicht etwa ein NTC, der erstmal wild linearisiert werden will. Ein anderer Weg wäre ein I2C-Temperatursensor, der mit dem Dreidrahtbus I2C mit dem ATmega verbunden wird. Jeder Baustein an diesem Bus bekommt eine Adresse verpasst, die zum Teil im Chip codiert ist, zum Teil von aussen durch Beschaltung bestimmter Pins festgelegt werden kann. Ein typischer Baustein dieser Art ist der LM75, allerdings ist der I2C-Bus vorrangig für die Verwendung innerhalb von Geräten gedacht, wenn Du also mehrere Temperaturfühler mit Kabeln an Dein Modul anschliessen möchtest, ist das nicht ganz optimal, dann würde ich doch eher was Analoges (zB den LM35 am A/D-Wandler) nehmen oder auf den 1-Wire-Bus von Dallas/Maxim umsteigen. Die Bausteine, zB der DS1820, brauchen wirklich nur eine Leitung plus Masse und die Bustopologie ist relativ willkürlich wählbar. Der Haken hier ist, dass die Chips zwar alle eine eindeutige und einmalige Adresse haben, die deutlich mehr Spielraum als die 8 möglichen LM75 an einem I2C-Bus bieten, aber leider auch nicht auf den ICs draufstehen, wenn Du also IC und Adresse eindeutig zuordnen willst, musst Du die vorher irgendwie auslesen oder eine Arbitrierungsroutine schreiben; Letztere hat Dallas zwar mal veröffentlicht, aber anfreunden konnte ich mich damit nie wirklich.
Zusammenfassung: am PC einen Wandler von RS232 auf RS485, auf den Modulen jeweils einen ATmega mit Programmierstecker, Quarz und LTC1487. An einen A/D-Eingang des ATmega kannst Du einen Analog-Temperatursensor anschliessen. Ein paar passive Bauteile, etwas Kabel und ein C-Programm, das Du mit WinAVR (frei, basiert auf dem Gnu C-Compiler gcc) programmierst und mit Ponyprog (ebenfalls frei) in den ATmega "flasht" und schon kannst Du mit einem Terminalprogramm vom PC aus Steuerbefehle an Dein Modul senden und die Antworten angucken. Wenn das funktioniert schreibst Du Dir ein Auswertungsprogramm nach Maß und Wunsch am PC und dann kann's weitergehen mit neuen Sensoren, Aktoren und weiteren Modulen. Ohne großartige weitere Hardware (weitere Wandler) kannst Du mindestens 8 analoge Sensoren, einige I2C-Bausteine, diverse digitale Ein- und Ausgänge (Meldekontakte, LEDs, Relais....) an jeden ATmega und damit an jedes Modul anschliessen.
Eine Beispielschaltung mit LTC1487 und die entsprechenden Stellen C-Code für den AVR kann ich Dir bei Bedarf mal extrahieren.
edit: kalledom hatte anscheinend die gleiche Idee, ich hab aber schon angefangen zu schreiben, bevor sein Posting hier stand. Ehrlich
Berechtigungen
- Neue Themen erstellen: Nein
- Themen beantworten: Nein
- Anhänge hochladen: Nein
- Beiträge bearbeiten: Nein
-
Foren-Regeln
Lesezeichen