雷竞技注册
项目

使用Arduino构建自动计算机显示旋转器

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

学习如何构建一个设备,当您的计算机显示器是物理旋转,并自动告诉您的计算机旋转显示相应。

学习如何构建一个设备,当您的计算机显示器是物理旋转,并自动告诉您的计算机旋转显示相应。

动画GIF的监视器旋转

这些天数数字内容狭窄而且高大(纵向),但大多数计算机屏幕短而长(横向)。这意味着许多屏幕的房地产被浪费了。比较下面的两个截图。在景观视图中只能看到一个半帖,而3可以在肖像中看到。

Facebook在景观

横向模式

Facebook在肖像

肖像模式

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

工作原则

该设备将是基于Arduino的,并将安装在显示器的背面。我们将使用加速度计来感测方向。静止时,加速度计将重力解释为9.8米/秒的加速度2。加速度计将通过I2C协议与Arduino交谈。Arduino将不断地看(轮询)加速度计认为它会加速的方向。当变化时,它将通过USB向计算机发送信号。在计算机上运行的Python脚本将读取更改,并将告诉计算机相应地旋转显示器。

本文介绍了如何在Windows和Linux上实现此功能。它可能也可以在Mac上完成。然而,由于我不拥有Mac,我无法尝试。(唯一的区别是Python脚本调用的系统命令。)

材料

你会需要:

  • arduino - 我们使用了一个uno,但你可以使用你想要的任何arduino类型。
  • Arduino原型护罩 - 任何风格都会做
  • MMA7455加速度计
  • 粘性安装销
  • 按钮
  • 100kΩ电阻
  • 一些电线
  • 烙铁和焊料

需要材料

当然,您还需要一个可以旋转的显示器。如果您有非旋转监视器,请检查是否有vesa.安装孔(背面的正方形中的4或8螺纹孔)。您可以购买旋转约70美元的VESA兼容监视器架。

建设

拿起你的烙铁,让我们开始吧!

如果您在电子设备中有太多的体验,则加速度计上的一些引脚名称应熟雷竞技最新app悉。VCC和GND将与Arduino的电源导轨相关联。CS表示“芯片选择”。由于我们在该项目中只有一个芯片,因此我们将将其与5V身体相连。SDA和SCL是I2C协议中使用的后退通信线路。如果您没有使用Arduinouno.,SDA和SCL的引脚可能不同。

加速度计引脚 Arduino Uno Pin.
vcc. 5V.
GND. GND.
CS 5V.
SDA. 4.
SCL. 5.

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

按钮电路图

Arduino Code.

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

将披风插入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枚举{y_pos,y_neg,x_pos,x_neg,z_pos,z_neg,not_sure}方向;

一个枚举是c中的数据类型,就像char。它用于变量,该变量可以是从非数字变量的短列表中的一个值。在这种情况下,我们正在使用枚举当我们将设备的方向保存到变量中。

看看加速度计。你会看到一个x箭头和一个箭头。当x箭头指向时,我们已打电话X_POS.。当x箭头指向时,我们已打电话X_NEG.。z轴指向黑板的外面或里面。当板子平放在桌子上的时候Z_POS

当安装在显示器背面时,设备应该只有y轴或x轴向上或向下。我们已经在监视器中创建了一个宏。伊诺叫做vigw_orientation检查给定的方向是否与我们预期的4个选项之一匹配。正如您所看到的,我们可以与任何其他数据类型一起检查枚举的值。

#define valid_orientation(O)((o == y_pos)||(o == y_neg)||(o == x_pos)||(o == x_neg))

设置功能主要是诊断。有3条重要线条。

Serial.Begin(9600);

以上线启动串行通信,这是我们与计算机交谈的方式。

Wire.begin();

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

错误= MMA7455_init (START_ORIENTATION);

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

我们使用的加速度计具有一些中断功能,但它不适用于我们的用例。这就是我们诉诸的原因轮询。(在性能方面更优选中断。)通常,在您希望按钮执行某些内容时使用中断是良好的做法。但是,由于我们无论如何都轮询加速度计,我们可能会轮询按钮。

每次循环时,我们都会检查是否正在按下该按钮。如果是,它是最后一次按下,那么我们知道用户刚刚按下按钮,所以我们再次运行安装程序,并发送start_orientation的电脑。然后我们等待100毫秒再继续。这个延迟是为了Arduino在继续之前等待按钮联系人确定。无可否认,这是一种相当粗心和懒惰的软件调试方法,因为Arduino在延迟期间什么也不做。更复杂的方法将包含计时器,这样在Arduino等待按钮的同时,其他代码可以继续执行。在这种特定的情况下,我们使用延迟而不是计时器所遗漏的唯一内容便是来自加速计的更改读数。因为当用户按下按钮时不应该发生这种情况,所以这种草率的方法是可以接受的。延迟法的唯一优点是它很简单。硬件调试需要更多的组件,为中断和延迟编写代码可能会变得棘手。

}else if(!digitalRead(BUTTON_PIN) //按钮被按下
&& previous_button_state)//这是第一次
//按下
{
//即使方向没有改变,也会发送
设置();//重新校准
Sendorientation(start_orientation);
延迟(100);//软件删除
Previous_button_state = 0;
}

电脑端代码

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

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

Linux用户应该跳到Linux部分

视窗

为您的计算机下载Python 3这里。在安装期间询问您是否要将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模块的安装可能很繁琐。如果没有成功安装,则不要继续。

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

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

Python脚本将打开与USB端口的连接。当它从Arduino检测到消息时,它将将相应的命令发送到Display.exe,这将旋转显示器。找到以下行,并更改目录以指向display.exe.

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

对于具有多个监视器的用户,还添加/设备X(其中X是您的监视器的索引)。所以有些东西如:

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

在命令提示符中,导航到您保存的文件夹display.exe.Windows-Script.py.。使用CD命令执行此操作。例如,如果它们保存在文件/旋转使用:

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.

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

安装pyserial.模块。

Python3 -m pip安装pyserial

安装python模块可能很棘手。如果从上面的命令中收到错误,不要继续。

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

possibledevices = [“/ dev / ttyacm0”,“/ dev / ttyacm1”,“/ dev / ttyacm2”]

我们需要运行的命令取决于您的特定设置。打开一个终端(ctrl+alt.+T.)并进入Xrandr.。您应该看到显示(或多个),例如edp1.HDMI1。请注意那个名字。实验使用以下命令,以查看它是否旋转显示器。

对于名称的单个监视器HDMI1

xrandr --output hdmi1 - 左侧和

将显示屏放回,

xrandr --output hdmi1 - 左侧和

对于两个显示器,edp1.(不旋转,右侧)和HDMI1(在左边),尝试:

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

把它放回去:

xrandr --output hdmi1 - 正常 - 自适应 - 小丁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日

    嘿,你能展示如何连接的按钮和电阻,因为没有照片,你才显示,没有按钮和电阻的情况。
    如果我没有使用按钮,它会在没有电阻的情况下工作,如果我不会使用按钮?
    我可以为此改变代码,但我对电东西不太好,所以我需要确保该电阻仅是按钮或加速度计本身所必需的。

    喜欢。 回复