Linux Python script

Linux Python sc...
(0 ratings)
Create by Jorge Pereira | January 11, 2015 | Last updated by Jorge Pereira January 11, 2015 (view change)

If you want to control your SBrick from Linux with Python code you need some way to make python talk "Bluetooth Low Energy" protocol. There are already some attempts to write some python libraries I had not sucess using any (NOTE: I am not a programmer). The one I found most promissory is Ian Harvey 'bluepy'.

But since python can execute commands from the operating system we can invoke gatttool almost like we do from command line:

gatttool -b 00:07:80:2E:2A:5D -i hci1 --char-write --handle=0x0025 --value=01000080

We just need 'call' from 'subprocess' library.

So to spin a motor on port A at 50% speed for just 2.5 seconds this is the most simple example:

#!/usr/bin/env python
from subprocess import call

def main():
    call("gatttool --device=00:07:80:2E:2A:5D --adapter=hci1 --char-write --handle=0x0025 --value=01000080", shell=True)

if __name__ == "__main__":
    main()

The following python script shows how to generate a sawtooth wave, starting with 80d (31%) and increase one step (0.4%) each 0.1 seconds until full speed (255d = 100%) and starting all over again until you press Control-C.

(I don't start at 0% because most LEGO motors don't react to lower values - my Power Functions M motors start spinning only at near 30%)

 

#!/usr/bin/env python

import sys, traceback, os
from subprocess import call
from time import sleep

RUN_A = "gatttool --device=00:07:80:2E:2A:5D --adapter=hci1 --char-write --handle=0x0025 --value=010000"
BREAK_A = "gatttool --device=00:07:80:2E:2A:5D --adapter=hci1 --char-write --handle=0x0025 --value=0000"

def main():
  try:

    # turn off motor

    call(BREAK_A, shell=True)
    sleep(0.1)

    while(True):
      for t in range(80,255):
        print(t)
        call(RUN_A+str(hex(t))[2:], shell=True)
        sleep(0.1)

  except (KeyboardInterrupt, SystemExit):
    print("Exiting...")
  except Exception:
    traceback.print_exc(file=sys.stdout)

  # turn off motor

  call(BREAK_A, shell=True)
  sys.exit(0)

if __name__ == "__main__":
    main()

 

 I use some ugly code like constants as a kind of macro commands and this piece of code

 

str(hex(t))[2:]

to convert from decimal to a string with the hexadecimal equivalent.

« View Page History