GSM shield + library conflicten vraag

Hallo jongens,

Ik ben momenteel nog steeds met een soort spel bezig waarbij ik vele modules gebruik, nu ben ik ongeveer bij de laatste modules beland en is mijn code te groot geworden voor de Uno, geen probleem natuurlijk, dan switch ik naar de Arduino Mega, maar nee de compiler ‘staat het niet toe’, de libraries conflicten ergens met elkaar, welke libraries het zijn en waarom zou ik echt niet weten, ik weet niet veel van libraries. In de Uno compiler krijg ik geen error messages, al zet ik de compiler op Mega krijg ik wel een error message namelijk:

Arduino: 1.8.1 (Windows 10), Board:"Arduino/Genuino Mega or Mega 2560, ATmega2560 (Mega 2560)"

Tone.cpp.o (symbol from plugin): In function `timer0_pin_port':

(.text+0x0): multiple definition of `__vector_13'

libraries\IRremote\IRremote.cpp.o (symbol from plugin):(.text+0x0): first defined here

c:/users/name/appdata/local/arduino15/packages/arduino/tools/avr-gcc/4.9.2-atmel3.5.4-arduino2/bin/../lib/gcc/avr/4.9.2/../../../../avr/bin/ld.exe: Disabling relaxation: it will not work with multiple definitions

collect2.exe: error: ld returned 1 exit status

Fout bij het compileren van board Arduino/Genuino Mega or Mega 2560

This report would have more information with
"Show verbose output during compilation"
option enabled in File -> Preferences.

Dit zijn de libraries die ik gebruik:

#include <nRF24L01.h>
#include <printf.h>
#include <RF24.h>
#include <RF24_config.h>

#include <IRremote.h>
#include <Wire.h>
#include <SPI.h>
#include <MFRC522.h>
#include <LiquidCrystal_I2C.h>
#include <EEPROM.h>

