Arduino Due libraries (official and 3rd party)

I have posted a patch for the Adafruit TFTLCD library to allow the Due to use LCD displays based on the ILI9825/9828 controllers with a 8 bit parallel interface here:

EasyTransfer compiles with this mod to EasyTransfer.h. Just wrap the avr include with an ifndef/endif:

#ifndef __SAM3X8E__
#include <avr/io.h>
#endif

PS: Pity it doesn't do retransmits...

Hi Everyone, I am very new to this, have had some success with a few Uno projects and now want to try working with a Due. However there are some libraries that I would like to use that are available for the Uno but not for Due. So the question comes... is there are general guidelines for converting libraries that work with Uno so they will work with Due? For example, Sensirion and BMP085.

Hey i am also new here,

may be some one are interested in a due working sketch for the BMP085

/*********************************************************************************************** 
 * Sketch:  BMP085_Text.ino
 * Author:  A. Kriwanek: http://www.kriwanek.de/arduino/wetterstation.html
 * Version: 1.00  01.09.2012/17:15
 *
 * This sketch tests a BMP085 barometric sensor. Temperature and pressure are read from the sensor
 * The mathematical computation is  done and the results will be displayed every second on the
 * serial monitor.
 *
 * Used Hardware:
 * - Sparkfun Breakout board BMP085
 * - Arduino UNO Protoboard
 * - Arduino UNO
 * 
 * My sketch is free software: Arduino BMP085_Text.ino von Andreas Kriwanek steht unter 
 * einer Creative Commons Namensnennung-Weitergabe unter gleichen Bedingungen 3.0 Unported Lizenz.
 *
 * My Sketch in wide parts is based on the sketch from Jim Lindblom:
 *
 * BMP085 Extended Example Code
 * by: Jim Lindblom
 * SparkFun Electronics
 * date: 1/18/11
 * license: CC BY-SA v3.0 - http://creativecommons.org/licenses/by-sa/3.0/
 *
 * Update (7/19/11): I've heard folks may be encountering issues
 * with this code, who're running an Arduino at 8MHz. If you're 
 * using an Arduino Pro 3.3V/8MHz, or the like, you may need to 
 * increase some of the delays in the bmp085ReadUP and 
 * bmp085ReadUT functions.
 * 
 * https://www.sparkfun.com/products/9694 Product page
 * http://de.wikipedia.org/wiki/Luftdruck Correction formula to sea level
 * http://www.meteo24.de/wetter/49X8157.html Weather Bad Aibling
 *
 **********************************************************************************************/

#include <Wire.h>

#define BMP085_ADDRESS 0x77        // I2C address of BMP085

const unsigned char OSS = 0;       // Oversampling Setting

// Calibration values of BMP085:
short ac1;
short ac2; 
short ac3; 
unsigned short ac4;
unsigned short ac5;
unsigned short ac6;
short b1; 
short b2;
short mb;
short mc;
short md;

// b5 is calculated in bmp085GetTemperature(...), this variable is also used in bmp085GetPressure(...)
// so ...Temperature(...) must be called before ...Pressure(...).
long b5; 

float temperature;
float pressure;
float pressureNN;
float pressureCorrection = 0.98731518;  // Höhe 103 ü.NN Halle. Please calculate your coeffizient
                                        // for your homes elevation!

//----------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------
void setup()
{
  Serial.begin(115200);
  Wire.begin();
  bmp085Calibration();
}

//----------------------------------------------------------------------------------------------------------
//----------------------------------------------------------------------------------------------------------
void loop()
{
  temperature = bmp085GetTemperature(bmp085ReadUT())/10;
  pressure = bmp085GetPressure(bmp085ReadUP())/100;
  pressureNN = pressure / pressureCorrection;
  Serial.print("Temperature: ");
  Serial.print(temperature,1);
  Serial.print(" C, Pressure: ");
  Serial.print(pressure,1);
  Serial.print(" hPa in 103m height above sea level, Pressure-NN: ");
  Serial.print(pressureNN,1);
  Serial.println(" hPa");
  delay(1000);
}

//----------------------------------------------------------------------------------------------------------
// Stores all of the bmp085's calibration values into global variables
// Calibration values are required to calculate temp and pressure
// This function should be called at the beginning of the program
void bmp085Calibration()
{
  ac1 = bmp085ReadInt(0xAA);
  ac2 = bmp085ReadInt(0xAC);
  ac3 = bmp085ReadInt(0xAE);
  ac4 = bmp085ReadInt(0xB0);
  ac5 = bmp085ReadInt(0xB2);
  ac6 = bmp085ReadInt(0xB4);
  b1 = bmp085ReadInt(0xB6);
  b2 = bmp085ReadInt(0xB8);
  mb = bmp085ReadInt(0xBA);
  mc = bmp085ReadInt(0xBC);
  md = bmp085ReadInt(0xBE);
}

