【Follow me第二季第1期】任务4:制作不倒翁——展示不倒翁运动过程中的不同灯光效果
<p>大家好,我是郑工,尘世间一个迷途小工程师。</p><p> </p>
<p>我们赶紧把任务4完成了,制作一个不倒翁,之前我在路边捡到一个木头,如下:</p>
<p> </p>
<p>我们来搞个不倒翁吧,电子上没办法整活,我们来整个木工活</p>
<p> </p>
<p>经过我一堆磨切敲打,终于把木头弄成下面这个形状了</p>
<p>(请忽略木头上那条裂纹,搞了一天,木头裂了,人都要炸了,最后用了些电工胶粘在一起了,我们是电子论坛,这是可以接收的,以后有机会得搞个车床才行)</p>
<p> </p>
<p>再打上木蜡油上去,经过晾晒,这个底座就可以用了</p>
<p> </p>
<p> </p>
<p>好了,木工活搞完了,我们继续来搞我们些原理分析吧。</p>
<p> </p>
<p>CPX的板子上,自带了一个lis3dh,这个芯片是ST生产的三轴线性加速度传感器,具有超低功耗,1到5.3k输出速率,提供±2g/±4g/±8g/±16g的动态用户可选全量程,好用的芯片</p>
<p> </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 />
value / adafruit_lis3dh.STANDARD_GRAVITY for value in lis3dh.acceleration<br />
]</p>
<p>因为读取出来是重力加速度,所以需要除以重力加速度</p>
<p> </p>
<p>然后计算俯仰角跟横滚角:</p>
<p># 计算俯仰角<br />
pitch = math.atan2(ay, math.sqrt(ax*ax + az*az)) * 180 / math.pi;<br />
# 计算横滚角<br />
roll = math.atan2(ax, math.sqrt(ay*ay + az*az)) * 180 / math.pi;</p>
<p> </p>
<p>俯仰角就是物体前后倾斜的角度,横滚角就是物体横向翻滚的角度。</p>
<p> </p>
<p>这里我做了个逻辑判断,如果两个角度都小于5度,则表示没有倾斜,如果倾斜之后,则用 (俯仰角/横滚角) 计算比例,再用arctan函数计算对应的角度,再转换成数值,对应到10个灯珠上。函数表现如下,基本能实现线路板倾斜,对应的灯珠能亮起来红灯。</p>
<pre>
<code class="language-python">if abs(pitch) < 5 and abs(roll) < 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 > 0:
fill_led(int(num))
else:
fill_led(int(num + 5))</code></pre>
<p> </p>
页:
[1]