Extend:bitⅡ
来自Labplus盛思维基百科
概述
microbit拓展板,支持4路电机驱动、4路舵机驱动。内置声音传感器、光线传感器、无源蜂鸣器、2颗级联全彩RGB灯珠。
技术参数
- DC接口:Micro USB 可循环充电
- 采用18650锂电池
- PCI插槽,可接入micro:bit作为主控
- 支持4路舵机驱动和4路电机驱动,采用I2C通讯不占用引脚资源
- 拓展microbit引脚P0/1/2/5/8/11、I2C、UART
- 级联2颗全彩RGB灯珠ws2812
- 内置光线、声音传感器、无源蜂鸣器
- 最大负载电流:1.2A
引脚定义
内置 | micro:bit引脚 |
---|---|
无源蜂鸣器 | P0 |
光线传感器 | P1 |
声音传感器 | P2 |
全彩RGB灯 | P16 |
电机舵机驱动 | I2C |
UART | RXI->P14 TXO->P15 |
快速入门
Step1.教程:microbit怎么编程下载?
Step2.电机驱动:extend:bitⅡ插上micro:bit,接上马达。M1/M2/M3/M4,4路电机驱动,调速0~255
Step3.舵机驱动:S1/S2/S3/S4,4路舵机驱动;角度0~180;
Step4.蜂鸣器:在使用时蜂鸣器跳线帽须接上
Step5.RGB灯:2个串联灯珠,使用P16引脚控制
注意灯珠启始是从"0"开始的 |
Step6.光线、声音传感器:光线使用P1,声音使用P2在使用时光线、声音跳线帽须接上
Step7.P0/P1/P2/P5/P8/P11拓展引脚使用,注意在使用时候,当用到P0/P1/P2,需要取下对应引脚的跳线帽,断开extendbit与microbit的引脚连接!
注意 重新装载18650锂电池,第一次需要接上USB激活锂电池!
Python各功能测试例程
示例测试各模块功能:
1.上电蜂鸣器发出1KHz,持续1秒声音
2.RGB灯依次红绿蓝显示
3.串口打印输出声音和光线采样数据
4.4路电机驱动正反转和4路舵机180度摆动,间隔1秒
from microbit import * import music import neopixel PCA9685_ADDRESS = 0x41 #device address #define register MODE1 = 0x00 MODE2 = 0x01 SUBADR1 = 0x02 SUBADR2 = 0x03 SUBADR3 = 0x04 PRESCALE = 0xFE LED0_ON_L = 0x06 LED0_ON_H = 0x07 LED0_OFF_L = 0x08 LED0_OFF_H = 0x09 ALL_LED_ON_L = 0xFA ALL_LED_ON_H = 0xFB ALL_LED_OFF_L = 0xFC ALL_LED_OFF_H = 0xFD STP_CHA_L = 2047 STP_CHA_H = 4095 STP_CHB_L = 1 STP_CHB_H = 2047 STP_CHC_L = 1023 STP_CHC_H = 3071 STP_CHD_L = 3071 STP_CHD_H = 1023 # Servos define S1 = 0x01 S2 = 0x02 S3 = 0x03 S4 = 0x04 # Motors define M2 = 0x1 M1 = 0x2 M4 = 0x3 M3 = 0x4 # Steppers define STP_M1 = 0x1 STP_M2 = 0x2 FORWARD = 0 REVERSAL = 1 # device init def initPCA9685(): i2c.write(PCA9685_ADDRESS, bytearray([MODE1, 0x00])) setFreq(50) for idx in range(0, 16, 1): setPwm(idx, 0 ,0) #initialized = true # function: motorRun() # @param motor: M1A, M1B, M2A, M2B # @param speed1: -255 - 255 0 is stop def MotorRun(Motors, speed): speed = speed * 16 # map 255 to 4096 if (speed >= 4096): speed = 4095 if (speed <= -4096): speed = -4095 if (Motors <= 4 and Motors > 0): pp = (Motors - 1) * 2 pn = (Motors - 1) * 2 + 1 if (speed >= 0): setPwm(pp, 0, speed) setPwm(pn, 0, 0) else : setPwm(pp, 0, 0) setPwm(pn, 0, -speed) # function: motorRun() # @param Servos: S1, S2, S3, S4 # @param degree: 0-180 def Servo(Servos, degree): # 50hz: 20,000 us v_us = (degree * 1800 / 180 + 600) # 0.6 ~ 2.4ms value = int(v_us * 4096 / 20000) setPwm(Servos + 7, 0, value) #set frequency def setFreq(freq): #Constrain the frequency prescaleval = int(25000000/(4096*freq)) - 1 #prescale = prescaleval; #Math.Floor(prescaleval + 0.5) i2c.write(PCA9685_ADDRESS, bytearray([MODE1])) oldmode = i2c.read(PCA9685_ADDRESS, 1) newmode = (oldmode[0] & 0x7F) | 0x10 # sleep i2c.write(PCA9685_ADDRESS, bytearray([MODE1, newmode])) # go to sleep i2c.write(PCA9685_ADDRESS, bytearray([PRESCALE, prescaleval])) # set the prescaler i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0]])) sleep(4) i2c.write(PCA9685_ADDRESS, bytearray([MODE1, oldmode[0] | 0xa1])) # function: setPwm() def setPwm(channel, on, off): if (channel >= 0 and channel <= 15): buf = bytearray([LED0_ON_L + 4 * channel, on & 0xff, (on >> 8) & 0xff, off & 0xff, (off >> 8) & 0xff]) i2c.write(PCA9685_ADDRESS, buf) # function: setStepper() # for 2 phase 4 line step motor # @param stpMotors : STP_M1, STP_M2 # @param dir: FORWARD REVERSAL # @param speed: 25 - 200 def setStepper(stpMotors, dir, speed): spd = speed #print(spd) setFreq(spd) if (stpMotors == 1): #step motor 1 if (dir): # forward rotating setPwm(0, STP_CHA_L, STP_CHA_H) setPwm(1, STP_CHB_L, STP_CHB_H) setPwm(2, STP_CHC_L, STP_CHC_H) setPwm(3, STP_CHD_L, STP_CHD_H) else: # reversal rotating setPwm(3, STP_CHA_L, STP_CHA_H) setPwm(2, STP_CHB_L, STP_CHB_H) setPwm(1, STP_CHC_L, STP_CHC_H) setPwm(0, STP_CHD_L, STP_CHD_H) elif (stpMotors == 2): #step motor 2 if (dir): setPwm(4, STP_CHA_L, STP_CHA_H) setPwm(5, STP_CHB_L, STP_CHB_H) setPwm(6, STP_CHC_L, STP_CHC_H) setPwm(7, STP_CHD_L, STP_CHD_H) else: setPwm(7, STP_CHA_L, STP_CHA_H) setPwm(6, STP_CHB_L, STP_CHB_H) setPwm(5, STP_CHC_L, STP_CHC_H) setPwm(4, STP_CHD_L, STP_CHD_H) #test code initPCA9685() # setStepper(STP_M1, REVERSAL, 80) # test step motor np = neopixel.NeoPixel(pin16, 3) music.pitch(1000,1000) for i in range(0,3): np[i]=(255,0,0) np.show() sleep(1000) for i in range(0,3): np[i]=(0,255,0) np.show() sleep(1000) for i in range(0,3): np[i]=(0,0,255) np.show() sleep(1000) np.clear() t =running_time() flag=0 while True: print('light:',pin1.read_analog(),' Sound',pin2.read_analog()) sleep(20) if (running_time() - t) > 2000: t = running_time() flag= not flag if flag: MotorRun(M1, 255) MotorRun(M2, 255) MotorRun(M3, 255) MotorRun(M4, 255) #servo test for i in range(1, 5, 1): Servo(i, 180) else: MotorRun(M1, -255) MotorRun(M2, -255) MotorRun(M3, -255) MotorRun(M4, -255) for i in range(1, 5, 1): Servo(i, 0)
应用案例
- Example_1 extend:bitⅡ音量计
- Example_2 extend:bitⅡ音乐盒
- Example_3 extend:bitⅡ循迹小车
- Example_4 extend:bitⅡ变色龙
- Example_5 extend:bitⅡ植物检测器
版本历史记录
Version | Date | Note [+]新增[-]删除[^]修复 |
---|---|---|
V1.2 | 2018/04/24 | [^] 修改外观、布局 [^] 电池座改成18650 [^] ws2812灯珠改成2颗 [^] PCA9685 I2C地址由0x40改为0x41 |