For my IoT project I needed to write code slightly differently for specific Arduino boards. E.g. for Arduino UNO I wanted to use Serial to talk to ESP8266 and for Arduino Mega wanted to use Serial1. So basically I wanted to use Board specific #defines
#ifdef MEGA #define SERIAL Serial1 #elif UNO #define SERIAL Serial #endif SERIAL.println("Something")
For that I needed to get board specific #defines for each of the board options in the Arduino IDE, so that as I change the board type in the IDE, I automatically build code for that specific board.
That information is actually available in a file called board.txt inside your arduino install folder. For me it is G:\arduino-1.6.5\arduino-1.6.5-r5\hardware\arduino\avr\boards.txt. For each board there is a section inside that file and the relevant entries look something as follows
############################################################## uno.name=Arduino/Genuino Uno uno.vid.0=0x2341 uno.pid.0=0x0043 uno.vid.1=0x2341 uno.pid.1=0x0001 ... uno.build.board=AVR_UNO uno.build.core=arduino uno.build.variant=standard
The .board entry when prefixed by ARDUINO_ becomes the #define. I wrote a quick PowerShell routine to get all such entires. The code for it is in GitHub at https://github.com/bonggeek/Samples/blob/master/Arduino/ListBoard.ps1
$f = Get-ChildItem -Path $args[0] -Filter "boards.txt" -Recurse foreach($file in $f) { Write-Host "For file" $file.FullName foreach ($l in get-content $file.FullName) { if($l.Contains(".name")) { $b = $l.Split('=')[1]; } if($l.Contains(".board")) { $s = [string]::Format("{0,-40}ARDUINO_{1}", $b, ($l.Split('=')[1])); Write-Host $s } } }
Given the argument of root folder or Arduino install, you get the following.
PS C:\Users\abhinaba> D:\SkyDrive\bin\ListBoard.ps1 G:\arduino-1.6.5\ For file G:\arduino-1.6.5\arduino-1.6.5-r5\hardware\arduino\avr\boards.txt Arduino Yún ARDUINO_AVR_YUN Arduino/Genuino Uno ARDUINO_AVR_UNO Arduino Duemilanove or Diecimila ARDUINO_AVR_DUEMILANOVE Arduino Nano ARDUINO_AVR_NANO Arduino/Genuino Mega or Mega 2560 ARDUINO_AVR_MEGA2560 Arduino Mega ADK ARDUINO_AVR_ADK Arduino Leonardo ARDUINO_AVR_LEONARDO Arduino/Genuino Micro ARDUINO_AVR_MICRO Arduino Esplora ARDUINO_AVR_ESPLORA Arduino Mini ARDUINO_AVR_MINI Arduino Ethernet ARDUINO_AVR_ETHERNET Arduino Fio ARDUINO_AVR_FIO Arduino BT ARDUINO_AVR_BT LilyPad Arduino USB ARDUINO_AVR_LILYPAD_USB LilyPad Arduino ARDUINO_AVR_LILYPAD Arduino Pro or Pro Mini ARDUINO_AVR_PRO Arduino NG or older ARDUINO_AVR_NG Arduino Robot Control ARDUINO_AVR_ROBOT_CONTROL Arduino Robot Motor ARDUINO_AVR_ROBOT_MOTOR Arduino Gemma ARDUINO_AVR_GEMMA
So now I can use
#ifdef ARDUINO_AVR_MEGA2560 // Serial 1: 19 (RX) 18 (TX); #define SERIAL Serial1 #elif ARDUINO_AVR_NANO #define SERIAL Serial #endif // ARDUINO_MEGA
No comments:
Post a Comment