Foto von USB I/O Interface mit ATmega168
USB I/O Interface mit ATmega168

Projekt Status

Die Firmware läuft sehr stabil und hat alle Features, die ich bislang implementieren wollte. Neue Funktionen sollten Sie daher nicht erwarten.

Changelog

1.4.4 19.02.2015
Update documentation.

1.4.3 28.10.2014
Fix for wrong output on Port Y after oPY command with bit number 15-31. The problem did not occur on all gcc versions.

1.4.2 20.09.2014
Changed fuse settings to enable brown-out detection at 2,7V.

1.4.1 23.04.2013
Fixes compiler warnings introduced by new avr-gcc version.

1.4.0 17.03.2014
Added support for more serial ports.

...

1.3.0 09.03.2012
Added support for Xmega microcontrollers

1.2.0 23.02.2012
Added support for up to 64 additional I/O pins through external shift registers of type 74HC165 and 74HC595.

...

1.1.0 10.12.2009
Major code cleanup. The files ADC.h, ADC.c, io-commands.h and io-commands.c are now the same as in the net_io firmware.
The status LED flashes now two times during power-on.
Added support for using backspace character in commands.

...

1.0.0 25.03.2009
first release

Startseite    English version of this page

I/O Schnittstellen Module, seriell mit USB oder Bluetooth

Mit I/O Schnittstellen Modulen steuern und überwachen Sie elektrische Einrichtungen. Da PC's keine herkömmlichen Parallel-Ports mehr haben, stelle ich hier einen Ersatz mit USB oder Bluetooth vor. Sie erhalten je nach Mikrocontroller 18 bis 84 steuerbare Anschlüsse. Und mit Hilfe von ein paar billigen Schieberegistern sind noch mehr Leitungen machbar.

Die Bluetooth Variante empfiehlt sich ganz besonders für Hobby-Elektroniker, die nicht riskieren wollen, ihren PC zu beschädigen. Allerdings ist Bluetooth etwas schwieriger zu programmieren, da die drahtose Verbindung weniger zuverlässig arbeitet.

Der Zugriff auf die I/O Ports erfolgt über einfache Textbefehle, so daß keine speziellen Treiber oder Libraries erforderlich sind. Es funktioniert daher mit nahezu jeder beliebigen Programmiersprache und jedem Betriebsystem, wie PC, Smartphones, Tablets, Raspberry Pi, usw.

Der C Compiler zum Programmieren des Mikrocontrollers ist kostenlos für Windows, Linux und Mac OS erhältlich. Die Beispiel App "ioModule" für PC und Smartphones können Sie mit Qt Creator compilieren. Schauen Sie sich auch die Alarmanlage als konkretes Anwendungsbeispiel an.

Download source code, compiled binaries (hex files).

So funktioniert es

Bauen Sie eine Verbindung zum I/O Modul auf. Dann senden sie Befehle in Text-Form und empfangen Antworten auf dieser Verbindung. Zum Testen empfehle ich das Hammer Terminalprogramm oder Cutecom.

Zum Beispiel setzen Sie so den Pin PC3 auf High:

Sende: oPC3,1
Antwort: Ok

So fragen Sie den Port D als Hexadezimalzahl ab:

Sende: iPD
Antwort: PD=60

Den vollständigen Befehlsatz finden Sie weiter unten. Sie können mehr als 100 Befehle pro Sekunde ausführen.

Voraussetzungen

Alternativ zu "nackten" Mikrocontrollern empfehle ich Arduino Nano sowie AVR Module von Chip45. Sie alle gibt es mit vorinstalliertem Bootloader, damit Sie keinen extra Programmieradapter benötigen.

Achtung: Mobile Geräte von Apple unterstützen das Bluetooth SPP Protokoll nicht! Weichen Sie ggf. auf WLAN oder Ethernet aus.

Bildschirmfotos

Test mit einem Terminalprogramm:
Bildschrimfoto von I/O-Befehle über seriellen Port (USB)

Die Beispiel App "ioModule" steuert zwei LED's an:
Bildschirmfoto von der Demo App in C++ Bildschirmfoto von der Demo App in C++

Befehlssatz

Digitale I/O

Das Modul wird mit vier Basis-Befehlen gesteuert, nämlich d, p, o und i.

Diese Befehle können sich wahlweise auf eine einzelne I/O Leitung (PB7), einen ganzen Port (PB) oder alle Ports auf einmal beziehen:

PB7 und PB sind hier nur als Beispiel genannt, es funktioniert mit allen Ports genau so. Wenn man alle Ports auf einmal anspricht, muss man je nach AVR Größe mit 8 oder 16-Stelligen Hexadezimal-Zahlen arbeiten, entsprechend den Ports: DDCCBBAA oder HHGGFFEEDDCCBBAA.

Bei Befehlen für einzelne Pins kann man anstelle von 0 und 1 auch Buchstaben verwenden:

Die Befehle d, p und o antworten immer mit "Ok". Der Befehl i antwortet so:

Analoge Eingänge

Je nach Fähigkeiten des Mikrocontrollers stehen folgende Referenzen zur Verfügung:

