无线电杂志

可编程型电动显示器支架

时间:2013-02-19 09:56:29  作者:杨闰哲  来源:  查看:5360  评论:0
导读:可编程型电动显示器支架 温州中学高一(4)班 杨闰哲 一、设计背景: 生活在21世纪,电脑已经成为了我们日常生活工作密不可分的一部分。人们长时间地坐在电脑桌前,保持不变的姿势,日久不免会对颈椎造成伤害。越来越多的人因为长时间盯着显示器而患上不同程度的..

可编程型电动显示器支架

温州中学高一(4)班 杨闰哲

一、设计背景:

生活在21世纪,电脑已经成为了我们日常生活工作密不可分的一部分。人们长时间地坐在电脑桌前,保持不变的姿势,日久不免会对颈椎造成伤害。越来越多的人因为长时间盯着显示器而患上不同程度的颈椎病。该项目即是针对这一问题设计的。通过设计和制作一个可进行自动调节的电动显示器支架,方便使用者调整显示器到一个舒适的位置,也可通过颈椎保护程序来自动调节,从而预防或治疗长时间使用电脑者的颈椎病,另外也具备一定的防止近视的功效。

二、设计过程:

在确定支架结构的过程中,考虑了多种模型,因为要使支架既可以上下运动,又可以左右调节,最终决定以常见的平行四边形伸缩架为基本模型,通过两个电动机带动支架底部与齿型架座相嵌的小轮,以两个小轮之间的相对运动实现对显示器的高度和左右位置的控制。电动机可由程序控制,更加方便操作。考虑到在轮子转动时,两个电机也可能随之转动,后又在架座上设计了固定电机的滑轨。为了增加显示器位置的可调节区域面积,进过计算,最终确定支架的规格。为使位置更加精确,保证运动的可重复性,查阅资料,决定选用双极性四相步进电机。最后用VB实现对电机的操控,并设计颈椎保护程序。

三、设计方案:

此智能型电动显示器支架可通过程序控制电机进行自动调节,两个电机带动小轮做相向运动时,平行四边形支架升高,显示器上升。两个电机带动小轮做背向运动时,平行四边形支架降低,显示器下降。两个电机带动小轮同时做向左(向右)运动时,支架向左(向右)运动,显示器左(右)移,由此实现对显示器的上下左右多个方向位的自动置调整。且颈椎保护程序能每隔一定时间自动调整显示器位置,从而使使用者被迫改变观看显示器的姿势,避免或缓解长时间使用电脑者的颈椎疲劳。

基本思路

底座剖面图

 

总设计图见如下:

 

四、工作原理:

(一)工作流程图如下所示:


(二)对VB程序(控制端)的界面设计如下:

1.“↑”“↓”“←”“→”四个按键分别控制支架的上下左右运动(指令形式为“C+w/s/a/d+“移动步数”<默认为1>)。

2.按下“启用颈椎保护模式”可以每隔20分钟向单片机发送指令(形式为“C+x+“左轮坐标”+“右轮坐标”),随机调整显示器位置。

3.“对话”栏:显示从单片机发送来的信息。

4.“当前位置”栏:显示显示器的当前水平位置和垂直高度,数据从单片机上获取(并自行换算)。

5.“命令输入”栏:可以直接进行命令的输入。

6.“位置”栏:以直观地看到显示器的当前位置。也可直接进行拖动改变显示器的位置。

(三)写到单片机上的程序代码如下:



(四)该可编程型电动显示器支架选用双极性四相步进电机(以双限制控制)。步进电机有如下优点:

1.停转时有最大的转矩

2.每步精度在3%~5%,误差不会积累到下一步,有较好的位置精度和运动的重复性

3.优秀的起停和反转响应

4.没有电刷,寿命较高

5.由数字输入脉冲控制

6.仅仅将负载直接连接到电机的转轴上也可以极低的速度同步旋转

步进电机的工作原理:

通常电机的转子为永磁体,当电流流过定子绕组时,定子绕组产生一矢量磁场。该磁场会带动转子旋转一角度,使得转子的一对磁场方向与定子的磁场方向一致。当定子的矢量磁场旋转一个角度。转子也随着该磁场转一个角度。每输入一个电脉冲,电动机转动一个角度前进一步。它输出的角位移与输入的脉冲数成正比、转速与脉冲频率成正比。改变绕组通电的顺序,电机就会反转。所以可用控制脉冲数量、频率及电动机各相绕组的通电顺序来控制步进电机的转动。

(五)用单片机控制步进电机,可以直接调用现成的Stepper库。该库内容如下:

/*

* two-wire constructor.

* Sets which wires should control the motor.

*/

Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2)

{

this->step_number = 0; // which step the motor is on

this->speed = 0; // the motor speed, in revolutions per minute

this->direction = 0; // motor direction

this->last_step_time = 0; // time stamp in ms of the last step taken

this->number_of_steps = number_of_steps; // total number of steps for this motor

// Arduino pins for the motor control connection:

this->motor_pin_1 = motor_pin_1;

this->motor_pin_2 = motor_pin_2;

// setup the pins on the microcontroller:

pinMode(this->motor_pin_1, OUTPUT);

pinMode(this->motor_pin_2, OUTPUT);

// When there are only 2 pins, set the other two to 0:

this->motor_pin_3 = 0;

this->motor_pin_4 = 0;

// pin_count is used by the stepMotor() method:

this->pin_count = 2;

}

/*

* constructor for four-pin version

* Sets which wires should control the motor.

*/

Stepper::Stepper(int number_of_steps, int motor_pin_1, int motor_pin_2, int motor_pin_3, int motor_pin_4)