//----------------------------------------------------------------------------------------------------------
// Calculate temperature given ut.
// Value returned will be in units of 0.1 deg C
short bmp085GetTemperature(unsigned short ut)
{
  long x1, x2;
  
  x1 = (((long)ut - (long)ac6)*(long)ac5) >> 15;
  x2 = ((long)mc << 11)/(x1 + md);
  b5 = x1 + x2;

  return ((b5 + 8)>>4);  
}

//----------------------------------------------------------------------------------------------------------
// Calculate pressure given up
// calibration values must be known
// b5 is also required so bmp085GetTemperature(...) must be called first.
// Value returned will be pressure in units of Pa.
long bmp085GetPressure(unsigned long up)
{
  long x1, x2, x3, b3, b6, p;
  unsigned long b4, b7;
  
  b6 = b5 - 4000;
  // Calculate B3
  x1 = (b2 * (b6 * b6)>>12)>>11;
  x2 = (ac2 * b6)>>11;
  x3 = x1 + x2;
  b3 = (((((long)ac1)*4 + x3)<<OSS) + 2)>>2;
  
  // Calculate B4
  x1 = (ac3 * b6)>>13;
  x2 = (b1 * ((b6 * b6)>>12))>>16;
  x3 = ((x1 + x2) + 2)>>2;
  b4 = (ac4 * (unsigned long)(x3 + 32768))>>15;
  
  b7 = ((unsigned long)(up - b3) * (50000>>OSS));
  if (b7 < 0x80000000)
    p = (b7<<1)/b4;
  else
    p = (b7/b4)<<1;
    
  x1 = (p>>8) * (p>>8);
  x1 = (x1 * 3038)>>16;
  x2 = (-7357 * p)>>16;
  p += (x1 + x2 + 3791)>>4;
  
  return p;
}

//----------------------------------------------------------------------------------------------------------
// Read 1 byte from the BMP085 at 'address'
char bmp085Read(unsigned char address)
{
  unsigned char data;
  
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  
  Wire.requestFrom(BMP085_ADDRESS, 1);
  while(!Wire.available())
    ;
    
  return Wire.read();
}

//----------------------------------------------------------------------------------------------------------
// Read 2 bytes from the BMP085
// First byte will be from 'address'
// Second byte will be from 'address'+1
short bmp085ReadInt(unsigned char address)
{
  unsigned char msb, lsb;
  
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(address);
  Wire.endTransmission();
  
  Wire.requestFrom(BMP085_ADDRESS, 2);
  while(Wire.available()<2)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  
  return (short) msb<<8 | lsb;
}

//----------------------------------------------------------------------------------------------------------
// Read the uncompensated temperature value
unsigned short bmp085ReadUT()
{
  unsigned short ut;
  
  // Write 0x2E into Register 0xF4
  // This requests a temperature reading
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x2E);
  Wire.endTransmission();
  
  // Wait at least 4.5ms
  delay(5);
  
  // Read two bytes from registers 0xF6 and 0xF7
  ut = bmp085ReadInt(0xF6);
  return ut;
}

//----------------------------------------------------------------------------------------------------------
// Read the uncompensated pressure value
unsigned long bmp085ReadUP()
{
  unsigned char msb, lsb, xlsb;
  unsigned long up = 0;
  
  // Write 0x34+(OSS<<6) into register 0xF4
  // Request a pressure reading w/ oversampling setting
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF4);
  Wire.write(0x34 + (OSS<<6));
  Wire.endTransmission();
  
  // Wait for conversion, delay time dependent on OSS
  delay(2 + (3<<OSS));
  
  // Read register 0xF6 (MSB), 0xF7 (LSB), and 0xF8 (XLSB)
  Wire.beginTransmission(BMP085_ADDRESS);
  Wire.write(0xF6);
  Wire.endTransmission();
  Wire.requestFrom(BMP085_ADDRESS, 3);
  
  // Wait for data to become available
  while(Wire.available() < 3)
    ;
  msb = Wire.read();
  lsb = Wire.read();
  xlsb = Wire.read();
  
  up = (((unsigned long) msb << 16) | ((unsigned long) lsb << 8) | (unsigned long) xlsb) >> (8-OSS);
  
  return up;
}
//----------------------------------------------------------------------------------------------------------

fatal error: util/delay.h: No such file or directory

I think some library works on UNO may not work in DUE. Any header file collection link for SAM3X8E?

Thanks

How about a Timer library that works properly?

DueTimer does not get the requested interval correct,
giving 49000 us when asked for 50000 (off by 1 ms).

garygid:
How about a Timer library that works properly?

