Problema con dichiarazione file DueTimer.h

Ho scritto il seguente codice che serve a gestire un robot a 4 zampe:

sp4_leged_robot.ino:

#include <Servo.h>
#include "D:\Progetto sp4\software\sp4_legged_robot\funzioni.h"
#include "D:\Progetto sp4\software\sp4_legged_robot\DueTimer.h"

long duration, cmCENTRO;
long cmDX, cmSX, cm;
//variabile di stato per decidere quanto camminare
int cicli=1;




void sonar()
{ 
  seleziona_sonar(TRIG_CENTRO);
  rileva();
  seleziona_sonar(TRIG_DX);
  rileva();
  seleziona_sonar(TRIG_SX);
  rileva();
  if(cmCENTRO<=40)
  {
      if(cmDX>=cmSX)   {svolta(DX);   digitalWrite(LED,LOW);}
      if(cmDX<=cmSX)   {svolta(SX);   digitalWrite(LED,HIGH);}   
  }
}


void setup() {
  //configurazione delle uscite PWM
  braccio_dx.attach(2);
  avanbraccio_dx.attach(3);
  braccio_sx.attach(4);
  avanbraccio_sx.attach(9);    
  
  gamba_dx.attach(6);
  piede_dx.attach(7);
  gamba_sx.attach(11);
  piede_sx.attach(13);    
  
  //configurazione degli 8 pulsanti;
  pinMode(51, INPUT);
  pinMode(49, INPUT);
  pinMode(47, INPUT);
  pinMode(45, INPUT);
  pinMode(43, INPUT);
  pinMode(41, INPUT);
  pinMode(39, INPUT);
  pinMode(37, INPUT);
  
  //configurazione degli I/O per gestione dei tre sonar
  pinMode(LED, OUTPUT);
  pinMode(ECHO_SX, INPUT);
  pinMode(ECHO_DX, INPUT);
  pinMode(ECHO_CENTRO, INPUT);
  pinMode(TRIG_CENTRO, OUTPUT);
  pinMode(TRIG_SX, OUTPUT);
  pinMode(TRIG_DX, OUTPUT);
  
  //configurazione interrupt rilevazione sonar
  Timer5.attachInterrupt(sonar).start(500000);                   //testa presenza del segnale di eco ogni 500msec.          
  Timer5.start(); 

}

DueTimer.h:

/*
  DueTimer.h - DueTimer header file, definition of methods and attributes...
  For instructions, go to https://github.com/ivanseidel/DueTimer

  Created by Ivan Seidel Gomes, March, 2013.
  Modified by Philipp Klaus, June 2013.
  Released into the public domain.
*/

#ifdef __arm__

#ifndef DueTimer_h
#define DueTimer_h

#include "Arduino.h"

#include <inttypes.h>

/*
 This fixes compatibility for Arduono Servo Library.
 Uncomment to make it compatible.

 Note that:
 + Timers: 0,2,3,4,5 WILL NOT WORK, and will
  neither be accessible by Timer0,...
*/
//#define USING_SERVO_LIB true

#ifdef USING_SERVO_LIB
 #warning "HEY! You have set flag USING_SERVO_LIB. Timer0, 2,3,4 and 5 are not available"
#endif


#define NUM_TIMERS  9

class DueTimer
{
protected:

 // Represents the timer id (index for the array of Timer structs)
 const unsigned short timer;

 // Stores the object timer frequency
 // (allows to access current timer period and frequency):
 static double _frequency[NUM_TIMERS];

 // Picks the best clock to lower the error
 static uint8_t bestClock(double frequency, uint32_t& retRC);

  // Make Interrupt handlers friends, so they can use callbacks
  friend void TC0_Handler(void);
  friend void TC1_Handler(void);
  friend void TC2_Handler(void);
  friend void TC3_Handler(void);
  friend void TC4_Handler(void);
  friend void TC5_Handler(void);
  friend void TC6_Handler(void);
  friend void TC7_Handler(void);
  friend void TC8_Handler(void);

 static void (*callbacks[NUM_TIMERS])();

 struct Timer
 {
 Tc *tc;
 uint32_t channel;
 IRQn_Type irq;
 };

