edgeboardAI 小车驱动实现

涉及的库函数

1.server_port edgeboardAI调用wobot接口库

2.cc.py 控制库

3.test.py主要 调用库 控制函数

#serial_port.py
import serial
import time

from threading import Lock

class Serial:
    def __init__(self):
        portx = "/dev/ttyUSB0"
        bps = 115200
        self.res = None
        self.serial = serial.Serial(portx, int(bps), timeout=1, parity=serial.PARITY_NONE, stopbits=1)
        time.sleep(1)
    def write(self, data):
        lock = Lock()
        lock.acquire()
        try:
            self.serial.write(data)
            self.serial.flush()
            self.res = self.serial.readline()
        finally:
            lock.release()

    def read(self):
        return self.res

serial_connection = Serial()

------------------------------------------------------------------

#cc.py
from serial_port import serial_connection;

from ctypes import *
import time
import serial
import math

comma_head_01_motor = bytes.fromhex('77 68 06 00 02 0C 01 01')
comma_head_02_motor = bytes.fromhex('77 68 06 00 02 0C 01 02')
comma_head_03_motor = bytes.fromhex('77 68 06 00 02 0C 01 03')
comma_head_04_motor = bytes.fromhex('77 68 06 00 02 0C 01 04')

comma_head_21_motor = bytes.fromhex('77 68 06 00 02 0C 02 01')
comma_head_22_motor = bytes.fromhex('77 68 06 00 02 0C 02 02')
comma_head_23_motor = bytes.fromhex('77 68 06 00 02 0C 02 03')
comma_head_24_motor = bytes.fromhex('77 68 06 00 02 0C 02 04')

comma_trail = bytes.fromhex('0A')

class Cart:
    def __init__(self):
        self.velocity = 25
        self.Kx=0.85
        portx = "/dev/ttyUSB0"
        bps = 115200
        self.serial = serial.Serial(portx, int(bps), timeout=1, parity=serial.PARITY_NONE, stopbits=1)

        self.p = 0.8;
        self.full_speed = self.velocity
        self.slow_ratio = 0.97;
        self.min_speed = 20

    def stop(self):
        self.move([0, 0, 0, 0,0,0,0,0])

    def exchange(self, speed):#if and else
        if speed > 100:
            speed = 100
        elif speed < -100:
            speed = -100
        else:
            speed = speed
        return speed

    def move(self, speeds):
        left_front = -int(speeds[0]);
        right_front = int(speeds[1]);
        left_rear = -int(speeds[2]);
        right_rear = int(speeds[3]);
        
        m1 = -int(speeds[4]);
        m2 = int(speeds[5]);
        m3 = -int(speeds[6]);
        m4 = int(speeds[7]);

        self.min_speed = int(min(speeds))
        
        left_front=self.exchange(left_front)
        right_front = self.exchange(right_front)
        left_rear=self.exchange(left_rear)
        right_rear = self.exchange(right_rear)
        
        send_data_01_motor = comma_head_01_motor + left_front.to_bytes(1, byteorder='big', signed=True) + comma_trail
        send_data_02_motor = comma_head_02_motor + right_front.to_bytes(1, byteorder='big',signed=True) + comma_trail
        send_data_03_motor = comma_head_03_motor + left_rear.to_bytes(1, byteorder='big', signed=True) + comma_trail
        send_data_04_motor = comma_head_04_motor + right_rear.to_bytes(1, byteorder='big', signed=True) + comma_trail
        send_data_21_motor = comma_head_21_motor + m1.to_bytes(1, byteorder='big', signed=True) + comma_trail
        send_data_22_motor = comma_head_22_motor + m2.to_bytes(1, byteorder='big',signed=True) + comma_trail
        send_data_23_motor = comma_head_23_motor + m3.to_bytes(1, byteorder='big', signed=True) + comma_trail
        send_data_24_motor = comma_head_24_motor + m4.to_bytes(1, byteorder='big', signed=True) + comma_trail
        
        self.serial.write(send_data_01_motor)
        self.serial.write(send_data_02_motor)
        self.serial.write(send_data_03_motor)
        self.serial.write(send_data_04_motor)
        
        self.serial.write(send_data_21_motor)
        self.serial.write(send_data_22_motor)
        self.serial.write(send_data_23_motor)
        self.serial.write(send_data_24_motor)
        
    def right(self,CarSpeedControl=10):
        self.move([CarSpeedControl,0,CarSpeedControl,0,0,0,0,0])
        
    def left(self,CarSpeedControl=10):
        self.move([0,CarSpeedControl,0,CarSpeedControl,0,0,0,0])
        
    def run(self,CarSpeedControl=10):
        self.move([CarSpeedControl,CarSpeedControl,CarSpeedControl,CarSpeedControl,0,0,0,0])
        
    def back(self,CarSpeedControl=10):
        self.move([-CarSpeedControl,-CarSpeedControl,-CarSpeedControl,-CarSpeedControl,0,0,0,0])
    
    def brake(self,CarSpeedControl=0):
        self.move([0,0,0,0,0,0,0,0])
        