DueTimer does not get the requested interval correct,
giving 49000 us when asked for 50000 (off by 1 ms).

How about submiting an issue on the GitHub so that I can know about it, and try to fix it? :wink:

Remember that micros() has an very weird reading too... and it doesn't works properly. The correct way (maybe the one you used), is to use an osciloscope...

Also, make shure to notice that DueTimer tries to find the Best clock for the desired frequency. However, it might not be EXACLY to what you want...

If you can, try to set the timer to 51ms, instead of 49, and see if it works. If yes, than we have a bug...

But make shure to submit it on the issue page, please! Issues · ivanseidel/DueTimer · GitHub

Ivan

--EDIT

Have just tested it with micros, and it's showing up exacly 50000uS.

Can you send me your code?

Ivan

Adafruit lib for NeoPixel works fine

(tested with 10 pixel of the stripe Adafruit NeoPixel Digital RGB LED Strip - White 60 LED [WHITE] : ID 1138 : $99.80 : Adafruit Industries, Unique & fun DIY electronics and kits)

http://forum.arduino.cc/index.php?PHPSESSID=ei2ghoroto35godf46e01t1en4&topic=144446.60

Even without level shifting the 3.3 V due pin to the 5 V input pin of the Neo pixel,
but not sure how stable this will be (datasheet says 0.7*Vcc min. for Vih = 3.5)

What version of the Due do you have? I've got R3 and the crystal and all parts are populated and work great. The crystal isn't enabled by default, but if you check out my post at Slow Clock External Crystal is Not Used - BUG - Suggestions for the Arduino Project - Arduino Forum it is very easy to turn on.

I created a Due EEPROM library using EEPROM that is already in the 16u2 on the board. It requires a hardware mod as well, but it's not terrible to do. New Arduino Due Library: DueEEPROM - Libraries - Arduino Forum

any1 have library for DUE work with DHT22?

MINMSC driver is posted for Due :-

README.txt 2 KB

minmsc_2013_11_17_v1_0.zip 9.8 MB

This driver will allow a sketch to do raw read/writes on a thumb drive attached to Native USB AB port of Due. A card reader with any media can also be used.

This driver works with old sdfat20130629 (can be downloaded from Google Code) by replacing two files. Then one can use all the sketches shipped with old sdfat on the USB device on AB port... no shield needed.

MINMSC is essentially a minimal Mass Storage Class driver following USBIF spec and drives devices that report as transparent SCSI.

Regards.

The MINMSC released on 18 Nov 2013 has some obvious bugs. This version attempts to correct them. It is still the same Mass Storage Class driver on the Native USB port on Due... but now runs fine with IDE 1.5.4 and SdFat dated 2013-06-29. You can download the sdfat20130629 from Google Code.

README.txt 2 KB

Source Code:
minmsc_2013_11_27_v1_1.zip 90 KB

Just Documentation:
minmsc_doc_2013_11_27_v1_1.zip 9.7 MB

Regards.

Alexeyca:
any1 have library for DUE work with DHT22?

My DHT lib is recently upgraded to support DUE, not tested myself, please give it a try
see - Arduino Playground - DHTLib -

kmartburrito:
I'm hoping for one for the RFM12 line of wireless modules. Anyone know if that one has been ported yet?

Hi,
I've successfully modified RFM12B library by Felix of LowPowerLab.com to work on DUE. Not all functionality has been implemented yet, like sleep mode, but overall, it works.
Here's the link to files:
http://boredomprojects.net/images/Articles/HomeEnergy/RFM12B_Due_v006.zip

Cheers!

http://forum.arduino.cc/index.php?topic=164281.msg1539562#msg1539562

I installed the new release of Arduino IDE 1.5.5. but I have some problem.

  1. in I2C comunication, infact if I try to use the MLX90914 sensor I can't read value.

  2. I have a sketch that read from analog input the value of accelerometer. after I installed the IDE 1.5.5 I can't read correctly the value.

somebody can help me?

randomvibe:
Library: pwm01.h
Description: A clean alternate approach for setting up unique PWM frequencies from within a sketch, for any or all PWM pins. The trick is to utilize the two PWM clocks (CLKA & CLKB) provided by the SAM3X8E chip.

I wrote and enclosed a library (pwm01.h). It includes 4 user functions to: 1) setup PWM resolution, 2) setup PWM pin, frequency & pick clock, 3) write duty cycle, and 4) stop PWM. See example code for usage:

#include "C:\Programs\arduino-1.5.1r2\hardware\arduino\sam\libraries\Pwm01\pwm01.h"

