dcexpert

个性签名:一起来玩 microbit/micropython

  • 2019-07-20
  • 回复了主题帖: 急求高手指点 AD15 破解后打不开PCB

    试试AD20吧

  • 回复了主题帖: X-NUCLEO-IKS01A3的MicroPython驱动合集

    传感器驱动在GitHub上的网址:   https://github.com/micropython-Chinese-Community/mpy-lib/tree/master/sensor

  • 发表了主题帖: X-NUCLEO-IKS01A3的MicroPython驱动合集

    为了方便大家查看,将6种传感器的MicroPython驱动收集在一起,方便参考和使用。 LSM6DSO的MicroPython驱动移植 LIS2DW12运动传感器的MicroPython驱动移植 LIS2MDL磁场传感器的MicroPython驱动移植 LPS22的micropython驱动 STTS751的MicroPython驱动移植 MicroPython的HTS221驱动移植  

  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之三3D加速度LIS2DW12传感器测...

    hujj 发表于 2019-7-20 09:34 测试和判断都是直接用范例的代码(参见帖子中的代码),调用IKS01A3_MOTION_SENSOR_Get_6D_Orientation_X ...
    这样的确非常简单

  • 回复了主题帖: LSM6DSO的MicroPython驱动移植

    驱动在github上的网址,以后更新会同步到github上。   https://github.com/micropython-Chinese-Community/mpy-lib/tree/master/sensor/LSM6DSO  

  • 回复了主题帖: LSM6DSO的MicroPython驱动移植

    使用方法: from machine import I2C import LSM6DSO i2c = I2C(1) lsm = LSM6DSO.LSM6DSO(i2c) lsm.ax() lsm.get_a() lsm.get()   回调函数: from machine import I2C from pyb import Timer import LSM6DSO i2c = I2C(1) lsm = LSM6DSO.LSM6DSO(i2c) lsm.ax() lsm.get_a() lsm.get() def tim_irq(t): print(lsm.get(), lsm.temperature()) tim = Timer(1, freq = 1) tim.callback(tim_irq)  

  • 回复了主题帖: LSM6DSO的MicroPython驱动移植

     完整的驱动 # LSM6DSO 3D accelerometer and 3D gyroscope seneor micropython drive # ver: 1.0 # License: MIT # Author: shaoziyang (shaoziyang@micropython.org.cn) # v1.0 2019.7 LSM6DSO_CTRL1_XL = const(0x10) LSM6DSO_CTRL2_G = const(0x11) LSM6DSO_CTRL3_C = const(0x12) LSM6DSO_CTRL6_C = const(0x15) LSM6DSO_CTRL8_XL = const(0x17) LSM6DSO_STATUS = const(0x1E) LSM6DSO_OUT_TEMP_L = const(0x20) LSM6DSO_OUTX_L_G = const(0x22) LSM6DSO_OUTY_L_G = const(0x24) LSM6DSO_OUTZ_L_G = const(0x26) LSM6DSO_OUTX_L_A = const(0x28) LSM6DSO_OUTY_L_A = const(0x2A) LSM6DSO_OUTZ_L_A = const(0x2C) LSM6DSO_SCALEA = ('2g', '16g', '4g', '8g') LSM6DSO_SCALEG = ('250', '125', '500', '', '1000', '', '2000') class LSM6DSO(): def __init__(self, i2c, addr = 0x6B): self.i2c = i2c self.addr = addr self.tb = bytearray(1) self.rb = bytearray(1) self.oneshot = False self.irq_v = [[0, 0, 0], [0, 0, 0]] self._power = True self._power_a = 0x10 self._power_g = 0x10 # ODR_XL=1 FS_XL=0 self.setreg(LSM6DSO_CTRL1_XL, 0x10) # ODR_G=1 FS_125=1 self.setreg(LSM6DSO_CTRL2_G, 0x12) # BDU=1 IF_INC=1 self.setreg(LSM6DSO_CTRL3_C, 0x44) self.setreg(LSM6DSO_CTRL8_XL, 0) # scale=2G self._scale_a = 0 self._scale_g = 0 self.scale_a('2g') self.scale_g('125') def int16(self, d): return d if d < 0x8000 else d - 0x10000 def setreg(self, reg, dat): self.tb[0] = dat self.i2c.writeto_mem(self.addr, reg, self.tb) def getreg(self, reg): self.i2c.readfrom_mem_into(self.addr, reg, self.rb) return self.rb[0] def get2reg(self, reg): return self.getreg(reg) + self.getreg(reg+1) * 256 def r_w_reg(self, reg, dat, mask): self.getreg(reg) self.rb[0] = (self.rb[0] & mask) | dat self.setreg(reg, self.rb[0]) def ax(self): return self.int16(self.get2reg(LSM6DSO_OUTX_L_A)) def ay(self): return self.int16(self.get2reg(LSM6DSO_OUTY_L_A)) def az(self): return self.int16(self.get2reg(LSM6DSO_OUTZ_L_A)) def gx(self): return self.int16(self.get2reg(LSM6DSO_OUTX_L_G)) def gy(self): return self.int16(self.get2reg(LSM6DSO_OUTY_L_G)) def gz(self): return self.int16(self.get2reg(LSM6DSO_OUTZ_L_G)) def get_a(self): self.irq_v[0][0] = self.ax() self.irq_v[0][1] = self.ay() self.irq_v[0][2] = self.az() return self.irq_v[0] def get_g(self): self.irq_v[1][0] = self.gx() self.irq_v[1][1] = self.gy() self.irq_v[1][2] = self.gz() return self.irq_v[1] def get(self): self.get_a() self.get_g() return self.irq_v def temperature(self): try: return self.int16(self.get2reg(LSM6DSO_OUT_TEMP_L))/256 + 25 except MemoryError: return self.temperature_irq() def temperature_irq(self): self.getreg(LSM6DSO_OUT_TEMP_L+1) if self.rb[0] & 0x80: self.rb[0] -= 256 return self.rb[0] + 25 def scale_a(self, dat=None): if dat is None: return LSM6DSO_SCALEA[self._scale_a] else: if type(dat) is str: if not dat in LSM6DSO_SCALEA: return self._scale_a = LSM6DSO_SCALEA.index(dat) else: return self.r_w_reg(LSM6DSO_CTRL1_XL, self._scale_a<<2, 0xF3) def scale_g(self, dat=None): if (dat is None) or (dat == ''): return LSM6DSO_SCALEG[self._scale_g] else: if type(dat) is str: if not dat in LSM6DSO_SCALEG: return self._scale_g = LSM6DSO_SCALEG.index(dat) else: return self.r_w_reg(LSM6DSO_CTRL2_G, self._scale_g<<1, 0xF1) def power(self, on=None): if on is None: return self._power else: self._power = on if on: self.r_w_reg(LSM6DSO_CTRL1_XL, self._power_a, 0x0F) self.r_w_reg(LSM6DSO_CTRL2_G, self._power_g, 0x0F) else: self._power_a = self.getreg(LSM6DSO_CTRL1_XL) & 0xF0 self._power_g = self.getreg(LSM6DSO_CTRL2_G) & 0xF0 self.r_w_reg(LSM6DSO_CTRL1_XL, 0, 0x0F) self.r_w_reg(LSM6DSO_CTRL2_G, 0, 0x0F)  

  • 发表了日志: LSM6DSO的MicroPython驱动移植

  • 发表了主题帖: LSM6DSO的MicroPython驱动移植

    每天一个X-NUCLEO-IKS01A3开发板的传感器MicroPython驱动移植,今天完成了LSM6DSO陀螺仪的驱动,也是最后一个驱动程序,下一步预备开始将这些驱动移植到MakeCode,这样以后大家也可以在MakeCode上用图形化方式使用它们了。   LSM6DSO可以看成是一颗芯片里面封装了两个传感器,控制的时候加速度和角速度也是分别控制的,所以LSM6DSO的体积也比其它几个传感器都要大一些(其它几个传感器都是2x2mm,LSM6DSO是2.5x3mm)。   从寄存器上看,LSM6DSO和LIS2DW12类似,分为控制寄存器、状态寄存器、输出寄存器、中断寄存器、事件寄存器、FIFO寄存器等。传感器的功能非常多,也很复杂,可以编写出适合不同应用的多种驱动。不过为了简化使用,并保持和其它驱动一致的风格,这次的驱动只包含了基本的参数设置、数据读取等功能,没有包含中断、事件、FIFO等,在需要时大家可以自行添加。   下面是LSM6DSO的部分寄存器列表,LSM6DSO的寄存器非常多,仅列表就占用了3页。不过对于基本功能,只需要用到其中一小部分寄存器。   LSM6DSO最基本的使用方法是先设置LSM6DSO_CTRL1_XL和LSM6DSO_CTRL2_G寄存器,将ODR从0修改为合适的数值,就可以开始读取数据了。和X-NUCLEO-IKS01A3开发板上其它传感器不同,LSM6DSO没有oneshot或者single模式,如果要降低功耗或进入休眠,需要将传感器的ODR设置为0。因为加速度和角速度是分别控制的,所以需要分别设置两个寄存器的ODR。   LSM6DSO的加速度传感器可以设置±2g、±4g、±8g、±16g四种量程,而角速度可以设置125、250、500、1000、2000dps五种量程,可以按需灵活选择。LSM6DSO的输出结果是16位的,传感器的灵敏度非常高,可以将它的输出和其它类似传感器比较就清楚了。   可能是为了做温度补偿,LSM6DSO内部同样带有一个温度传感器,使用方法和LIS2DW12是相同的。   另外值得注意的是,LSM6DSO也支持最新的I3C接口标准,这部分的驱动等以后有机会补上。 此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: 【MicroPython】ESP32开始支持硬件I2C方式了

  • 发表了主题帖: 【MicroPython】ESP32开始支持硬件I2C方式了

    昨天,ESP32分支发布新的更新,开始支持硬件I2C方式了。 https://github.com/micropython/micropython/commit/a29334761dc7b8eaf9f78611e3cd9033928b110c   from machine import Pin, I2C # construct a software I2C bus i2c = I2C(scl=Pin(5), sda=Pin(4), freq=100000) # construct a hardware I2C bus i2c = I2C(0) i2c = I2C(1, scl=Pin(5), sda=Pin(4), freq=400000) i2c.scan() # scan for slave devices i2c.readfrom(0x3a, 4) # read 4 bytes from slave device with address 0x3a i2c.writeto(0x3a, '12') # write '12' to slave device with address 0x3a  

  • 2019-07-19
  • 回复了主题帖: 为什么我的代码里的标点符号是这样的不应该是后面那个图里的哪样吗

    字体不同造成的吧

  • 回复了主题帖: 基于STM32F401RE开发板的X-NUCLEO-IKS01A3传感器测试之三3D加速度LIS2DW12传感器测...

    是通过三个轴的参数来判断姿态吧。

  • 回复了主题帖: LIS2DW12运动传感器的MicroPython驱动移植

    在github上分享的库:   https://github.com/micropython-Chinese-Community/mpy-lib/tree/master/sensor/LIS2DW12  

  • 回复了主题帖: LIS2DW12运动传感器的MicroPython驱动移植

    使用方法:   from machine import I2C import LIS2DW12 i2c = I2C(1) lis = LIS2DW12.LIS2DW12(i2c) lis.x() lis.get()   中断方式 from machine import I2C from pyb import Timer import LIS2DW12 i2c = I2C(1) lis = LIS2DW12.LIS2DW12(i2c) lis.x() def tim_irq(t): print(lis.get()) tim = Timer(1, freq = 1) tim.callback(tim_irq)  

  • 发表了日志: LIS2DW12运动传感器的MicroPython驱动移植

  • 发表了主题帖: LIS2DW12运动传感器的MicroPython驱动移植

    LIS2DW12是一个低功耗的三轴加速度(运动)传感器,支持多种工作模式,可以用于: 可穿戴设备的运动检测 手势识别和游戏 运动激活功能和用户界面 显示方向 点击/双击识别 自由落体检测 手持设备的智能节能 助听器 便携式医疗设备 无线传感器节点 运动计量装置 LIS2DW12可以通过I2C/SPI方式访问内部寄存器,其中SPI支持3线和4线两种方式。在I2C方式下,设备地址是24/25(7位地址模式),在X-NUCLEO-IKS01A3上的地址是25。   LIS2DW12内部寄存器分为控制寄存器(R/W),输出寄存器(R),状态寄存器(R),FIFO寄存器,TAP(敲击)寄存器等。上电后,首先需要设置控制寄存器,让传感器处于工作模式,否则不能读取数据。   传感器工作模式有低功耗模式、高性能模式和掉电模式,而低功耗模式有4种方式(具体区别可以参考数据手册)。数据输出速率ODR范围是1.6-1600HZ,如果将ODR设为0就进入了掉电模式。这部分功能都是在控制寄存器CTRL1中设置。   控制寄存器CTRL4和CTRL5用来设置中断输出功能,而传感器最大量程是通过CTRL6的FS进行设置,可以设置为±2g/±4g/±8g/±16g。   传感器的数据是通过OUT_X_L/OUT_X_H等寄存器读取,两个寄存器表示一个数据,运动数据可以用12/14位两种方式表示。而温度通过OUT_T_L/OUT_T_H/OUT_T寄存器表示,OUT_T_L和OUT_T_H的数值除以256再加上25,就是环境温度,OUT_T寄存器相当于OUT_T_H,也就是温度的整数部分。有点奇怪的是在单次模式(oneshot)下,温度传感器停止了更新,数据不在发生变化。   下面是使用MicroPython移植的完整驱动,暂时没有包含中断、自由落体检测、敲击检测等功能。为了保持和其它传感器驱动一致,将单次模式统一用oneshot_mode()函数控制。   # LIS2DW12 3-axis motion seneor micropython drive # ver: 1.0 # License: MIT # Author: shaoziyang (shaoziyang@micropython.org.cn) # v1.0 2019.7 LIS2DW12_CTRL1 = const(0x20) LIS2DW12_CTRL2 = const(0x21) LIS2DW12_CTRL3 = const(0x22) LIS2DW12_CTRL6 = const(0x25) LIS2DW12_STATUS = const(0x27) LIS2DW12_OUT_T_L = const(0x0D) LIS2DW12_OUT_X_L = const(0x28) LIS2DW12_OUT_Y_L = const(0x2A) LIS2DW12_OUT_Z_L = const(0x2C) LIS2DW12_2G = const(0) LIS2DW12_4G = const(1) LIS2DW12_8G = const(2) LIS2DW12_16G = const(3) LIS2DW12_SCALE = ('2g', '4g', '8g', '16g') class LIS2DW12(): def __init__(self, i2c, addr = 0x19): self.i2c = i2c self.addr = addr self.tb = bytearray(1) self.rb = bytearray(1) self.oneshot = False self.irq_v = [0, 0, 0] self._power = 0x20 # ODR=2 MODE=0 LP=1 self.setreg(LIS2DW12_CTRL1, 0x21) # BDU=1 self.setreg(LIS2DW12_CTRL2, 0x0C) # SLP_MODE_SEL=1 self.setreg(LIS2DW12_CTRL3, 0x02) # scale=2G self._scale = 0 self.scale(self._scale) self.oneshot_mode(False) def int16(self, d): return d if d < 0x8000 else d - 0x10000 def setreg(self, reg, dat): self.tb[0] = dat self.i2c.writeto_mem(self.addr, reg, self.tb) def getreg(self, reg): self.i2c.readfrom_mem_into(self.addr, reg, self.rb) return self.rb[0] def get2reg(self, reg): return self.getreg(reg) + self.getreg(reg+1) * 256 def r_w_reg(self, reg, dat, mask): self.getreg(reg) self.rb[0] = (self.rb[0] & mask) | dat self.setreg(reg, self.rb[0]) def oneshot_mode(self, oneshot=None): if oneshot is None: return self.oneshot else: self.oneshot = oneshot d = 8 if oneshot else 0 self.r_w_reg(LIS2DW12_CTRL1, d, 0xF3) def ONE_SHOT(self): if self.oneshot: self.r_w_reg(LIS2DW12_CTRL3, 1, 0xFE) while 1: if self.getreg(LIS2DW12_CTRL1) & 0x01: return def x(self): self.ONE_SHOT() return self.int16(self.get2reg(LIS2DW12_OUT_X_L))>>2 def y(self): self.ONE_SHOT() return self.int16(self.get2reg(LIS2DW12_OUT_Y_L))>>2 def z(self): self.ONE_SHOT() return self.int16(self.get2reg(LIS2DW12_OUT_Z_L))>>2 def get(self): self.ONE_SHOT() self.irq_v[0] = self.int16(self.get2reg(LIS2DW12_OUT_X_L))>>2 self.irq_v[1] = self.int16(self.get2reg(LIS2DW12_OUT_Y_L))>>2 self.irq_v[2] = self.int16(self.get2reg(LIS2DW12_OUT_Z_L))>>2 return self.irq_v def temperature(self): try: return self.int16(self.get2reg(LIS2DW12_OUT_T_L))/256 + 25 except MemoryError: self.temperature_irq() def temperature_irq(self): self.getreg(LIS2DW12_OUT_T_L+1) if self.rb[0] & 0x80: self.rb[0] -= 256 return self.rb[0] + 25 def scale(self, dat=None): if dat is None: return LIS2DW12_SCALE[self._scale] else: if type(dat) is int: if dat > 3 or dat < 0: return self._scale = dat elif type(dat) is str: if not dat in LIS2DW12_SCALE: return self._scale = LIS2DW12_SCALE.index(dat) else: return self.r_w_reg(LIS2DW12_CTRL6, self._scale<<4, 0xCF) def power(self, on=None): if on is None: return self._power > 0 else: if on: self.r_w_reg(LIS2DW12_CTRL1, self._power, 0x0F) self._power = 0 else: self._power = self.getreg(LIS2DW12_CTRL1) & 0xF0 self.r_w_reg(LIS2DW12_CTRL1, 0, 0x0F) 此内容由EEWORLD论坛网友dcexpert原创,如需转载或用于商业用途需征得作者同意并注明出处

  • 发表了日志: 开源的tinygo发布0.70版

  • 发表了主题帖: 开源的tinygo发布0.70版

    开源的tinygo近日发布了0.70版,现在已经可以支持15种开发板了。   Adafruit Circuit Playground Express Adafruit Feather M0 Adafruit ItsyBitsy M0 Adafruit Trinket M0 Arduino Nano33 IoT Arduino Uno BBC micro:bit ST Micro STM32F103XX "Bluepill" ST Micro STM32F407 "Discovery" Digispark Nordic Semiconductor PCA10031 Nordic Semiconductor PCA10040 Nordic Semiconductor PCA10056 Makerdiary nRF52840-MDK Phytec reel board   https://github.com/tinygo-org/tinygo  

  • 2019-07-18
  • 回复了主题帖: 这个是怎么弄得?

    什么效果,板子中抠掉一块吗?

