How to make wireless low power Arduino
27. června 2016Lang: cs
How to make wireless Arduino with extra low power.
Warduxere is a programmable device for wireless communication with a small bitrate, extra low power consumption and an option of battery power source. It is a foundation designed to be used in development of wireless projects.
Specifications
- Power: DC 3,4-6V
- frequency of wireless communication: 433MHz
- Range: up to 900 m
- Consumption: run mode 5 mA; Broadcasting 10 mA; sleep 10uA
- the dimensions: 25 x 25 mm
- Communication Interface: serial line, 3.3V
- Development is possible on any OS and on non-x86 PC as well
3D models of devices:
Motivation
Nowadays modern devices include wireless peripherals and wireless connection is gradually becoming a common thing.
These devices always consist of a microprocessor and a wireless part.
I've already used commercial solutions for these purposes, but I was not satisfied and even on the internet I haven't found an adequate which would meet all of my requirements. That's why I decided to create a platform that can be reused in the implementation of different wireless projects.
Criteria for the device:
- The compiler must be: free, multiplatform, without conditions, supported by the manufacturer of the processor.
- Cross platform development tools (IDE).
- Standardized hardware and software for programming.
- Easy to develop - higher programming language, the availability of libraries and plug-in devices.
- Open solution.
- A small device.
- Energy efficient equipment that will last long on battery power.
- Precise measurement of battery.
- Wireless communication.
- The ability to connect various peripherals.
- Standard work with memory = DMA .
- Large number of basic components and large user community.
Hardware choice
There is a very famous and successful Arduino Project . Arduino is based on 8bit processors by Atmel company, which is actively involved in development of the opensource tools for developers, for example the GNU GCC compiler for AVR. These development tools run on all operating systems of various computer architectures. For Arduino there is developed Arduino IDE, which is multiplatform. There is even no need of a special hardware or a special software programeer or a special driver for programming. The entire device can be started and used immediately without any installation. Arduino uses Wiring language as its main programming language, which is similar to the C++. There is still need to know the coding but thanks to Wiring it is possible to learn it easily with Arduino. (You can find more detailed information on Arduino in PE / AR 2009/1).
Therefore I have decided to use Arduino as a base and thus AVR microcontrollers from Atmel.
Originally I thought I will use existing prototype components,
but it turned out that I have to develop my own device.
Because for example Arduino Pro Mini version contains a power diode and a wasteful
stabilizer, that together create large and totally unnecessary power
consumption, and therefore it is unsitable in case of long-term battery power supply.
I have created a device with an AVR processor,
which is energy efficient and also contains several other components.
At the same time the device is compatible with Arduino.
And because the most important part is the Wireless part , I named the device Warduxere.
Because of compatibility with Arduino it can use already existing and proven development tools:
Arduino IDE, libraries etc. It is also possible to connect many other devices, that already have their API libraries.
Processor
The device is controlled by a microprocessor Atmega 328P in the TQFP package. In
the microprocessor there is loaded a bootloader, which is used for comfortable loading of the program using a serial line. For PC connection it is best to use USB-UART converter, which supplies power to the Warduxere as well. I use a converter with the FTDI 232RL chip or the CP2102 chip.
You can also connect the device to the computer's parallel port, but you have to provide the power supply and use a voltage convertor, for example in connection with the MAX232 chip (already described in
Article in PE / AR 2010/12).
After connecting Warduxere to the USB converter no other electronics is needed and you can connect Warduxere to the PC and use it along with Arduino IDE.
You can see the connection on the picture below, it is necessary to connect RX to TX correctly.
For computers such as
Raspberry PI and
Banana PI you can connect Warduxere directly without any additional electronics, because these computers have hardware serial lines using the 3.3V voltage levels.
For uploading the program to the processor there is the "upload" button in the development environment. At first IDE resets the processor using the DTR (RTS) outlet. After a reset the boot loader is started and waits a while for the loading of the program.
Wireless
On the market it's possible to purchase different wireless chips, usually even as prepared modules.
Some of them communicate in one direction only, some can also use Wifi, ZigBee or other standards.
They differ in their frequency and interface through which they can be connected to a microprocessor.
I chose SI4432 chip. This chip can both transmit and receive.
With the processor it communicates via SPI bus and works on frequencies 240-930 MHz, has a great reach and an output power + 20 dBm .
It also has a low supply voltage 1.8 to 3.6 V and a low power consumption .
I have bought already prepared small DRF4432F20 module which contains the SI4432 chip and is ready to work at a frequency of 433MHz.
For Arduino there are libraries for working with this chip, namely
the library Radiohead RF22.
Parameters of the wireless module DRF4432F20 with SI4432 chip:
- Supply voltage: 1.8 ~ 3.6V
- Working frequency: 433MHz or 868MHz
- Modulation: FSK / GFSK / OOK
- SPI interface
- Sensitivity: -121dBm
- Output power: + 20dBm
- Data transfer rate: -0.123 ~ 256 kbps
- Digital RSSI
- Wake-up Timer
- 64 bytes of TX / RX FIFOs
- Integrated voltage regulator
- Frequency Hopping
- Temperature Sensor and 8-bit ADC
- Operating temperature: -20 ° C ~ + 60 ° C
- consumption during standby: ≤ 1uA
Pins of the wireless module are connected to inputs of the CPU 6->16, 7->15, 8->17, 9->14, 10->32. The module is powered by a stabilized voltage of 3.3V. Pins 11 and 12 of the wireless module are connected to the ground. Pin 5 is connected to 3.3V.
The layout of the pins of the DRF4432F20 module, see figure:
Wireless module is supplied including antenna, which is connected to the pin no. 13.
Construction
Everything is chosen with regard to the size and especially to the energy efficiency. Therefore the processor and the entire device operates at 3.3 volts and clock frequency of the processor is set to 8MHz.
It uses an internal oscillator, which saves space on the PCB and the structure is simpler.
It is expected to use one LiPo cell as a power source.
These batteries have a suitable voltage, large capacity and small size.
Also contrary to NiMH batteries they do not suffer from self-discharging, which is important in the long term use. After charging the voltage on LiPo battery reaches 4.2V (according to battery type and settings of charging program).
When discharging these batteries still maintain a sufficient operating voltage which should not drop below 3.3V. When it drops to 3.6V it is appropriate to re-charge the battery.
Therefore, these parameters make LiPo batteries a suitable candidate as an energy source.
To reduce the power consumption the Warduxere has no power diode.
The device includes voltage stabilizer MCP1700 , which has a small power consumption. The choice of a stabilizer defines the input voltage, which can be 6V maximally.
Specifically, it is the stabilizer MCP1700T-3302 / TT.
These are its values according to the documentation:
- typical quiescent current of 1.6 uA
- maximum output current of 250 mA
- drop 178mV at 250 mA
The device includes operational amplifier MCP6042, which has according to the documentation quiescent current of 600 nA . If the energy efficiency is not a crucial thing, you can replace the operational amplifier by a cheaper and more affordable type, for example MCP6002 or MCP6L02.
For low consumption you have to chose large resistors (R5, R6) at the divider for the battery measurement, for example of a value 1M Ohm.
Printed circuit board
PCB is designed to be fitted even at home without any problem. Therefore the used components are in large SMD 1206 packages, which are located in such way that they can be soldered easily. It is a double-sided printed circuit board with plated holes. On a well-made board with a non-solder mask you can easily solder even a processor in a TQFP package. The wireless module has to be soldered as the last one, the order of soldering of other components does not matter.
Assembling and starting
Starting of the device consists of following steps:
- Soldering of the CPU and other components besides the wireless module
- Burning the loader
- Test by the blinking program
- Soldering of the wireless module
- Testing of the wireless module
When mounting the components, start with soldering the processor (IC2), which you will fit into place precisely and with the correct orientation using the tweezer, and first of all solder two pins in opposite corners. After checking that the position is precise solder the remaining pins of the processor. Then solder the U1 stabilizer. Then you easily solder all remaining components on this side of the PCB. Just be sure to properly orient the LED. On the other side start by soldering of the operational amplifier (OP1). Mind the correct orientation and proceed as with the processor. Then solder the remaining components on this side of the board.
Boot loader
The easiest way is to solder the processor with already pre-programmed bootloader, but it is also possible to program the processor even after it is soldered to the board as there are pins on the board prepared for this.
To upload the boot loader you need a hardware and a software programmer. For example you can use the parallel port of the computer and pony-STK200 software and Avrdude . Everyone will probably use the programming resources he is already familiar with.
As a programmer you can use Arduino itself. You load
ArduinoISP software
into Arduino and after connecting both devices together you run the burning of the boot loader directly from the Arduino IDE.
Outlets of the programmer have to be connected to the pads within K1. CPU pins are in order from left: 15 MOSI, 16 MISO,
17 SCK. These pins have to be connected to the programmer. In case of Arduino ISP they are D11 (MOSI), D12 (MISO), D13 (SCK).
Then you have to connect the power (until stabilizer is not soldered yet you can use a pad at R4 resistor) and GND.
The last one is the processor reset, which can be connected for example to pad of C3 capacitor.
As a reset in Arduino ISP is used pin D10.
Now you can burn the bootloader.
The loader is standard bootloader for Arduino. The processor is set to 8MHz with
internal oscillation.
Before burning the bootloader you have to select the right type of device in the Arduino IDE , that defines its parameters.
Simply add following text into arduino/hardware/arduino/boards.txt file:
atmega328Wb.name=Warduxere by www.xeres.cz atmega328Wb.upload.protocol=stk500 atmega328Wb.upload.maximum_size=30720 atmega328Wb.upload.speed=57600 atmega328Wb.bootloader.low_fuses=0xE2 atmega328Wb.bootloader.high_fuses=0xDA atmega328Wb.bootloader.extended_fuses=0x05 atmega328Wb.bootloader.path=atmega atmega328Wb.bootloader.file=warduxere.hex atmega328Wb.bootloader.unlock_bits=0x3F atmega328Wb.bootloader.lock_bits=0x0F atmega328Wb.build.mcu=atmega328p atmega328Wb.build.f_cpu=8000000L atmega328Wb.build.core=arduino atmega328Wb.build.variant=standard
These values define all device's configuration for uploading the bootloader, the processor settings (lock bits), compilation of the program and the speed of uploading. The file
warduxere.hex
with the bootloader including a blinking LED software is available for download on the website of the magazine PE / AR.
After connecting USB-UART converter to the pins of the P1 connector you can upload programs to the processor and test the basic functionality by LED blinking. Outlets are in following order: GND, NONE, VCC, TX, RX, DTR. Remember that it is necessary to connect the CPU's RX to convertor's TX and vice versa.
At last solder the wireless module. Just to be sure attach a strip of insulating tape to the bottom of the wireless module. Solder it so that it touches the processor, this will considerably reduce eventual mechanical stress in joints. Then verify the functionality by uploading a sample program. If for example the module is wrongly soldered, the sample program will send message through the serail line about the problem with its initialization.
Now you have the device ready and you can start to create simple but also wide wireless sensor networks ...
Power consumption
I have roughly measured the wireless module's consumption at voltage of 3.3 V, values were following: 9 mA when broadcasting; 1.4 mA when idle, according to documentation 1uA when sleep. Processor at 5V when sleep draws 0.16 mA , after turning off the ADC it draws approximately 1-2 uA. After optimization to minimize the power consumption and when connecting only the processor and the wireless module I have measured the consumption of 3.4 mA at idle state and during sleep of processor and wireless module I have measured 5uA . Approximately when neglecting other effects Warduxere could work several years when powered from a single LiPo cell, such as those in phones. In real use however it mostly depends on the particular application and this determines real endurance on battery power. Further thing are the connected peripherals that have to be asleep or power efficient.
For fully fitted Warduxere in sleep state I have measured consumption of less than 10uA .
Application
To work with the device just download from internet
Arduino IDE,
which contains everything you need. Just unzip the downloaded archive, there is no need to install anything.
Besides all the necessary components Arduino IDE contains numerous examples for Arduino itself and for the common expansion boards (shields).
Warduxere is fitted resistor and solder pads for one-wire bus, resistive divider for battery measuring, resistor and solder pads for analog sensor (eg. photoresistor).
I brought out other pins of the processor to the solder pads, so that it is possible to connect to the processor other devices and peripherals, such as
various types of LCD displays, Ethernet, GSM modules.
Specific use will depend mainly on the ideas of each designer. Further I am going to describe the properties that distinguish Warduxere from Arduino.
Before using the libraries mentioned in the following paragraphs you have to unzip them to the arduino/libraries/
folder.
LED
The functionality of the device can be simply tested by LED's blinking. Usually diode is on
CPU 17 pin (on Arduino it is custom to label it D13), but there is connected the
wireless module. Therefore, in Warduxere LED is connected to pin 32 (Arduino D2). See sample program Blink
.
Wireless
The configuration options of the wireless communications are extensive.
Most importantly, the communication is packet-oriented with a buffer of 64 bytes.
The speed of communication can be 0.123 up to 256 kbps, the modulation: FSK, GFSK and OOK.
It is possible to operated even extensive MESH networks.
For example I will mention only the most basic type of communication, with which you can verify the functionality of the device. See sample programs Wireless-client
and Wireless-server
.
Other practical examples of using the SI4432 chip with Radiohead RF22 library will reader find in the
documentation on the Internet.
Low power modes
The processor can do several power-saving modes.
The most power saving mode od the CPU is sleep, to save even more it is needed to put in sleep individual parts of the processor as well, such as A/D converter and Brown-out Detector (BOD).
Often it is enough to leave only the watchdog running, which will generate interruption to wake up.
It is also needed to pur the peripherals to sleep as well, in this case it is only the wireless module which can sleep on demand. When suspending the system it is therefore needed to put to sleep the processor itself and the wireless part. For simple suspend program see program Sleep
.
Who does not want to deal with suspend settings himself can use the library
Low-Power.
Battery
The battery state is detected by measuring voltage 1:1 at divider using the analog converter of the CPU. Using this connection the actual voltage on battery is measured.
It is thus possible to connect for example three NiMH cells or single LiPo cell or even other types of batteries
and by adjusting the software you can easily achieve the specific needs for monitoring the battery state.
In other solutions, where the battery voltage is measured behind the 3V stabilizer, there was a problem especially when using LiPo batteries.
For accurate measurement of the battery is also required to have precise divider .
Basic series of the resistors have a tolerance of +-5%, but these less accurate resistors can cause a considerable error in measurement. In worst case up to +-10% which at 4V battery means 0.4V and that is really a lot. This is inacceptable when measuring the state of LiPo batteries. Therefore it is necessary to use precise resistors with a tolerance of +-0.1%, eventually +-0.5%.
But there is no need to buy expensive precise resistors right away. For the production of several devices it is sufficient to measure resistors and create pairs with those of the equal value.
Battery voltage measurement is in sample program Battery
.
You can easily try all the examples if you have Arduino Pro Mini 3.3V 8MHz or microprocessor Atmega 328P and you will connect them to the Wireless module DRF4432F20 or other with SI4432 chip. You can try everything with just a few components after wiring according to the diagram.
Notes
Information about using the Arduino IDE applies to version 1.0.6.
DPS is designed in the KiCad software.
List of components:
C1, C2, C3 | 100n |
4 | 10u |
D1 | LED |
IC2 | ATmega328P-AU |
OP1 | MCP6042 (MCP6002, MCP6L02) |
R1 | 330R |
R3 | 4k7 |
R2, R4 | 10k |
R5, R6 | 1M - + 0.5% |
U1 | MCP1700T-3302 / TT |
WIRELESS1 | DRF4432F20 - SI4432 |
Conclusion
I have achieved all the set out points, including small size and long operating time on battery power.
Thanks to building on an open-source solutions the development was even smoother and faster than my optimistic imagination. Even after achieving the defined goal there are still other possibilities of how to improve the device. It could me optimized in various ways. For example reduce the size even more and ideally produce it in one piece with processor and wireless chip mounted on one PCB. Or to bring out the CPU's pins to the rail.
I am releasing the connection diagram created in KiCad and sample programs under
the Creative Commons Attribution ShareAlike 3.0 licence .
I have several remaining PCBs available should you be interested and I can offer you other services as well.
List of attachments
- warduxere.hex - Bootloader
- boards.txt - configuration for Arduino IDE
- Low-Power.zip
- RadioHead-1.37.zip
- Blink program
- Programs Wireless-client a Wireless-server
- Programs Sleep
- Battery program
- PNG images of PCB and setting
Author
Author of the article and the device:
SW&HW developer Bc. Josef Jebavý
You can contact author
First implementation of the device.
Side with the operational amplifier:
Side with the processor:
The finished device after soldering the wireless module:
Články na podobné téma
Programovací jazyk Go
Analýza zadání a nacenění vývoje softwarového projektu
Python program na ovládání Dockeru pomocí API
Jak použít aplikaci MailCatcher pro testování emailů
Návod: Python OpenAI API
Vytvoření WebSocket webové aplikace a nastavení proxy
Řízení projektů: Agilní vývoj softwaru
Jak provozovat staré PHP aplikace
Co by měl umět dobrý programátor
Programovací jazyk Rust
NodeJS: vývoj, konfigurace serveru
Nette security bug CVE-2020-15227
Jak porovnat dvě stejné databáze?
REST API: API platform
Vlastní web a mail hosting se softwarem ISP Config
Programovní v SQL: PostgreSQL, MySQL/MariaDB
HTTPS: zabezpečený web
NoSQL databáze Mongo DB
Připojení k Microsoft SQL Serveru z Linuxu
Co je pracovní náplň programátora
Lokalizace aplikací v jazyce Python
Jaký mail a web hosting vybrat
Digispark - Programujte mikrokontrolér Atmel ATtiny pomocí Arduino IDE
Program Roulette
Vývoj pro procesory ARM s Arduino IDE
Wireless low power Arduino
Pyradio - Python program for receive Internet radio with text user inteface
UPS monitor pro Android
Bezdrátový bateriově napájený WiFi teploměr
Jak programovat WiFi procesor ESP8266
Comparison IQRF vs Wireless Arduino
Jakou platformu zvolit pro eshop? Například Prestashop
Development kits and gateways for wireless platform IQRF
OpenStreetMap a GPS trasy v mapě na webu
Quickplay
Java program pro přehledné monitorování záložních zdrojů
Čipové kontaktní a bezkontaktní karty Java Card OpenPlatform
Otevřený chytrý telefon s Linuxem - Openmoko Neo FreeRunner
Vývoj pro bezdrátové moduly s procesorem PIC pod GNU/Linux - IQRF
Grafický program pro embeded/mobilní zařízení na vyhledávání dopravního spoje.
O programování a ruzné programy v jazyce Java, Python a dalších
Java program a applet Kalkulačka
Java program na výpočet kvadratické rovnice
Odběr novinek
Pokud máte zájem dostávat příležitostně na email novinky.
Můžete se vyplněním emailu registrovat k
odběru novinek.
+