This reverts commit 3ea710f92f.
BACnet MS/TP on Arduino Uno R3 Platform - Atmega328p
The Arduino Uno R3 platform for this example uses the following peripherals:
-
USB bootloader using AVR-119 protocol
-
Arduino Uno V3 I/O to BACnet Objects map - see below
-
Arduino Uno V3 compatible RS485 shield (DFR0259)
Arduino Uno V3 Pin Mapping
| ATmega328p | Arduino | RS485 DFR0259 | BACnet Object |
|---|---|---|---|
| NC | NC | ||
| +5V | IOREF | ||
| RESET | RESET | RST BUTTON | |
| +3V3 | +3V3 | ||
| +5V | +5V | +5V | |
| GND | GND | GND | |
| GND | GND | GND | |
| VIN | VIN | ||
| ADC0/PC0 | A0 | AV-0 Millivolts | |
| ADC1/PC1 | A1 | AV-1 Millivolts | |
| ADC2/PC2 | A2 | AV-2 Millivolts | |
| ADC3/PC3 | A3 | AV-3 Millivolts | |
| ADC4/PC4 | A4* | ||
| ADC5/PC5 | A5* | ||
| ADC5/PC5 | SCL* | I2C | |
| ADC4/PC4 | SDA* | I2C | |
| AVDD | AREF | ||
| GND | GND | ||
| SCK/PB5 | D13 | LED-L ANODE (+) | BV-99 (output) |
| MISO/PB4 | D12 | BV-9 (output) | |
| MOSI/PB3 | D11 | BV-8 (output) | |
| SS/PB2 | D10 | BV-7 (output) | |
| OC1/PB1 | D9 | BV-6 (output) | |
| ICP/PB0 | D8 | BV-5 (output) | |
| AIN1/PD7 | D7 | BV-4 (input) | |
| AIN0/PD6 | D6 | BV-3 (input) | |
| T1/PD5 | D5 | BV-2 (input) | |
| T0/PD4 | D4 | BV-1 (input) | |
| INT1/PD3 | D3 | BV-0 (input) | |
| INT0/PD2 | D2 | CE DE /RE RTS | RS485 |
| TXD/PD1 | D1/Tx** | TXD | RS485 |
| RXD/PD0 | D0/Rx** | RXD | RS485 |
* ADC4/PC4: A4 and SDA are shared I/O
* ADC5/PC5: A5 and SCL are shared I/O
** shared with Uno R3 USB Tx/Rx. DFR0259 switch ON to disable.
Building this Project
GNU Makefile
There is a GNU Makefile that uses avr-gcc and avr-libc to build the project. avrdude can be used to program the Arduino Uno R3 board via USB.
The GNU Makefile is used in the continuous integration pipeline to validate the build is not broken. The Makefile is called from an Ubuntu image container after installing the necessary tools:
sudo apt-get update -qq
sudo apt-get install -qq build-essential
sudo apt-get install -qq gcc-avr avr-libc binutils-avr avrdude
To add the build and debug tools to MinGW64 environment:
pacman --noconfirm -S mingw-w64-x86_64-gcc-avr
pacman --noconfirm -S mingw-w64-x86_64-avr-libc
pacman --noconfirm -S mingw-w64-x86_64-binutils-avr
pacman --noconfirm -S mingw-w64-x86_64-avrdude
The build sequence is usually:
make clean all
The Makefile includes a recipe to use avrdude to program the Uno R3 via USB
make install
Board diagnostics and configuration
| BACnet Object | Description | Default | R/W |
|---|---|---|---|
| AV-92 | Device ID | 260123 | R/W |
| AV-93 | MS/TP bitrate | 38400 bps | R/W |
| AV-94 | MS/TP MAC | 123 | R/W |
| AV-95 | MS/TP Max Manager | 127 | R/W |
| AV-96 | MCU Frequency | F_CPU | R |
| AV-97 | CStack Size | 0 | R |
| AV-98 | CStack Unused | 0 | R |
| AV-99 | Uptime | 0 | R |
Shield option
The DFR0259 shield for RS485 was used, but any RS485 circuit could be attached to the Arduino Uno R3 using the same pins for Tx, Rx, CE RE/DE RTS.
The MS/TP MAC address, bitrate, and max-manager are stored in EEPROM.
BACnet Capabilities
The BACnet Capabilities include WhoIs, I-Am, ReadProperty, and WriteProperty support. The BACnet objects include a Device object, 10 Binary Value objects, and 10 Analog Value objects. An GPIO output is controlled by Binary Value object instance 0. All required object properties can be retrieved using ReadProperty. The Present_Value property of the Analog Value and Binary Value objects can be written using WriteProperty. The Object_Identifier, Object_Name, Max_Info_Frames, Max_Master, and baud rate (property 9600) of the Device object can be written using WriteProperty.