feat: sync all micropython board configurations and scripts

This commit is contained in:
yczpf2019
2026-01-24 16:14:43 +08:00
parent c6dc5537f0
commit 6dce82e125
2066 changed files with 113326 additions and 0 deletions

View File

@@ -0,0 +1,77 @@
{
"me_g1": {
"__require__": [
"time",
"gc",
"machine",
"hp203x",
"ahtx0",
"rc522"
],
"__file__": true,
"__size__": 1327,
"__name__": "me_g1.py"
},
"me_go": {
"__require__": [
"time",
"gc",
"math",
"tm1931",
"machine"
],
"__file__": true,
"__size__": 8787,
"__name__": "me_go.py"
},
"mixgocar_c3": {
"__require__": [
"time",
"gc",
"ms32006",
"machine",
"ws2812",
"music"
],
"__file__": true,
"__size__": 9735,
"__name__": "mixgocar_c3.py"
},
"mixgo_cc": {
"__require__": [
"time",
"gc",
"machine",
"ws2812",
"music",
"mxc6655xa",
"ltr553als",
"rc522",
"matrix32x12",
"mmc5603",
"hp203x",
"spl06_001",
"ahtx0",
"shtc3"
],
"__file__": true,
"__size__": 6824,
"__name__": "mixgo_cc.py"
},
"mixgo_me": {
"__require__": [
"time",
"gc",
"machine",
"ws2812",
"music",
"mxc6655xa",
"ltr553als",
"matrix8x5",
"mmc5603"
],
"__file__": true,
"__size__": 4790,
"__name__": "mixgo_me.py"
}
}

View File

@@ -0,0 +1,55 @@
"""
ME G1 -MixGo ME EXT G1
MicroPython library for the ME G1 (Expansion board for MixGo ME)
=======================================================
#Preliminary composition 20230110
dahanzimin From the Mixly Team
"""
import time,gc
from machine import Pin,SoftI2C,ADC
'''i2c-extboard'''
ext_i2c=SoftI2C(scl = Pin(0), sda = Pin(1), freq = 400000)
Pin(0,Pin.OUT)
'''Atmos_Sensor'''
try :
import hp203x
ext_hp203x = hp203x.HP203X(ext_i2c)
except Exception as e:
print("Warning: Failed to communicate with HP203X or",e)
'''T&H_Sensor'''
try :
import ahtx0
ext_ahtx0 = ahtx0.AHTx0(ext_i2c)
except Exception as e:
print("Warning: Failed to communicate with AHTx0 or",e)
'''RFID_Sensor'''
try :
import rc522
ext_rc522 = rc522.RC522(ext_i2c)
except Exception as e:
print("Warning: Failed to communicate with RC522 or",e)
'''Knob_Sensor'''
def varistor():
adc = ADC(Pin(0))
adc.atten(ADC.ATTN_11DB)
time.sleep_ms(1)
values = []
for _ in range(100):
values.append(adc.read_u16())
time.sleep_us(100)
result = sum(sorted(values)[25:75])//50
Pin(0,Pin.OUT)
time.sleep_ms(1)
return max((result-10100),0)*65535//55435
'''Reclaim memory'''
gc.collect()

View File

