yaboPP电子
项目

用Arduino做一个自动电脑显示旋转器

2016年4月12日,经过马修•戴维斯

了解如何构建计算机监视器物理旋转时感应的设备,并自动告诉您的计算机相应地旋转显示器。

了解如何构建计算机监视器物理旋转时感应的设备,并自动告诉您的计算机相应地旋转显示器。

监控旋转的动画GIF

现在很多数字内容都是又窄又高(纵向),而大多数电脑屏幕是又短又长(横向)。这意味着大量屏幕空间被浪费了。比较下面两张截图。在景观视图中只能看到一个半帖子,而在肖像视图中可以看到3个帖子。

Facebook在景观

横向模式

Facebook在肖像

肖像模式

因此,在浏览社交媒体时,它可以是旋转计算机监视器90º的好主意,但是来回切换显示设置是乏味的。如果您有多个监视器或标准键盘快捷方式不起作用的计算机,则尤其如此。今天,我将解释如何构建一个设备自动告诉计算机在物理旋转时自动告诉您的计算机旋转显示器。

工作原则

该设备将基于Arduino,并将安装在您的显示器的后面。我们将使用加速度计来感知方向。当静止时,加速度计将重力解释为9.8m/s的向上加速度2.加速度计将通过I2C协议与Arduino对话。Arduino将不断查看(轮询)加速计认为它正在加速的方向。当它改变时,它将通过USB向计算机发送一个信号。在计算机上运行的python脚本将读取更改,并告诉计算机相应地旋转显示。

本文将解释如何在Windows和Linux上实现此功能。这可能也可以在Mac上实现。然而,由于我没有Mac,我不能尝试它。(唯一的区别是Python脚本调用的系统命令。)

材料

你会需要:

  • Arduino -我们使用Uno,但你可以使用任何类型的Arduino。
  • Arduino原型屏蔽-任何风格都可以
  • MMA7455加速度计
  • 粘性安装销
  • 按钮
  • 100kΩ电阻
  • 几条电线
  • 烙铁和焊料

所需材料

当然,您还需要一个可以旋转的显示器。如果你有一个不旋转的监视器,检查它是否有视频电子设备标准协会安装孔(背面的正方形中的4或8螺纹孔)。您可以购买旋转约70美元的VESA兼容监视器架。

建造

抓住你的烙铁,让我们开始吧!

如果你在电子学方面有丰富的经验,加速度计上的一些大头针应该是熟yabosports官网悉的。VCC和GND将被绑在Arduino的电源轨道上。CS的意思是“芯片选择”。因为我们在这个项目中只有一个芯片,我们将把它连接到5V。SDA和SCL是I2C协议中使用的来回通信线路。如果你不用Arduino的话Uno,SDA和SCL的引脚可能不同。

加速度计销 Arduino Uno销
VCC 5伏
GND. GND.
CS 5伏
SDA. 4.
SCL. 5.

对于按钮,我们将在主动低配置中将其连接。由于我们使用软件脱扣(稍后描述),我们不需要任何电容器。Button_pin在代码中定义为引脚12.如果您希望,您可以自由更改此项。

按钮电路图

Arduino Code.

如果您没有Arduinos的经验,请阅读我们的初学者的Arduino指南

将CAPE插入Arduino,并通过USB将Arduino插入计算机。

如前所述,我们可以通过测量加速度读取9.8m / s的加速来使用加速度计来检测方向2.由于显示器只有垂直或水平,这将很容易。(如果我们需要考虑对角线方向,那将更加困难。)
在编程时,将代码的不同部分分离到不同的文件中是一种很好的做法。我们已经写了一个库来感知方向,基于官方MMA7455图书馆.这使我们能够抽出如何完成的详细信息,因此我们的主文件可以保持简单,检查有一个函数调用的方向,并在更改时向计算机写入消息。

下载以下内容并从以下zip存档中提取文件。

code_files.zip.zip.

