Home→Forums→MonoBrick Communication Library→Trigger brick program from Python
Tagged: python ev3
- This topic has 4 replies, 3 voices, and was last updated 10 years, 4 months ago by Pascal SALLIOT.
-
AuthorPosts
-
January 6, 2014 at 21:57 #3777
Fergus O’CallaghanParticipantHappy New Year! And congratulations on the great website. I have a (hopefully) simple question. I have an EV3 set and I want to trigger a normal Lego Mindstorms program to run on the EV3 brick, from a python script on a PC. Basically this python script runs unattended, and I want it to be able to trigger the EV3 brick to press a physical button.
Communications via either bluetooth or USB would be fine. The question is: do I need a whole SW stack on the PC side to do the communication, or is there perhaps some shortcut I could use directly with the python pybluez module? I can already discover the EV3 using pybluez. But how could I trigger a program to run?
Many thanks,
FergusJanuary 6, 2014 at 22:19 #3781
Anders SøborgKeymasterAlthough this forum is related to MonoBrick communication here are some Phyton code to send a message to the EV3 from a PC over Bluetooth
import struct import ctypes import binascii import socket import time import StringIO import serial import struct from array import array from serial import * from threading import Thread class MailboxMessage(): def __init__(self, mailboxName, msg): self.MailboxName = mailboxName self.msg = msg mailboxNameLength = len(mailboxName)+1 msgLength = len(msg) +1 totalLength = mailboxNameLength + msgLength + 7 self.data = bytearray(b"") self.data.append(totalLength)#length self.data.append(0) self.data.append(100)#sequence number self.data.append(0) self.data.append(129)#Command type - system command without reply 0x81 self.data.append(158)#system command type - WriteMailbox 0x9e self.data.append(mailboxNameLength) self.data = self.data + bytearray(mailboxName) self.data.append(0) self.data.append(msgLength) self.data.append(0) self.data = self.data+ bytearray(msg) self.data.append(0) def Mailbox(self): return self.MailboxName def Data(self): return self.data def Message(self): return self.msg class Receiver(Thread): def __init__(self, serialPort): Thread.__init__(self) self.serialPort = serialPort def run(self): message = [] messageSize=0 while True: for c in self.serialPort.read(size=1): message.append(ord(c)) if len(message) == 2: bytes = array('B', message) messageSize = struct.unpack('<H', bytes )[0] #print messageSize for c in self.serialPort.read(size=messageSize): message.append(ord(c)) bytes = array('B', message[6:7]) mailboxNameLength = struct.unpack('<B', bytes )[0] #bytes = array('B', message[7+mailboxNameLength:7+mailboxNameLength+2]) #mailboxTextLength = struct.unpack('<H', bytes )[0] mailboxName = array('B', message[7:7+mailboxNameLength-1]).tostring() mailboxText = array('B', message[7+mailboxNameLength+2 :messageSize+1]).tostring() mailboxMessage = MailboxMessage(mailboxName, mailboxText) print mailboxMessage.Mailbox() print mailboxMessage.Message() message[:] = [] self.serialPort.close() class Sender(Thread): def __init__(self, serialPort): Thread.__init__(self) self.serialPort = serialPort def run(self): text = "" print "Enter text to send" while(text != "quit\n"): msg = raw_input("") mailboxName = "mailbox1" self.sendMessage(mailboxName, msg) self.serialPort.close() def sendMessage(self, mailboxName,msg): mailboxMessage = MailboxMessage(mailboxName,msg) self.serialPort.write(mailboxMessage.Data()) serialPort = Serial(port='/dev/tty.EV3-SerialPort', baudrate=9600) send = Sender(serialPort) receive = Receiver(serialPort) send.start() receive.start()
To start a program you need to change the command to be a start program command. You can find more info on this and other direct commands here.
Anders
January 7, 2014 at 09:32 #3784
Fergus O’CallaghanParticipantYes I couldn’t really find an appropriate location for this question. Thanks anyway for the answer, I’ll try it out as soon as I can.
Fergus
January 7, 2014 at 11:18 #3787
Anders SøborgKeymasterNo problem
Anders
July 10, 2014 at 07:30 #4490
Pascal SALLIOTParticipantI’m trying to exchange mailbox’s messages between python 2.7 and the EV3’s software “LabVIEW” via a Bluetooth communication.
After several month searching, you’re the only one who was able to do this ; thank you for this work.When I run the program above, I’ve got this message :
“SerialException(“could not open port %r: %r” % (self.portstr, ctypes.WinError()))
SerialException: could not open port ‘/dev/tty.EV3-SerialPort’: WindowsError(3, ‘Le chemin d\x92acc\xe8s sp\xe9cifi\xe9 est introuvable.’)”
It means that Windows is unable to find the path /dev/tty.EV3-SerialPort even if the brick is connected with the USB wire…Any suggestions ?
-
AuthorPosts
You must be logged in to reply to this topic.
Follow