Go Down

Topic: [risolto] problema con interrupt (Read 574 times) previous topic - next topic

stefa24

Jul 06, 2014, 12:09 pm Last Edit: Jul 06, 2014, 06:01 pm by stefa24 Reason: 1
Ciao
Uso un motore stepper per muovere un tappeto. In questo sketch, utilizzo la funzione interrupt,
Code: [Select]
attachInterrupt(0, sensor_stop, FALLING); //sensore induttivo collegato al pin 2
per gestire un evento dato da un sensore induttivo NPN 12v interfacciato con arduino mediante fotoaccoppiatore, con oscilloscopio ho controllato il segnale che esce dal fotoaccoppiatore, che vale HIGH, quando manualmente avvicino il target al sensore,il segnale va LOW in modo pulito e il tappeto si ferma come deve essere, trascorsi
Code: [Select]
 ritardo_1 = 5000;// pauses for milliseconds ms
il movimento ricomincia ma se a questo punto allontano il target il tappeto si ferma per ricominciare dopo il medesimo ritardo.
Ho fatto prove mettendo
Code: [Select]
attachInterrupt(0, sensor_stop, RISING); //sensore induttivo collegato al pin 2, con il target vicino al sensore il segnale è LOW, il tappeto si muove e quando allontano il segnale va HIGH e il tappeto si ferma per ricominciare a muoversi dopo il ritardo impostato.
In pratica quello che vedo è che con RISING il codice funziona, con FALLING non fa quello che voglio.

Code: [Select]
/*
DESCRIPTION
====================
Simple example of the bounce library that switches the debug LED when a button is pressed.

CIRCUIT
====================
https://raw.github.com/thomasfredericks/Bounce-Arduino-Wiring/master/Bounce/examples/circuit-bounce-change-duration-retrigger.png
*/

/*
*/
#include <Bounce2.h>

#define sensor_stop_pin 2
#define motorPin        10// digital pin per il driver dello stepper

#define BUTTON_PIN      11
#define LED_PIN         13

// Instantiate a Bounce object
Bounce debouncer1 = Bounce();

int ritardo, ritardo_1;
volatile byte k;
byte pin;

void setup()
{
 // Setup the button
 pinMode(BUTTON_PIN,INPUT);
 // Activate internal pull-up
 digitalWrite(BUTTON_PIN,HIGH);

 // After setting up the button, setup debouncer
 debouncer1.attach(BUTTON_PIN);
 debouncer1.interval(5);

 //Setup the LED
 pinMode(LED_PIN,OUTPUT);

 //setup the motor  
 pinMode(sensor_stop_pin, INPUT);
 attachInterrupt(0, sensor_stop, FALLING); //sensore induttivo collegato al pin 2
 k = 1;

 pinMode(motorPin,OUTPUT);// set the digital pin as output

 ritardo = 1500;// pauses for microseconds us
 ritardo_1 = 5000;// pauses for milliseconds ms
//  Serial.begin(9600);
}

void loop()
{
 // Update the debouncer
 debouncer1.update();

 // Get the update value
 int value = debouncer1.read();

 // Turn on or off the LED
 if ( value == HIGH)
 {
   digitalWrite(LED_PIN, LOW);
   pin = 0;
 }  
 else
 {
   digitalWrite(LED_PIN, HIGH );
   pin = 1;
 }
 // Serial.println(value);
 //sezione motore  
 if(pin == 1 && k == 1)
 {
   digitalWrite(motorPin, LOW);   // sets the pin on
   delayMicroseconds(ritardo);// pauses for microseconds
   digitalWrite(motorPin, HIGH);    // sets the pin off
   delayMicroseconds(ritardo);// pauses for microseconds
 }

 if(k == 0)
 {
   k = 1;
   delay(ritardo_1);
 }
}//fine loop

void sensor_stop()
{
 k = 0;
}


Stefano

https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

stefa24

ciao
ho risolto riscrivendo lo sketch
Code: [Select]
/*
DESCRIPTION
====================
Simple example of the bounce library that switches the debug LED when a button is pressed.

CIRCUIT
====================
https://raw.github.com/thomasfredericks/Bounce-Arduino-Wiring/master/Bounce/examples/circuit-bounce-change-duration-retrigger.png
*/

/*
*/
#include <Bounce2.h>

#define sensor_stop_pin 2
#define motorPin        10// digital pin per il driver dello stepper

#define BUTTON_PIN      11
#define LED_PIN         13

// Instantiate a Bounce object
Bounce debouncer1 = Bounce();

int ritardo, ritardo_1;
volatile byte moto, k;
byte p;

void setup()
{
  // Setup the button
  pinMode(BUTTON_PIN,INPUT);
  // Activate internal pull-up
  digitalWrite(BUTTON_PIN,HIGH);

  // After setting up the button, setup debouncer
  debouncer1.attach(BUTTON_PIN);
  debouncer1.interval(10);

  //Setup the LED
  pinMode(LED_PIN,OUTPUT);

  //setup the motor 
  pinMode(sensor_stop_pin, INPUT);
  attachInterrupt(0, sensor_stop, FALLING); //sensore induttivo collegato al pin 2

  pinMode(motorPin,OUTPUT);// set the digital pin as output

  ritardo = 1500;// pauses for microseconds us
  ritardo_1 = 5000;// pauses for milliseconds ms

  k = 1;
  // Serial.begin(9600);
}

void loop()
{
  // Update the debouncer
  debouncer1.update();

  // Get the update value
  int value = debouncer1.read();

  // Turn on or off the LED
  if ( value == HIGH)
  {
    digitalWrite(LED_PIN, LOW);
    moto = 0;
  } 
  else
  {
    digitalWrite(LED_PIN, HIGH );
    moto = 1;
  } 
  while(moto == 1 && k ==1)
  {
    digitalWrite(motorPin, LOW);   // sets the pin on
    delayMicroseconds(ritardo);// pauses for microseconds
    digitalWrite(motorPin, HIGH);    // sets the pin off
    delayMicroseconds(ritardo);// pauses for microseconds
    moto = 0;
  }
  while(moto == 1 && k == 0)
  {
    delay(5000);
    k = 1;
  }
}//fine loop

void sensor_stop()
{
  moto = 1;
  k = 0;
}

Stefano
https://sites.google.com/site/agritronica/
https://sites.google.com/site/t3chconcrete/
https://www.youtube.com/channel/UCnY1DNrSywgadjyqqtbvyew

Go Up