最近访客

< 1/6 >

统计信息

已有1667人来访过

  • 芯币:44947
  • 好友:43
  • 主题:1045
  • 回复:6179
  • 课时:1
  • 资源:14

留言

你需要登录后才可以留言 登录 | 注册


dcexpert 2019-4-7
和C语言中用法是一样的
szl123456 2019-4-6
您好 我正在在micropython上搞485通信,因为没有历程,大家好像都没搞过 大神能指导一下吗   help  help
werjufour 2018-8-28
你好!向你请教个问题。PIC24fj64ga004 AD转换值放在哪个寄存器当中?
MSYuan0317 2018-8-9
您好!我们是代理乐鑫产品的,如果有需要可以联系我,QQ:285254096 ,谢谢!
dcexpert 2018-8-2
在《MicroPython中文教程》电子版和《MicroPython入门指南》一书中都有
15588608145 2018-8-2
具体的MicroPython所支持的模块和语法说明在哪里呢?
MSYuan0317 2018-7-27
您好!我们是代理乐鑫产品的,如果有需要可以联系我,QQ:285254096 ,谢谢!
dcexpert 2018-6-6
还没有开始做,等做好了我送你两片
mo2016 2018-6-6
DIY一个micropython的多功能无线电子钟 想要有偿PCB板二片,谢谢!
dcexpert 2015-1-22
不是5个DIY项目,是围绕DIY F429示波器,有5个小专题,希望大家一起讨论完成。

5个都在DIY示波器帖子中的。
xu__changhua 2015-1-22
5个DIY项目,我就查到示波器,还有4个能给出链接么?
查看全部