Go Down

Topic: FUNZIONE "tone(pinBuzzer,frequenza,durata)" non funzionante con libreria IR? (Read 509 times) previous topic - next topic

RaffaeleP

Mi spiego meglio è possibile che la funzione tone non funzioni con la libreria" #include <IRremote.h>" ?
Ho provato due programmi diversi "tone funziona e anche IRremote" ma quando su una if piazzo la funzione tone mi da un'errore, ed è la funzione tone a provocare questo errore poiché  se la levo funziona tutto.
L'errore: "core.a(Tone.cpp.o): In function `__vector_7':
C:\Program Files\Arduino\hardware\arduino\cores\arduino/Tone.cpp:535: multiple definition of `__vector_7'
IRremote\IRremote.cpp.o:C:\Program Files\Arduino\libraries\IRremote/IRremote.cpp:311: first defined here"

gpb01

Si, probbailmente vanno in conflitto sui Timer che usano ....
... guarda il file IRremote.h, all'inizio hai la possibilità di cambiare il Timer che usa :

Code: [Select]

// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif


prova spostandolo su Timer1 ...  :smiley-roll:

Guglielmo
Search is Your friend ... or I am Your enemy !

RaffaeleP

Scusami @Gugliemo per la mia ignoranza ma, dove devo mettere quella scritta ?
Questo è il mio programma, si ricorda nel mio scorso post avevo risolto il sensore pir usando la funzione tone all'interno del programma perchè il delay stoppava arduino, Cioè risolto uno ne trovo un'altro errore..
Il programma è il seguente:
Code: [Select]
#include<Servo.h>
#include <IRremote.h>
int receiver = 11;
IRrecv irrecv(receiver);
decode_results results;
const byte pinPulsante=6;
int pinPir=7;
int pinLed=8;
int pinFoto=A0;
int statoPulsante=0;
int statoPir=0;
int statoFoto=0;
int ledGia=13;
int ledSta=2;
int pinBuzzer=3;
int frequenza=200;
int durata=2000;
Servo servo1;
void setup()
{
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(pinPir,INPUT_PULLUP);
  pinMode(pinLed,OUTPUT);
  pinMode(ledGia,OUTPUT);
  pinMode(ledSta,OUTPUT);
  pinMode(pinFoto,INPUT);
  pinMode(pinBuzzer,OUTPUT);
  pinMode(pinPulsante,INPUT);
  servo1.attach(9);
  servo1.write(0);
}
void loop()
{
  statoPir= digitalRead(pinPir);
  statoFoto= analogRead(pinFoto);
  statoPulsante=digitalRead(pinPulsante);

  if (irrecv.decode(&results))
  {
    Serial.println(results.value, HEX);
    irrecv.resume();
  }

  if ( results.value == 0x8B8510E8){
    digitalWrite(ledSta, HIGH);   
  }
  if ( results.value == 0x6825E53E){
    digitalWrite(ledSta, LOW);   
   
  } 
   if (statoPulsante==HIGH){
    digitalWrite(pinLed,HIGH);
    servo1.write(0);
    delay(6000);
    Serial.println(statoPulsante);
  }
  else {
    digitalWrite(pinLed,LOW);
    servo1.write(140);
    delay(300);
  }
  if (statoFoto<=500){
    Serial.println(statoFoto);
    digitalWrite(ledGia,HIGH);
    delay(15);

  }
  else {
    digitalWrite(ledGia,LOW);
    delay(15);

  }
  if(statoPir==LOW) {
   tone(pinBuzzer,frequenza,durata);
   delay(2000);
  }
}

pablos

non devi aggiungere nulla, devi aprire il file della libreria IRremoteint.h che si trova in
C:\Program Files (x86)\Arduino\libraries\IRremote
righe 66/67

da così
Code: [Select]
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  //#define IR_USE_TIMER1   // tx = pin 9
  #define IR_USE_TIMER2     // tx = pin 3
#endif


a così
Code: [Select]
// Arduino Duemilanove, Diecimila, LilyPad, Mini, Fio, etc
#else
  #define IR_USE_TIMER1   // tx = pin 9
  //#define IR_USE_TIMER2     // tx = pin 3
#endif



no comment

RaffaeleP

Dentro questa cartella ci sono piu file, quale devo aprire e come ?

pablos

leggi bene te l'ho scritto
devi aprire il file della libreria IRremoteint.h che si trova in
C:\Program Files (x86)\Arduino\libraries\IRremote
con un editor di testo ... tasto destro "apri con" blocco note ... note pad ..
la modifica non entra se non ricompili lo sketch su arduino
no comment

RaffaeleP

IRremote è una cartella, non un file per questo non posso modificarla con un file di testo, andando per esclusione sono riuscito a farlo comunque dentro il file "IRremoteInt"
Fatto questo adesso mi da quest'errore: 

IRremote\IRremote.cpp.o: In function `__vector_11':
C:\Program Files\Arduino\libraries\IRremote/IRremote.cpp:311: multiple definition of `__vector_11'
Servo\Servo.cpp.o:C:\Program Files\Arduino\libraries\Servo/Servo.cpp:103: first defined here

pablos

mi prendi in giro?
scusa ma io cosa ho scritto nei post precedenti ?
me lo rileggi piano piano ad alta voce?  :D
no comment

gpb01

@ pablos : pazienza pablos, devi avere pazienza ...  :smiley-mr-green: :smiley-mr-green: :smiley-mr-green:

Guglielmo
Search is Your friend ... or I am Your enemy !

pablos

servo.cpp alla riga 103 c'è questo
Code: [Select]
SIGNAL (TIMER1_COMPA_vect)
{
 handle_interrupts(_timer1, &TCNT1, &OCR1A);
}


IRremote.cpp alla riga 311 c'è questo
Code: [Select]
ISR(TIMER_INTR_NAME)
{
 TIMER_RESET;


direi che è sempre un problema di timer
ha commentato la riga giusta con // e decommentato l'altra? nel file IRremoteInt.h
no comment

RaffaeleP

Ah, mizzica scusami, sono 10 ore che cerco di risolversi sto problema da solo, e non avevo letto la parte di sopra, ti sto scrivendo da un cellulare androir della samsung mini pocket con uno schermo un pò piccolo ahaha
Scusami ancora, in ogni caso ancora non sto risolvendo! HELP ME ç_ç

RaffaeleP

Guarda io non ne capisco molto, questo per me è un hobby, perfavore se non disturbo spiegami passo passo cosa devo fare, perchè mi da sempre questo errore nonostante io ho guardato..
IRremote\IRremote.cpp.o: In function `__vector_11':
C:\Program Files\Arduino\libraries\IRremote/IRremote.cpp:311: multiple definition of `__vector_11'
Servo\Servo.cpp.o:C:\Program Files\Arduino\libraries\Servo/Servo.cpp:103: first defined here

pablos

Quote
questo per me è un hobby, perfavore se non disturbo spiegami passo passo cosa devo fare, perchè mi da sempre questo errore nonostante io ho guardato..

anche per me è un hobby, intanto ho letto tutti i tuoi post precedenti per capire che arduino hai, ma non ho trovato nulla sul tuo modello, penso sia una UNO
Comunque se tu avessi cercato su google come ho fatto io, avresti trovato che il tuo errore è molto famoso usando insieme le lib
#include<Servo.h>
#include <IRremote.h>
io non ho mai usato servo con arduino, ma per risolvere il problema comincerei a cercare e leggere tutto internet :) (usando anche i traduttori), prima o poi la soluzione esce, se poi qualcuno del forum ha riscontrato e risolto il problema personalmente e te lo scrive tanto meglio.
Tieni conto che l'interrupt 0 lo usa il millis, il delay e non può essere utilizzato
interrupt dei vari modelli
Code: [Select]
Board       int.0  int.1  int.2   int.3   int.4   int.5
Uno, Ethernet 2 3
Mega2560 2 3 21 20 19 18
Leonardo 3 2 0 1 7


http://forum.arduino.cc/index.php?topic=167525.0;wap2  
http://letsmakerobots.com/content/solved-strange-compilation-error
https://forum.sparkfun.com/viewtopic.php?f=32&t=34032
https://github.com/shirriff/Arduino-IRremote/issues/5
http://adafruit.com/forums/viewtopic.php?f=25&t=34328
http://forum.arduino.cc/index.php?topic=102519.0;wap2
http://forum.arduino.cc/index.php?topic=22630.0
e altri

ho intravisto leggendo velocemente che qualcuno ha applicato il reset degli interrupt dopo aver ricevuto il segnale IR
Altri hanno risolto comprando una mega, non ho approfondito l'argomento, penso che da qui in poi sia compito tuo esplorare e leggerti tutto, un po' di materiale ce l'hai  :smiley-roll-blue:
ciao

Ps: ma il titolo "FUNZIONE "tone(pinBuzzer,frequenza,durata)" non funzionante con libreria IR?" cosa centra con i tuoi errori servo e IRremote?
no comment

RaffaeleP

Cosa intenti per interrupt ?
Ho provato a leggere i vari link che mi hai inviato ma sono un pò difficile da capire, in ogni caso rispondendo alla tua domanda prima pensavo fosse la funzione "tone()" perché se mettevo digitalWrite funzionava tutto..
Comunque non ho ancora risolto ma non posso rispondere in tempi brevi, perché sono molto impegnato, se questa discussione può restare in cronologia tra un mesetto circa che mi finisce la scuola e termino con le ultime interrogazioni ed i due concorsi a cui sto partecipando mi cimenterò nuovamente in questi problemi.
Grazie pablos per l'aiuto. A preso

Go Up