Car:bit
来自Labplus盛思维基百科
概述
car:bit是以micro:bit作主控的小车。内置超声波、模拟光线、蜂鸣器、测速、全彩RGB灯、循迹等模块。可用于超声波测距、循线、寻光、无线遥控小车。
技术参数
- 供电方式:3.7V 18650锂电池
- Micro USB接口:可充电
- PCI插槽,可接入micro:bit作为主控
- 内置模拟光线
- 超声波测距 3cm~300cm 精度±1cm
- 支持两轮测速
使用说明
- car:bit快速入门
Step1.教程:microbit怎么编程下载?
Step2.在使用电机驱动函数和测速函数时,应在先程序前定义car:bit驱动
Step3.简要使用说明
car:bit | micro:bit引脚 | Python示例 |
---|---|---|
B2电机 | I2C | setLeftMotor(value) 前进 value:0~100;后退 value:0~-100 |
B1电机 | I2C | setRightMotor(value) 前进 value:0~100;后退 value:0~-100 |
蜂鸣器 | P0 | import music music.play(music.NYAN) |
W1/W2/W3/W4 RGB灯 | P8 | #W1显示红色 import neopixel np=neopixel.NeoPixel(pin8,4) np[0]= (255,0,0) np.show() |
模拟光线 Q3 | P1 | pin1.read_analog() |
模拟光线 Q4 | P2 | pin2.read_analog() |
测速 U11 | I2C | spd = getSpeed() print(spd[0]+spd[1]*256) #left Speed |
测速 U10 | I2C | spd = getSpeed() print(spd[2]+spd[3]*256) #Right Speed |
循迹红外对管 U18/U17/U14/U13/U6/U5 | U18->P16 U17->P15 U14->P2 U13->P1 U6->P14 U5->P13 |
pin1.read_digital() 更详细循迹编程可参考循迹例程 |
超声波 | I2C | Distance() |
1.P1/P2与模拟光线引脚有复用,所以不能同时使用。在使用时需要通过切换开关,选择「循迹」和「光线」 2.如果18650锂电池重新装载的话,第一次需要激活下锂电池才能供电正常!激活方式:装上18650电池后接上microUSB接口,电源开关拨到ON |
应用例程
循迹小车
''' 循迹小车(基于PID算法) 使用时需调整以下参数 1、PID参数kp ki kd 2、直线行走速度值(影响行走速度) k_speed 3、最大限速值(影向转弯效果) speedMax 4、速度调整系数(影响转弯速度) speedScale 5、转弯调整延时(影向转弯调整时间) turnDelay ''' from microbit import * kp = 1 ki = 1 kd = 1 preError = 0 integral = 0 delays = 1 leftMotorSpeed = 0 rightMotorSpeed = 0 k_speed = 50 speedMax = 75 turnDelay = 10 def setLeftMotor(speed): i2c.write(0x10, bytearray([0x01, speed])) def setRightMotor(speed): i2c.write(0x10, bytearray([0x02, speed])) def getSpeed(): motorSpeed = i2c.read(0x10,4) return motorSpeed def pidInit(kp_ = 0, ki_ = 0, kd_ = 0,delays_ = 1): global kp, ki,kd, delays kp = kp_ ki = ki_ kd = kd_ delays = delays_ def getError(): err = 0 varLeft1 = pin1.read_digital() varLeft2 = pin14.read_digital() varLeft3 = pin13.read_digital() varRight1 = pin2.read_digital() varRight2 = pin15.read_digital() varRight3 = pin16.read_digital() if (varLeft1 == 1 and varRight1 == 0 and varLeft2 == 0): err = 1 elif (varLeft2 == 1 and varLeft1 == 1): err = 2 elif (varLeft2 == 1 and varLeft1 == 0 and varLeft3 == 0): err = 3 elif (varLeft3 == 1 and varLeft2 == 1): err = 4 elif (varLeft3 == 1 and varLeft2 == 0): err = 5 elif (varRight1 == 1 and varLeft1 == 0 and varRight2 == 0): err = -1 elif (varRight1 == 1 and varRight2 == 1): err = -2 elif (varRight2 == 1 and varRight1 == 0 and varRight3 == 0): err = -3 elif (varRight3 == 1 and varRight2 == 1): err = -4 elif (varRight3 == 1 and varRight2 == 0): err = -5 #print(err) return err def pidControl(): global preError,integral,delays,leftMotorSpeed,rightMotorSpeed global kd, ki, kd speedScale = 1 error = getError() if (error != 0): speedScale = 2/abs(error) if speedScale > 1: speedScale = 1 integral = integral + error derivative = error - preError output = (int)(kp*error + ki*integral*delays + kd*derivative/delays) print(output) preError = error leftMotorSpeed = int((k_speed - output)*speedScale) rightMotorSpeed = int((k_speed + output)*speedScale) if leftMotorSpeed < -speedMax: leftMotorSpeed = -speedMax elif leftMotorSpeed > speedMax: leftMotorSpeed = speedMax if rightMotorSpeed < -speedMax: rightMotorSpeed = -speedMax elif rightMotorSpeed > speedMax: rightMotorSpeed = speedMax setLeftMotor(leftMotorSpeed) setRightMotor(rightMotorSpeed) sleep(abs(error)*turnDelay) # test code pidInit(kp_ = 8, ki_ = 0.0, kd_ = 15, delays_ = 1) #setLeftMotor(60) #setRightMotor(60) while True: pidControl()
版本历史记录
Version | Date | Note [+]新增[-]删除[^]修复 |
---|---|---|
V1.4 | 2018/04/24 |