Arduino Modulino 旋钮教程

什么是 Arduino Modulino 旋钮模块?

Arduino Modulino 旋钮是一个演示板,具有带集成按压开关的正交编码器。旋钮模块(Arduino 零件号 ABX00108)最初是作为 Arduino 即插即用套件的一部分提供的。它配备了两个 Qwiic 连接器,允许与 Arduino UNO R4 WiFi 微控制器以及其他 Modulino 模块进行菊花链连接。该系统为学生提供了一种无需面包板的便捷方法,用于探索常见的微控制器相关组件。旋钮 Modulino 采用低成本的 ARM Cortex M0 微控制器来处理 I2C 通信并读取 Bourns 品牌的编码器。

本工程简介介绍了 Modulino 旋钮模块及其支持的硬件。这些材料对于希望了解更多关于底层硬件和通信协议的学生非常有用。

1 Arduino Modulino旋钮模块的图片。表面贴装的 Bourns 正交编码器位于电路板的中心。微小的32位STM ARM微控制器在左下角可见。

技术提示 :旋转编码器包括三个机械开关——两个用于正交信号,一个用于按压开关。仔细查看 Arduino 数据手册会发现缺少上拉或下拉电阻。为了减少物料清单 (BOM),工程师利用了 STM 微控制器的内部上拉电阻。

什么是正交编码器?

Modulino 旋钮基于 Bourns PEC11J-9215F-S0015 正交编码器。
术语“正交”描述了两个信号之间的关系。每个信号之间相隔 90 度的相位差。可以使用正弦和余弦波形之间的数学关系来可视化这种关系。例如,COS(0) = 1 且 SIN(0) = 0。相位关系保持不变,因为 90° 后,我们看到 COS(90°) = 0 且 SIN(90°) = 1。这种正交相位关系由图 2 左侧面板中所示的 A 信号和 B 信号输出所暗示。为了清晰起见,您可以将正交 SIN 和 COS 波形叠加在方波上。

2 :来自数据手册的 Bourns PEC11J 系列正交编码器的开关操作描述。

有关正交编码器的更多信息,请参阅这些文章。第一篇特别有用,因为它使用图 3 中的大示例解释了操作。虽然物理实现非常不同,但该机制与旋钮的正交编码器共享基本操作原理。

3 :近距离图像显示正交传感器、中断盘和反射器之间的关系。请注意,中断盘的尺寸设计为允许或阻挡两个传感器。

技术提示 :正交编码器被归类为增量编码器。位置根据观察编码器的A和B输出保持在微控制器内存中。事实上,微控制器启动时位置是未知的。参考图3,A和B传感器无法区分一个叶片与另一个叶片。启动时,微控制器假设编码器处于零位。

仔细观察图3,可以看到右上角叶片中有一个六角螺母。捕获的螺钉由欧姆龙接近传感器检测到,该传感器在直流电机的右侧可见。当配备此参考传感器时,系统可以确定机构的绝对位置。

相关说明,图1中的旋钮上标有黑色指示线,使用户能够快速识别物理方向。这可能会让新手感到困惑,因为标记与Modulino微控制器中维护的实际计数无关。请记住,编码器在启动时初始化为零位;启动时旋钮指向的位置就是零位。因此,除非您包含让用户将旋钮“归位”到已知位置的例程,否则黑线是无意义的。

Modulino 旋钮软件

Arduino Modulino模块的软件相对简单。与所有Modulino模块一样,代码基于面向对象的原则构建。这需要使用构造函数和点符号来访问方法。这三种方法是:

  • get( ); 返回与用户旋转旋钮相对应的整数值。

  • set( ); 覆盖旋钮模块的位置。这对于为编码器值建立上限和下限特别有用。

  • isPressed( ); 当按下时返回true布尔值,表示旋钮的按压开关处于活动状态。

示例代码

假设我们希望Modulino旋钮返回一个介于-100和100之间的值。使用此示例代码可以轻松实现,结果如图4所示。我们看到,当遇到上限和下限时,使用set( )方法重写编码器的值。此代码通过旋转编码器的按压开关方便用户重置值。

#include "Modulino.h"
ModulinoKnob encoder;

void setup( ) {
  Serial.begin(19200);
  Modulino.begin();
  encoder.begin();
}

void loop( ) {
  int value = encoder.get();

  if (value > 100) {          // Set limits
    encoder.set(100);
  } else if (value < -100) {
    encoder.set(-100);
  }

  if (encoder.isPressed( )){  // Reset to zero when switch is pressed
    encoder.set(0);
  }

  value = encoder.get( );     // Retrieve the latest value
  Serial.println(value);
  delay(500);
}

技术提示 :此示例代码的性能因阻塞的delay(500)函数而降低。用户被迫按下按钮长达半秒钟才能重置值。这可能是也可能不是您应用程序的问题。要构建一个响应迅速的系统,您可能对本文开头嵌入的教程感兴趣。它描述了阻塞代码的问题以及传统的Arduino解决方案。然后,它提出了一个受常用于可编程逻辑控制器的结构化文本语言启发的优雅解决方案。

4 :编码器输出在-100和100之间的图表。波浪线表示对编码器的调整。

通信协议

Modulino旋钮使用的I2C协议与Modulino蜂鸣器教程中描述的类似。似乎有两个独特的帧。一个帧通过检索计数和开关位置来执行双重任务。另一个帧命令Modulino旋钮重置为用户选择的值。

我留给你来逆向工程这个帧。该技术与Modulino蜂鸣器教程中使用的技术类似。

最后的思考

Modulino旋钮是Bourns PEC11J旋转编码器的简单评估板。基于类的编程易于实现。它使用getter和setter来检索和操作Modulino旋钮的ARM微控制器中保存的值。

我们保持本文简短,因为正交编码器材料已在相关文档中探讨(见下方链接)。我们鼓励您购买并实验正交编码器,例如图5中所示的安装在电机上的设备。

掌握正交编码器,微控制器的隐形世界将向您敞开。

5 :安装 在Pololu #4754直流电机上的正交编码器特写。

相关信息

请点击以下链接获取相关和有用的信息: