175 lines
4.0 KiB
Python
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()
|