@@ -0,0 +1,249 @@
"""
ME GO -Onboard resources
MicroPython library for the ME GO (Smart Car base for MixGo ME)
=======================================================
#Preliminary composition 20220625
dahanzimin From the Mixly Team
"""
import time, gc, math
from tm1931 import TM1931
from machine import Pin, SoftI2C, ADC
'''i2c-onboard'''
i2c = SoftI2C(scl = Pin(7), sda = Pin(6), freq = 400000)
i2c_scan = i2c.scan()
'''Version judgment'''
if 0x50 in i2c_scan:
version = 1
else:
version = 0
'''Judging the type of external motor'''
Mi2c = 0
for addr in i2c_scan:
if addr in [0x30, 0x31, 0x32, 0x33]:
Mi2c = addr
break
'''i2c-motor'''
def i2c_motor(speed):
i2c.writeto(Mi2c, b'\x00\x00' + speed.to_bytes(1, 'little') + b'\x00')
'''TM1931-Expand'''
class CAR(TM1931):
'''Infrared line patrol obstacle avoidance mode'''
CL=0 #Turn off infrared to reduce power consumption
OA=1 #Obstacle avoidance mode only
LP=2 #Line patrol mode only
LS=3 #Light seeking mode only
AS=4 #Automatic mode switching
'''TM1931 port corresponding function definition'''
OAOU=5 #obstacle avoidance
LPOU=4 #Line patrol control
LSOU=3 #Light control
WLED=12 #Headlamp port
GLED=[17,8,6,15] #Green LED port
RLED=[16,7,9,18] #Red LED port
UCOU=[1,2] #Typec external port
MOTO=[[13,14],[10,11],[1,2]] #Motor port
def __init__(self, i2c_bus):
super().__init__(i2c_bus)
self._mode = self.CL
self.atten = 0.82 if version else 1
self.adc0 = ADC(Pin(0), atten=ADC.ATTN_11DB)
self.adc1 = ADC(Pin(1), atten=ADC.ATTN_11DB)
self.adc2 = ADC(Pin(2), atten=ADC.ATTN_11DB)
self.adc3 = ADC(Pin(3), atten=ADC.ATTN_11DB)
def ir_mode(self,select=0):
'''Infrared line patrol obstacle avoidance mode'''
self._mode=select
if select==self.CL:
self.pwm(self.OAOU,0)
self.pwm(self.LPOU,0)
self.pwm(self.LSOU,0)
if select==self.OA:
self.pwm(self.OAOU,255)
self.pwm(self.LPOU,0)
self.pwm(self.LSOU,0)
if select==self.LP:
self.pwm(self.OAOU,0)
self.pwm(self.LPOU,255)
self.pwm(self.LSOU,0)
if select==self.LS:
self.pwm(self.OAOU,0)
self.pwm(self.LPOU,0)
self.pwm(self.LSOU,255)
time.sleep_ms(2)
def obstacle(self):
'''Read the obstacle avoidance sensor'''
if self._mode==self.AS:
self.pwm(self.OAOU,255)
self.pwm(self.LPOU,0)
self.pwm(self.LSOU,0)
time.sleep_ms(2)
if self._mode==self.OA or self._mode==self.AS :
return self.adc2.read_u16(),self.adc1.read_u16(),self.adc0.read_u16(),self.adc3.read_u16()
else:
raise ValueError('Mode selection error, obstacle avoidance data cannot be read')
def patrol(self):
'''Read the line patrol sensor'''
if self._mode==self.AS:
self.pwm(self.OAOU,0)
self.pwm(self.LPOU,255)
self.pwm(self.LSOU,0)
time.sleep_ms(2)
if self._mode==self.LP or self._mode==self.AS:
return self.adc3.read_u16(),self.adc2.read_u16(),self.adc1.read_u16(),self.adc0.read_u16()
else:
raise ValueError('Mode selection error, line patrol data cannot be read')
def light(self):
'''Read the light seeking sensor'''
if self._mode==self.AS:
self.pwm(self.OAOU,0)
self.pwm(self.LPOU,0)
self.pwm(self.LSOU,255)
time.sleep_ms(2)
if self._mode==self.LS or self._mode==self.AS:
return self.adc3.read_u16(),self.adc2.read_u16(),self.adc1.read_u16(),self.adc0.read_u16()
else:
raise ValueError('Mode selection error, light seeking data cannot be read')
def motor(self, index, action, speed=0):
speed = round(max(min(speed, 100), -100) * self.atten)
if action=="N":
if (index == [1, 2]) and Mi2c:
i2c_motor(0)
else:
self.pwm(index[0], 255)
self.pwm(index[1], 255)
elif action=="P":
if (index == [1, 2]) and Mi2c:
i2c_motor(0)
else:
self.pwm(index[0], 0)
self.pwm(index[1], 0)
elif action=="CW":
if (index == [1, 2]) and Mi2c:
i2c_motor(speed)
else:
if speed >= 0:
self.pwm(index[0], speed * 255 // 100)
self.pwm(index[1], 0)
else:
self.pwm(index[0], 0)
self.pwm(index[1], - speed * 255 // 100)
elif action=="CCW":
if (index == [1, 2]) and Mi2c:
i2c_motor(- speed)
else:
if speed >= 0:
self.pwm(index[0], 0)
self.pwm(index[1], speed * 255 // 100)
else:
self.pwm(index[0], - speed * 255 // 100)
self.pwm(index[1], 0)
else:
raise ValueError('Invalid input, valid are "N","P","CW","CCW"')
def move(self,action,speed=100):
if action=="N":
self.motor(self.MOTO[0],"N")
self.motor(self.MOTO[1],"N")
elif action=="P":
self.motor(self.MOTO[0],"P")
self.motor(self.MOTO[1],"P")
elif action=="F":
self.motor(self.MOTO[0],"CCW",speed)
self.motor(self.MOTO[1],"CW",speed)
elif action=="B":
self.motor(self.MOTO[0],"CW",speed)
self.motor(self.MOTO[1],"CCW",speed)
elif action=="L":
self.motor(self.MOTO[0],"CW",speed)
self.motor(self.MOTO[1],"CW",speed)
elif action=="R":
self.motor(self.MOTO[0],"CCW",speed)
self.motor(self.MOTO[1],"CCW",speed)
else:
raise ValueError('Invalid input, valid are "N","P","F","B","L","R"')
def setbrightness(self,index,val):
if not 0 <= val <= 100:
raise ValueError("Brightness must be in the range: 0-100%")
self.pwm(index,val)
def getrightness(self,index):
return self.duty(index)
def setonoff(self,index,val):
if(val == -1):
if self.getrightness(index) < 50:
self.setbrightness(index,100)
else:
self.setbrightness(index,0)
elif(val == 1):
self.setbrightness(index,100)
elif(val == 0):
self.setbrightness(index,0)
def getonoff(self,index):
return True if self.getrightness(index)>0 else False
try :
car=CAR(i2c) #Including LED,motor,patrol,obstacle
except Exception as e:
print("Warning: Failed to communicate with TM1931 (ME GO CAR) or", e)
'''2Hall_HEP'''
class HALL:
_pulse_turns=1/480 if version else 1/400 #圈数= 1/(减速比*磁极)
_pulse_distance=_pulse_turns*math.pi*4.4 #距离= 圈数*π*轮胎直径
def __init__(self, pin):
self.turns = 0
self.distance = 0 #cm
self._speed = 0 #cm/s
self._on_receive = None
self._time = time.ticks_ms()
Pin(pin, Pin.IN).irq(handler=self._receive_cb, trigger = (Pin.IRQ_RISING | Pin.IRQ_FALLING))
def _receive_cb(self, event_source):
self.turns += self._pulse_turns
self.distance += self._pulse_distance
self._speed += self._pulse_distance
if self._on_receive:
self._on_receive(round(self.turns,2),round(self.distance,2))
def irq_cb(self, callback):
self._on_receive = callback
def initial(self,turns=None,distance=None):
if not (turns is None):
self.turns = turns
if not (distance is None):
self.distance = distance
@property
def speed(self):
value=self._speed/time.ticks_diff(time.ticks_ms(), self._time)*1000 if self._speed>0 else 0
self._time = time.ticks_ms()
self._speed=0
return round(value, 2)
hall_A = HALL(20)
hall_B = HALL(21)
'''Reclaim memory'''
gc.collect()

View File

@@ -0,0 +1,231 @@
"""
MixGo CC Onboard resources
MicroPython library for the MixGo CC Onboard resources
=======================================================
@dahanzimin From the Mixly Team
"""
import time, gc
from machine import *
'''i2c-onboard'''
onboard_i2c=SoftI2C(scl = Pin(7), sda = Pin(6), freq = 400000)
onboard_i2c_scan = onboard_i2c.scan()
'''Version judgment'''
if 0x73 in onboard_i2c_scan:
version=1
elif 0x72 in onboard_i2c_scan:
version=0
else:
print("Warning: Mixgo CC board is not detected, which may cause usage errors")
'''RTC'''
rtc_clock=RTC()
'''ACC-Sensor'''
try :
import mxc6655xa
onboard_acc = mxc6655xa.MXC6655XA(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with MXC6655XA (ACC) or",e)
'''ALS_PS-Sensor'''
try :
import ltr553als
onboard_als = ltr553als.LTR_553ALS(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with TR_553ALS (ALS&PS) or",e)
'''BPS_Sensor'''
if 0x76 in onboard_i2c_scan:
try :
import hp203x
onboard_bps = hp203x.HP203X(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with HP203X (BPS) or",e)
if 0x77 in onboard_i2c_scan:
try :
import spl06_001
onboard_bps = spl06_001.SPL06(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with SPL06-001 (BPS) or",e)
'''T&H_Sensor'''
if 0x38 in onboard_i2c_scan:
try :
import ahtx0
onboard_ths = ahtx0.AHTx0(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with AHTx0 (THS) or",e)
if 0x70 in onboard_i2c_scan:
try :
import shtc3
onboard_ths = shtc3.SHTC3(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with GXHTC3 (THS) or",e)
'''RFID_Sensor'''
try :
import rc522
onboard_rfid = rc522.RC522(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with RC522 (RFID) or",e)
'''matrix32x12'''
try :
import matrix32x12
onboard_matrix = matrix32x12.Matrix(onboard_i2c, address=0x73 if version else 0x72)
except Exception as e:
print("Warning: Failed to communicate with Matrix32X12 or",e)
'''Magnetic'''
try :
import mmc5603
onboard_mgs = mmc5603.MMC5603(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with MMC5603 (MGS) or",e)
'''2RGB_WS2812'''
from ws2812 import NeoPixel
onboard_rgb = NeoPixel(Pin(8), 4, ORDER=(0, 1, 2, 3))
'''1Buzzer-Music'''
from music import MIDI
onboard_music = MIDI(10)
'''MIC_Sensor'''
class MICSensor:
def __init__(self,pin):
self.adc=ADC(Pin(pin), atten=ADC.ATTN_11DB)
def read(self):
maxloudness = 0
for i in range(5):
loudness = self.sample()
if loudness > maxloudness:
maxloudness = loudness
return maxloudness
def sample(self):
values = []
for i in range(50):
val = self.adc.read_u16()
values.append(val)
return max(values) - min(values)
onboard_sound = MICSensor(pin=4 if version else 3)
'''5KEY_Sensor'''
class KEYSensor:
def __init__(self, pin, range):
self.pin = pin
self.adc = ADC(Pin(pin), atten=ADC.ATTN_11DB)
self.range = range
self.flag = True
def _value(self):
values = []
for _ in range(25):
try:
values.append(self.adc.read())
except: #IDF>5.2.2存在ADC2问题
pass
time.sleep_us(5)
return (self.range-200) < min(values) < (self.range+200)
def get_presses(self, delay = 1):
last_time,presses = time.time(), 0
while time.time() < last_time + delay:
time.sleep_ms(50)
if self.was_pressed():
presses += 1
return presses
def is_pressed(self):
return self._value()
def was_pressed(self):
if(self._value() != self.flag):
self.flag = self._value()
if self.flag:
return True
else:
return False
def irq(self, handler, trigger):
Pin(self.pin, Pin.IN).irq(handler = handler, trigger = trigger)
'''1KEY_Button'''
class Button(KEYSensor):
def __init__(self, pin):
self.pin = pin
self.key = Pin(pin, Pin.IN)
self.flag = True
def _value(self):
return not self.key.value()
if version==0:
B1key = Button(9)
B2key = Button(4)
A1key = KEYSensor(2,20)
A2key = KEYSensor(2,1170)
A3key = KEYSensor(2,2400)
A4key = KEYSensor(2,3610)
else:
B1key = Button(9)
B2key = KEYSensor(5,20)
A1key = KEYSensor(5,800)
A2key = KEYSensor(5,1600)
A3key = KEYSensor(5,2500)
A4key = KEYSensor(5,3500)
'''2-LED''' #Modify indexing method
class LED:
def __init__(self, pins=[]):
self._pins = pins
self._flag = [True] * len(pins)
self._brightness = [0] * len(pins)
def setbrightness(self, index, val):
if not 0 <= val <= 100:
raise ValueError("Brightness must be in the range: 0-100%")
if len(self._pins) == 0:
print("Warning: Old version, without this function")
else:
if self._flag[index-1]:
self._pins[index-1] = PWM(Pin(self._pins[index-1]), duty_u16=65535)
self._flag[index-1] = False
self._brightness[index - 1] = val
self._pins[index - 1].duty_u16(65535 - val * 65535 // 100)
def getbrightness(self, index):
if len(self._pins) == 0:
print("Warning: Old version, without this function")
else:
return self._brightness[index - 1]
def setonoff(self, index, val):
if len(self._pins) == 0:
print("Warning: Old version, without this function")
else:
if val == -1:
self.setbrightness(index, 100) if self.getbrightness(index) < 50 else self.setbrightness(index, 0)
elif val == 1:
self.setbrightness(index, 100)
elif val == 0:
self.setbrightness(index, 0)
def getonoff(self, index):
if len(self._pins) == 0:
print("Warning: Old version, without this function")
else:
return True if self.getbrightness(index) > 50 else False
#LED with function call / L1(IO20),L2(IO21)
onboard_led = LED() if version == 0 else LED(pins=[20, 21])
'''Reclaim memory'''
gc.collect()

View File

@@ -0,0 +1,172 @@
"""
MixGo ME Onboard resources
MicroPython library for the MixGo ME Onboard resources
=======================================================
@dahanzimin From the Mixly Team
"""
import time, gc
from machine import *
'''i2c-onboard'''
onboard_i2c=SoftI2C(scl = Pin(7), sda = Pin(6), freq = 400000)
'''RTC'''
rtc_clock=RTC()
'''ACC-Sensor'''
try :
import mxc6655xa
onboard_acc = mxc6655xa.MXC6655XA(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with MXC6655XA or",e)
'''ALS_PS-Sensor'''
try :
import ltr553als
onboard_als = ltr553als.LTR_553ALS(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with LTR_553ALS or",e)
'''Matrix8x5'''
try :
import matrix8x5
onboard_matrix = matrix8x5.Matrix(8)
except Exception as e:
print("Warning: Failed to communicate with Matrix8x5 or",e)
'''Magnetic'''
try :
import mmc5603
onboard_mgs = mmc5603.MMC5603(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with MMC5603 or",e)
'''2RGB_WS2812'''
from ws2812 import NeoPixel
onboard_rgb = NeoPixel(Pin(9), 2, ORDER=(0, 1, 2, 3), multiplex=1)
'''1Buzzer-Music'''
from music import MIDI
onboard_music = MIDI(10)
'''MIC_Sensor'''
class MICSensor:
def __init__(self):
self.adc=ADC(Pin(4), atten=ADC.ATTN_11DB)
def read(self):
maxloudness = 0
for i in range(5):
loudness = self.sample()
if loudness > maxloudness:
maxloudness = loudness
return maxloudness
def sample(self):
values = []
for i in range(50):
val = self.adc.read_u16()
values.append(val)
return max(values) - min(values)
onboard_sound = MICSensor()
'''5KEY_Sensor'''
class KEYSensor:
def __init__(self, pin, range):
self.pin = pin
self.adc = ADC(Pin(pin), atten=ADC.ATTN_11DB)
self.range = range
self.flag = True
def _value(self):
values = []
for _ in range(25):
try:
values.append(self.adc.read())
except: #IDF>5.2.2存在ADC2问题
pass
time.sleep_us(5)
return (self.range-200) < min(values) < (self.range+200)
def get_presses(self, delay = 1):
last_time,presses = time.time(), 0
while time.time() < last_time + delay:
time.sleep_ms(50)
if self.was_pressed():
presses += 1
return presses
def is_pressed(self):
return self._value()
def was_pressed(self):
if(self._value() != self.flag):
self.flag = self._value()
if self.flag:
return True
else:
return False
def irq(self, handler, trigger):
Pin(self.pin, Pin.IN).irq(handler = handler, trigger = trigger)
'''1KEY_Button'''
class Button(KEYSensor):
def __init__(self, pin):
self.pin = pin
self.key = Pin(pin, Pin.IN)
self.flag = True
def _value(self):
return not self.key.value()
B1key = Button(9)
B2key = KEYSensor(5,20)
A1key = KEYSensor(5,800)
A2key = KEYSensor(5,1600)
A3key = KEYSensor(5,2500)
A4key = KEYSensor(5,3500)
'''2LED-Multiplex RGB'''
class LED:
def __init__(self, rgb, num=2, color=3):
self._rgb = rgb
self._col = [color] * num
self._color = ((0, 0, 0), (1, 0, 0), (0, 1, 0), (0, 0, 1), (1, 1, 0), (0, 1, 1), (1, 0, 1), (1, 1, 1))
def setbrightness(self, index, value):
self._rgb[index - 1] = (value if self._color[self._col[index-1]][0] else 0,
value if self._color[self._col[index-1]][1] else 0,
value if self._color[self._col[index-1]][2] else 0)
self._rgb.write()
def getbrightness(self, index):
color = self._rgb[index - 1]
return color[0] | color[1] | color[2]
def setonoff(self, index, value):
if value == -1:
if self.getbrightness(index) < 50:
self.setbrightness(index, 100)
else:
self.setbrightness(index, 0)
elif value == 1:
self.setbrightness(index, 100)
elif value == 0:
self.setbrightness(index, 0)
def getonoff(self, index):
return True if self.getbrightness(index) > 50 else False
def setcolor(self, index, color):
self._col[index-1] = color
def getcolor(self, index):
return self._col[index-1]
onboard_led=LED(onboard_rgb)
'''Reclaim memory'''
gc.collect()

View File

@@ -0,0 +1,251 @@
"""
MixGo CAR -Onboard resources
MicroPython library for the MixGo CAR (ESP32C3)
=======================================================
@dahanzimin From the Mixly Team
"""
import time,gc,ms32006
from machine import *
'''RTC'''
rtc_clock=RTC()
'''i2c-onboard'''
onboard_i2c=SoftI2C(scl = Pin(7), sda = Pin(6), freq = 400000)
'''4RGB_WS2812'''
from ws2812 import NeoPixel
onboard_rgb = NeoPixel(Pin(8), 4, ORDER=(0, 1, 2, 3))
'''1Buzzer-Music'''
from music import MIDI
onboard_music =MIDI(5)
'''1KEY_Button'''
class Button:
def __init__(self, pin):
self.pin = Pin(pin, Pin.IN)
self.flag = True
def get_presses(self, delay = 1):
last_time, last_state, presses = time.time(), 0, 0
while time.time() < last_time + delay:
time.sleep_ms(50)
if last_state == 0 and self.pin.value() == 1:
last_state = 1
if last_state == 1 and self.pin.value() == 0:
last_state, presses = 0, presses + 1
return presses
def is_pressed(self):
return not self.pin.value()
def was_pressed(self, flag = 0):
if(self.pin.value() != self.flag):
self.flag = self.pin.value()
time.sleep(0.02)
if self.flag:
return False
else:
return True
def irq(self, handler, trigger):
self.pin.irq(handler = handler, trigger = trigger)
button = Button(9)
'''MS32006-Drive'''
class CAR:
MOTO_R =1
MOTO_R1 =0
MOTO_R2 =7
MOTO_L =2
MOTO_L1 =4
MOTO_L2 =3
def __init__(self, i2c_bus):
self.motor_a=ms32006.MS32006(i2c_bus,ms32006.ADDRESS_A)
self.motor_b=ms32006.MS32006(i2c_bus,ms32006.ADDRESS_B)
self.motor_move("P")
def motor(self,index,action,speed=0):
if action=="N":
if index==self.MOTO_R:
self.motor_a.dc_motor(ms32006.MOT_N,speed)
if index==self.MOTO_L:
self.motor_b.dc_motor(ms32006.MOT_N,speed)
elif action=="P":
if index==self.MOTO_R:
self.motor_a.dc_motor(ms32006.MOT_P,speed)
if index==self.MOTO_L:
self.motor_b.dc_motor(ms32006.MOT_P,speed)
elif action=="CW":
if index==self.MOTO_R:
self.motor_a.dc_motor(ms32006.MOT_CW,speed)
if index==self.MOTO_L:
self.motor_b.dc_motor(ms32006.MOT_CW,speed)
elif action=="CCW":
if index==self.MOTO_R:
self.motor_a.dc_motor(ms32006.MOT_CCW,speed)
if index==self.MOTO_L:
self.motor_b.dc_motor(ms32006.MOT_CCW,speed)
else:
raise ValueError('Invalid input, valid are "N","P","CW","CCW"')
def stepper(self,index,action,mot_pps,mot_step):
if action=="N":
if index==self.MOTO_R1 or index==self.MOTO_L1:
self.motor_a.close(index)
if index==self.MOTO_R2 or index==self.MOTO_L2:
self.motor_b.close(index-3)
elif action=="P":
if index==self.MOTO_R1 or index==self.MOTO_L1:
self.motor_a.stop(index)
if index==self.MOTO_R2 or index==self.MOTO_L2:
self.motor_b.stop(index-3)
elif action=="CW":
if index==self.MOTO_R1 or index==self.MOTO_L1:
self.motor_a.move(index,ms32006.MOT_CW,mot_pps,mot_step)
if index==self.MOTO_R2 or index==self.MOTO_L2:
self.motor_b.move(index-3,ms32006.MOT_CW,mot_pps,mot_step)
elif action=="CCW":
if index==self.MOTO_R1 or index==self.MOTO_L1:
self.motor_a.move(index,ms32006.MOT_CCW,mot_pps,mot_step)
if index==self.MOTO_R2 or index==self.MOTO_L2:
self.motor_b.move(index-3,ms32006.MOT_CCW,mot_pps,mot_step)
else:
raise ValueError('Invalid input, valid are "N","P","CW","CCW"')
def stepper_readwork(self,index):
if index==self.MOTO_R1 or index==self.MOTO_L1:
return self.motor_a.readwork(index)
if index==self.MOTO_R2 or index==self.MOTO_L2:
return self.motor_b.readwork(index-3)
def stepper_move(self,action,mot_pps,mot_step):
if action=="N":
self.motor_a.close(self.MOTO_R1)
self.motor_a.close(self.MOTO_R2-3)
self.motor_b.close(self.MOTO_L1)
self.motor_b.close(self.MOTO_L2-3)
elif action=="P":
self.motor_a.stop(self.MOTO_R1)
self.motor_a.stop(self.MOTO_R2-3)
self.motor_b.stop(self.MOTO_L1)
self.motor_b.stop(self.MOTO_L2-3)
elif action=="F":
self.motor_a.move(self.MOTO_R1,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_a.move(self.MOTO_R2-3,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L1,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L2-3,ms32006.MOT_CCW,mot_pps,mot_step)
elif action=="B":
self.motor_a.move(self.MOTO_R1,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_a.move(self.MOTO_R2-3,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L1,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L2-3,ms32006.MOT_CW,mot_pps,mot_step)
elif action=="L":
self.motor_a.move(self.MOTO_R1,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_a.move(self.MOTO_R2-3,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L1,ms32006.MOT_CCW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L2-3,ms32006.MOT_CCW,mot_pps,mot_step)
elif action=="R":
self.motor_a.move(self.MOTO_R1,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_a.move(self.MOTO_R2-3,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L1,ms32006.MOT_CW,mot_pps,mot_step)
self.motor_b.move(self.MOTO_L2-3,ms32006.MOT_CW,mot_pps,mot_step)
else:
raise ValueError('Invalid input, valid are "N","P","F","B","L","R"')
def motor_move(self,action,speed=100):
if action=="N":
self.motor_a.dc_motor(ms32006.MOT_N,speed)
self.motor_b.dc_motor(ms32006.MOT_N,speed)
elif action=="P":
self.motor_a.dc_motor(ms32006.MOT_P,speed)
self.motor_b.dc_motor(ms32006.MOT_P,speed)
elif action=="F":
self.motor_a.dc_motor(ms32006.MOT_CCW,speed)
self.motor_b.dc_motor(ms32006.MOT_CW,speed)
elif action=="B":
self.motor_a.dc_motor(ms32006.MOT_CW,speed)
self.motor_b.dc_motor(ms32006.MOT_CCW,speed)
elif action=="L":
self.motor_a.dc_motor(ms32006.MOT_CCW,speed)
self.motor_b.dc_motor(ms32006.MOT_CCW,speed)
elif action=="R":
self.motor_a.dc_motor(ms32006.MOT_CW,speed)
self.motor_b.dc_motor(ms32006.MOT_CW,speed)
else:
raise ValueError('Invalid input, valid are "N","P","F","B","L","R"')
try :
car=CAR(onboard_i2c) #Including LED,motor,patrol,obstacle
except Exception as e:
print("Warning: Failed to communicate with MS32006 or",e)
'''IRtube-Drive'''
class IRtube:
OA=1 #Obstacle avoidance mode only
LP=2 #Line patrol mode only
AS=3 #Automatic mode switching
def __init__(self):
#auto是否手动切换模拟开关转换
self.adc0 = ADC(Pin(0))
self.adc1 = ADC(Pin(1))
self.adc2 = ADC(Pin(3))
self.adc3 = ADC(Pin(4))
self.adc0.atten(ADC.ATTN_11DB)
self.adc1.atten(ADC.ATTN_11DB)
self.adc2.atten(ADC.ATTN_11DB)
self.adc3.atten(ADC.ATTN_11DB)
self.convert=Pin(2, Pin.OUT)
self._mode=self.AS
def read_bat(self):
#读电池电量,返回电压值
self.convert = ADC(Pin(2))
self.convert.atten(ADC.ATTN_11DB)
time.sleep_ms(5)
bat_adc=self.convert.read()*0.0011
time.sleep_ms(5)
self.convert=Pin(2, Pin.OUT)
return bat_adc
def obstacle(self):
#读避障传感器,返回前左、右后左、右ADC值
if self._mode==self.AS:
self.convert.value(0)
time.sleep_ms(2)
if self._mode==self.OA or self._mode==self.AS :
return self.adc1.read_u16(),self.adc2.read_u16(),self.adc3.read_u16(),self.adc0.read_u16()
else:
raise ValueError('In line patrol mode, obstacle avoidance data cannot be read')
def patrol(self):
#读巡线传感器,返回左、中左、中右、右ADC值
if self._mode==self.AS:
self.convert.value(1)
time.sleep_ms(2)
if self._mode==self.LP or self._mode==self.AS:
return self.adc0.read_u16(),self.adc1.read_u16(),self.adc2.read_u16(),self.adc3.read_u16()
else:
raise ValueError('In obstacle avoidance mode, line patrol data cannot be read')
def ir_mode(self,select=0):
#切换模式
self._mode=select
if select==self.OA:
self.convert.value(0)
if select==self.LP:
self.convert.value(1)
time.sleep_ms(2)
onboard_info = IRtube()
'''Reclaim memory'''
gc.collect()