feat: sync all micropython board configurations and scripts
This commit is contained in:
Binary file not shown.
Binary file not shown.
Binary file not shown.
Binary file not shown.
77
mixly/boards/default/micropython_esp32c3/build/lib/map.json
Normal file
77
mixly/boards/default/micropython_esp32c3/build/lib/map.json
Normal 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"
|
||||
}
|
||||
}
|
||||
55
mixly/boards/default/micropython_esp32c3/build/lib/me_g1.py
Normal file
55
mixly/boards/default/micropython_esp32c3/build/lib/me_g1.py
Normal 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()
|
||||
249
mixly/boards/default/micropython_esp32c3/build/lib/me_go.py
Normal file
249
mixly/boards/default/micropython_esp32c3/build/lib/me_go.py
Normal 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()
|
||||
231
mixly/boards/default/micropython_esp32c3/build/lib/mixgo_cc.py
Normal file
231
mixly/boards/default/micropython_esp32c3/build/lib/mixgo_cc.py
Normal 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()
|
||||
172
mixly/boards/default/micropython_esp32c3/build/lib/mixgo_me.py
Normal file
172
mixly/boards/default/micropython_esp32c3/build/lib/mixgo_me.py
Normal 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()
|
||||
@@ -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()
|
||||
Reference in New Issue
Block a user