{

this->step_number = 0; // which step the motor is on

this->speed = 0; // the motor speed, in revolutions per minute

this->direction = 0; // motor direction

this->last_step_time = 0; // time stamp in ms of the last step taken

this->number_of_steps = number_of_steps; // total number of steps for this motor

// Arduino pins for the motor control connection:

this->motor_pin_1 = motor_pin_1;

this->motor_pin_2 = motor_pin_2;

this->motor_pin_3 = motor_pin_3;

this->motor_pin_4 = motor_pin_4;

// setup the pins on the microcontroller:

pinMode(this->motor_pin_1, OUTPUT);

pinMode(this->motor_pin_2, OUTPUT);

pinMode(this->motor_pin_3, OUTPUT);

pinMode(this->motor_pin_4, OUTPUT);

// pin_count is used by the stepMotor() method:

this->pin_count = 4;

}

/*

Sets the speed in revs per minute

*/

void Stepper::setSpeed(long whatSpeed)

{

this->step_delay = 60L * 1000L

/ this->number_of_steps / whatSpeed;

}

/*

Moves the motor steps_to_move steps. If the number is negative,

the motor moves in the reverse direction.

*/

void Stepper::step(int steps_to_move)

{

int steps_left = abs(steps_to_move); // how many steps to take

// determine direction based on whether steps_to_mode is + or -:

if (steps_to_move > 0) {this->direction = 1;}

if (steps_to_move < 0) {this->direction = 0;}

// decrement the number of steps, moving one step each time:

while(steps_left > 0) {

// move only if the appropriate delay has passed:

if (millis() - this->last_step_time >= this->step_delay) {

// get the timeStamp of when you stepped:

this->last_step_time = millis();

// increment or decrement the step number,

// depending on direction:

if (this->direction == 1) {

this->step_number++;

if (this->step_number == this->number_of_steps) {

this->step_number = 0;

}

}

else {

if (this->step_number == 0) {

this->step_number = this->number_of_steps;

}

this->step_number--;

}

// decrement the steps left:

steps_left--;

// step the motor to step number 0, 1, 2, or 3:

stepMotor(this->step_number % 4);

}

}

}

/*

* Moves the motor forward or backwards.

*/

void Stepper::stepMotor(int thisStep)

{

if (this->pin_count == 2) {

switch (thisStep) {

case 0: /* 01 */

digitalWrite(motor_pin_1, LOW);

digitalWrite(motor_pin_2, HIGH);

break;

case 1: /* 11 */

digitalWrite(motor_pin_1, HIGH);

digitalWrite(motor_pin_2, HIGH);

break;

case 2: /* 10 */

digitalWrite(motor_pin_1, HIGH);

digitalWrite(motor_pin_2, LOW);

break;

case 3: /* 00 */

digitalWrite(motor_pin_1, LOW);

digitalWrite(motor_pin_2, LOW);

break;

}

}

if (this->pin_count == 4) {

switch (thisStep) {

case 0: // 1010

digitalWrite(motor_pin_1, HIGH);

digitalWrite(motor_pin_2, LOW);

digitalWrite(motor_pin_3, HIGH);

digitalWrite(motor_pin_4, LOW);

break;

case 1: // 0110

digitalWrite(motor_pin_1, LOW);

digitalWrite(motor_pin_2, HIGH);

digitalWrite(motor_pin_3, HIGH);

digitalWrite(motor_pin_4, LOW);

break;

case 2: //0101

digitalWrite(motor_pin_1, LOW);

digitalWrite(motor_pin_2, HIGH);

digitalWrite(motor_pin_3, LOW);

digitalWrite(motor_pin_4, HIGH);

break;

case 3: //1001

digitalWrite(motor_pin_1, HIGH);

digitalWrite(motor_pin_2, LOW);

digitalWrite(motor_pin_3, LOW);

digitalWrite(motor_pin_4, HIGH);

break;

}

}

}


五、创新性、科学性、实用性:

经过调查,与此项目类似的电动显示器支架款式多样,但以挂壁型和直杆型为主,几乎没有以平行四边形伸缩架为支架主体的。且几乎所有的显示器支架只能做高度上的调整,却不能调整左右位置。用程序进行直接控制和自动调整,以及能够保护颈椎疲劳、预防近视,更是同类电动显示器支架所不具有的一大特色。

将普通的物理显示器支架与单片机技术结合到一起,并用C语言对单片机进行编程,用BASIC语言设计程序,由程序通过串口向单片机发送指令,单片机执行命令,对命令进行处理,控制步进电机转动,从而控制平心四边形支架的形状,达到改变显示器位置的效果。在对支架结构与程序的设计中都体现了该项目丰富的科学性。

这款可编程型电动显示器支架方便易用。其针对长时间使用电脑者和颈椎不便者进行设计,可方便调节显示器位置,且颈椎保护程序可有效避免颈椎长时保持相同姿势造成的疲劳。左右位置的调节,可在一定程度上避免长时间盯着显示器引起的近视,对青少年预防近视也有一定的功效。

六、应用前景:

该可编程型电动显示器支架可应用于办公室、电子阅览室、机房等,也可用于家庭,对所有的桌面液晶显示器都适用。且该项目针对当代白领及青少年不同程度上的颈椎和近视问题进行设计,有广阔的应用前景。


关键词:arduino

评论区

已有0位网友发表评论
帐  号: 密码: (如果您还不是博趣会员,欢迎注册)
表  情:
内  容:
网友评论仅供其表达个人看法,并不表明博趣网同意其观点或证实其描述。