cart = Cart()

-------------------------------------------------------------------------------------------

#test.py
import time
import struct
from serial_port import serial_connection
from cc import cart;
serial = serial_connection

class Button:
    def __init__(self, port, buttonstr):
        self.state = False
        self.port = port
        self.buttonstr = buttonstr
        port_str = '{:02x}'.format(port)
        self.cmd_data = bytes.fromhex('77 68 05 00 01 E1 {} 01 0A'.format(port_str))

    def clicked(self):
        serial.write(self.cmd_data)
        response = serial.read()
        buttοnclick="no"
        if len(response) == 9 and  response[5]==0xE1 and response[6]==self.port:
            button_byte=response[3:5]+bytes.fromhex('00 00')
            button_value=struct.unpack('             # print("%x"%button_value)
            if button_value>=0x1f1 and button_value<=0x1ff:
                buttοnclick="UP"
            elif button_value>=0x330 and button_value<=0x33f:
                buttonclick = "LEFT"
            elif button_value>=0x2ff and button_value<=0x30f:
                buttonclick = "DOWN"
            elif button_value>=0x2a0 and button_value<=0x2af:
                buttonclick = "RIGHT"
            else:
                buttonclick
        return self.buttonstr==buttonclick


class LimitSwitch:
    def __init__(self, port):
        self.state = False;
        self.port = port;
        self.state = True;
        port_str = '{:02x}'.format(port)
        # print (port_str)
        self.cmd_data = bytes.fromhex('77 68 04 00 01 DD {} 0A'.format(port_str))

    # print('77 68 04 00 01 DD {} 0A'.format(port_str))

    def clicked(self):
        serial.write(self.cmd_data);
        response = serial.read();  # 77 68 01 00 0D 0A
        if len(response) < 8 or response[4] != 0xDD or response[5] != self.port \
                or response[2] != 0x01:
            return False;
        state = response[3] == 0x01
        # print("state=",state)
        # print("elf.state=", self.state)
        clicked = False
        if state == True and self.state == True and clicked == False:
            clicked = True;
        if state == False and self.state == True and clicked == True:
            clicked = False
        # print('clicked=',clicked)
        return clicked


class UltrasonicSensor():
    def __init__(self, port):
        self.port = port
        port_str = '{:02x}'.format(port)
        self.cmd_data = bytes.fromhex('77 68 04 00 01 D1 {} 0A'.format(port_str))

    def read(self):
        serial.write(self.cmd_data)
        # time.sleep(0.01)
        return_data = serial.read()
        if len(return_data)<11 or return_data[7] != 0xD1 or return_data[8] != self.port:
            return None
        # print(return_data.hex())
        return_data_ultrasonic = return_data[3:7]
        ultrasonic_sensor = struct.unpack('         # print(ultrasonic_sensor)
        return int(ultrasonic_sensor)


class Servo:
    def __init__(self, ID):
        self.ID = ID
        self.ID_str = '{:02x}'.format(ID)

    def servocontrol(self, angle, speed):
        cmd_servo_data = bytes.fromhex('77 68 06 00 02 36') + bytes.fromhex(self.ID_str) + speed.to_bytes(1,
                                                                                                            byteorder='big', \
                                                                                                            signed=True) + angle.to_bytes(
            1, byteorder='big', signed=True) + bytes.fromhex('0A')

        # for i in range(0,2):
        serial.write(cmd_servo_data)
        #     time.sleep(0.3)

class Servo_pwm:
    def __init__(self, ID):
        self.ID = ID
        self.ID_str = '{:02x}'.format(ID)

    def servocontrol(self, angle, speed):
        cmd_servo_data = bytes.fromhex('77 68 06 00 02 0B') + bytes.fromhex(self.ID_str) + speed.to_bytes(1,
                                                                                                            byteorder='big', \
                                                                                                            signed=True) + angle.to_bytes(
            1, byteorder='big', signed=False) + bytes.fromhex('0A')
        # for i in range(0,2):
        serial.write(cmd_servo_data)
        # time.sleep(0.3)

class Light:
    def __init__(self, port):
        self.port = port
        self.port_str = '{:02x}'.format(port)

    def lightcontrol(self, which, Red, Green, Blue):  # 0代表全亮,其他值对应灯珠亮,1~4
        which_str = '{:02x}'.format(which)
        Red_str = '{:02x}'.format(Red)
        Green_str = '{:02x}'.format(Green)
        Blue_str = '{:02x}'.format(Blue)
        cmd_servo_data = bytes.fromhex('77 68 08 00 02 3B {} {} {} {} {} 0A'.format(self.port_str, which_str, Red_str \
                                                                                    , Green_str, Blue_str))
        serial.write(cmd_servo_data)

    def lightoff(self):
        cmd_servo_data1 = bytes.fromhex('77 68 08 00 02 3B 02 00 00 00 00 0A')
        cmd_servo_data2 = bytes.fromhex('77 68 08 00 02 3B 03 00 00 00 00 0A')
        cmd_servo_data = cmd_servo_data1 + cmd_servo_data2
        serial.write(cmd_servo_data)


class Motor_rotate:
    def __init__(self, port):
        self.port = port
        self.port_str = '{:02x}'.format(port)

    def motor_rotate(self, speed):
        cmd_servo_data = bytes.fromhex('77 68 06 00 02 0C 02') + bytes.fromhex(self.port_str) + \
                         speed.to_bytes(1, byteorder='big', signed=True) + bytes.fromhex('0A')
        serial.write(cmd_servo_data)


class Infrared_value:
    def __init__(self, port):
        port_str = '{:02x}'.format(port)
        self.cmd_data = bytes.fromhex('77 68 04 00 01 D4 {} 0A'.format(port_str))

    def read(self):
        serial.write(self.cmd_data)
        return_data = serial.read()
        if return_data[2] != 0x04:
            return None
        if return_data[3] == 0x0a:
            return None
        # print("**********************************")
        # print("return_data[3]=%x" % return_data[3])
        # print(type(return_data[3]))
        # print("return_data[4]=%x" % return_data[4])
        # print("return_data[5]=%x" % return_data[5])
        # print("return_data[6]=%x" % return_data[6])
        # print(return_data.hex())
        return_data_infrared = return_data[3:7]
        print(return_data_infrared)
        infrared_sensor = struct.unpack('         # print(ultrasonic_sensor)
        return infrared_sensor


class Buzzer:
    def __init__(self):
        self.cmd_data = bytes.fromhex('77 68 06 00 02 3D 03 02 0A')

    def rings(self):
        serial.write(self.cmd_data)
class Magneto_sensor:
    def __init__(self,port):
        self.port=port
        port_str = '{:02x}'.format(self.port)
        self.cmd_data = bytes.fromhex('77 68 04 00 01 CF {} 0A'.format(port_str))

    def read(self):
        serial.write(self.cmd_data)
        return_data = serial.read()
        # print("return_data=",return_data[8])
        if len(return_data) < 11 or return_data[7] != 0xCF or return_data[8] != self.port:
            return None
        # print(return_data.hex())
        return_data = return_data[3:7]
        mag_sensor = struct.unpack('         # print(ultrasonic_sensor)
        return int(mag_sensor)
class Test:
    pass

CarSpeedControl = 10 #init speed
c=cart

target = 20 # 微调的最佳 目标距离

def Distance_test():
    ultr_sensor=UltrasonicSensor(4)
    distance=ultr_sensor.read()
    return distance

def near_distance(distance):
    i = 0#Limit of adjustment times
    if distance > target+1:
        print("Move up to the right by a large margin and small left down retreat")
        while int(distance - target) != 0:#一直调整
            h = distance
            c.right()
            time.sleep(0.5) #偏向角15度左右
            c.run()
            time.sleep(0.5)
            c.left()
            time.sleep(0.75)
            c.back()
            time.sleep(1)
            distance = Distance_test()
            print(str(distance)+" CM")
        
            i = i + 1            
            if int(target - distance) > 0 or i>= 10 or h < distance:#防止其它因素导致 出现移动太过情况
                break

def away_distance(distance):
    i = 0#Limit of adjustment times
    if distance < target-1:
        print("Large left up advance and back down slightly to the right")
        while int(target - distance) != 0:#一直调整
            h = distance
            c.left()
            time.sleep(0.5) #偏向角15度左右
            c.run()
            time.sleep(0.5)
            c.right()
            time.sleep(0.75)
            c.back()
            time.sleep(1)
            distance = Distance_test()
            print(str(distance)+" CM")
            i = i + 1        
            if int(distance - target) > 0 or i>= 10 or h > distance:#防止其它因素导致 出现移动太过情况
                break

def control(x):
    global CarSpeedControl
    if str(x) == 'a' or str(x) == 'A':#Left
        c.left(CarSpeedControl)
        
    elif str(x) == 'd' or str(x) == 'D':#Right
        c.right(CarSpeedControl)
        
    elif str(x) == 'w' or str(x) == 'W':#Run
        c.run(CarSpeedControl)
        
    elif str(x) == 's' or str(x) == 'S':#Back
        c.back(CarSpeedControl)
        
    elif str(x) == 'j' or str(x) == 'J':#Accelerate
        CarSpeedControl = CarSpeedControl + 10
        if CarSpeedControl > 90:#防止堆栈溢出
            CarSpeedControl = 90
    elif str(x) == 'k' or str(x) == 'K':#Slow down
        CarSpeedControl = CarSpeedControl - 10
        if CarSpeedControl < 10:#防止堆栈溢出
            CarSpeedControl = 10
    elif str(x) == 'U' or str(x) == 'u':
        speed = CarSpeedControl #保存微调前速度        
        CarSpeedControl = 10#慢速微调

        print("Fine tuning starts...")#begin 微调开始 根据超声波测距 进行水平位移
        distance = Distance_test()
        print(str(distance)+" CM")
        p = 0
        while 1:
            distance = Distance_test()
            p = p + 1
            if p >= 3:#循环调3次
                break
            if distance > target+1:
                near_distance(distance)
            
                continue
            elif distance < target-1:
                away_distance(distance)
            
                continue
            break

        c.brake()

        print("Fine tuning ends.")#end
        
        CarSpeedControl = speed
    else:
        c.brake()
        

#from Serial_0305 import SerialAssistant
if __name__ == '__main__':
    while 1:
        scan = input("Key command: ")
        if str(scan) == 'p' or str(scan) == 'P':
            break
        control(scan)
    
    pass
   

  • 1
    点赞
  • 11
    收藏
    觉得还不错? 一键收藏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值