HC-06 (ZG-B23090W) Bluetooth 2.0 EDR modules

HC-06 - ZG 1643 - B23090W_001_800The HC-06 (ZG-B23090W) uses a regular smd Bluetooth module based on the csr BC417 chip with a MX 29LV800CBXBI-70G flash memory chip. The firmware is well documented and a Google search for “HC-06 linvor V1.8″ should get you more than a few hits.

I have received a few comments about HC-06 and HC-05 modules that use a new breakout board (new to me at least). When I received the first comment I hadn’t seen these modules, by the time I had received the 4th or 5th comment the modules were all over Taobao so I decided to order a few (2 x HC-06 and 2 x HC05). I have no real use for these except to see if they are different to previous versions.

The HC-06 is a Bluetooth 2.0/2.1 EDR device that has a serial UART layer on top of the Bluetooth. The UART layer makes them extremely easy to use but hides the Bluetooth functions from the user. This is good if all you want is to make 2 things talk to each other.

The HC-06 has 2 modes of operation; AT mode and transmission mode. When the modules are first powered on they go in to AT mode. Here AT commands can be entered via the wired serial connection. After a connection has been made the modules go in to transmission mode. Here everything the modules receives via the wired serial connection is sent to the connected device. At commands cannot be entered again until the connection is broken.

HC-06s are slave only modules and require a master device to make a connection. Slave devices cannot initiate a connection which means you cannot link 2 HC-06s together. The master module is the HC-05 which can be either slave or master. Since the price for the HC-05 and the HC-06 is basically the same I would suggest buying HC-05s and not HC-06s.

HC-06 (ZG-B23090W): Basic Specs

Slave only module
Bluetooth 2.0 EDR
Based on the csr BC417 chip
Firmware is linvor V1.8 which is (I think) created by Wavesen and getting a little old.
Default baud rate for serial UART is 9600
AT commands need to be uppercase without line endings.

Hard to know if these are copies or not (I suspect they are). Wavesen are the manufactures of the original HC series of Bluetooth modules and their modules now feature the HC logo screen printed on the Bluetooth SMD board (the small daughter board) and a blue LED at the top right. Since these modules do not have the logo nor the blue LED I presume they are copies. But, the photos in the data sheet feature modules without the logo. Bare in mind the data sheets are from 2010 and 2011.

The datasheet available from the Taobao sellers is the Wavesen Chinese data sheet. You can download it at the bottom of the page. Note that the data sheet looks to be version 2.0 but the firmware is 1.8. All the commands in the data sheet work though. I have included an older English data sheet for the same firmware in the downloads section below.
The HC logo


HC-06 (ZG-B23090W): First try

The first thing with any new Bluetooth module is to power them up and see if they work and what name they transmit. Both modules seem to work fine and they transmit “HC-06″. So no surprises there. The modules pair with the PIN “1234”. Again this is standard.
HC-06 - ZG 1643 - B23090W_002_Pairing_720
When powered on the LED flashes about 10 times a second. When there is an active connection the LED is solid on.


HC-06 (ZG-B23090W): AT Commands

The HC-06 starts in AT command mode on power on and expects commands to be uppercase without line endings (so no \r\n characters).
The HC-06 does not have many commands, apart from setting the baud rate and renaming it, there isn’t a lot you can do.

