步骤1:您需要的东西
您可能已有一个使用MPU-9150的Arduino项目,在这种情况下,您可以将我的草图加载到其中。 Neopixel环仅使用一个Arduino输出引脚。
或者,您可以使用此处描述的设置。您可以使用其他功能来扩展它,并且可以根据需要为其他基于Neopixel环的项目使用其他硬件。
您将需要:
基于ATMega328的Arduino和电源(尽管您可能会使用其他电源)
MPU-9150加速度计/陀螺仪/磁力计
Adafruit Neopixel环,12像素大小或更大的
无焊面包板,剥离板和跳线。
MPU-9150输入不容许5V的电压,因此以5V运行Arduino时,您将需要具有2个或更多电压的5V/3.3V电平转换器通道。这些东西从远东eBay卖家那里非常便宜。由于Neopixels需要5V的全部电压,因此您不能简单地以3.3V的电压运行整个项目。
电平转换器将Arduino的SDA和SCL引脚以5V的电平供电,并以3.3V的电压提供给MPU -9150。为此,它一方面需要5V电源,另一方面需要3.3V电源。幸运的是,常见的MPU-9150板包含3.3V稳压器,但是不幸的是,其输出未在任何引脚上提供。因此,必须如图所示将细线焊接到稳压器的输出引脚上。
找到稳压器,该稳压器应标记为KB33(在第二张图片的顶部)。您将需要一只稳定的手和一个尖尖的烙铁。将一根细线焊接到右上角的插针上。建立良好的连接后,请用一滴强力胶将其覆盖,以防止其轻易脱落。
步骤2:将其连接
接线将取决于您使用的是插线板还是无焊面包板,哪种类型的Arduino,以及是否使用电平转换器,因此我将为您确定接线或插线板布局。 (如果您觉得做不到,请尝试一个或两个简单的Arduino项目或使用Stripboard的项目,然后在有想法的情况下返回。)
电平转换器具有除Gnd之外,还有两个标为HV和LV的电源输入。使用您焊接到的细线,将HV连接到5V电源,将LV连接到MPU-9150的3.3V输出。 Arduino的SDA和SCL引脚使用5V逻辑电平,并连接到电平转换器的HV1和HV2引脚。然后,LV1和LV2引脚以3.3V逻辑电平向MPU-9150提供相同的信号。您的设备可能还具有未使用的HV3,HV4,LV3和LV4连接。
步骤3:对Arduino进行编程
该草图包括三个文件(附加)。将这三个都复制到Arduino sketch文件夹中的新文件夹“ Compass”中。然后,草图应出现在Arduino IDE的草图簿中。
在编译之前,请检查“指南针”选项卡下文件顶部的#define配置选项,并根据需要进行修改。
PIN定义用于Neopixel数据输入的Arduino引脚,默认情况下为引脚8。
BRILL是默认的像素亮度,最大可以为255,但是更高的值会造成盲目和可能消耗的电流超过电源所能提供的电流,尤其是使用较大尺寸的环之一时。我通常不会超过30。
PIXELS是指环中的像素数。 Adafruit当前提供的尺寸为12(非常好用),16、24(非常不错的尺寸)和60(巨大-如果您有足够的钱就可以了)。
已反转:如果您的戒指与MPU-9150在电路板的同一侧,请保留此注释掉。相对于MPU-9150,第一个像素应位于加速度计的正Y方向。取消注释您的戒指在板子的另一侧(已将板子绕Y轴翻转)。
您将需要下载并安装MPU6050库(其中还包含代码)用于MPU-9150,是MPU6050的超集)和Adafruit Neopixel库。编译草图并将其上传到Arduino。
步骤4:自动校准过程
首次运行草图时,它首先输入校准值程序。将完成的设备放在桌子上方几英寸的地方,使电路板的一个边缘与桌子的边缘对齐,或者与其他固定的直边对齐。
Neopixel环将显示一些绿色和一些蓝色像素。调平电路板,直到它们全部变为绿色。剩余的蓝色像素表示该边太高(天空为蓝色)。当满足水平要求时,将读取数个磁力计读数,然后将所有像素闪烁一次。
现在,它将要求您在4个方向上将其倾斜45度,以绿色提示和蓝色像素一样,在每个位置进行测量,并将所有像素闪烁2、3、4,最后闪烁5次。始终注意使板的边缘与桌子的边缘对齐。
整个过程将重复3次,然后将计算并存储磁力计的偏移量。
一旦校准,草图将模拟指南针。消除蓝色像素以使电路板保持水平,从而获得可靠的读数。红点叠加在一起,表示北。点从一个像素移动到下一个像素时逐渐淡出。
您可以根据需要使它重新进入校准模式,只需将板急剧地向另一方向扭转几下即可。
p》
第5步:在自己的项目中使用草图
您可以将校准功能合并到自己的项目中,方法是将我的代码合并到自己的代码中或添加代码挖掘,取决于您已经走了多远。 Mine包含钩子,可用于添加其他功能。
如果将Mine合并到自己的钩子中,请完成Calibrate和Functions选项卡。在“指南针”选项卡中,您需要将我的Setup()函数与您的函数合并,并将之前的所有内容合并到您的代码中。您只需要调用Calibrate()函数即可进入校准模式。
“校准”选项卡包含两个#define语句。 NUMSAMPLES定义每个位置获取多少个磁力计读数。可能没有特别的理由将其从10更改。这样的数字可以确保始终保持稳定。 NUMTESTS定义要重复执行5个位置的完整过程的次数。一个很好的数字是3,但是对于速度而言,如果您只想进行粗略的校准,则1可能就足够了。
步骤6:使用其他硬件
相同的技术可以用于其他磁力计,并且不仅限于Arduino,还必须对其进行调整,并可能将其从C语言翻译为另一种语言。
如果将代码修改为如果要使用其他磁力计,则MPU-9150会对磁力计和加速度计使用不同的坐标系。从一个交换到另一个需要交换X和Y值并取反Z。这是在readMag()函数中完成的,以便其余代码可以仅在加速度计的坐标系中工作。一旦计算出偏移量,就将其转换回磁力计坐标以进行存储。
使用其他磁力计,原则上您只需要替换readMag()函数即可。
三个数组,mx [],my []和mz [] 5个元素中的每一个,将磁力计读数保持在5个位置(即水平)上,分别绕X轴旋转45度,然后绕X轴旋转,以及类似地绕Y轴旋转。旋转加速度计输出的位置(第一个位置除外),以便displayCal()函数只需要计算变量“ angle”和“ up”,作为与所需方向和方向(作为浮点像素数)的角度最大的坡度。将误差的大小转换为对数刻度,以在误差较小时提供最大的灵敏度。当误差在限制范围内时,displayCal()函数将返回布尔值true,一旦这样做,行中就会以固定次数多次校准Calibrate()存储磁力计读数。
实际计算偏移量的计算需要几页代数和三角函数,但仅用4行代码即可实现。您可能会认识到魔术数0.7071是2或cos(45⁰)的平方根的一半。从1减去这个得到第二个魔术数0.29289并将其加倍得到第三个魔术数0.58579。毕竟不是魔术。
在校准中使用的45度倾斜没有什么特别之处,但是它确实大大简化了数学运算。原则上,您可以将设备绕垂直方向滚动,连续获取来自加速度计和磁力计的读数,并计算偏移量,直到计算出的平均值稳定在一个可靠的结果附近,但数学会复杂得多。 iOS Compass应用程序执行此操作,这是我自动校准的想法。
-
校准
+关注
关注
1文章
153浏览量
21838 -
磁力计
+关注
关注
1文章
71浏览量
20840
发布评论请先 登录
相关推荐
评论