Das Projekt wurde 2025 geschlossen, es wird keine Updates mehr geben.
Mit I/O Schnittstellen Modulen kann man elektrische Einrichtungen überwachen und steuern. Da PC's keine herkömmlichen Parallel-Ports mehr haben, stelle ich hier einen Ersatz mit serieller USB Schnittstelle vor. Je nach Mikrocontroller erhält man 18 bis 84 steuerbare Anschlüsse. Mit Hilfe von ein paar billigen Schieberegistern sind noch mehr machbar. Der Zugriff auf die I/O Ports erfolgt über einfache Textbefehle.
Downloads:
Beispiel-Programme:
Öffne eine serielle (USB) Verbindung mit 115200 Baud. Du kannst darüber 100 Befehle pro Sekunde ausführen. Neben dem allgemeinen Befehlssatz unterstützt die serielle (USB) Version den h Befehl, welcher eine Hilfeseite anzeigt.
Alternativ zu "nackten" Mikrocontrollern empfehle ich Arduino Nano Boards. Sie enthalten den USB-UART bereits. Dank USB Bootloader braucht man für Arduino Boards keinen Programmieradapter.
Die Anzahl der I/O Ports kann man mit Schieberegistern vom Typ 74HC165 und 74HC595 oder TPIC6B595 erweitern. So kommt man auf bis zu 32 zusätzliche Eingänge und 32 zusätzliche Ausgänge.
Test mit einem Terminalprogramm:
Ich möchte dir zeigen, wie einfach das Modul mit einem selbst geschriebenen PC Programm gesteuert werden kann. Es erfordert nur wenige Minuten.
Baue dir ein I/O Modul mit USB auf Basis eines Arduino Nano auf. Am Anschluss PD2 soll eine LED mit Vorwiderstand hängen:
470Ω LED PD2 o-----[===]-----|>|----| GND
Lade die Firmware mit einem ISP Programmieradapter (oder dem vorinstallierten Bootloader) in den Mikrocontroller, und schließe das Modul an den PC an. Der USB Treiber wird automatisch installiert. Schaue im Gerätemanager von Windows nach, welcher COM-Port dem Gerät zugewiesen wurde. Benutze bei Linux den dmesg Befehl. In meinem Fall ist es "COM3".
Installiere die Qt Creator Entwicklungsumgebung. Damit kannst du schicke Programme für Windows, Linux und Mac OS in der Sprache C++ entwickeln.
Lege in Qt Creator ein neues Projekt an, wobei du die Vorlage "Anwendung/Qt-Widgets-Anwendung" wählst. Gebe der Anwendung den Namen "test" und klicke dann ein paar mal auf "Weiter", um den Assistenten abzuschließen. Du erhältst folgende Ansicht:
Füge ganz oben in die Datei mainwindow.cpp eine Zeile für die QSerialPort Klasse ein:
#include "mainwindow.h" #include "ui_mainwindow.h" #include <QSerialPort>
Öffne die Projektdatei test.pro durch Doppelklick und ergänze die folgende Zeile um das Wort "serialport":
QT += core gui serialport
Öffne das Formular, indem du doppelt auf die Datei mainwindow.ui klickst. Ziehe aus dem Widget Katalog (links) einen "Push Button" in das Formular, etwa so:
Klicke doppelt auf die Beschriftung "PushButton", um den Knopf "Start" zu nennen.
Nun wollen wir festlegen, was beim Klick auf den Knopf passieren soll. Klicke dazu mit der rechten Maustaste auf den Knopf, und dann auf "Slot anzeigen...".
Wähle das Signal clicked() aus. Dadurch wird in der Datei mainwindow.cpp eine leere Funktion mit Namen on_pushButton_clicked() erzeugt, die beim Klick auf den Knopf ausgeführt wird. Fülle die leere Funktion wie folgt aus:
void MainWindow::on_pushButton_clicked() { // Seriellen Port öffnen QSerialPort port("COM3"); port.setBaudRate(QSerialPort::Baud115200); port.open(QIODevice::ReadWrite); // Konfiguriere PD2 als Ausgang port.write("dPD2,1\n"); port.flush(); // Setze PD2 auf High Pegel port.write("oPD2,1\n"); port.flush(); // Schließe den seriellen Port port.close(); }
Anstelle von "COM3" sollst du den Port angeben, den Windows deinem Modul zugewiesen hat. Darunter muss die richtige Baudrate angegeben werden, entsprechend der Firmware auf deinem Mikrocontroller.
Probiere das Programm aus, indem du Strg-R drückst.
Wenn du auf den Start Knopf klickst, geht die LED am Port D2 an. Zur Übung könntest du noch einen zweiten Knopf hinzufügen, der die LED wieder aus schaltet.
Um die Antwort des Moduls zu lesen, kannst du nach dem flush() dies einfügen:
QTime time; time.start(); while (!serialPort.canReadLine()) { if (time.elapsed()>1000) { break; } QThread::msleep(10); QCoreApplication::processEvents(); } QByteArray response=serialPort.readAll().trimmed();
Hier wird maximal eine Sekunde lang auf die Antwort gewartet, damit sich das Programm im Fall eines technischen Defektes nicht aufhängt.
Schaue dir die Dokumentation von QSerialPort, sowie ganz allgemein die Einsteiger-Hilfen von Qt an.