机器人制作开源方案 | 可变式智能正姿椅

作者:吴菁菁 徐乐 张志强

单位:河海大学

指导老师:施敏虎 赵建华

一、作品简介

1. 作品介绍

       久坐本身及其导致的各种错误坐姿行为常常会引发一系列健康问题,不利于人体健康。

       椅子作为人在久坐状态下与人体接触时间最长的工具则成为了市场上矫正坐姿的首要产品。

       经过对市场上现有产品的对比研究发现,一个优秀的坐姿矫正椅应具备以下特点:

              1)通过新的提醒方式解决传统坐姿矫正椅警示效果不明显的问题;

              2) 打破常规,一椅多用,增加功能调节模式,提升座椅性价比和用户体验度;

              3)基于人机工程学设计追求座椅使用舒适度,同时结合青少年成长需求,合理延展座椅适用年龄段。

       据此,本作品进行了智能正姿椅的设计和研究,希望能为大家解决坐姿行为习惯养成的问题。

      本装置的设计目标是解决现有坐姿矫正产品功能单一、效果不明显、体验感不佳等问题。本作品由“变形金刚”得到灵感,打破思维定势,结合人机工程学原理,设计出了一款可以“变形”的智能椅,既能成为使用者坐姿矫正的好帮手,又能给使用者带来新鲜有趣的体验感。

      结构方面,该装置整体由四大部分构成:

             ① 椅面处一组联动式平行四边形机构;

             ② 椅背处一组联动式曲柄滑块机构;

             ③ 膝靠板处一组联动式平行四边形与曲柄滑块组合机构;

             ④ 椅面双侧齿轮传动剪叉式复合椅腿构成。

      机构①②③合称为对称式主轴联动机构,负责实现椅背倾角由90°至180°的变换以及膝靠板的收放功能;机构④通过齿轮传动实现两侧复合椅腿的角度开合,实现椅面升降与倾斜。

      控制方面,主要包括arduino开发板、电机、超声波传感器、蜂鸣器、压力传感器、触碰开关等。开发板是整个控制系统的中心,通过开发板对电机的控制,使得对称式主轴联动机构可以调整为不同的姿态,实现控制椅背以及膝靠板的角度变换。超声波传感器和压力传感器是监测模块的核心部分,蜂鸣器和电机是干预模块的响应部分。当两个超声波传感器检测到距离差大于设定值时,释放电信号,开发板根据程序及检测到的电信号,启动干预模块。同理,当压力传感器检测到持续压力时间超过设定值或两个压力传感器所测数值差大于设定值时,干预模块开启。触碰开关安装在座椅扶手两侧,当使用者按住开关时,开发板根据程序及检测到的电信号做出相应调整。

应用场景,可变式智能正姿椅旨在帮助“久坐族”和坐姿习惯不当的人群,如上班族,学生等,可用于办公室,自习室和居家环境等场景,有助于使用者养成健康行为习惯,避免脊柱健康问题等,同时可实现“一椅多用”。

      在制作过程中,小组成员用matlab对所需数据进行了分析,简化物理模型,用solidworks 进行了模型构建和关键零部件的静力分析,用 arduino 进行编程,控制电机、舵机等结构。本装置的物理模型由探索者套件搭建,并烧入程序进行调试,在调试中不断根据实际反馈结果优化结构设计。经过近两个月的制作与优化,团队制作出了物理样机,实现了预期功能。

设计流程图
可变式智能正姿椅实物图

2. 工作过程

2.1坐姿矫正过程

       该装置的矫正过程如下图所示,当产生错误坐姿时,监测系统发出电信号,单片机进行处理,并开启矫正过程,座椅两侧电机工作,带动齿轮传动及复合椅腿角度变换,从而使椅面高度改变,在一定程度上干扰使用者,达到提醒使用者矫正坐姿的目的。当监测系统检测到使用者重新坐好时,座椅椅面恢复正常。整个装置完成坐姿矫正功能。此外,当使用者按压触碰开关时产生持续电信号也可自主调整座椅高度。

