Files
mixly3/boards/default/micropython_robot/build/lib/rm_e1.py
2024-11-29 21:43:18 +08:00

175 lines
4.0 KiB
Python

"""
RM E1 -Onboard resources
MicroPython library for the RM E1 -Onboard resources
=======================================================
#Preliminary composition 20220703
dahanzimin From the Mixly Team
"""
import time,gc
#import ble_handle
from machine import Pin,SoftI2C,ADC,PWM,RTC
'''Bluetooth-handle'''
#handle=ble_handle.Handle()
'''i2c-onboard'''
onboard_i2c=SoftI2C(scl = Pin(22), sda = Pin(21), freq = 400000)
'''RTC'''
rtc_clock=RTC()
'''ACC-Sensor'''
class ACC:
def __init__(self,i2c_bus):
self._device = i2c_bus
self._address = 0x09
def _rreg(self,nbytes):
'''Read memory address'''
return self._device.readfrom(self._address, nbytes)
def acceleration(self):
data_reg=self._rreg(3)
return data_reg[0],data_reg[1],data_reg[2] #返回x y轴数值(0~180)及晃动值
try :
gyro=ACC(onboard_i2c)
except Exception as e:
print("Warning: Failed to communicate with ACC or",e)
'''2RGB_WS2812''' #color_chase(),rainbow_cycle()方法移至类里
from ws2812 import NeoPixel
onboard_rgb = NeoPixel(Pin(12), 2, default=1, timing=(450, 900, 850, 500))
'''3-Button'''
class Button:
def __init__(self, pin):
self._pin = Pin(pin, Pin.IN)
self._flag = True
def get_presses(self, delay = 1):
last_time,presses = time.time(), 0
while time.time() < last_time + delay:
time.sleep(0.05)
if self.was_pressed():
presses += 1
return presses
def is_pressed(self):
return self._pin.value() == False
def was_pressed(self):
if self._pin.value() != self._flag:
time.sleep(0.01)
self._flag = self._pin.value()
if self._flag:
return False
else:
return True
def irq(self, handler, trigger):
self._pin.irq(handler = handler, trigger = trigger)
button_p = Button(35)
button_cw = Button(39)
button_ccw = Button(36)
'''3-ADCSensor'''
class ADCSensor:
def __init__(self, pin):
self._adc=ADC(Pin(pin))
self._adc.atten(ADC.ATTN_11DB)
def read(self):
return self._adc.read_u16()
def voltage(self):
return round(self._adc.read_uv()*4.6/1000000,2)
adc1=ADCSensor(32)
adc2=ADCSensor(33)
'''ADC conflicts with WiFi'''
try:
battery=ADCSensor(26)
except:
class Clash:
def voltage(self):
print("Warning: battery power collection conflicts with WiFi")
return None
battery=Clash()
'''2-LED''' #Repair brightness adjustment range 0-100%
class LED:
def __init__(self, pin):
self._pin =PWM(Pin(pin),freq=5000,duty_u16=0)
self.setbrightness(0)
def value(self, val):
self.setonoff(val)
def setbrightness(self,val):
if not 0 <= val <= 100:
raise ValueError("Brightness must be in the range: 0-100%")
self._brightness=val
self._pin.duty_u16(val*65535//100)
def getbrightness(self):
return self._brightness
def setonoff(self,val):
if(val == -1):
self.setbrightness(100) if self._brightness<50 else self.setbrightness(0)
elif(val == 1):
self.setbrightness(100)
elif(val == 0):
self.setbrightness(0)
def getonoff(self):
return True if self._brightness>0 else False
rled = LED(2)
gled = LED(4)
'''3-Motor'''
class Motor:
def __init__(self, apin,bpin):
self._apin =PWM(Pin(apin),freq=5000,duty_u16=65535)
self._bpin =PWM(Pin(bpin),freq=5000,duty_u16=65535)
self.motion("P")
def motion(self,action,speed=0):
if action=="N":
self._apin.duty_u16(0)
self._bpin.duty_u16(0)
elif action=="P":
self._apin.duty_u16(65535)
self._bpin.duty_u16(65535)
elif action=="CW":
if speed >=0:
self._apin.duty_u16(speed*65535//100)
self._bpin.duty_u16(0)
else:
self._apin.duty_u16(0)
self._bpin.duty_u16(-speed*65535//100)
elif action=="CCW":
if speed >=0:
self._apin.duty_u16(0)
self._bpin.duty_u16(speed*65535//100)
else:
self._apin.duty_u16(-speed*65535//100)
self._bpin.duty_u16(0)
else:
raise ValueError('Invalid input, valid are "N","P","CW","CCW"')
motor1=Motor(23,27)
motor2=Motor(18,19)
motor3=Motor(13,14)
'''Reclaim memory'''
gc.collect()