DanielSan
20.03.2013, 17:37
Hi,
ich habe einen Nano V3.0 (bzw. er ist noch unterwegs). Also mache ich mir schonmal gedanken, wie meine Software aussehen könnte.
Ich möchte 2 RC-Empfänger Kanäle einlesen. Das habe ich mit Int0 und Int1 gelöst. Ich denke das klappt auch soweit. (Code ist ungetestet)
int pin = 13;
long starttime_1;
long starttime_2;
long duration_1;
long duration_2;
long interval = 1000;
long previousMicros = 0;
void setup()
{
pinMode(pin, OUTPUT);
//Interrupts für steigende Flanke konfigurieren
attachInterrupt(0, ch1_r, RISING);
attachInterrupt(1, ch2_r, RISING);
//Serial starten
Serial.begin(9600);
}
void loop()
{
unsigned long currentMicros = micros();
if(currentMicros - previousMicros > interval) {
previousMicros = currentMicros;
//Zeit und Kanal auf RS232 ausgeben
Serial.print('CH1: ' + duration_1 + '\n');
Serial.print('CH2: ' + duration_2 + '\n');
}
}
void ch1_r()
{
detachInterrupt(0);
starttime_1 = micros();
attachInterrupt(0, ch1_f, FALLING);
}
void ch1_f()
{
detachInterrupt(0);
duration_1 = micros() - starttime_1;
attachInterrupt(0, ch1_r, RISING);
}
void ch2_r()
{
detachInterrupt(1);
starttime_2 = micros();
attachInterrupt(1, ch2_f, FALLING);
}
void ch2_f()
{
detachInterrupt(1);
duration_2 = micros() - starttime_2;
attachInterrupt(1, ch2_r, RISING);
}
Jetzt möchte ich noch einen Sensorwert vom AD-Port einlesen etwas dran rumrechnen und dann ggf. Das RC-Signal verändern und wieder ausgeben. Später kommt wahrscheinlich noch ein I2C Sensor dazu. Wie man ein Servo prinzipiell steuert ist mir klar.
Meine Frage ist, wie gebe ich das Servosignal möglichst sinnvoll im Bezug auf Rechenleistung aus?
Wie macht die Mitgelieferte Servo Lib das? Blockiert die solang den Prozessor, bis sie fertig ist? So wie bspw. Delay().
Ich würde das eigentlich mit einem Timer lösen. Aber wie macht man das beim Arduino? Ich habe schon Timer libs gefunden, aber die sagen mir nicht so recht zu. Ich möchte das lieber selbst in der Hand haben.
Danke
Gruß Daniel
ich habe einen Nano V3.0 (bzw. er ist noch unterwegs). Also mache ich mir schonmal gedanken, wie meine Software aussehen könnte.
Ich möchte 2 RC-Empfänger Kanäle einlesen. Das habe ich mit Int0 und Int1 gelöst. Ich denke das klappt auch soweit. (Code ist ungetestet)
int pin = 13;
long starttime_1;
long starttime_2;
long duration_1;
long duration_2;
long interval = 1000;
long previousMicros = 0;
void setup()
{
pinMode(pin, OUTPUT);
//Interrupts für steigende Flanke konfigurieren
attachInterrupt(0, ch1_r, RISING);
attachInterrupt(1, ch2_r, RISING);
//Serial starten
Serial.begin(9600);
}
void loop()
{
unsigned long currentMicros = micros();
if(currentMicros - previousMicros > interval) {
previousMicros = currentMicros;
//Zeit und Kanal auf RS232 ausgeben
Serial.print('CH1: ' + duration_1 + '\n');
Serial.print('CH2: ' + duration_2 + '\n');
}
}
void ch1_r()
{
detachInterrupt(0);
starttime_1 = micros();
attachInterrupt(0, ch1_f, FALLING);
}
void ch1_f()
{
detachInterrupt(0);
duration_1 = micros() - starttime_1;
attachInterrupt(0, ch1_r, RISING);
}
void ch2_r()
{
detachInterrupt(1);
starttime_2 = micros();
attachInterrupt(1, ch2_f, FALLING);
}
void ch2_f()
{
detachInterrupt(1);
duration_2 = micros() - starttime_2;
attachInterrupt(1, ch2_r, RISING);
}
Jetzt möchte ich noch einen Sensorwert vom AD-Port einlesen etwas dran rumrechnen und dann ggf. Das RC-Signal verändern und wieder ausgeben. Später kommt wahrscheinlich noch ein I2C Sensor dazu. Wie man ein Servo prinzipiell steuert ist mir klar.
Meine Frage ist, wie gebe ich das Servosignal möglichst sinnvoll im Bezug auf Rechenleistung aus?
Wie macht die Mitgelieferte Servo Lib das? Blockiert die solang den Prozessor, bis sie fertig ist? So wie bspw. Delay().
Ich würde das eigentlich mit einem Timer lösen. Aber wie macht man das beim Arduino? Ich habe schon Timer libs gefunden, aber die sagen mir nicht so recht zu. Ich möchte das lieber selbst in der Hand haben.
Danke
Gruß Daniel