- Offizieller Beitrag
Hier mal ein kleines Projekt, wie man mit AutoIt ein Relais am Arduino schalten kann.
Als erstes die erforderliche Hardware:
- ein Arduino Nano (Clone)
- ein Relais-Modul (da befindet sich nicht nur das Relais drauf, sondern auch noch ein Transistor, Freilaufdiode und meist 1 oder 2 LEDs)
- ein Steckbrett
- ein paar "Strippen"
Hier die Fritzing-Steckplatine:
Relaismodul_Steckplatine.png
Das Programm für den Arduino-Nano:
#define RelaisPin 2 // Pin fuer das Relais-Modul
String inputString = ""; // Einen String zum speichern der seriellen Eingabe
boolean stringComplete = false; // Variable zum anzeigen, dass die Eingabe beendet ist
void setup() {
Serial.begin(115200); // serielle Schnittstelle initialisieren
inputString.reserve(200); // 200 Bytes fuer den String reservieren
digitalWrite(RelaisPin, HIGH); // den Relais-Pin auf HIGH setzen (negative Logik HIGH = aus)
pinMode(RelaisPin, OUTPUT); // den Relais-Pin auf Ausgang schalten
Serial.println("Ready."); // "Ready." ueber die serielle Schnittstelle ausgeben
}
void loop() {
if (stringComplete) { // wenn die Eingabe komplett ist, dann...
if (inputString.startsWith("a1")) { // beginnt die Eingabe mit "a1", dann...
digitalWrite(RelaisPin, LOW); // das Relais einschalten (negative Logik HIGH = aus)
Serial.println("a1"); // "a1" als Bestaetigung zurueckgeben
}
if (inputString.startsWith("a0")) { // beginnt die Eingabe mit "a0", dann...
digitalWrite(RelaisPin, HIGH); // das Relais ausschalten (negative Logik HIGH = aus)
Serial.println("a0"); // "a0" als Bestaetigung zurueckgeben
}
inputString = ""; // Eingabestring leeren
stringComplete = false; // "Eingabe komplett" zuruecksetzen
}
}
/*
SerialEvent occurs whenever a new data comes in the
hardware serial RX. This routine is run between each
time loop() runs, so using delay inside loop can delay
response. Multiple bytes of data may be available.
*/
void serialEvent() {
while (Serial.available()) {
// get the new byte:
char inChar = (char)Serial.read();
// add it to the inputString:
inputString += inChar;
// if the incoming character is a newline, set a flag
// so the main loop can do something about it:
if (inChar == '\n') {
stringComplete = true;
}
}
}
Alles anzeigen
Und das AutoIt-Programm:
#include <MsgBoxConstants.au3>
#include 'cfx.au3'
; hier die Parameter für die serielle Schnittstelle eintragen
Global Const $iComPort = 9
Global Const $iBaudrate = 115200
Global Const $iDataBits = 8
Global Const $iParity = 0
Global Const $iStopBits = 1
Global Const $sInitResponse = 'Ready.' & @CRLF ; Meldung vom Arduino, wenn der COM-Port geoeffnet wird
Global Const $iResponseLen = StringLen($sInitResponse) ; die Stringlaenge der Meldung
Global Const $iTimeOut = 5000 ; innerhalb dieser Zeit muss der Arduino antworten (in Millisekunden)
Global $idSerialPort = _OpenCOMPort($iComPort, $iBaudrate, $iDataBits, $iParity, $iStopBits)
If $idSerialPort = -1 Then Exit MsgBox($MB_ICONERROR, 'Fehler', 'Der COM-Port konnte nicht geöffnet werden!')
Global $sReceive = _ReceiveStringWait($idSerialPort, $iResponseLen, $iTimeOut)
If $sReceive <> $sInitResponse Then
_CloseCOMPort($idSerialPort)
MsgBox($MB_ICONERROR, 'Fehler', 'Der Arduino antwortete nicht!')
Exit
EndIf
ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
MsgBox($MB_ICONINFORMATION,'','Relais einschalten')
_SendSerialString($idSerialPort, "a1" & @LF)
$sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
MsgBox($MB_ICONINFORMATION,'','Relais ausschalten')
_SendSerialString($idSerialPort, "a0" & @LF)
$sReceive = _ReceiveStringWait($idSerialPort, 4, $iTimeOut)
ConsoleWrite(@ScriptLineNumber & ' Antwort: ' & $sReceive)
_CloseCOMPort($idSerialPort)
Alles anzeigen
Es wird noch eine UDF ("cfx.au3") benötigt, die sich, zusätzlich zu den obigen Programmen, im ZIP-Archiv befindet.
Die Einstellungen für die serielle Schnittstelle müßt ihr u.U. noch im AutoIt-Programm anpassen. Das sollte eigentlich nur den COM-Port betreffen.
Und schon kann man das Relais, von AutoIt aus, ein-/ausschalten.