 // Store timer configuration (static, as it's fixed for every object)
 static const Timer Timers[NUM_TIMERS];

public:

 static DueTimer getAvailable(void);

 DueTimer(unsigned short _timer);
 DueTimer& attachInterrupt(void (*isr)());
 DueTimer& detachInterrupt(void);
 DueTimer& start(long microseconds = -1);
 DueTimer& stop(void);
 DueTimer& setFrequency(double frequency);
 DueTimer& setPeriod(unsigned long microseconds);

 double getFrequency(void) const;
 long getPeriod(void) const;
};

// Just to call Timer.getAvailable instead of Timer::getAvailable() :
extern DueTimer Timer;

extern DueTimer Timer1;
// Fix for compatibility with Servo library
#ifndef USING_SERVO_LIB
 extern DueTimer Timer0;
 extern DueTimer Timer2;
 extern DueTimer Timer3;
 extern DueTimer Timer4;
 extern DueTimer Timer5;
#endif
extern DueTimer Timer6;
extern DueTimer Timer7;
extern DueTimer Timer8;

#endif

#else
 #error Oops! Trying to include DueTimer on another device?
#endif

La libreria DueTimer serve a gestire un interrupt da timer.
Per favore provate a compilare il tutto cambiando il percorso degli headers con il vostro.
Come risultato della compilazione ottengo un messaggio che mi dice che non è stato dichiarato
l’ oggetto DueTimer, quindi il problema dovrebbe essere dentro al file DueTimer.h e precisamente
mi dice che Timer5 non è stato dichiarato.
Nessuno mi può aiutare a capire dov’è il problema?

Ciao, con servolib alcuni timer sono inibiti (0, 2, 3, 4 e 5), qui sotto uno snippet del codice di inizializzazione che trovi in DueTimer.cpp:

/*
	Initializing all timers, so you can use them like this: Timer0.start();
*/
DueTimer Timer(0);

DueTimer Timer1(1);
// Fix for compatibility with Servo library
#ifndef USING_SERVO_LIB
 DueTimer Timer0(0);
 DueTimer Timer2(2);
 DueTimer Timer3(3);
 DueTimer Timer4(4);
 DueTimer Timer5(5);
#endif
DueTimer Timer6(6);
DueTimer Timer7(7);
DueTimer Timer8(8);

Spero ti sia di aiuto! Ciao, Silvio.

Ho scritto nel codice:

Timer6.attachInterrupt(sonar).start(500000);                  
  Timer6.start();

se compilo continua a darmi errore proprio li. Perchè?

Prova a installare la libreria come suggerito dall'autore cioè nella cartella libraries dell'IDE di Arduino:

Installation

  1. Download the Latest release from GitHub.
  2. Unzip and modify the Folder name to "DueTimer" (Remove the '-version')
    3. Paste the modified folder on your Library folder (On your Libraries folder inside Sketchbooks or Arduino software).
  3. Re-open Arduino Software

Può essere che mettendo i files in D:\Progetto sp4\software\sp4_legged_robot\ l'ide non li veda come libreria e quindi non compili e colleghi correttamente la parte in cui è implementata la libreria stessa (DueTimer.cpp).

Ciao
Silvio

Ho fatto come mi hai detto: ho messo DueTimer.cpp e DueTimer.cpp in C:\Program Files\Arduino\libraries\DueTimer ma non ottengo nessun risultato continua a darmi lo stesso problema.

Dunque, scompatta tutta la cartella che trovi nello ZIP che scarichi da GitHub nella cartella libraries e riniminala in DueTimer (da DueTimer-master), poi riavvia l'IDE e verifica se negli examples dell'IDE c'è la libreria e ci sono i tre esempi che vengono rilasciati insieme.

Se non trovi i tre esempi probabilmente la libreria non viene letta correttamente (forse non è la cartella libraries giusta).

Nell'ultima versione dell'ide puoi usare anche le funzioni per importare le librerie che trovia nei menu a cui se non erro puoi passare direttamente lo zip.

La cartella DueTimer con all'interno la libreria, non devi metterla in C:\Program Files\Arduino\libraries\ ma nella cartella "libraries" che hai nella cartella "arduino" che hai nella cartella "documenti".