Beispiel für den r Befehl:

Beim a Befehl gibt man die Nummer des analogen Eingangs (Kanals) an, zum Beispiel:

Erweiterte Eingänge

Mit Hilfe eines Schieberegisters kann man die Anzahl der Eingänge erweitern. Diese zusätzlichen Eingänge nenne ich "Port X". Sie können mit dem i Befehl abgefragt werden:

Je nach Größe des Schieberegisters antwortet der iPX Befehl mit unterschiedlich großen Hexadezimal-Zahlen (8-32 Bits).

Erweiterte Ausgänge

Mit Hilfe eines Schieberegisters kann man die Anzahl der Ausgänge erweitern. Diese zusätzlichen Ausgänge nenne ich "Port Y". Sie können mit dem o Befehl beschrieben werden:

Je nach Größe des Schieberegisters erwartet der oPY Befehl unterschiedlich große Hexadezimal-Zahlen (8-32 Bits). Der aktuelle Zustand von Port Y kann mit dem i Befehl eingelesen werden.

Die Befehle d und p stehen bei erweiterten Eingängen und Ausgängen nicht zur Verfügung!

15 Minuten Programmier-Beispiel

Ich möchte Ihnen zeigen, wie einfach das Modul mit einem selbst geschriebenen PC Programm gesteuert werden kann. Es erfordert nur wenige Minuten.

Vorbereitung der Hardware

Bauen Sie sich ein I/O Modul mit USB auf Basis eines Arduino Nano oder Crumb168-USB Moduls auf. Am Anschluss PD2 (bzw. D2) soll eine LED mit Vorwiderstand hängen:

               470 Ohm   LED
      D2 o-----[===]-----|>|----| GND
  

Laden Sie die Firmware mit einem ISP Programmieradapter (oder dem vorinstallierten Bootloader) in den Mikrocontroller, und schließen Sie das Modul an den PC an. Der USB Treiber wird automatisch installiert. Schauen Sie im Gerätemanager von Windows nach, welcher COM-Port dem Gerät zugewiesen wurde. Benutzen Sie bei Linux den dmesg Befehl. In meinem Fall ist es "COM3".

Installieren Sie die Qt Creator Entwicklungsumgebung. Damit können Sie schicke Programme für Windows, Linux und Mac in der Sprache C++ entwickeln.

Programmierung

Legen Sie in Qt Creator ein neues Projekt an, wobei sie die Vorlage "Anwendung/Qt-Widgets-Anwendung" wählen. Geben Sie der Anwendung den Namen "test" und klicken dann ein paar mal auf "Weiter", um den Assistenten abzuschließen. Sie erhalten folgende Ansicht:

Öffnen Sie die Projektdatei test.pro durch Doppelklick und ergänzen Sie die folgende Zeile um das Wort "serialport":

    QT += core gui serialport
Öffnen Sie das Formular, indem Sie doppelt auf die Datei mainwindow.ui klicken. Ziehen Sie aus dem Widget Katalog (links) einen "Push Button" in das Formular, etwa so:

Klicken Sie doppelt auf die Beschriftung "PushButton", um den Knopf "Start" zu nennen.

Nun wollen wir festlegen, was beim Klick auf den Knopf passieren soll. Klicken Sie dazu mit der rechten Maustaste auf den Knopf, und dann auf "Slot anzeigen...".

Wählen Sie den Slot clicked() aus. Dadurch wird die Datei mainwindow.cpp im Texteditor angezeigt. Fügen Sie ganz oben die Zeile für die QSerialPort Klasse ein:

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QSerialPort>
Weiter unten hat Qt Creator automatisch eine leere Funktion mit Namen on_pushButton_clicked() erzeugt. Dort müssen Sie nun code einfügen, der beim Klick auf den Knopf aufgeführt werden soll. Kopieren Sie von der folgenden Vorlage:
void MainWindow::on_pushButton_clicked()
{
    QSerialPort port("COM3");
    port.setBaudRate(115200);
    
    port.setDataBits(QSerialPort::Data8);
    port.setParity(QSerialPort::NoParity);
    port.setStopBits(QSerialPort::OneStop);
    port.setFlowControl(QSerialPort::NoFlowControl);
    port.open(QIODevice::ReadWrite);

    port.write("dPD2,o\n");  // configure PD2 as output
    port.write("oPD2,h\n");  // set PD2 to high (=5V)

    port.waitForBytesWritten(1000);
    port.close();
}
Anstelle von "COM3" sollen Sie den Port angeben, den Windows ihrem Modul zugewiesen hat. Darunter muss die richtige Baudrate angegeben werden, enstsprechend der Firmware auf ihrer Hardware.

Probieren Sie das Programm aus, indem Sie Strg-R drücken.

Wenn Sie auf den Start Knopf klicken, geht die LED am Port D2 an. Zur Übung könnten Sie noch einen zweiten Knopf hinzufügen, der die LED wieder aus schaltet.

Schauen Sie sich die Dokumentation von QSerialPort, sowie ganz allgemein die Einsteiger-Hilfen von Qt.