Робот на базе Lego NXT 2.0 управляется с помощью датчика accelerometer телефона nokia 5800 по каналу bluetooth.
Python cкрипт
Исходный код
#-*-coding:utf-8-*- import sys import e32 import miso import appuifw import btsocket as socket from appuifw import * from graphics import * from key_codes import * from sensor import * sock=socket.socket(socket.AF_BT, socket.SOCK_STREAM) accelerometer = AccelerometerXYZAxisData(data_filter=LowPassFilter()) target=('00:16:53:11:da:c3', 1) #nxt #self.target=('00:03:7a:a5:f7:bb', 1) #pc app_path=app.full_name()[0]+u':\\data\\python\\ImageNXT\\' #28->127(x7f) 128(x80)<-229 против часовой #bankPower = [127,128,27,47,67,87] #print("%x" % bankPower[0]) #resetMstr = '\x03\x00\x80\x21' class Main: def __init__(self): app.directional_pad=False #self.course=0 self.cnt = 0 #self.X = 0 self.Y = 0 self.Z = 0 self.AccellStatus = False self.connStatus=False accelerometer.set_callback(data_callback=self.my_callback) self.splash=Image.open(app_path+'remoteNiko.jpg') self.canvas=Canvas(redraw_callback=self.redraw) app.body=self.canvas self.up=Image.open(app_path+'remoteNiko_Up.jpg') self.down=Image.open(app_path+'remoteNiko_Down.jpg') self.left=Image.open(app_path+'remoteNiko_Left.jpg') self.right=Image.open(app_path+'remoteNiko_Right.jpg') self.up_a=Image.open(app_path+'remoteNiko_UpA.jpg') self.down_a=Image.open(app_path+'remoteNiko_DownA.jpg') self.valuePowerUp = '\x64' self.valuePowerDown = '\x9b' self.up_motorA = '\x0c\x00\x80\x04\x00'+self.valuePowerUp+'\x03\x02\x00\x20\xe6\x00\x00\x00' self.up_motorB = '\x0c\x00\x80\x04\x01'+self.valuePowerUp+'\x03\x02\x00\x20\x68\x01\x00\x00' self.up_motorC = '\x0c\x00\x80\x04\x02'+self.valuePowerUp+'\x03\x02\x00\x20\x68\x01\x00\x00' self.down_motorB = '\x0c\x00\x80\x04\x01'+self.valuePowerDown+'\x03\x02\x00\x20\x68\x01\x00\x00' self.down_motorC = '\x0c\x00\x80\x04\x02'+self.valuePowerDown+'\x03\x02\x00\x20\x68\x01\x00\x00' #self.accelOnOff = ((u'On',self.setAccelOn),(u'Off',self.setAccelOff)) self.powerKort = ((u'20%',self.setPower5),(u'40%',self.setPower4),(u'60%',self.setPower3),(u'80%',self.setPower2),(u'100%',self.setPower1)) app.menu=[(u'Connect',self.connect),(u'Power',self.powerKort),(u'Rotation',self.setRot),(u'Accelerometer On',self.setAccelOn)] self.canvas.bind(EButton1Down,self.controlUpShow,((115,0),(217,119))) self.canvas.bind(EButton1Down,self.controlDownShow,((115,241),(217,360))) self.canvas.bind(EButton1Down,self.controlLeftShow,((0,108),(129,251))) self.canvas.bind(EButton1Down,self.controlRightShow,((258,108),(394,251))) self.canvas.bind(EButton1Down,self.controlUpAShow,((346,0),(505,119))) self.canvas.bind(EButton1Down,self.controlDownAShow,((346,241),(505,360))) self.canvas.bind(EButton1Up,self.controlHide,((115,0),(217,119))) self.canvas.bind(EButton1Up,self.controlHide,((115,241),(217,360))) self.canvas.bind(EButton1Up,self.controlHide,((0,108),(129,251))) self.canvas.bind(EButton1Up,self.controlHide,((258,108),(394,251))) self.canvas.bind(EButton1Up,self.controlHide,((346,0),(505,119))) self.canvas.bind(EButton1Up,self.controlHide,((346,241),(505,360))) def my_callback(self): if self.cnt % 10 == 0: #self.redraw() self.cnt = 0 #self.X = accelerometer.x self.Y = accelerometer.y self.Z = accelerometer.z if self.Y > 10: self.controlRightShow(EButton1Down) elif self.Y < -10: self.controlLeftShow(EButton1Down) elif self.Z > 35: self.controlUpShow(EButton1Down) elif self.Z < 15: self.controlDownShow(EButton1Down) self.cnt = self.cnt+1 def setMotorSetting(self): self.up_motorA = '\x0c\x00\x80\x04\x00'+self.valuePowerUp+'\x03\x02\x00\x20\xe6\x00\x00\x00' self.up_motorB = '\x0c\x00\x80\x04\x01'+self.valuePowerUp+'\x03\x02\x00\x20\x68\x01\x00\x00' self.up_motorC = '\x0c\x00\x80\x04\x02'+self.valuePowerUp+'\x03\x02\x00\x20\x68\x01\x00\x00' self.down_motorB = '\x0c\x00\x80\x04\x01'+self.valuePowerDown+'\x03\x02\x00\x20\x68\x01\x00\x00' self.down_motorC = '\x0c\x00\x80\x04\x02'+self.valuePowerDown+'\x03\x02\x00\x20\x68\x01\x00\x00' def vibro_and_redraw(self): if self.AccellStatus == False: miso.vibrate(30,20) def resetMOTOR(self): sock.send('\x03\x00\x80\x21\x00') sock.send('\x03\x00\x80\x21\x01') sock.send('\x03\x00\x80\x21\x02') def controlUpShow(self,event): if self.connStatus==True: self.resetMOTOR() sock.send(self.up_motorB+self.up_motorC) self.canvas.blit(self.up) #self.course=1 self.vibro_and_redraw() def controlDownShow(self,event): if self.connStatus==True: self.resetMOTOR() sock.send(self.down_motorB+self.down_motorC) self.canvas.blit(self.down) #self.course=2 self.vibro_and_redraw() def controlLeftShow(self,event): if self.connStatus==True: self.resetMOTOR() sock.send(self.up_motorB+self.down_motorC) self.canvas.blit(self.left) #self.course=3 self.vibro_and_redraw() def controlRightShow(self,event): if self.connStatus==True: self.resetMOTOR() sock.send(self.down_motorB+self.up_motorC) self.canvas.blit(self.right) #self.course=4 self.vibro_and_redraw() def controlUpAShow(self,event): if self.connStatus==True: self.resetMOTOR() sock.send(self.up_motorA) self.canvas.blit(self.up_a) #self.course=5 self.vibro_and_redraw() def controlDownAShow(self,event): #self.course=6 self.canvas.blit(self.down_a) self.vibro_and_redraw() def controlHide(self,event): #self.course=0 self.redraw() def connect(self): app.menu=[(u'Disconnect',self.disconnect),(u'Power',self.powerKort),(u'Rotation',self.setRot),(u'Accelerometer On',self.setAccelOn)] sock.connect(target) sock.send('\x02\x00\x01\x88') data = sock.recv(1) self.connStatus=True self.redraw() def disconnect(self): self.connStatus=False self.redraw() app.menu=[(u'Connect',self.connect),(u'Power',self.powerKort),(u'Rotation',self.setRot),(u'Accelerometer On',self.setAccelOn)] sock.close() def setAccelOn(self): self.AccellStatus = True app.menu=[(u'Connect',self.connect),(u'Power',self.powerKort),(u'Rotation',self.setRot),(u'Accelerometer Off',self.setAccelOff)] accelerometer.start_listening() def setAccelOff(self): self.AccellStatus = False app.menu=[(u'Connect',self.connect),(u'Power',self.powerKort),(u'Rotation',self.setRot),(u'Accelerometer On',self.setAccelOn)] accelerometer.stop_listening() def setPower1(self): self.valuePowerUp = '\x64' self.valuePowerDown = '\x9b' self.setMotorSetting() def setPower2(self): self.valuePowerUp = "\x50" self.valuePowerDown = "\xaf" self.setMotorSetting() def setPower3(self): self.valuePowerUp = "\x3c" self.valuePowerDown = "\xc3" self.setMotorSetting() def setPower4(self): self.valuePowerUp = "\x28" self.valuePowerDown = "\xd7" self.setMotorSetting() def setPower5(self): self.valuePowerUp = "\x14" self.valuePowerDown = "\xeb" self.setMotorSetting() def setRot(self): appuifw.query(u'Rotation:', 'number') #models = [u"6600", u"6630", u"7610", u"5800", u"N70"] #fields = [(u"Model", 'combo', (models, 0))] #myForm = appuifw.Form(fields, flags=appuifw.FFormEditModeOnly) #myForm.execute() def redraw(self,rect=None): self.canvas.blit(self.splash) if self.connStatus==True: self.canvas.text((5,20),text=u'connect to NXT!',fill=0x000000) else: self.canvas.text((5,20),text=u'No connect',fill=0xff0000) #self.canvas.text((5,40),text=(u"Y:%s, Z:%s" % (self.Y,self.Z)),fill=0x000000) #self.canvas.text((30,50),text=u'%s раз.'%(5),fill=0x000000) def quit(): app_lock.signal() accelerometer.stop_listening() sock.close() app_lock = e32.Ao_lock() app.screen = 'large' app.orientation = 'landscape' app.exit_key_handler=quit generalUI=Main() app_lock.wait()