neo3000
14.04.2011, 03:05
Hallo,
Kurz eine Beschreibung meines Projektes:
Ich möchte eigene Steuerbefehle per COM an den Arduino senden welche dieser auswertet und weiter verarbeitet, was soweit auch schon ganz gut funktioniert.
zb: Befehl 1003 senden
Adruino Empfang >> Pin9 auf HIGH setzen
Einen PWM wert sende ich indem ich zb.: 3235 sende und am Arduino 3235 - 3000 rechne das.
So erhalte ich den Wert 235 für dem PWM1 Ausgang.
PWM2 = 4000 usw.
Wenn ich die Befehle auch schön nach einander Sende werden diese auch ohne Problem verarbeiten.
Sende ich nun (timer abhänging) zb.: alle 2 sec dass der PWM1 auf 180 und dann wieder auf 0 gehen soll und will gleichzeitig noch mehere LEDs steuern und Daten vom Arduino an den PC senden bekomme ich immer wieder verschide aussetzer zb.: vom Servo an PWM1.
Kurz geasgt ich benötige Multitaskting am Arduino.!!
Mein derzeitiger Code (CODE WURDE DURCH HINWEISE VON BENUTZER "lokirobotics (https://www.roboternetz.de/community/member.php?11422-lokirobotics)" ANGEPASST, thx.)
const int pwmPin = 9;
const int ledPin = 8;
byte pwmWert;
int incomingData;
char data[4];
int i;
//Setup-Routine
void setup(){
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
pinMode(pwmPin,OUTPUT);
}
//Hauptprogramm-Routine
void loop(){
//Abwarten bis data[] vier Stellen hat
do{
if (Serial.available()){data[i++] = Serial.read();}
}
while(i<4);
incomingData = atoi(data); // "data[]" in Integer umwandeln und in "incomingData" speichern
Daten_auswerten(); //Interger "incomingData" auswerten
PWM_setzen(); //PWM Wert auf Pin 9 ausgeben
Eingaenge_abrufen(); //Alle Ausgänge und Eingänge abrufen
i = 0;
}
void PWM_setzen(){analogWrite(pwmPin, pwmWert);}
void Daten_auswerten(){
if (incomingData == 1002){digitalWrite(ledPin, HIGH);} //Befehl "1002" um LED einzuschalten
if (incomingData == 1003){digitalWrite(ledPin, LOW);} //Befehl "1003" um LED einzuschalten
if (incomingData >= 3000){pwmWert = byte(incomingData - 3000);} //Befehl "3000" um PWM zu senden (bsp: 3245 - 3000 = 245) 3000 ist nur zur Unterscheidung
}
void Eingaenge_abrufen(){
//Daten aller Analogeingänge abrufen
for(int i = 0;i < 6;i++){
Serial.print(analogRead(i));
Serial.print(",");
}
//Daten der Digitaleingänge 0 - 8 abrufen
for(int i = 0;i < 14;i++){
if (i == 9){Serial.print(analogRead(i));}
else{Serial.print(digitalRead(i));}
if(i<13){Serial.print(",");}
}
Serial.print("&H");
Serial.flush();
//331,250,206,173,149,137,1,0,0,0,0,0,0,0,0,158(PWM) ,0,0,0,0&H
}
Wie kann ich nun die verschiedene Subroutinen so programmieren dass ich "zeitgleich" zb.: Daten (ständig) abrufen, PWM setzen, und LEDs über den PC steuern kann.
Zum Schluss möchte ich es so weit möglich machen dass ich ständig alle daten des Arduino einlesen, und zb.: Motorgeschwindigkeit und Servos gleichzeitig über den PC steuren kann.
Vielen Danke
Markus
Kurz eine Beschreibung meines Projektes:
Ich möchte eigene Steuerbefehle per COM an den Arduino senden welche dieser auswertet und weiter verarbeitet, was soweit auch schon ganz gut funktioniert.
zb: Befehl 1003 senden
Adruino Empfang >> Pin9 auf HIGH setzen
Einen PWM wert sende ich indem ich zb.: 3235 sende und am Arduino 3235 - 3000 rechne das.
So erhalte ich den Wert 235 für dem PWM1 Ausgang.
PWM2 = 4000 usw.
Wenn ich die Befehle auch schön nach einander Sende werden diese auch ohne Problem verarbeiten.
Sende ich nun (timer abhänging) zb.: alle 2 sec dass der PWM1 auf 180 und dann wieder auf 0 gehen soll und will gleichzeitig noch mehere LEDs steuern und Daten vom Arduino an den PC senden bekomme ich immer wieder verschide aussetzer zb.: vom Servo an PWM1.
Kurz geasgt ich benötige Multitaskting am Arduino.!!
Mein derzeitiger Code (CODE WURDE DURCH HINWEISE VON BENUTZER "lokirobotics (https://www.roboternetz.de/community/member.php?11422-lokirobotics)" ANGEPASST, thx.)
const int pwmPin = 9;
const int ledPin = 8;
byte pwmWert;
int incomingData;
char data[4];
int i;
//Setup-Routine
void setup(){
Serial.begin(9600);
pinMode(ledPin,OUTPUT);
pinMode(pwmPin,OUTPUT);
}
//Hauptprogramm-Routine
void loop(){
//Abwarten bis data[] vier Stellen hat
do{
if (Serial.available()){data[i++] = Serial.read();}
}
while(i<4);
incomingData = atoi(data); // "data[]" in Integer umwandeln und in "incomingData" speichern
Daten_auswerten(); //Interger "incomingData" auswerten
PWM_setzen(); //PWM Wert auf Pin 9 ausgeben
Eingaenge_abrufen(); //Alle Ausgänge und Eingänge abrufen
i = 0;
}
void PWM_setzen(){analogWrite(pwmPin, pwmWert);}
void Daten_auswerten(){
if (incomingData == 1002){digitalWrite(ledPin, HIGH);} //Befehl "1002" um LED einzuschalten
if (incomingData == 1003){digitalWrite(ledPin, LOW);} //Befehl "1003" um LED einzuschalten
if (incomingData >= 3000){pwmWert = byte(incomingData - 3000);} //Befehl "3000" um PWM zu senden (bsp: 3245 - 3000 = 245) 3000 ist nur zur Unterscheidung
}
void Eingaenge_abrufen(){
//Daten aller Analogeingänge abrufen
for(int i = 0;i < 6;i++){
Serial.print(analogRead(i));
Serial.print(",");
}
//Daten der Digitaleingänge 0 - 8 abrufen
for(int i = 0;i < 14;i++){
if (i == 9){Serial.print(analogRead(i));}
else{Serial.print(digitalRead(i));}
if(i<13){Serial.print(",");}
}
Serial.print("&H");
Serial.flush();
//331,250,206,173,149,137,1,0,0,0,0,0,0,0,0,158(PWM) ,0,0,0,0&H
}
Wie kann ich nun die verschiedene Subroutinen so programmieren dass ich "zeitgleich" zb.: Daten (ständig) abrufen, PWM setzen, und LEDs über den PC steuern kann.
Zum Schluss möchte ich es so weit möglich machen dass ich ständig alle daten des Arduino einlesen, und zb.: Motorgeschwindigkeit und Servos gleichzeitig über den PC steuren kann.
Vielen Danke
Markus