E ovviamente l’include cambia in:

#include <DueTimer.h>

:wink:

Ho fatto come mi hai detto ma continua a darmi errore, perchè?

Ma la libreria e’ correttamente elencata nell’IDE?

Prova a postare tutto il risultato della compilazione che compare nell’IDE magari c’e’ qualche info utile a capire meglio che succede.

Si la libreria è correttamente elencata nell' IDE.
Ecco il risultato della compilazione:

Arduino:1.5.6-r2 (Windows 7), Scheda:"Arduino Uno"

In file included from sp4_legged_robot.ino:12:
C:\Users\fabio\Documents\Arduino\libraries\DueTimer/DueTimer.h:108:3: error: #error Oops! Trying to include DueTimer on another device?
sp4_legged_robot.ino: In function 'void setup()':
sp4_legged_robot:71: error: 'Timer8' was not declared in this scope
DueTimer.ino: At global scope:
DueTimer:12: error: 'DueTimer' has not been declared
DueTimer:12: error: expected initializer before 'DueTimer'

  Questo report potrebbe essere più ricco
di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"

Ho capito ora che il problema è sul fatto che ho impostato Arduino uno invecie che Arduino Due.
Ora ricompilando con Arduino Due ottengo:

Arduino:1.5.6-r2 (Windows 7), Scheda:"Arduino Due (Programming Port)"

DueTimer:61: error: prototype for 'DueTimer::DueTimer(int)' does not match any in class 'DueTimer'
DueTimer.h:37: error: candidates are: DueTimer::DueTimer(const DueTimer&)
DueTimer.h:77: error: DueTimer::DueTimer(short unsigned int)
DueTimer:82: error: prototype for 'DueTimer DueTimer::attachInterrupt(void (*)())' does not match any in class 'DueTimer'
DueTimer.h:78: error: candidate is: DueTimer& DueTimer::attachInterrupt(void (*)())
DueTimer:92: error: prototype for 'DueTimer DueTimer::detachInterrupt()' does not match any in class 'DueTimer'
DueTimer.h:79: error: candidate is: DueTimer& DueTimer::detachInterrupt()
DueTimer:104: error: prototype for 'DueTimer DueTimer::start(long int)' does not match any in class 'DueTimer'
DueTimer.h:80: error: candidate is: DueTimer& DueTimer::start(long int)
DueTimer:124: error: prototype for 'DueTimer DueTimer::stop()' does not match any in class 'DueTimer'
DueTimer.h:81: error: candidate is: DueTimer& DueTimer::stop()
DueTimer:176: error: prototype for 'DueTimer DueTimer::setFrequency(double)' does not match any in class 'DueTimer'
DueTimer.h:82: error: candidate is: DueTimer& DueTimer::setFrequency(double)
DueTimer:217: error: prototype for 'DueTimer DueTimer::setPeriod(long int)' does not match any in class 'DueTimer'
DueTimer.h:83: error: candidate is: DueTimer& DueTimer::setPeriod(long unsigned int)
DueTimer:228: error: prototype for 'double DueTimer::getFrequency()' does not match any in class 'DueTimer'
DueTimer.h:85: error: candidate is: double DueTimer::getFrequency() const
DueTimer:236: error: prototype for 'long int DueTimer::getPeriod()' does not match any in class 'DueTimer'
DueTimer.h:86: error: candidate is: long int DueTimer::getPeriod() const

  Questo report potrebbe essere più ricco
di informazioni con
  "Mostra un output dettagliato durante la compilazione"
  abilitato in "File > Impostazioni"

Dimmi te ora dove può essere il problema.

La dichiarazione del costruttore è:

DueTimer(unsigned short _timer);

quindi:

DueTimer Timer(0); //ERRATA

DueTimer Timer((unsigned short) 0); //GIUSTA

devi fare il casting del tipo!

Ok, un passo avanti l’abbiamo fatto, almeno compiliamo per la scheda giusta! :wink:

Hai già provato a compilare uno degli esempi che arrivano con la libreria? Io ho provato e a me compilano tutti senza errori…

Prova a compilare un esempio e eventualmente postare il risultato.