Since about version 3.3 Python supports Bluetooth sockets natively. To put this to the test I got hold of an iRacer from sparkfun. To send to New Zealand the cost was $60. The toy has an on-board Bluetooth radio that supports the RFCOMM transport protocol.
The drive protocol is dead easy, you send single byte instructions when a direction or speed change is required. The bytes are broken into two nibbles: 0xXY where X is the direction and Y is the speed. For example the byte 0x16 means forwards at mid-speed. I was surprised to note the car continues carrying out the last given demand!
I let pairing get dealt with by the operating system. The code to create a Car object that is drivable over Bluetooth is very straight forward in pure Python:
So there is no need for PyBluez or any of that overhead for some easy Bluetooth tasks. From here it is very easy to build up a program to control the car from the interface of your desire: keyboard, mouse, joystick, internet, webcam...
The drive protocol is dead easy, you send single byte instructions when a direction or speed change is required. The bytes are broken into two nibbles: 0xXY where X is the direction and Y is the speed. For example the byte 0x16 means forwards at mid-speed. I was surprised to note the car continues carrying out the last given demand!
I let pairing get dealt with by the operating system. The code to create a Car object that is drivable over Bluetooth is very straight forward in pure Python:
import socket
import time
class BluetoothCar:
def __init__(self, mac_address="00:12:05:09:98:36"):
self.socket = socket.socket(socket.AF_BLUETOOTH, socket.SOCK_STREAM, socket.BTPROTO_RFCOMM)
self.socket.connect((mac_address, 1))
def _write(self, data_byte):
self.socket.send(bytes([data_byte]))
def drive(self, command, duration=1.0):
self._write(command)
time.sleep(duration)
self.stop()
def forwards(self, duration=1.0):
self.drive(0x16, duration)
def reverse(self, duration=1.0):
self.drive(0x26, duration)
def left(self, duration=1.0):
self.drive(0x57, duration)
def right(self, duration=1.0):
self.drive(0x67, duration)
def stop(self):
self._write(0x00)
def __del__(self):
self.stop()
if __name__ == "__main__":
car = BluetoothCar()
while True:
car.forwards(0.05)
So there is no need for PyBluez or any of that overhead for some easy Bluetooth tasks. From here it is very easy to build up a program to control the car from the interface of your desire: keyboard, mouse, joystick, internet, webcam...