打开monitor.ino在你的Arduino IDE。编译并运行代码。(3个Arduino文件需要保存在同一个目录下。)打开您的串行监视器工具>串行显示器,或用Ctrl.+转移+m

您应该看到类似于以下类似的东西。

飞思卡尔MMA7455加速度计
2012年5月
MMA7455没问题
状态:0
WHOAMI: 55
假设设备是y_pos

现在握住Arduino,以便它处于垂直平面中。旋转它(仍然在垂直平面上)。每次旋转90º时,您应该看到这样的东西:

旋转显示器
变化检测
旋转显示器
变化检测
旋转显示器
变化检测
旋转显示器

将设备安装到显示器背面,并使用USB电缆将其插入计算机。您可以使用您想要安装的任何方法。我用胶粘钩。

安装在监视器上的设备


我们需要校准加速度计,以便它知道它在打开时最初指出的方向。每当Arduino打开时,此初始化将运行。在您的显示器上使用时,这可能是您的计算机时。(取决于您的USB端口在计算机关闭时提供电源。)如果您打开计算机时,此设备将期待您的监视器以您定义的任何默认位置。如果不是,Arduino会告诉您的计算机以错误的方式旋转显示,或者它将变得迷失方向,并不会告诉计算机旋转。

这就是为什么我们有这个按钮。当按下按钮时,Arduino重新运行设置程序,并告诉计算机将显示旋转到start_orientation.

当您在显示器背面安装设备时,当显示器处于其默认方向时,请注意哪个方向(当您打开计算机时可能进入)。
里面有一行代码monitor.ino您需要相应地改变。如果加速度计上的y箭头指向,请将其留给y_pos..如果y箭头向下,就把它改成Y_NEG.类似于X轴,使用X_POS要么X_NEG.

#define start_orientation y_pos.

如果您想了解代码中发生的事情,请继续阅读。如果您只想要一个工作产品,请跳到电脑侧代码部分。

代码的解释

对此项目不需要了解对I2C协议的详细信息。如果您想了解更多信息,请查看我们的I2C总线介绍

看一下mma7455.h.

typedef enum {Y_POS, Y_NEG, X_POS, X_NEG, Z_POS, Z_NEG, NOT_SURE}方向;

一个枚举是C中的数据类型,就像要么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))

设置函数主要是诊断。有三条关键的线。

Serial.Begin(9600);

上面的行启动串行通信,这是我们如何与计算机交谈。

Wire.begin();

初始化I2C通信,这是我们与加速度计的方式。它只是初始化Arduino侧的设置。我们用以下行初始化加速度计。

ERROR = MMA7455_INIT(start_orientation);

按下物理按钮时,联系人不会完美无缺。它们反弹,输出信号看起来好像用户在几毫秒内按下按钮多次。我们正在等待100毫秒以确保我们的代码不会以后续推送解释这些反弹。我们可以采取两种方法来解决这个问题。我们可以实现硬件消除抖动, 要么软件消除抖动.硬件方法包括添加一个低通滤波器到我们的电路,要么积极的要么被动的.因为这涉及到购买和焊接额外的组件,我已经选择软件消除抖动反而。

我们使用的加速度计具有一些中断功能,但它不适用于我们的用例。这就是我们诉诸的原因轮询.(就性能而言,中断更可取。)一般来说,当你想让一个按钮做某事时,使用中断是一个好习惯。但是,既然我们在轮询加速度计,我们也可以轮询按钮。

