AttatchInterrupt interrumpe constantemente

2

Soy nuevo en electrónica. Estoy tratando de configurar el control de radio para el arduino. Conecté el canal 1 de Reciever al pin digital 2 de Arduino Mega 2560, Reciever Vin a Arduino 5V y Ground a Ard Ground. Aquí está mi código fuente.

void setup() {
        Serial.begin(9600);
        attachInterrupt(0 , blink, CHANGE);
     }

void loop() {
   Serial.println("I AM IN THE LOOP");        

}


void blink()
{

     Serial.println("I AM IN THE INTERRUPT");  
}

Intenté usar otros pines de interrupción, 3.3 V en lugar de 5 y también probé Arduino Uno y diferentes tipos de valores de Interrupción como RISING, LOW y FALLING pero constantemente imprime "I AM IN THE INTERRUPT" sin que yo toque el transmisor. Cualquier sugerencia.

[ACTUALIZACIÓN] Después de una gran discusión sobre enlace Llegué a esta conclusión. La radio genera una señal PWM. Si tiene un pin de interrupción conectado a un canal. Se interrumpirá independientemente de lo que haga, ya que genera constantemente un PWM. Así que me inclino hacia la interrupción no es una buena idea para el control de radio.

    
pregunta Rabin

2 respuestas

1

Como ha determinado que el tipo de receptor tendrá una salida PWM para controlar un servo, el Servo Control de Wikipedia El artículo tiene buena información al respecto. Si quisiera usarlo de todos modos, la posición neutral normal será de 1.5 ms, por lo que podría usar algo como el siguiente código que usa el pulseIn para tratar un pulso de 1,75 ms o más como si estuviera encendido:

#define MY_PIN 0

void setup() {
    Serial.begin(9600);
    pinMode(MY_PIN, INPUT);
}

void loop() {
   if (pulseIn(MY_PIN, HIGH) >= 1750)
      Serial.println("TX on");        
}

Tenga en cuenta que el período típico entre pulsos es de 20 ms, por lo que su código se detendrá en pulseIn durante ese período. Si ese es un problema, podría volver a usar la interrupción y configurarlo para CHANGE y hacer un seguimiento del tiempo entre el momento en que la línea sube y baja nuevamente. Sería algo así como el siguiente código no probado:

#define MY_PIN 0 // Make sure this matches the interrupt line
unsigned long start_micros = 0;
unsigned long last_duration = 0;

void setup() {
    Serial.begin(9600);
    pinMode(MY_PIN, INPUT);
    attachInterrupt(0 , PWM_handler, CHANGE);
}

void loop() {
   if (last_duration >= 1750)
      Serial.println("TX on");        
}

void PWM_hander()
{
    if (digitalRead(MY_PIN) == HIGH)
        start_micros = micros();
    else
        last_duration = micros() - start_micros;
}
    
respondido por el PeterJ
0

No estoy seguro de si el receptor tiene una salida de colector abierto o no, pero es muy probable. Creo que el pin de interrupción es el pin 2. Agrega un pinMode( 2 , INPUT_PULLUP ); antes del attachInterrupt .

También su rutina de interrupción puede ser un poco larga (en duración). Es mejor simplemente encender el LED en el pin 13 o establecer una bandera en la rutina de interrupción y luego hacer algunas cosas inteligentes con esa bandera en el bucle principal.

Es posible que desee consultar con un osciloscopio si el LED está encendido constantemente o no.

    
respondido por el jippie

Lea otras preguntas en las etiquetas