void setup()
{
   uint32_t  pwm_duty = 32767;
   uint32_t  pwm_freq1 = 2;  
   uint32_t  pwm_freq2 = 5000;

// Set PWM Resolution
   pwm_set_resolution(16);

// Setup PWM Once (Up to two unique frequencies allowed
   //-----------------------------------------------------    
   pwm_setup( 6, pwm_freq1, 1);  // Pin 6 freq set to "pwm_freq1" on clock A
   pwm_setup( 7, pwm_freq2, 2);  // Pin 7 freq set to "pwm_freq2" on clock B
   pwm_setup( 8, pwm_freq2, 2);  // Pin 8 freq set to "pwm_freq2" on clock B
   pwm_setup( 9, pwm_freq2, 2);  // Pin 9 freq set to "pwm_freq2" on clock B
     
   // Write PWM Duty Cycle Anytime After PWM Setup
   //-----------------------------------------------------    
   pwm_write_duty( 6, pwm_duty );  // 50% duty cycle on Pin 6
   pwm_write_duty( 7, pwm_duty );  // 50% duty cycle on Pin 7
   pwm_write_duty( 8, pwm_duty );  // 50% duty cycle on Pin 8
   pwm_write_duty( 9, pwm_duty );  // 50% duty cycle on Pin 9

delay(30000);  // 30sec Delay; PWM signal will still stream
       
   // Force PWM Stop On All Pins
   //-----------------------------    
   pwm_stop( 6 );
   pwm_stop( 7 );
   pwm_stop( 8 );
   pwm_stop( 9 );
}

void loop()
{  
}





The pwm01.h library and example code were tested in IDE 1.5.1r2. Additional notes on this library:
- Applies to Arduino-Due board, PWM pins 6, 7, 8 & 9.
- Libary Does not operate on the TIO pins.
- Unique frequencies set via PWM Clock-A ("CLKA") and Clock-B ("CLKB")
Therefore, up to two unique frequencies allowed.
- Set max duty cycle counts (pwm_max_duty_Ncount) equal to 255 per Arduino approach. 
This value is best SUITED for low frequency applications (2hz to 40,000hz) such as
PWM motor drivers, 38khz infrared transmitters, etc.
- Future library versions will address high frequency applications.
- Arduino's "wiring_analog.c" function was very helpful in this effort.

Have you updated this library recently to accommodate higher frequencies? I am in need of 250kHz+ for a senior design project. I am new to Arduino, and my background is EE...I am not the best with programming.

If anyone has been able to use this code or another library to get HF PWM please let me know! Any help is appreciated.

Thanks!

Is there any library like Tinywebserver compatible with the DUE I have a project rumming on Mega 2560 and want to move to DUE

Thanks

Hi folks,
I am encountering a problem compiling the TimeSerial example from the Time.h lib.
First I was getting all kind of interesting error mesages in my own project. In order to trace it down, after some fiddling - I now try to just compile the TimeSerial example. It first gives an error message on line 79 "Serial.print ( TIME_REQUEST, BYTE)" this is fixed by modifying it to "Serial.write".

Now I´m getting the following error message:

Arduino: 1.5.6-r2 (Windows 8), Board: "Arduino Due (Programming Port)"

Build options changed, rebuilding all

In file included from c:\program files (x86)\arduino\hardware\tools\g++_arm_none_eabi\bin../lib/gcc/arm-none-eabi/4.4.1/../../../../arm-none-eabi/include/stdio.h:46,
from C:\Program Files (x86)\Arduino\hardware\arduino\sam\cores\arduino/Print.h:24,
from C:\Program Files (x86)\Arduino\hardware\arduino\sam\cores\arduino/Stream.h:26,
from C:\Program Files (x86)\Arduino\hardware\arduino\sam\cores\arduino/HardwareSerial.h:24,
from C:\Program Files (x86)\Arduino\hardware\arduino\sam\cores\arduino/Arduino.h:183,
from TimeSerial.pde:18:
c:\program files (x86)\arduino\hardware\tools\g++_arm_none_eabi\bin../lib/gcc/arm-none-eabi/4.4.1/../../../../arm-none-eabi/include/sys/types.h:109: error: conflicting declaration 'typedef long int time_t'
C:\cop\Documents\Arduino\libraries\Time/Time.h:15: error: 'time_t' has a previous declaration as 'typedef long unsigned int time_t'

Dieser Report hätte mehr Informationen mit
"Ausführliche Ausgabe während der Kompilierung"
aktiviert in Datei > Einstellungen[/font][/color]

I do have installed the Time.h lib (original dating22.07.2011, as well as a more recent version from prjc.com dated 27.03.2012) in the libraries directory, imported the lib in the IDE, restarted the IDE to no effect.
Further obseration: A `normal´ #include <xyz.h> will change the color of the .h file in the IDE automatically, in case of Time.h there is no change.

I´m stuck - can you help?

regards Matthias