eew_Ya3s2d 发表于 2024-10-13 20:18

【Follow me第二季第1期】任务4:制作不倒翁——展示不倒翁运动过程中的不同灯光效果

<p>大家好,我是郑工,尘世间一个迷途小工程师。</p>

<p>&nbsp;</p>

<p>我们赶紧把任务4完成了,制作一个不倒翁,之前我在路边捡到一个木头,如下:</p>

<p> &nbsp;</p>

<p>我们来搞个不倒翁吧,电子上没办法整活,我们来整个木工活</p>

<p>&nbsp;</p>

<p>经过我一堆磨切敲打,终于把木头弄成下面这个形状了</p>

<p>(请忽略木头上那条裂纹,搞了一天,木头裂了,人都要炸了,最后用了些电工胶粘在一起了,我们是电子论坛,这是可以接收的,以后有机会得搞个车床才行)</p>

<p> &nbsp;</p>

<p>再打上木蜡油上去,经过晾晒,这个底座就可以用了</p>

<p> &nbsp;</p>

<p>&nbsp;</p>

<p>好了,木工活搞完了,我们继续来搞我们些原理分析吧。</p>

<p>&nbsp;</p>

<p>CPX的板子上,自带了一个lis3dh,这个芯片是ST生产的三轴线性加速度传感器,具有超低功耗,1到5.3k输出速率,提供&plusmn;2g/&plusmn;4g/&plusmn;8g/&plusmn;16g的动态用户可选全量程,好用的芯片</p>

<p> &nbsp;</p>

<p>首先是初始化,因为两个管脚就是芯片的I2C管脚,在board库里面有定义board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA,所以初始化比较简单,代码如下:</p>

<pre>
<code class="language-python">import board
import busio
import adafruit_lis3dh

i2c = busio.I2C(board.ACCELEROMETER_SCL, board.ACCELEROMETER_SDA)
lis3dh = adafruit_lis3dh.LIS3DH_I2C(i2c, address=0x19)

# Set range of accelerometer (can be RANGE_2_G, RANGE_4_G, RANGE_8_G or RANGE_16_G).
lis3dh.range = adafruit_lis3dh.RANGE_2_G</code></pre>

<p>然后读取三轴加速度的值,只需要通过函数:</p>

<p>ax, ay, az = [<br />
&nbsp; &nbsp; &nbsp; &nbsp; value / adafruit_lis3dh.STANDARD_GRAVITY for value in lis3dh.acceleration<br />
&nbsp; &nbsp; ]</p>

<p>因为读取出来是重力加速度,所以需要除以重力加速度</p>

<p>&nbsp;</p>

<p>然后计算俯仰角跟横滚角:</p>

<p># 计算俯仰角<br />
&nbsp; &nbsp; pitch = math.atan2(ay, math.sqrt(ax*ax + az*az)) * 180 / math.pi;<br />
&nbsp; &nbsp; # 计算横滚角<br />
&nbsp; &nbsp; roll = math.atan2(ax, math.sqrt(ay*ay + az*az)) * 180 / math.pi;</p>

<p>&nbsp;</p>

<p>俯仰角就是物体前后倾斜的角度,横滚角就是物体横向翻滚的角度。</p>

<p>&nbsp;</p>

<p>这里我做了个逻辑判断,如果两个角度都小于5度,则表示没有倾斜,如果倾斜之后,则用 (俯仰角/横滚角) 计算比例,再用arctan函数计算对应的角度,再转换成数值,对应到10个灯珠上。函数表现如下,基本能实现线路板倾斜,对应的灯珠能亮起来红灯。</p>

<pre>
<code class="language-python">if abs(pitch) &lt; 5 and abs(roll) &lt; 5: # 倾斜角度小于5度,认为水平,显示绿灯
      pixels.fill((0, 15, 0))
      pixels.show()
    else:
      if roll == 0:       # 防止roll等于0的错误
            roll = 1
      arc = math.atan(pitch/roll)* 180 / math.pi
      num = ((arc + 90) / 180) * 4.7
      if roll &gt; 0:
            fill_led(int(num))
      else:
            fill_led(int(num + 5))</code></pre>

<p>&nbsp;</p>
页: [1]
查看完整版本: 【Follow me第二季第1期】任务4:制作不倒翁——展示不倒翁运动过程中的不同灯光效果