I’m messing about with Zigbee for a comms protocol to various temperature sensors, and this requires a Zigbee Coordinator. There’s a few ways of doing this, but ultimately I settled on a zigbee2mqtt bridge and a cheapie AliExpress CC2530+CC2591 module.
This module incorporates an RF amplifier, but does not have the normal debug header that the CC2530 Zigbee transceivers have and also lacks the USB-TTL adapter chip. Not a problem if you’re using a RPi as the bridge, which is what I plan on doing.
However first, you need to get Z-Stack firmware on it, so you can use it as a coordinator. This proves to be… non-trivial. Especially if you want to use a Wemos D1 Mini as the flashing device (these Wemos things are really good, incidentally).
First Steps - Getting CClib-Proxy onto the Wemos
Assuming you have a Wemos D1 mini, your first steps are to install the Arduino IDE (available from the Windows Store). Once that’s in, in Preferences, add the following URL to the Additional Boards Manager URL field;
From there, you should now be able to go to the Boards Manager, and install the esp8266 package. Once that is installed, configure your board as a “LOLIN(WEMOS) D1 R2 & Mini” and select the correct COM port.
Now it’s as simple as downloading CCLib-Proxy from this link. Open up CCLib_Proxy.ino, then change the following lines for the pinout;
int CC_RST = 5;
int CC_DC = 4;
int CC_DD_I = 14;
int CC_DD_O = 12;
These mappings are required. Upload to your device. You now have CClib-Proxy onto the Wemos and ready to go.
Wiring up the Wemos to the CC2530+CC2591 Module
You will need to map various pins on the Wemos to pins on the module, using the following chart;
|PIN PURPOSE||NUMBER ON CC2591||NUMBER ON WEMOS|
|DC (Debug Clock)||P2_2||D2 (GPIO4)|
|DD (Debug Data)||P2_1||
|RST (Reset)||RST||D1 (GPIO5)|
|RXD (Receive Data)||P0_2||RPI Pin 8 (TXD)|
|TXD (Transmit Data)||P0_3||RPI Pin 10 (RXD)|
|CTS (Clear To Send)||P0_5||RPI Pin 11 (RTS)|
|RTS ( Ready To Send)||P0_4||RPI Pin 36 (CTS)|
When using a Wemos as the flashing device, it’s safe to tie the two I/O pins together (D5 and D6) and connect them to the DD pin on the CC2530. It works fine. The P0_2 through P0_5 pins are used when you’re using the finished device, not when flashing (so you don’t need to connect them up).
<figcaption>Pinout for CC2530+CC2591 module
The above diagram shows the pin mappings on the CC2530+CC2591 module itself. Follow those numbers and the pins above to wire it up.
<figcaption>Pinout of Debug Header on CC2530 (not present on combined module)</figcaption></figure>
This diagram shows the pinout of the debug header (which is not present on the CC2591). However, it does show which pins on the CC2591 marry up to what purposes on the debug header (which correspond to pins on the Wemos).
After this is done, you need to use CClib to flash the firmware.
Flashing the Z-Stack Firmware
pip install pyserial==3.0.1
Edit the firmware .hex you downloaded, and remove the second to last line (it won’t work with the flasher you’re using). Once that is done, connect your Wemos to your computer, and then from the Python directory in your CClib download, run;
python cc_info.py -p COM9
Assuming that COM9 is your Wemos. You should see output giving you data on the CC2530. If so, fantastic. Now flash it;
python cc_write_flash.py -e -p COM9 --in=YOURFIRMWAREHERE.hex
This will take an extremely long time. Several hours. But you should see progress fairly quickly. Just hang tight. Once that’s done, you have a coordinator!
Next post will deal with testing the coordinator out.
References and Links
- Wemos D1 Mini with Arduino IDE Guide
- Wemos D1 Mini Pinout and GPIO Chart
- zigbee2mqtt flashing documentation
- Z-Stack Firmware for CC2530+CC2591 (Standard)
- Flow Control discussion about CC2530 (Forum Post)
- Z-Stack Firmware with RTCCTS disabled (for my module)
- Pinout for CC2530+CC2591 Module
- TTL Pins for Module (Forum Post)
- Debugger Port Mappings
- Pinouts and Assignments (Forum Post)
- CCLib Wiring Diagram (for Arduino)
- CCLib-Proxy fork for Arduino