|
代码说明 首先我们先来看一下MMA7455.h。 - typedef enum {Y_POS, Y_NEG, X_POS, X_NEG, Z_POS, Z_NEG, NOT_SURE} orientation;
复制代码枚举enum是C中的数据类型,就像int或char一样。它用于变量,这些变量可以是非数字变量的短列表中的一个值。在这种情况下,当我们将设备的方向保存到变量中时,我们使用枚举。
现在我们来看看加速度计。你会看到一个x箭头和一个y箭头。当x箭头指向时,我们称之为X_POS。当x箭头指向下方时,我们称之为X_NEG。 z轴指向板外或板内。当电路板平放在桌子上时就是Z_POS。 当安装在显示器背面时,设备应该只有y轴或x轴向上或向下。我们在monitor.ino中创建了一个名为VALID_ORIENTATION的宏来检查给定的方向是否与我们期望的4个选项之一匹配。如您所见,我们可以像任何其他数据类型一样检查枚举的值。
- #define VALID_ORIENTATION(o) ((o==Y_POS) || (o==Y_NEG) || (o==X_POS) || (o==X_NEG))
复制代码
setup函数主要是诊断。有3个关键点。 上面的行启动了串行通信,这是我们与计算机通信的方式。
这初始化了I2C通信,这就是我们与加速度计通信的方式。它只是初始化Arduino端的设置。我们使用以下行初始化加速度计。
- error = MMA7455_init(START_ORIENTATION);
复制代码
按下物理按钮时,触点不会完全关闭。它们会抖动,输出信号看起来好像用户在几毫秒内按下按钮几次。我们等待100ms以确保代码不会将这些抖动误认为是多次按下。我们可以采取两种方法来解决这个问题。我们可以实现硬件去抖或软件去抖动。硬件方法包括在电路中添加低通滤波器,无论是有源还是无源。由于这涉及购买和焊接额外的组件,我选择了软件去抖动。
我们使用的加速度计有一些中断功能,但它不适用于我们的用例。通常,当您希望按钮执行某些操作时,最好使用中断。但是,由于我们无论如何都在轮询加速度计,我们也可以轮询按钮。
每次循环,我们检查按钮当前是否被按下。如果是,并且上次未按下它,那么我们知道用户刚刚按下按钮,因此我们再次运行例程,并将START_ORIENTATION发送到计算机。然后我们等待100ms再继续。这种延迟是为了让Arduino在继续之前等待按钮触点稳定下来。不可否认,这是一种相当草率和懒惰的软件去抖方法,因为Arduino在延迟期间什么都不做。更复杂的方法将涉及计时器,以便在Arduino等待按钮时可以继续执行其他代码。在这种特殊情况下,我们唯一错过的是使用延迟而不是计时器,这是加速度计的读数变化。因为当用户按下按钮时不应该发生这种情况,所以这种草率方法是可以接受的。延迟方法的唯一优点是它很简单。硬件去抖动需要更多组件,编写中断和延迟代码会变得棘手。 - }else if(!digitalRead(BUTTON_PIN) // button has been pressed
- && previous_button_state) // and this is the first time it's been
- // pressed
- {
- // send even if orientation hasn't changed
- setup(); //re-calibrate
- sendOrientation(START_ORIENTATION);
- delay(100); //software debounce
- previous_button_state = 0;
- }
复制代码
Windows计算机代码 Arduino将使用我们用于编程和调试的相同串行接口向计算机发送信息。为避免冲突,请确保在运行此脚本时关闭Arduino IDE中的串行监视器。如果它是打开的,一些Arduino的消息将被串行监视器,并且脚本将不会看到它们,或者只会看到它们中难以理解的部分。 我们将使用Python作为我们的计算机端代码。这将听取Arduino写入串口的内容,并进行系统调用以旋转显示器。
从这里为您的计算机下载Python 3。在安装过程中询问是否要将python添加到path中时,请选择“yes”。 在之前下载的zip文件中找到windows-script.py。 打开Arduino IDE。单击Tools > Serial Port。看一下列出的端口,例如COM3。 如果你看到COM3在文本编辑器中打开windows-script.py。找到以下行,并将其更改为与您看到的一致。
- possibleDevices = ["COM3"]
复制代码
搜索以下行。您需要更改这些数字以适合您的设置。对于每个可能的方向,数字是顺时针旋转的度数。 - translation = {"Y_POS":"90",
- "X_POS":"180",
- "X_NEG":"0",
- "Y_NEG":"270"}
复制代码
现在我们需要安装pySerial模块,用于从USB端口读取。打开命令提示符。在Windows 8及更高版本中,搜索cmd。在Windows 7及更早版本中,在开始菜单中找到run实用程序并输入cmd。 在现在出现的终端中,键入: - python -m pip install pyserial
复制代码
安装python模块可能很麻烦。如果未成功安装,请不要继续。 现在,在运行脚本之前,我们还需要做一件事。找到上述zip文件的Windows文件夹中包含的显示实用程序。
如果您有多台显示器,请执行以下操作。如果您只有一台显示器,请跳过此段落。打开保存display.exe的命令提示符。 在命令提示符下输入display.exe / listdevices。您应该看到每个监视器的索引。记下要旋转的索引的内容。
python脚本将打开与USB端口的连接。当它检测到来自Arduino的消息时,它会将相应的命令发送到display.exe,这将旋转显示。找到以下行,并将目录更改为指向display.exe。 - command = "C:/.../display.exe /rotate:" + translation[direction]
复制代码对于具有多个监视器的用户,还要添加/ device x(其中x是监视器的索引)。所以类似于: - command = "C:/.../display.exe /device 2 /rotate:" + translation[direction]
复制代码
在命令提示符中,导航到保存display.exe和windows-script.py的文件夹。使用cd命令执行此操作。例如,如果它们保存在Documents / rotate中,请使用: 现在输入dir以查看该目录中的文件列表。仔细检查您是否看到这两个文件。现在让我们运行python脚本。
尝试旋转设备。屏幕应相应旋转。
现在我们需要告诉Windows每次启动计算机时都在后台运行该程序。默认情况下,启动程序会明显打开。我们不希望一直看到可见的命令窗口。因此,我们将创建一个批处理文件,它将在后台启动python脚本,然后批处理文件将退出。 首先,打开您的启动文件夹。此文件夹的位置取决于您使用的Windows版本。按Windows键,然后按R.应显示运行窗口。键入shell:startup并按Enter键。现在您应该看到您的启动文件夹。创建一个名为monitor.bat的新文本文件,并将以下代码粘贴到该文件中。修改路径,使其指向您的python脚本。 - @echo off
- START pythonw C:\...\windows-script.py
复制代码
我们使用pythonw而不是python,因为这是隐藏python脚本的命令窗口所必需的。 现在重新启动计算机并检查它是否有效。
|