118 lines
5.2 KiB
Markdown
118 lines
5.2 KiB
Markdown
### BACnet MS/TP on Arduino Uno R3 Platform - Atmega328p
|
|
|
|
The Arduino Uno R3 platform for this example uses the following peripherals:
|
|
|
|
1) USB bootloader using AVR-119 protocol
|
|
|
|
2) Arduino Uno V3 I/O to BACnet Objects map - see below
|
|
|
|
3) 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.
|