Command Comment
AT Communications test
Returns “OK”
AT+VERSION Check the firmware version ID
Returns “linvorV1.8″
AT+BAUDx Set the baud rate used for serial UART communication
x = single digit hex value number from 1 to C:
4———9600 (Default´╝ë
Replies with OKxxxx where xxxx is the new baud rate. For example “AT+BAUD4″ replies with “OK9600″
Take care. Most PCs cannot use a baud rate above 115200.
AT+NAMEnewname Change the name of the module
Replies with “OKsetname”
The maximum length is 20 characters. You may need to reset the module before the new name is broadcast.
AT+PINxxxx Change the PIN. The new PIN must be 4 numeric characters
AT+PN Set the parity to None
AT+PE Set the parity to Even
AT+PO Set the parity to Odd

The baud rate and PIN cannot be interrogated so take care when setting. Although the PIN can be reset using AT commands you need to know the baud rate to use AT commands. Most PCs cannot use a baud rate above 115200 and there is not way to hardware reset these modules.


HC-06 (ZG-B23090W): Communication and AT commands

Next up is to see if we can talk to them using AT commands. I normally use the Arduino serial monitor. There are a few ways to connect serial Bluetooth modules to a PC. The main two are; via a serial UART adapter, or, by using an Arduino and a serial-in serial-out sketch.


HC-06 (ZG-B23090W): Serial UART adapter

If you have one, using a serial UART to usb adapter is probably the easiest way to get the HC-06 connected to a computer. Take care with the HC-06 RX pin as this is 3.3v not 5v. The adapter I am using has a jumper to select 5V or 3.3v so the level conversion is taken care of (it’s in the 3.3v position). If you are using a 5V only adapter you will need to convert the adapters 5v TX pin to 3.3v with something like a voltage divider (see below).

HC-06 - ZG 1643 - B23090W_010_SerialAdapter_800

After you are connected, the Windows PC will allocate a COM port to the adpater, select this port in the Arduino IDE or your preferred terminal program.


HC-06 (ZG-B23090W): Arduino and a serial-in serial-out sketch

If you do not have a serial UART adapter you can make your own using an Arduino and a simple serial in – serial out sketch.

HC-06 - ZG 1643 - B23090W_013_Serial_Breadboard_1200

HC-06 - ZG 1643 - B23090W_014_Circuit_1200

The Arduiono Sketch:

//  veryBasic_SerialInSerialOut_001
//  Uses hardware serial to talk to the host computer and Software Serial for communication with the bluetooth module
//  What ever is entered in the serial monitor is sent to the connected device
//  Anything received from the connected device is copied to the serial monitor
//  Pins
//  BT VCC to Arduino 5V out. 
//  BT GND to GND
//  Arduino D8 (SS RX) - BT TX no need voltage divider 
//  Arduino D9 (SS TX) - BT RX through a voltage divider (5v to 3.3v)
#include <SoftwareSerial.h>
SoftwareSerial BTserial(8, 9); // RX, TX
char c=' ';
void setup() 
    Serial.print("Sketch:   ");   Serial.println(__FILE__);
    Serial.print("Uploaded: ");   Serial.println(__DATE__);
    Serial.println(" ");
    Serial.println("BTserial started at 9600");
    Serial.println(" ");
void loop()
    // Read from the Bluetooth module and send to the Arduino Serial Monitor
    if (BTserial.available())
        c = BTserial.read();
    // Read from the Serial Monitor and send to the Bluetooth module
    if ( Serial.available() )
        c = Serial.read();   


HC-06 (ZG-B23090W):Serial monitor and AT commands

Make sure “No line Ending” and “9600” are selected at the bottom of the serial monitor
HC-06 - ZG 1643 - B23090W_019_serial_monitor

“AT” checks that serial communication is working
HC-06 - ZG 1643 - B23090W_020_AT_Commands

“AT+VERSION” gets the firmware version/ID
HC-06 - ZG 1643 - B23090W_021_AT_Commands


HC-06 (ZG-B23090W): Downloads

HC-06 B28090W Bluetooth module Data Sheet English
HC-06 B28090W Bluetooth module Data Sheet Chinese


One thought on “HC-06 (ZG-B23090W) Bluetooth 2.0 EDR modules

  1. Pingback: Bluetooth Modules | Martyn Currey

Leave a Reply

Your email address will not be published. Required fields are marked *

+ seven = 13

You may use these HTML tags and attributes: <a href="" title=""> <abbr title=""> <acronym title=""> <b> <blockquote cite=""> <cite> <code> <del datetime=""> <em> <i> <q cite=""> <s> <strike> <strong>