椅面高度升降过程

2.2 模式变换过程

      该装置三种模式如下图所示,椅面为固定部分,舵机带动椅面处平行四连杆机构运动,从而带动与其前后两端固连的椅背和膝靠板机构运动,使椅背与膝靠板都能以椅面所在轴线旋转。同时,膝靠板处另设一舵机,控制曲柄滑块机构运动,实现膝靠板单独收放,该装置完成模式变化过程。

座椅三种模式展示

3. 创新点介绍

3.1功能创新

      ① 本装置采用基于压力传感器的人体坐姿识别测试方法对使用者的坐姿进行判断,该监测方法具有操作方便、稳定性高、准确率高、成本较低等优点。

      ② 本装置结合蜂鸣器警报以及椅面高度变化的强制干预功能,与传统提示相比,能够有效地实时干预使用者的错误坐姿,帮助使用者自觉养成健康的坐姿习惯。

      ③ 本装置提供了三种坐姿模式的选择,实现了一椅多用功能,同时可以自主调整座椅高度和椅背倾斜角度,满足不同使用者的需求。

3.2设计创新

      ① 采用剪叉式复合升降椅腿代替传统气压升降立柱。传统气压升降椅会由于零部件老化、产品质量欠佳以及使用习惯不正确发生爆炸,具有极大的安全隐患,在综合考量各种机构设计的优缺点后,本装置采用剪叉式复合椅腿完成座椅升降功能,经过实验和分析,该机构具有稳定性强、安全性能高等优点。  

      ② 采用对称式主轴联动机构实现椅背、膝靠板配合运动。为实现座椅三种模式的正常变换,本装置特地采用由平行四边形机构与曲柄滑块复合机构组成的对称式主轴机构,该设计具有运动平稳连续、操作方便等优点,能够较好地实现座椅仰躺式、膝靠式以及常规式三种模式的转变。

二、装置介绍

1. 机械结构总体规划设计

       本装置核心部分为对称式主轴联动机构,主要包括联动式平行四边形机构与曲柄滑块机构,该设计在一定程度上既确保了运动的流畅性,也保证了装置的稳定性;同时该装置摒弃传统的液压升降装置,创新椅腿结构化设计,采用齿轮传动搭载剪叉式复合椅腿的设计,通过变换复合椅腿开合角度实现座椅升降。

       具体研究步骤如下:

       ① 搜集资料分析各种机构优缺点,由装置具体功能确定各机构及其连接方式;

       ② 根据人机工程学及机构运动方程确定机构间角度变化范围;

       ③ 使用 Solidworks 软件,搭建装置模型,并进行运动仿真,确保各机构间运动互不干涉。

实物建模

1.1变换机构设计

      变换机构采用如下图所示的对称式主轴联动设计,可分为椅面、椅背和膝靠板三部分,包括椅面处平行四边形机构,椅背处曲柄滑块机构与膝靠板处平行四边形机构与曲柄滑块组合机构。若机构存在死点位置,则该处的驱动力对从动件有效回转力矩为零,会对连续传动产生阻碍,从而影响装置运动的流畅性。由于本装置采用的平行四边形机构属于双曲柄机构,无死点位置,故仅需考虑两处曲柄滑块处的死点位置。当曲柄连杆与滑块行程轨迹共线时形成死点位置,但通过规定角度范围,已有效避免机构到达死点位置。

对称式主轴联动结构实物图

1.2 矫正机构设计

      矫正机构主要由椅面两侧齿轮传动搭载剪叉式复合椅腿构成,如下图所示。该设计结合

      剪叉式升降机构和开合式机械爪模型,采用“X”形复合椅腿设计。“X”形椅腿由腿1、腿2组成,上端分别与齿轮轴相连,下端与滚轮相连,确保流畅度与稳定性。电机控制齿轮传动,带动“X”角度变换,从而控制椅面升降。通过椅面升降这一行为干预措施达到提醒使用者矫正坐姿目的。

剪叉式复合椅腿模型图

