NXT 2.0 + nokia 5800 + accelerometer + bluetooth

Робот на базе 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()

Видео

Добавить комментарий

Ваш адрес email не будет опубликован. Обязательные поля помечены *