Teensyduino and Arduino IDE coexisting in peace (duplicated libraries)

jornamon

New member
Hi!

I am experimenting with a Teensy 4.1, and I have installed Teensyduino (1.8.19) along with Arduino IDE. Using macOS (Monterey 12.1).

I have been experimenting problems that seem to be related to duplicated libraries from Teensyduino and Arduino. It all started with a "'BUILTIN_SDCARD' was not declared in this scope" error while trying to use SD library. The compiler states that it finds several version of the same libraries (in the Applications/Teensyduino folder and in the ~/Arduino/libraries folder).

I have tried, for example, to erase the SD library from Arduino IDE to try to force the compiler to use the Teensyduino SD library, and it does, but now it complains "Teensy's SD library uses a custom modified copy of SdFat. Standard SdFat was mistakenly used. Arduino should print multiple libraries found for SdFat.h. To resolve this error, you will need to move or delete the copy Arduino is using, or otherwise take steps to cause Teensy's special copy of SdFat to be used.". I could maybe continue by erasing also de SdFat library from Arduino IDE, but it doesn't seem a good solution.

Both Teensyduino and Arduino IDE seem to share at least some of the configuration files, paths and libraries. I have other development boards, so I would like to keep both versions installed and updated, so the question is if there is an easy and clean way to see both environments (Teensyduino and Arduino IDE) more or less isolated to avoid this interference.

Thank you very much for any advice.

The sketch I was using was the Card Info example from the SD library:

Code:
/*
  SD card test

  This example shows how use the utility libraries on which the'
  SD library is based in order to get info about your SD card.
  Very useful for testing a card when you're not sure whether its working or not.

  The circuit:
    SD card attached to SPI bus as follows:
 ** MOSI - pin 11 on Arduino Uno/Duemilanove/Diecimila
 ** MISO - pin 12 on Arduino Uno/Duemilanove/Diecimila
 ** CLK - pin 13 on Arduino Uno/Duemilanove/Diecimila
 ** CS - depends on your SD card shield or module.
 		Pin 4 used here for consistency with other Arduino examples


  created  28 Mar 2011
  by Limor Fried
  modified 9 Apr 2012
  by Tom Igoe
*/
// include the SD library:
#include <SPI.h>
#include <SD.h>

// set up variables using the SD utility library functions:
Sd2Card card;
SdVolume volume;
SdFile root;

// change this to match your SD shield or module;
// Arduino Ethernet shield: pin 4
// Adafruit SD shields and modules: pin 10
// Sparkfun SD shield: pin 8
// MKRZero SD: SDCARD_SS_PIN
const int chipSelect = BUILTIN_SDCARD;

void setup() {
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  Serial.print("\nInitializing SD card...");

  // we'll use the initialization code from the utility libraries
  // since we're just testing if the card is working!
  if (!card.init(SPI_HALF_SPEED, chipSelect)) {
    Serial.println("initialization failed. Things to check:");
    Serial.println("* is a card inserted?");
    Serial.println("* is your wiring correct?");
    Serial.println("* did you change the chipSelect pin to match your shield or module?");
    while (1);
  } else {
    Serial.println("Wiring is correct and a card is present.");
  }

  // print the type of card
  Serial.println();
  Serial.print("Card type:         ");
  switch (card.type()) {
    case SD_CARD_TYPE_SD1:
      Serial.println("SD1");
      break;
    case SD_CARD_TYPE_SD2:
      Serial.println("SD2");
      break;
    case SD_CARD_TYPE_SDHC:
      Serial.println("SDHC");
      break;
    default:
      Serial.println("Unknown");
  }

  // Now we will try to open the 'volume'/'partition' - it should be FAT16 or FAT32
  if (!volume.init(card)) {
    Serial.println("Could not find FAT16/FAT32 partition.\nMake sure you've formatted the card");
    while (1);
  }

  Serial.print("Clusters:          ");
  Serial.println(volume.clusterCount());
  Serial.print("Blocks x Cluster:  ");
  Serial.println(volume.blocksPerCluster());

  Serial.print("Total Blocks:      ");
  Serial.println(volume.blocksPerCluster() * volume.clusterCount());
  Serial.println();

  // print the type and size of the first FAT-type volume
  uint32_t volumesize;
  Serial.print("Volume type is:    FAT");
  Serial.println(volume.fatType(), DEC);

  volumesize = volume.blocksPerCluster();    // clusters are collections of blocks
  volumesize *= volume.clusterCount();       // we'll have a lot of clusters
  volumesize /= 2;                           // SD card blocks are always 512 bytes (2 blocks are 1KB)
  Serial.print("Volume size (Kb):  ");
  Serial.println(volumesize);
  Serial.print("Volume size (Mb):  ");
  volumesize /= 1024;
  Serial.println(volumesize);
  Serial.print("Volume size (Gb):  ");
  Serial.println((float)volumesize / 1024.0);

  Serial.println("\nFiles found on the card (name, date and size in bytes): ");
  root.openRoot(volume);

  // list all files in the card with date and size
  root.ls(LS_R | LS_DATE | LS_SIZE);
}

void loop(void) {
}
 
What you probably want is Arduino Portable mode. But unfortunately it's not supported on MacOS.

I believe the main problem you're seeing is any library you install into Documents/Arduino/libraries overrides all other copies. In recent years the rules for how Arduino decides which library to use have become more complicated, but the general idea is one you install in your Documents/Arduino/libraries get top priority, then next comes the ones in a platform's folder (the ones Teensyduino installs), and finally the generic libraries that come with the IDE get the lowest priority.

Starting with Teensyduino 1.54, we got rid of the ancient Arduino SD library, replacing it with a thin compatibility layer which just uses SdFat. But the normal SdFat had some issues, so now Teensy's not-really-a-library SD needs the Teensy-customized SdFat.

Without Portable Arduino, probably your next best option that doesn't involve deleting lots of libraries you might want to still use for non-Teensy boards might be to change the sketchbook location away from Documents/Arduino when using Teensy. Create an empty folder somewhere. Then use File > Preference to set it as your sketchbook location. This should give you a fairly clean slate, where all the libraries you've installed will remain in Documents/Arduino/libraries, so you can switch back to using them just by using File > Preferences to change back to Documents/Arduino.
 
Thank you very much Paul!

I have changed the sketchbook location for Teensyduino environment and, apart from having to install again some libraries, now it defaults to the correct (Teensy-custom) libraries and the problems have gone away. More than enough for me right now.

By the way, you name ringed me a bell, and I saw that you are one of the author of the LittleFS wrapper library (https://github.com/PaulStoffregen/LittleFS). Thank you for that too!! I tested it this afternoon and works great. It's very useful to me, I have to log some data from sensors in a high-vibration environment, and I am afraid that the SD card contacts may not be reliable enough (potential disconnections). I was planning to use an external flash to store the data and only after the end of the vibrations and data collection copy it to the SD card for further analysis on a computer. With that library, I can take advantage of the onboard Flash :)
 
Ha ha ha!! Yes, completely true. I noticed some more contributions besides designing the board I'm using, after posting.... :p

I am completely new to this world so I don't know anyone yet.
 
Back
Top