Ansteuerung
Guten Tag zusammen,
ich wollte mir einen Impulsgeber mit 4 Ausgängen bauen die unabhängig von einander geschaltet werden können sollen (also auswählen welche mittels des "An"-Buttons Impulse senden sollen), jedoch die gleiche Frequenz (wobei diese auch mittels VB vorgegeben werden soll) haben sollen. Dabei sieht die Situation wie folgt aus:
Ich habe einen Arduino Micro (9600 Baud, COM-Schnittstelle) folgendermaßen programmiert.
C-Quellcode
- int i = 0, impOut[4]={0,0,0,0}, stat[4]={0,0,0,0}, sum = 0, stat_length = 0, L3_L4=8, spgFrei = 3, j = 0;
- int frequenz = 1, periode = 500, tHigh = 40, tLow = 940, spgZustand = 2, Dosierung = 0, dosCount = 0;
- int on = 0;
- String incString = "";
- void setup() {
- stat_length = sizeof(stat)/sizeof(stat[0]); //Länge des Arrays berechnen
- Serial.begin(9600); //Serielle Verbindung mit 9600 bps
- for(i = 0; i < stat_length; i++){ //Initialisieren der Ausgänge für die Impulse
- pinMode(i+4, OUTPUT);
- impOut[i]=i+4;
- }
- pinMode(L3_L4, OUTPUT); //Initialisieren der 3Leiter 4Leiter Umschaltung
- pinMode(spgFrei, OUTPUT); //Initialisieren der Spannungsfreischaltung an der Ausgangsklemme 9 und 10
- pinMode(spgZustand, OUTPUT); //Initialisieren der Leuchte für Spannungsfreiheit
- }
- void loop() {
- if(Serial.available() > 0) { //Nur bei Veränderung des Eingangssinals abarbeiten
- incString = Serial.readString(); //Auslesen des USB's
- if(incString == "f") { //einlesen der Frequenz //Länge des Arrays ermitteln
- Serial.println("Frequenz eingeben"); //Kann als Abfrage dienen ob der Microcontroller bereit zur Eingabe ist
- while(Serial.available() == 0) {} //Dauerschleife bis die gewuenschte Frequenz eingegeben ist
- frequenz = Serial.readString().toInt(); //einlsesn der Frequenz (MAXIMAL 25 Hz) und umwandlen aus String in Integer
- if(frequenz <= 25) {
- periode = 1000 / frequenz; //Berechnen der Low/High Zeit
- tLow = periode - tHigh;
- Serial.println("fAcc"); //Bestätigung der Frequenzübernahme
- }
- else {
- Serial.println("fOF");
- tLow = 0;
- tHigh = 40;
- }
- }
- if(incString == "spgRot") { //Umschalten auf Rot der Spannungsleuchte
- digitalWrite(spgZustand, HIGH);
- Serial.println("uON");
- }
- else if(incString == "spgGruen") { //Umschalten auf Gruen der Spannungsleuchte
- digitalWrite(spgZustand, LOW);
- Serial.println("uOFF");
- }
- if(incString == "off") { //Ausschalten der LEDs auf einmal
- for(i=0; i< stat_length; i++) { //Mit jedem Durchgang wird eine LED deaktiviert
- digitalWrite(impOut[i], LOW);
- stat[i] = 0;
- }
- Serial.println("impOFF"); //Statusausgabe
- on = 0;
- }
- if(incString == "go") {
- on = 1;
- }
- if(incString == "allon") { //Ausschalten der LEDs auf einmal
- for(i=0; i< stat_length; i++) { //Mit jedem Durchgang wird eine LED aktiviert
- stat[i] = 1;
- }
- Serial.println("allON");
- }
- for(i=0;i<stat_length;i++) {
- if(incString == "p"+String(i+1)) { //Vergleichen des eingebenen Strings mit einem String zusammen mit einem Variablen Integer
- stat[i] = 1;
- Serial.print("P"); Serial.print(i+1); Serial.println("ON"); //Kaskadierung der Ausgabe, da Konstante Strings nicht mit variablen Integern ausgegeben werden können
- }
- else if(incString == "p"+String(i+1)+"o") { //Deaktivieren der Impulse
- stat[i] = 0;
- Serial.print("P"); Serial.print(i+1); Serial.println("OFF"); //Kaskadierung der Ausgabe, da Konstante Strings nicht mit variablen Integern ausgegeben werden können
- }
- }
- if(incString == "3L") { //Umschalten af 3 Leiter
- digitalWrite(L3_L4, HIGH);
- Serial.println("3LON");
- }
- else if(incString == "4L") { //Umschalten auf 4 Leiter (Standardmäßig)
- digitalWrite(L3_L4, LOW);
- Serial.println("4LON");
- }
- if(incString == "LEDzu") { //Zuschalten der LED an der Ausgangsklemme 9 und 10
- digitalWrite(spgFrei, HIGH);
- Serial.println("LEDcircuit");
- }
- else if(incString == "LEDweg") { //Wegschalten der LED an der Ausgangsklemme 9 und 10
- digitalWrite(spgFrei, LOW);
- Serial.println("LEDsave");
- }
- sum = 0;
- for(i=0;i<stat_length;i++) { //Addieren der einzelnen Einträge, wenn >0 herauskommt, dann muss mindestens 1 Ausgang Impulse ausgeben
- sum=sum+stat[i];
- }
- if(incString == "dosON") {
- sum = 0;
- Dosierung = 1;
- Serial.println("DosCount");
- while(Serial.available() == 0) {} //Dauerschleife bis die gewuenschte Frequenz eingegeben ist
- dosCount = Serial.readString().toInt();
- Serial.println("Dosierung uebernommen");
- }
- }
- ////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////////
- if(sum > 0 && Dosierung == 0 && on == 1) { //Um den Delay zu umgehen wird durch if ermittelt ob überhaupt ein Impuls aktiviert werden muss => Zeit sparen
- for(i=0; i<stat_length;i++) { //Setzen des jeweiligen Impulses durch if Abfrage mit dem jeweiligen "stat" (Status)
- if(stat[i] == 1) { //Einschalten der jeweilgen Impulses
- digitalWrite(impOut[i], HIGH);
- }
- else {
- digitalWrite(impOut[i], LOW);
- }
- }
- delay(tHigh); //Verzögerung um standardmäßig 40ms
- for(i=0; i<stat_length;i++) { //Ausschalten des Impulses nach der Verzögerung
- if(stat[i] == 1) {
- digitalWrite(impOut[i], LOW);
- }
- }
- delay(tLow); //Verzögerung um periode-tHigh
- }
- /**************************************************************************************************************************************/
- if(sum > 0 && Dosierung == 1 && on == 1) { //Um den Delay zu umgehen wird durch if ermittelt ob überhaupt ein Impuls aktiviert werden muss => Zeit sparen
- for(j=dosCount; j>0; j--) {
- for(i=0; i<stat_length;i++) { //Setzen der jeweiliges Impulses durch if Abfrage mit dem jeweiligen "stat" (Status)
- if(stat[i] == 1) { //Einschalten der jeweilges Impulses
- digitalWrite(impOut[i], HIGH);
- }
- else {
- digitalWrite(impOut[i], LOW);
- }
- }
- delay(tHigh); //Verzögerung um standardmäßig 40ms
- for(i=0; i<stat_length;i++) { //Ausschalten des Impulses nach der Verzögerung
- if(stat[i] == 1) {
- digitalWrite(impOut[i], LOW);
- }
- }
- delay(tLow); //Verzögerung um periode-tHigh
- }
- if(j == 0) {
- Dosierung = 0;
- sum = 0;
- on = 0;
- }
- }
- }
Es geht mir hauptsächlich um die Impulsausgänge die ich generieren möchte, welche mittels eines Programms das mit VB geschrieben ist, gesteuert werden sollen und die Frequenz variabel ist. Meine Vorstellung war es, dass ich je nach dem was betätigt wird Strings gesendet werden um den Arduino zu steuern.
VB.NET-Quellcode
- Imports System.IO
- Imports System.IO.Ports
- Public Class Form1
- Private WithEvents SerialPort1 As New System.IO.Ports.SerialPort("COM5")
- Private Sub CheckBox1_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox1.CheckedChanged
- SerialPort1.Open()
- SerialPort1.Write("p1")
- End Sub
- Private Sub CheckBox2_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox2.CheckedChanged
- SerialPort1.Open()
- SerialPort1.Write("p2")
- End Sub
- Private Sub CheckBox3_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox3.CheckedChanged
- SerialPort1.Open()
- SerialPort1.Write("p3")
- End Sub
- Private Sub CheckBox4_CheckedChanged(sender As Object, e As EventArgs) Handles CheckBox4.CheckedChanged
- SerialPort1.Open()
- SerialPort1.Write("p4")
- End Sub
- Private Sub TextBox1_TextChanged(sender As Object, e As EventArgs) Handles TextBox1.TextChanged
- End Sub
- Private Sub TextBox2_TextChanged(sender As Object, e As EventArgs) Handles TextBox2.TextChanged
- End Sub
- Private Sub Button1_Click(sender As Object, e As EventArgs) Handles Button1.Click
- SerialPort1.Write("go")
- SerialPort1.Close()
- End Sub
- Private Sub Button2_Click(sender As Object, e As EventArgs) Handles Button2.Click
- SerialPort1.Write("off")
- SerialPort1.Close()
- CheckBox1.CheckState = 0
- CheckBox2.CheckState = 0
- CheckBox3.CheckState = 0
- CheckBox4.CheckState = 0
- End Sub
- End Class
Mein Problem ist es nun, das jedes mal eine Fehlermeldung auftaucht wenn der SerialPort1 zum zweiten mal geöffnet wird und ich nicht weis wie ich dies umgehen kann. Außerdem weis ich nicht wie ich die Frequenz bzw. eine Dosierungsvorgabe (Anzahl der Impulse bevor diese von alleine aufhören).
Falls mehr Infos benötigt werden, so einfach danach fragen