2. 监测模块设计

      本作品采用基于压力传感器的人体坐姿识别测试方法来监测使用者的不同坐姿状态,并以此判断错误坐姿。具体研究步骤如下:

      ① 将人与椅面接触部分简化为“两点一线”,即两个坐骨接触点和一条脊柱线段,如下图所示:

简化物理模型

② 根据简化物理模型,在椅面坐骨两点处分别安装压力传感器,在椅背处脊柱线段对应的上下两点分别安装超声波传感器,如下图所示:

传感器安装位置

③ 收集不同错误坐姿下对应的传感器数据,并用 matlab 对所得数据进行拟合分析;

④ 编写程序,设定传感器响应范围,确保在错误坐姿发生时,传感器能够发生电信号,并由单片机进行下一步工作,到此监测系统设计完成。

监测模块系统框图

3. 人机工程学设计

       为给使用者带来更好的舒适性体验,本设计结合人机工程学原理与使用群体特征,对座椅各方面尺寸指标进行了分析与研究。

      ① 座椅高度:研究表明,为避免大腿下有过高的压力,座位前沿到地面或脚踏的高度不应大于脚底到大腿膝盖的距离。对于青少年而言,椅面高度可调范围以38~45cm为宜,并且应设计为可调整式, 以适应不同用户的身体尺寸。

      ② 椅面宽度:椅面宽度以38~48cm为宜。对于有扶手的座椅, 应以扶手的内宽作为座宽的尺寸, 一般不应小于47cm。

      ③ 椅面倾角一般情况下,座面倾角越大,下肢肌肉受力就越小,疲劳度也越小。但学习用椅的倾角不能太大, 一般4~5°为宜。

      ④ 座椅靠背:靠背设计的主要目的是为脊柱提供稳定的支承, 放松背肌, 使椎间盘接近正常受力状态。就人体脊柱形状而言, 为使脊柱接近于自然的S形生理曲度,靠背角度115°左右为最佳。

座椅尺寸参考表

4. 静力学分析

      在solidworks进行建模,并使用其中的simulation模块对模型部分部件进行强度校核。本节中校核的零部件考虑到质量和强度的问题,均采用合金钢材料。弹性模量为2.1e+11N/m^2,质量密度为7700kg/m^3,中泊松比为0.28。具体操作步骤为:

      ① 在 solidworks 内建立模型,打开solidworks中的simulation模块;

      ② 对模型进行网格划分;

      ③ 对模型添加约束;

      ④ 对模型添加应力;

      ⑤ 进行仿真,得出应力分布云图。

椅面应力分布云图
椅腿杆应力分布云图
齿轮应力分布云图

      椅面、椅腿、齿轮的应力分布云图如上所示,当根据人体较大体重添加至2000N时,通过云图可以看出这三部分均无应力破坏现象,符合工作条件。由此可知,根据人体质量当添加较大重力时,其应力变化均在承受载荷所允许的范围内,因此该作品设计满足正常的使用需求。

三、程序代码

1. 示例程序

#include <Servo.h>

Servo myservo1;   // create servo object to control a servo

Servo myservo2;

Servo myservo3;

Servo myservo4;

// a maximum of eight servo objects can be created

const int TrigPin1=A1;       //设置发射脚位

const int EchoPin1=A0;      //设置接收脚位

const int TrigPin2=A5;       //设置发射脚位

const int EchoPin2=A4;      //设置接收脚位

float cm1;                 //浮点型数据类型(加小数点,提高精准度)

float cm2;

int i;

int key=0;

int flag=1;

int tang=1;

int pos = 0;    // variable to store the servo position


void setup()

{

  Serial.begin(9600);

  pinMode(TrigPin1,OUTPUT);

  pinMode(EchoPin1,INPUT);

  pinMode(TrigPin2,OUTPUT);

  pinMode(EchoPin2,INPUT);

  pinMode(A2,INPUT);

  pinMode(A3,INPUT);

  pinMode(7,INPUT);

  pinMode(3,INPUT);

//   pinMode(8,INPUT);

  myservo1.attach(4);   // attaches the servo on pin 9 to the servo object

  myservo2.attach(12);  

  myservo3.attach(8);

  myservo4.attach(11);

}



