A little while back, the Lejos forums were getting reports that some of the newly purchased bricks were having issues with Bluetooth connections. Andy Shaw, one of the main developers of this project, determined that the main cause was a newly updated Bluetooth chipset in this brick. Unlike its predecessor, this chipset is BT 4.0 capable. That means that, at least in theory, the brick is BLE (Bluetooth Low Energy) capable.
For whatever reason, the LEGO MINDSTORMS hardware team decided to NOT increment the hardware revision number of these new brick, which makes identifying them extremely tricky. The only way to do it is to gain console access to the brick, which is not trivial for non-Linux savvy users. A command line utility has to be run and the output checked. The tool in question is hciconfig, a tool to configure BT devices. The output of this command, when run on an “old” brick, gives us the following:
On a new brick, the output is quite different:
As you can see, the first output tells us that the chipsets supports Bluetooth 2.1, the second output tells us that BT 4.0 is supported.
The LEGO firmware cannot tell the difference between the two due to the fact that the new chipset is a complete drop-in replacement for its predecessor, the only difference is the version number of the chipset firmware file version number.
I’ve created a small LMS assembler based program that will allow you to check your brick’s BT chipset, using the hciconfig command, without requiring console access. It’s been precompiled for you, but if you’d like, you can see the code below. As you can see, it’s pretty harmless. You can download the precompiled version here: [LINK]. Just download it to your brick and run it from the screen. A simple message will be displayed on your screen for 5 seconds, telling you whether or not you have a BLE capable chipset. I have only tested this with LEGO firmware versions 1.06 and 1.07, as I don’t have the source code for firmwares versions 1.08 and 1.09.
Keep in mind that having the BLE capable chipset doesn’t really allow you to do anything special with the current LEGO firmware. Perhaps in the future, LEGO will leverage this new capability, who knows.
/* Xander Soldaat (2016) * * Copyright (C) 2016 Xander Soldaat * * This program is free software; you can redistribute it and/or modify * it under the terms of the GNU General Public License as published by * the Free Software Foundation; either version 2 of the License, or * (at your option) any later version. * * This program is distributed in the hope that it will be useful, * but WITHOUT ANY WARRANTY; without even the implied warranty of * MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the * GNU General Public License for more details. * * You should have received a copy of the GNU General Public License * along with this program; if not, write to the Free Software * Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. */ define NO_BLE_MSG 'No BLE chipset found' define YES_BLE_MSG 'BLE chipset found' vmthread MAIN { DATA32 waitTimer DATA32 exitCode DATA16 fileHandle DATA32 fileSize DATA8 flag DATAS fileContent 32 DATAS uiMessage 32 // This runs the hciconfig, which retrieves all of the BT hardware related info SYSTEM('(hciconfig -a | grep -q "Version: 4.0" && echo "1" || echo "0") > /tmp/output.rtf', exitCode) // Open the file and read the first byte, which will be a '1' or '0' (ASCII) FILE(OPEN_READ, '/tmp/output.rtf', fileHandle, fileSize) FILE(READ_TEXT, fileHandle, DEL_NONE, 1, fileContent) FILE(CLOSE, fileHandle) // Compare the string and jump to the appropriate messsage initialisation STRINGS(COMPARE, fileContent, '1', flag) JR_TRUE(flag, HasBLE) JR_FALSE(flag, NoBLE) // No BLE chipset found, this is an older generation brick NoBLE: STRINGS(DUPLICATE, NO_BLE_MSG, uiMessage) JR(displayMsg) // A BLE capable chipset was found, this is a newer generation brick HasBLE: STRINGS(DUPLICATE, YES_BLE_MSG, uiMessage) // Put a little message on the screen and exit after 5 seconds displayMsg: UI_DRAW(FILLWINDOW,BG_COLOR,0,0) UI_DRAW(TEXT,FG_COLOR, 0, 60, uiMessage) UI_DRAW(UPDATE) TIMER_WAIT(5000,waitTimer) TIMER_READY(waitTimer) }
Hello Xander.
Do you know if there are certain plans to support Bluetooth in RobotC for EV3?
Thanks,
Sergey.
Hey Sergey,
I am actually working on that at the moment 🙂
= Xander
That’s a coincidence!
So, any forecast? End of summer may be? 🙂
Hah! When it’s done 🙂
Will you please write a separate post here when it’s done?
Of course!
Hello, Xander! Firstly I wanna say you thanks for your work! Secondly I wanna ask you about a communication between two EV3 blocks. Does it works and how can I make it? I very hope that you added it in current version RobotC.
There are currently no plans to add that kind of functionality to ROBOTC, I’m afraid. There are some alternative environments that do provide this kind of functionality, though. ev3dev is basically a full-blown Linux distort with very nice Python, Java (Lejos) and other languages available for it.
you can replace your whole program with the following:
hciconfig -a | grep -q “Version: 4.0” && echo “BLE chipset found” || echo “No BLE chipset found”
Sure, but that will only work if you have console access.