A few days ago the ev3dev project launched a great feature: nightly image builds. Right after that I got a received a notice that they included in the image for Raspberry Pi 2/3 support for onboard the Bluetooth and needed to test it.
So I did test it. And found out that onboard Bluetooth indeed works… as also onboard Wi-Fi… as also the Brick Pi, no need to disable BT. Yeah, no more USB dongles!
The procedure is very simple – the really important step is freeing the hardware serial port for the BrickPi (both the onboard Bluetooth and the BrickPi need a UART so a soft UART (“miniuart”) is used for BT instead of the default one.
- get the latest nightly image build for the Pi2/Pi3 (mine was 26 July 2016) and restore it to a microSD card
- insert the card in the Pi3
- connect an USB keyboard and a HDMI display to the Pi3
- power up the Pi
- login (robot + maker) – if you cannot see the login prompt change to the proper console with Alt+F1 or Alt+F2 or Alt+F[n]
- run ‘sudo connmanctl’ to configure BT and Wi-Fi (see this tutorial on how to configure Wi-Fi from command line; for BT just run ‘sudo connmanctl enable bluetooth’)
- edit the ‘/boot/flash/config.txt’ and uncomment these 4 lines:
- dtoverlay=brickpi
- init_uart_clock=32000000
- dtoverlay=pi3-miniuart-bt
- core_freq=250
- sudo reboot
- remove the display and the keyboard and from now on just connect through Wi-Fi
To test that both Bluetooth and the BrickPi work properly I used a python script to read the NXT ultrasonic sensor (in the first input port) and change the color of my WeDo 2.0 Smart Hub from green to red:
#!/usr/bin/python # run with sudo # assumes NXT Ultrasonic at INPUT #1 from ev3dev.auto import * from gattlib import GATTRequester from time import sleep BTdevice = "hci0" # BlueTooth 4.0 BLE capable device WeDo2HubAddress = "A0:E6:F8:1E:58:57" InputCommand_hnd = 0x3a OutputCommand_hnd = 0x3d RGBAbsoluteMode_cmd = str(bytearray([01,02,06,17,01,01,00,00,00,02,01])) RGBAbsoluteOutput_cmd = str(bytearray([06,04,03])) # or "\x06\x04\x03" DELAY = 0.3 # DO NOT FORGET TO CONFIG FOR US sensor: # sudo echo nxt-i2c > /sys/class/lego-port/port0/mode # sudo echo "lego-nxt-us 0x01" > /sys/class/lego-port/port0/set_device # us = UltrasonicSensor('ttyAMA0:S1:i2c1') assert us.connected req = GATTRequester(WeDo2HubAddress,True,BTdevice) sleep(DELAY) # configure RBG LED to Absolute Mode (accepts 3 bytes for RGB instead of default Index Mode) req.write_by_handle(InputCommand_hnd,RGBAbsoluteMode_cmd) while(True): if (us.value() < 10): print("!") req.write_by_handle(OutputCommand_hnd, RGBAbsoluteOutput_cmd+chr(255)+chr(0)+chr(0)) sleep(DELAY) else: print("-") req.write_by_handle(OutputCommand_hnd, RGBAbsoluteOutput_cmd+chr(0)+chr(255)+chr(0)) sleep(DELAY)
My script need the gattlib library to talk with Bluetooth Low Energy devices. You can install this library with ‘pip’ but first need to install some dependencies:
sudo apt-get install pkg-config libboost-python-dev libboost-thread-dev libbluetooth-dev libglib2.0-dev python-dev
then
sudo pip install gattlib