void loop()

{

  while(digitalRead(7)==LOW)

  {

    while(digitalRead(A2)==LOW)

    {                         // in steps of 1 degree

      myservo1.write(pos);   

      myservo2.write(50-pos);      // tell servo to go to position in variable 'pos'

      delay(75);                       // waits 15ms for the servo to reach the position

      pos+=1;  

      if(pos==50)

      {

        pos-=1;

      }

    }

    while(digitalRead(A3)==LOW)

    {  

      myservo1.write(pos);

      myservo2.write(50-pos);       // tell servo to go to position in variable 'pos'

      delay(75);                       // waits 15ms for the servo to reach the position

      pos-=1;  

      if(pos==0)

      {

        pos+=1;

      }

    }

  }

  while(digitalRead(7)==HIGH)

  {

    if(digitalRead(A2)==LOW)//guishi  

    {

      if(flag==1)

      {

        for(i=50;i<200;i++)

        {

          myservo3.write(i);

          delay(100);

        }

      }

      else

      {

        for(i=200;i>50;i--)

        {

          myservo3.write(i);

          delay(100);

        }

      }

      flag*=-1;

      delay(500);

    }

    if(digitalRead(A3)==LOW)

    {

      if(tang==-1)

      {

        for(i=0;i<200;i++)

        {

          myservo4.write(i);

        }

      }

      else

      {

        for(i=200;i>0;i--)

        {

          myservo4.write(i);

          delay(100);

        }

      }

      tang*=-1;

      delay(500);

    }

    digitalWrite(TrigPin1,LOW);        //用低高低电平发送脉冲给Trigpin引脚

    delayMicroseconds(2);             //微秒级延时

    digitalWrite(TrigPin1,HIGH);

    delayMicroseconds(10);

    digitalWrite(TrigPin1,LOW);

    cm1=pulseIn(EchoPin1,HIGH)/58.0;    //读取脉冲宽度,换算成厘米


    digitalWrite(TrigPin2,LOW);

    delayMicroseconds(2);

    digitalWrite(TrigPin2,HIGH);

    delayMicroseconds(10);

    digitalWrite(TrigPin2,LOW);

    cm2=pulseIn(EchoPin2,HIGH)/58.0;

    //Serial.print(cm2-cm1);                 //显示距离

    //Serial.print("cm");               //显示单位

    //Serial.println();                 //回车

    Serial.print(key);

    Serial.println();

    if( cm1<30 && cm2<30 )

    {

      if(cm2-cm1<-5||cm2-cm1>5)key+=1;

      else key-=1;

      if(key>5)

      {

        for(i=pos ; i < 50; i += 1)   // goes from 0 degrees to 180 degrees

        {                                  // in steps of 1 degree

          myservo1.write(i);              // tell servo to go to position in variable 'pos'

          myservo2.write(50-i);

          delay(15);                       // waits 15ms for the servo to reach the position

        }

        for(i = 50; i>=1; i-=1)     // goes from 180 degrees to 0 degrees

        {                               

          myservo1.write(i);

          myservo2.write(50-i);           // tell servo to go to position in variable 'pos'

          delay(15);                       // waits 15ms for the servo to reach the position

        }

        for(i=0 ; i <= pos; i += 1)   // goes from 0 degrees to 180 degrees

        {                                  // in steps of 1 degree

          myservo1.write(i);

          myservo2.write(50-i);           // tell servo to go to position in variable 'pos'

          delay(15);                       // waits 15ms for the servo to reach the position

        }  

        key-=1;

      }

      else if(key<=0)

      {

        key+=1;

      }

      delay(1000);

    }

  }

}

程序源代码及模型3D文件资料详见 可变式智能正姿椅

猜你喜欢

转载自blog.csdn.net/Robotway/article/details/131878483
今日推荐