每次循环时,我们都会检查是否正在按下该按钮。如果是,它是最后一次按下,那么我们知道用户刚刚按下按钮,所以我们再次运行安装程序,并发送start_orientation.到电脑。然后我们在继续之前等100ms。这种延迟使得Arduino等待按钮联系人在继续之前解决。不可否认,这是一个相当邋且懒惰的软件衰败方法,因为Arduino在延迟期间没有任何作用。更复杂的方法将涉及计时器,因此可以继续执行其他代码,同时Arduino等待按钮。在这个特定情况下,我们通过使用延迟而不是计时器遗漏的唯一方法是从加速度计的更改读取。由于当用户按下按钮时不应发生,因此此邋play方法是可接受的。延迟方法的唯一优点是它很简单。硬件脱嘴需要更多的组件,并编写中断和延迟的代码可能会变得棘手。

}如果(!DigitalRead(Button_pin)//按下按下
//这是它的第一次
/ /按下
{
//即使方向没有改变,也会发送
设置();/ /进行调整
sendOrientation (START_ORIENTATION);
延迟(100);//软件删除
previous_button_state = 0;
}

电脑侧代码

Arduino会使用我们用来编程和调试的同一串行接口将信息发送到计算机。为了避免冲突,请确保在运行此脚本时关闭了Arduino IDE中的串行监视器。如果它是打开的,Arduino的一些信息将被串行监视器吞噬,脚本不会看到它们,或者只会看到其中难以理解的部分。

我们将使用Python为我们的计算机侧代码。这将倾听Arduino写入串行线路的信息,并将制作系统调用来旋转显示器。

Linux用户应该直接跳到Linux部分

窗户

为您的计算机从下载python3这里.在安装期间询问您是否要将Python添加到您的小路说,是的。

定位windows-script.py在您以前下载的zip文件中。

打开Arduino IDE。点击工具>串行端口.看看列出了哪些端口,例如COM3。

如果你看到COM3以外的任何东西,打开windows-script.py在文本编辑器中。找到以下行,并更改它以匹配您所看到的内容。

possibleDevices =(“COM3”)

搜索以下行。您需要更改这些数字以满足您的设置。对于每个可能的方向,数字以度为单位的旋转。

翻译= {" Y_POS”:“90”,
“X_POS”:“180”,
“x_neg”:“0”,
" Y_NEG ": " 270 "}

现在我们需要安装pyserial.模块,用于从USB端口读取。打开命令提示符。在Windows 8及后续版本中,搜索cmd.在Windows 7及更早版本上,在“开始”菜单中找到“运行实用程序”并输入cmd

在现在出现的终端中,输入:

Python -m PIP安装pyserial

Python模块的安装可以是finichy。如果没有成功安装,请勿继续。

现在我们还有一件事我们需要在运行脚本之前做。找到上述zip文件的Windows文件夹中包含的显示实用程序(这是来自这个网站).

如果您有多个显示器,请执行以下操作。如果您只有一个显示器,请跳过本段。打开您保存的命令提示符display.exe.(然后在该位置打开文件浏览器转移+右击在文件浏览器后台,单击在这里打开命令提示符。) 进入display.exe / listdevices.进入命令提示符。您应该看到每个监视器的索引。注意索引是您想要旋转的那个索引。

python脚本将打开到USB端口的连接。当它检测到来自Arduino的消息时,它将发送相应的命令display.exe,该命令将旋转显示。定位以下行,并更改要指向的目录display.exe

command =“c:/.../ display.exe /旋转:”+转换[方向]

对于有多个监视器的用户,还可以添加/device x(其中x是监视器的索引)。所以类似:

command =“c:/.../ display.exe / device 2 /旋转:”+转换[方向]

在命令提示符中,导航到保存的文件夹display.exewindows-script.py.使用cd命令来完成这一操作。例如,如果它们被保存在文件/旋转, 采用:

光盘文件/旋转

现在键入dir以查看该目录中的文件列表。仔细检查您是否看到这两个文件。现在让我们运行Python脚本。

python windows-script.py.

试着旋转设备。屏幕应该相应地旋转。

现在,每次我们启动计算机时,我们都需要告诉Windows在后台运行这个程序。默认情况下,启动程序被可见地打开。我们不希望总是有一个可见的命令窗口。相反,我们要创建一个批处理文件,它将在后台启动python脚本,然后批处理文件将退出。

首先,打开启动文件夹。此文件夹的位置根据您正在使用的Windows版本的位置而异。按下Windows的关键, 然后R..应出现运行窗口。类型shell:启动并按输入.现在你应该看到你的启动文件夹。创建一个调用的新文本文件monitor.bat.,并将以下代码粘贴到该文件中。修改路径,使其指向您的python脚本。

@echo关闭
开始pythonw C: \…\ windows-script.py

我们使用pythonw而不是python,因为这对于隐藏python脚本的命令窗口是必要的。

现在重新启动计算机并检查它是否有效。如果它,请跳到结束

Linux.

为您的计算机从下载python3这里.您还可以通过包管理器执行此操作。如果在安装期间询问您是否要将Python添加到您的小路说,是的。

安装pyserial.模块。

Python3 -m pip安装pyserial

安装Python模块可能很棘手。如果您收到上述命令的错误,请勿继续。

打开Arduino IDE。点击工具>串行端口.看看列出了哪些端口,例如/dev/ttyACM1
寻找linux-script.py.,它位于您之前下载的zip文件中。打开linux-script.py.在文本编辑器中。找到以下行,并在必要时修改它以添加您所看到的端口。

/dev/ttyACM0, /dev/ttyACM1, /dev/ttyACM2

我们需要运行的命令取决于您的特定设置。打开终端(Ctrl.+alt+T.),进入Xrandr..您应该看到显示(或多个),例如eDP1要么HDMI1..注意这个名字。试试下面的命令,看看它是否会旋转显示。

用于单个带名称的监视器HDMI1.

xrandr——输出HDMI1——左旋转&

为了把显示器放回去,

xrandr——输出HDMI1——左旋转&

两个显示器,eDP1(不旋转,在右边)和HDMI1.(左边),试试:

xrandr --output hdmi1 - leverate -output edp1 - auto - right-of hdmi1&

放回去:

xrandr——output HDMI1——rotate normal——primary——output eDP1——auto——right of HDMI1 & . xrandr——output HDMI1——rotate normal——primary——output eDP1——auto——right of HDMI1 &

注意哪些命令对您的设置有效。改变命令= "xrandr——output…"行在你的脚本相应,哪里正常的要么剩下被替换为" +翻译[方向]+ "(包括双引号)。

现在运行脚本:

python3 script.py.

试着旋转设备。屏幕应该相应地旋转。

如果屏幕旋转,但旋转不是正确的,请相应地修改python脚本中的以下行:

翻译= {“y_pos”:“正常”,
“X_POS”:“正确的”,
“X_NEG”:“左”,
“Y_NEG”:“倒”}

现在剩下的就是在启动时自动启动脚本。具体细节取决于你的发行版。尝试在开始菜单中搜索“启动”。或者,您可以添加cron作业去做吧。

完毕!

现在坐下来享受您更有效的屏幕空间使用。


监控旋转的动画GIF

你自己试试这个项目吧!BOM。

9日评论
  • D.
    Dvallis. 2017年9月19日

    Matthew,我能拿到你的Arduino项目的源代码吗?谢谢

    喜欢的。 回复
    • m
      马修•戴维斯 2017年9月25日
      嗨,在文章中有一个链接:https://www.allaboutcircules.com/uploads/articles/code_files.zip我的库使用加速度计作为倾斜传感器,在此处发布:https://github.com/ MLDA065 / MMA7455-Arduino-Library
      喜欢的。 回复
  • jakub kuczys. 2018年6月21日

    嘿,你能展示一下你是如何连接按钮和电阻的吗,因为这里没有照片,你只展示了,没有按钮和电阻的样子。
    如果我不用按钮,它能像你展示的那样,在没有电阻器和引脚连接的情况下工作吗?
    我可以为此改变代码,但我对电东西不太好,所以我需要确保该电阻仅是按钮或加速度计本身所必需的。

    喜欢的。 回复