Maar dan komt het volgende probleem er weer bij kijken… ik wil nu nog een GSM shield toevoegen en een bluetooth module, ik had in gedachten om de bluetooth module op pin 0 en 1 aan te sluiten Tx en Rx zodat ik in de code geen SoftwareSerial of iets hoef te gebruiken en de Arduino hem automatisch pakt, lekker makkelijk dus.
Nu gebruikt de GSM shield als Rx en Tx pin 2 en 3 (heb ik hier gelezen: Klik hier, conflict het shield dan als ik Bluetooth in 0 en 1 gebruik? Mij lijkt van niet, overigens is 2 een interupt pin die op de Mega pin 10 is, dus zal ik een jumper wire van pin 2 naar 10 moeten verbinden (heb ik hier gelezen: Klik hier).
Overigens kan ik dus ook alle pins op de GSM shield gebruiken behalve, (2), 10 en 3 en 7 (reset voor GSM?)

Ook al zou het theoretisch gezien moeten werken allemaal (nadat die library fout opgelost is), heb ik toch het idee dat het GSM shield gaat conflicten met het Bluetooth module als ik die aansluit op 0 en 1, weet iemand hier meer van?

Misschien handige informatie:
Modules die ik nu gebruik:

  • RFID reader
  • motion sensor
  • buzzer (kleine)
  • NRF24L01
  • LCD screen (I2C 20x4)
  • IR-receiver
  • lichtsensor

Modules die ik nog ga toevoegen:

  • GSM Shield
  • Bluetooth module (Ik moet dan zeker weten dat deze niet conflict met GSM shield!)

Bedankt voor alle hulp (sorry dat ik zoveel vraag)!

En wat van de dames :wink:

De foutmelding laat aan duidelijkheid niet veel te wensen over; het gaat om 'tone' en 'irremote' bibliotheken. Dat wordt een beetje graven :smiling_imp:

Onderstand een benadering die ik een paar keer heb toegepast om anderen te helpen met irremote library conflicten.

Eerst de datasheet raadplegen om te weten wat __vector_13 is; tabel 14_1 van de 2560 datasheet. De vector nummers beginnen bij 1, the compiler telt vanaf 0. Eentje aftrekken van de vector nummers in de tabel en je hebt TIMER2 COMPA; aha, timer2

Open nu relevante files; in dit geval beginnen we met Tone.cpp en zoek naar ISR; er zijn er 6 en eentje is voor timer2

#ifdef USE_TIMER2
ISR(TIMER2_COMPA_vect)
{

Nu kun je zoeken naar USE_TIMER2; komt 4 keer voor en deze is in jouw geval relevant

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)

#define AVAILABLE_TONE_PINS 1
#define USE_TIMER2
...
...

OK, zo ver, zo goed. Aangezien ik geen idee heb wat of er een relatie is tussen tonepins en timers laat ik dat even zitten en kijk of er wat mogelijkheden zijn in irremote

Open IRRemote.h, IRremoteInt.h en IRremote.cpp. Zoek weer naar de ISR; je vindt deze in the cpp file

ISR(TIMER_INTR_NAME)
{

OK, een andere 'variabele', dus zoeken naar TIMER_INTR_NAME; je vindt deze in IRremoteInt.h, zoek naar eentje waar iets refereert naar timer2

#if defined(IR_USE_TIMER2)
#define TIMER_RESET
#define TIMER_ENABLE_PWM     (TCCR2A |= _BV(COM2B1))
#define TIMER_DISABLE_PWM    (TCCR2A &= ~(_BV(COM2B1)))
#define TIMER_ENABLE_INTR    (TIMSK2 = _BV(OCIE2A))
#define TIMER_DISABLE_INTR   (TIMSK2 = 0)
#define TIMER_INTR_NAME      TIMER2_COMPA_vect
...
...

Deze defines zitten binnen #if defined(IR_USE_TIMER2), nu dus zoeken naar IR_USE_TIMER2; weer in IRRemoteInt.h vind je (refererend naar the Mega)

#if defined(__AVR_ATmega1280__) || defined(__AVR_ATmega2560__)
  //#define IR_USE_TIMER1   // tx = pin 11
  #define IR_USE_TIMER2     // tx = pin 9
  //#define IR_USE_TIMER3   // tx = pin 5
  //#define IR_USE_TIMER4   // tx = pin 6
  //#define IR_USE_TIMER5   // tx = pin 46

Aha, dit lijkt je toe te staan om timers 1..5 te gebruiken. Verander dit stukje zodat een andere timer gebruikt wordt (bv timer5) en compileer je code opnieuw. Het zal nu zeer waarschijnlijk werken (ik laat het testen aan jou over :wink: )

Succes met het verdere graven.

Opmerking:
deze verandering zal invloed hebben op alle MEGA programmas die je hebt geschreven (opnieuw compileren van bestaande code zal nu bv timer5 gebruiken) of gaat schrijven in the toekomst. Dus plaats wat commentaar in de file die je veranderd hebt.

Zo goeiemorgen Sterretje,

Je bent weer echt een held, ik snap het hele achterliggende idee van het complete verhaal hierboven niet, maar het werkt perfect!
Dit is nog steeds hetzelfde project als waarbij de vorige keer de IRremote library ging conflicten en nu dus ook weer.
Ik heb hem nu op timer5 gezet en het werkt, timer5 is pin 46 maar wat gebeurt er nu op deze pin dan? Moet ik hier iets op aansluiten, nee toch?

Ik ben echt blij dat je zoveel van libraries weet, want anders had ik echt nooit de oplossing gevonden.

Hartstikke bedankt!!

Het is hier rond zes in de avond :smiley:

Ik heb geen bal verstand van de bibliotheken maar ik kan ze (met wat goede wil) analyseren omdat ik weet waar ik naar moet zoeken. Je kunt het nu hopelijk ook zelf.

Deze bibliotheken zijn behoorlijk flexibel opgezet, anderen misschien niet zo en dan kan het moeilijker worden (bv alleen keuze uit twee timers).

sterretje:
Het is hier rond zes in de avond :smiley:

Ik heb geen bal verstand van de bibliotheken maar ik kan ze (met wat goede wil) analyseren omdat ik weet waar ik naar moet zoeken. Je kunt het nu hopelijk ook zelf.

Deze bibliotheken zijn behoorlijk flexibel opgezet, anderen misschien niet zo en dan kan het moeilijker worden (bv alleen keuze uit twee timers).

Oke dat ik het zelf kan, misschien, zolang het bij die timers blijft. Welke library het precies is geeft de foutmelding ook niet aan want er staat alleen "libraries\IRremote\IRremote.cpp.o" terwijl het de IRremoteInt is.

Omdat die op de Uno wel compiled en op de Mega niet weet ik nu ook dat ik in die files moet zoeken naar waar de Mega defined staat er daar dan een timer aanpassen (als dat het probleem is). Volgende keer zal ik het zelf eerst nog is proberen :D.

Maar bedankt!

Ik zei je al dat je moet gaan graven. Bibliotheken bestaan meestal uit cpp and h files. Begin met de cpp files; kijk naar de includes aan het begin van de file (IRremote.cpp includes IRremote.h en IRremoteInt.h).

PS Een programma als grep (of grepWin onder windows kan heel handig zijn) om dingen te vinden.