程序

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include <QPainter>
#include <QtCore>
#include <QDebug>
#include "math.h"
#include <sys/ioctl.h>
#include <fcntl.h>
#include <QFile>
#include <QDataStream>    //引入头文件
/*定义常量*/
#define DIS_SMALL 278;     //定义小臂长度 单位cm
#define DIS_BIG 213.5;     //定义臂长度 单位cm
#define PI 3.1415926;      //定义PI
/*定义用到的全局变量*/
int angfix_big=0;             //定义大臂
int angfix_small=0;
int current_big=560-117;=433/667-550=117//553-433=120  大臂
int current_small=650-(-71);//=695//553-624=-71623-695=-72

int current_page=1;
int page_size=1;
QString save_index="dat0.dat";
int motor_speed=1500;//delay time

int flag_writing=0;//writing标志
int flag_lock[10];//0 当前页锁定标志,锁定后不可修改
int cont_replay[10];//0 屏幕复写计数
int temp_replay[10];//0 屏幕复写用到临时变量
int timems[10];//延时计数变量,每页单独一个数组元素由计数器1修改数值
int xx[10][100][1000];//记录x坐标 当前页-笔画数-点数
int yy[10][100][1000];//记录y坐标 当前页-笔画数-点数
int angle_big[10][100][1000];  //记录当前点的大臂角度值 当前页-笔画数-点数
int angle_small[10][100][1000];//记录当前点的小臂角度值 当前页-笔画数-点数
int dian_delay[10][100][1000];//记录每个点之间到延时时间 当前页-笔画数-点数
int step[10][100];//记录每个笔画到点数 当前页-笔画数
int bihua_num[10];//-1 用前先加1所以初始值为-1,记录当前页的总笔画数 当前页
int dian_num[10];//记录当前页的总点数 当前页
int flag_go[10];//0 用于go标记,每次go之后用此标记清除画板

int bihua_delay[10][100];//记录笔画间隔时间 当前页-笔画数
double A1,A2,A,B,C,a,b,c;//坐标与电机角度转换用到变量、常量

/********************************************************************************
* 函数名称:主函数
* 功    能:主函数
*********************************************************************************/
MainWindow::MainWindow(QWidget *parent) :QMainWindow(parent),ui(new Ui::MainWindow)//主函数入口
{
    /*初始化变量*/
    ui->setupUi(this);
    ui->radioButton_2->setEnabled(0);
    ui->radioButton_3->setEnabled(0);
    ui->radioButton_4->setEnabled(0);
    ui->radioButton_5->setEnabled(0);
    ui->radioButton_6->setEnabled(0);
    ui->radioButton_7->setEnabled(0);
    ui->radioButton_8->setEnabled(0);
    ui->radioButton_9->setEnabled(0);
    for(int con1=0;con1<10;con1++)
    {
        flag_lock[con1]=0;
        cont_replay[con1]=0;
        bihua_num[con1]=-1;
        dian_num[con1]=0;
        flag_go[con1]=0;
        temp_replay[con1]=0;
        timems[con1]=1;
    }
    a=DIS_SMALL;
    c=DIS_BIG;

    /*初始化GPIO状态*/
    int fd=::open("/dev/leds",0);
    int fd2=::open("/dev/step",0);
    ::ioctl(fd2,0,0);//  con6 PIN9  CK1
    ::ioctl(fd2,0,1);//  con6 PIN10 CK2
    ::ioctl(fd2,0,2);//  con6 PIN11 CW1
    ::ioctl(fd2,0,3);//  con6 PIN12 CW2
    ::ioctl(fd2,1,6);//  con6 PIN15 HAND
    ::close(fd2);
    ::ioctl(fd,0,0);//
    ::ioctl(fd,0,1);//
    ::ioctl(fd,0,2);//
    ::ioctl(fd,0,3);//
    ::close(fd);

    /*初始化画板*/
    pix = QPixmap(200,200);
    pix.fill(Qt::gray);

    /*初始化定时器*/
    timer1 = new QTimer(this);
    timer4 = new QTimer(this);
    timer2 = new QTimer(this);
    timer3 = new QTimer(this);
    connect(timer1,SIGNAL(timeout()),this,SLOT(timer1UpDate())); //
    connect(timer2,SIGNAL(timeout()),this,SLOT(timer2UpDate()));
    connect(timer3,SIGNAL(timeout()),this,SLOT(timer3UpDate()));
    connect(timer4,SIGNAL(timeout()),this,SLOT(timer4UpDate()));
    timer1->start(1);
    timer4->start(10);//启动遥控接收器监视定时器,每10ms检测一次是否有按键被按下
}

/********************************************************************************
* 函数名称:退出函数
* 功    能:退出应用
*********************************************************************************/
MainWindow::~MainWindow() //主退出函数
{
    delete ui;
}

/********************************************************************************
* 函数名称:鼠标按下事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制起始点等功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mousePressEvent(QMouseEvent *event)
{
    if(event->button()==Qt::LeftButton)
    {
        x = event->x()-20;//获得当前x坐标并修正
        y = event->y()-10;//获得当前y坐标并修正
        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page]) //判断是否符合绘画条件
        {
            bihua_num[current_page]++;//当前页到笔画数加1
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;//记录当前x坐标
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;//记录当前y坐标

            /*绘制当前坐标*/
            QPainter pp11(&pix);
            pp11.drawLine(x,y,x,y);
            update();

            /*屏幕坐标换算成电机角度并记录*/
            x1=320-x;//当前坐标转化为机械臂坐标
            y1=290-y;//当前坐标转化为机械臂坐标
            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;
            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;    //记录当前坐标的大臂角度数
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;//记录当前坐标的小臂角度数
            dian_num[current_page]++;//点数加1
            path1.moveTo(x,y);//将绘图坐标系原点转换到当前坐标
            bihua_delay[current_page][bihua_num[current_page]]=timems[current_page];//记录笔画间隔时间
            timems[current_page]=1;//重置计时变量
            flag_go[current_page]=0;//清除go标记
        }
    }
}

/********************************************************************************
* 函数名称:鼠标按下并移动事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制相邻两点构成的直线等功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mouseMoveEvent(QMouseEvent *event)
{
    if(event->buttons()&Qt::LeftButton) //注释同“鼠标按下事件函数”
    {
        x = event->x()-20;
        y = event->y()-10;
        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page])
        {
            QPainter pp11(&pix);
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;
            pp11.drawLine(xx[current_page][bihua_num[current_page]][dian_num[current_page]-1],yy[current_page][bihua_num[current_page]][dian_num[current_page]-1],xx[current_page][bihua_num[current_page]][dian_num[current_page]],yy[current_page][bihua_num[current_page]][dian_num[current_page]]);//绘制上一坐标到本次坐标的直线
            update();
            dian_delay[current_page][bihua_num[current_page]][dian_num[current_page]]=timems[current_page];

            x1=320-x;
            y1=290-y;

            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;

            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;;
            dian_num[current_page]++;
            timems[current_page]=1;
        }
    }
}

/********************************************************************************
* 函数名称:鼠标按下事件
* 功    能:完成坐标记录、角度转换、延时数据记录、绘制结束点点功能
* 参    数:事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::mouseReleaseEvent(QMouseEvent *event)
{
    if(event->button() == Qt::LeftButton) //注释同“鼠标按下事件函数”
    {
        x = event->x()-20;
        y = event->y()-10;

        if(x>=0&&x<=200&&y>=0&&y<=200&&!flag_lock[current_page])
        {
            xx[current_page][bihua_num[current_page]][dian_num[current_page]]=x;
            yy[current_page][bihua_num[current_page]][dian_num[current_page]]=y;
            dian_delay[current_page][bihua_num[current_page]][dian_num[current_page]]=timems[current_page];

            x1=320-x;
            y1=290-y;

            b=sqrt(x1*x1+y1*y1);
            B=acos((c*c+a*a-b*b)/(2*a*c))*180/PI;
            A1=atan(y1/x1)*180/PI;;
            A2=acos((c*c+b*b-a*a)/(2*c*b))*180/PI;
            A=A1+A2;

            angle_big[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(A/0.1286)+angfix_big;
            angle_small[current_page][bihua_num[current_page]][dian_num[current_page]]=(int)(B/0.1286)+angfix_small;
            step[current_page][bihua_num[current_page]]=dian_num[current_page];
            dian_num[current_page]=0;

            timems[current_page]=1;
        }
    }
}

/********************************************************************************
* 函数名称:go按钮点击函数
* 功    能:完成当前页的绘制机械臂动作并且打开timer2完成在屏幕上复写的功能
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_clicked()
{
    /*为变量、标志赋值*/
    flag_go[current_page]=1;
    cont_replay[current_page]=0;
    flag_lock[current_page]=1;
    /*打开step步进电机驱动,并进行相应操作*/
    int fd2=::open("/dev/step",0);
    for(int b11=0;b11<=bihua_num[current_page];b11++)
    {
        go(angle_big[current_page][b11][0],angle_small[current_page][b11][0]);//使机械臂走到指定的角度坐标
        usleep(50000);
        ::ioctl(fd2,0,6);
        for(int b22=1;b22<=step[current_page][b11];b22++)
        {
            usleep(1000*dian_delay[current_page][b11][b22]);
            move(angle_big[current_page][b11][b22]-angle_big[current_page][b11][b22-1],angle_small[current_page][b11][b22]-angle_small[current_page][b11][b22-1]);//按照记录数据依次向后一点坐标移动
        }
        usleep(50000);
        ::ioctl(fd2,1,6);
        if(b11<bihua_num[current_page]){usleep(1000*bihua_delay[current_page][b11+1]);}//笔画延时
    }
    ::close(fd2);
    timer2->start(100);//go复写定时器打开
}

/********************************************************************************
* 函数名称:屏幕复写函数
* 功    能:利用定时器绘制,能够准确复现绘制点之间、笔画之间的延时效果
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer2UpDate()//屏幕复写定时器
{
    QPainter pp11(&pix);
    if(temp_replay[current_page]<=bihua_num[current_page])
    {
        if(cont_replay[current_page]<step[current_page][temp_replay[current_page]])
        {
            pp11.drawLine(xx[current_page][temp_replay[current_page]][cont_replay[current_page]],yy[current_page][temp_replay[current_page]][cont_replay[current_page]],xx[current_page][temp_replay[current_page]][cont_replay[current_page]+1],yy[current_page][temp_replay[current_page]][cont_replay[current_page]+1]);
            update();
            timer2->start(dian_delay[current_page][temp_replay[current_page]][cont_replay[current_page]+1]);
            cont_replay[current_page]++;
        }
        else
        {
            temp_replay[current_page]++;
            cont_replay[current_page]=0;
            timer2->start(bihua_delay[current_page][temp_replay[current_page]]);
        }
    }
    else
    {
        timer2->stop();//绘制完成关闭定时器
        update();
        /*恢复复写变量的初值*/
        cont_replay[current_page]=0;
        temp_replay[current_page]=0;
    }
}
/********************************************************************************
* 函数名称:画板更新事件函数
* 功    能:更新画板
* 参    数:绘画事件
* 返 回 值:无
*********************************************************************************/
void MainWindow::paintEvent(QPaintEvent *)
{
    QPainter pp(this);
    pp.drawPixmap(20,10,200,200,pix); //将全局画布pix绘制在画板上
    /*根据go标记清除画板*/
    if(flag_go[current_page])
    {
        pix.fill(Qt::gray);
        flag_go[current_page]=0;
    }
}

/********************************************************************************
* 函数名称:延时计数定时器1更新事件
* 功    能:将延时计数变量自加
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer1UpDate()
{
    timems[current_page]++;
}

/********************************************************************************
* 函数名称:机械臂移动函数
* 功    能:将机械臂按照参数运动指定步数
* 参    数:move_temp_big,move_temp_small 分别为大臂与小臂运动的步数,若为正直则向正方向
*           运动对应步数反之则向相反方向运动对应步数
* 返 回 值:无
*********************************************************************************/
void MainWindow::move(int move_temp_big,int move_temp_small)
{
    current_big+=move_temp_big;
    current_small+=move_temp_small;
    int fd=::open("/dev/leds",0);
    int fd2=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
    int direction1,direction2;

    if(move_temp_big==0&&move_temp_small==0)
    {
        ::close(fd);
        return;
    }

    if(move_temp_big<0)
    {
        direction1=0;
        move_temp_big=-move_temp_big;
        ::ioctl(fd,1,2);
        ::ioctl(fd2,1,2);
    }
    else
    {
        direction1=1;
        ::ioctl(fd,0,2);
        ::ioctl(fd2,0,2);
    }

    if(move_temp_small<0)
    {
        direction2=0;
        move_temp_small=-move_temp_small;
        ::ioctl(fd,1,3);
        ::ioctl(fd2,1,3);
    }
    else
    {
        direction2=1;
        ::ioctl(fd,0,3);
        ::ioctl(fd2,0,3);
    }

    if(move_temp_big==0)
    {
        for(int tmp=0;tmp<move_temp_small;tmp++)
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd2,1,1);
            usleep(10);
            ::ioctl(fd,0,1);
            ::ioctl(fd2,0,1);
            usleep(motor_speed);
        }
        ::close(fd);
        ::close(fd2);
        return;
    }

    if(move_temp_small==0)
    {
        for(int tmp=0;tmp<move_temp_big;tmp++)
        {
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,0);
            usleep(10);
            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);
        }
        ::close(fd);
        ::close(fd2);
        return;
    }

    int go_loop=move_temp_big*move_temp_small;

    for (int go_temp=1;go_temp<=go_loop;go_temp++)
    {
        if((go_temp%move_temp_big==0)&&(go_temp%move_temp_small==0))
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,1);
            ::ioctl(fd2,1,0);
            usleep(10);
            ::ioctl(fd,0,1);
            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,1);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);
        }
        else
        {
            if(go_temp%move_temp_big==0)
            {
                ::ioctl(fd,1,1);
                ::ioctl(fd2,1,1);
                usleep(10);
                ::ioctl(fd,0,1);
                ::ioctl(fd2,0,1);
                usleep(motor_speed);
            }
            if(go_temp%move_temp_small==0)
            {
                ::ioctl(fd,1,0);
                ::ioctl(fd2,1,0);
                usleep(10);
                ::ioctl(fd,0,0);
                ::ioctl(fd2,0,0);
                usleep(motor_speed);
            }
        }
    }

    ::close(fd);
    ::close(fd2);
}

/********************************************************************************
* 函数名称:机械臂移动到指定角度函数
* 功    能:将机械臂移动到指定步数
* 参    数:go_temp_big,go_temp_small 分别为大臂与小臂的目的角度值,经过与当前角度比较,得出
*           运动对应步数反和方向,并移动
* 返 回 值:无
*********************************************************************************/
void MainWindow::go(int go_temp_big,int go_temp_small)
{
    go_temp_big=go_temp_big-current_big;      //计算大臂当前角度与指定的角度之间的差值
    go_temp_small=go_temp_small-current_small;//计算小臂当前角度与指定的角度之间的差值

    current_big+=go_temp_big;    //更新当前角度
    current_small+=go_temp_small;//更新当前角度

    int fd=::open("/dev/leds",0);//打开led驱动,便于观察程序运行状态
    int fd2=::open("/dev/step",0);//打开step驱动
    /*判断如果两个电机需要运动的角度均为0则退出函数*/
    if(go_temp_big==0&&go_temp_small==0)
    {
        ::close(fd);return;
    }
    /*判断如果大臂需要运动的角度为负数,则将大臂运行方向置为反并且将负数转为正数;否则大臂运行方向为正*/
    if(go_temp_big<0)
    {
        go_temp_big=-go_temp_big;
        ::ioctl(fd,1,2);
        ::ioctl(fd2,1,2);
    }
    else
    {
        ::ioctl(fd,0,2);
        ::ioctl(fd2,0,2);
    }
    /*判断如果小臂需要运动的角度为负数,则将小臂运行方向置为反并且将负数转为正数;否则小臂运行方向为正*/
    if(go_temp_small<0)
    {
        go_temp_small=-go_temp_small;
        ::ioctl(fd,1,3);
        ::ioctl(fd2,1,3);
    }
    else
    {
        ::ioctl(fd,0,3);
        ::ioctl(fd2,0,3);
    }

    /*判断如果大臂需要运动的角度大于等于小臂需要的,则用大臂度数作为循环计数值,
      这里需要说明以下,本函数是两个电机同时动作的所以需要用运动数大的作为计数。*/
    if(go_temp_big>=go_temp_small)
    {
        for(int tmp=0;tmp<go_temp_big;tmp++)
        {
            ::ioctl(fd,1,0);
            ::ioctl(fd2,1,0);

            /*判断小臂是否运行结束,若没结束则小臂运动*/
            if(tmp<go_temp_small)
            {
                ::ioctl(fd,1,1);
                ::ioctl(fd2,1,1);
            }

            usleep(10);

            /*判断小臂是否运行结束,若没结束则小臂运动*/
            if(tmp<go_temp_small)
            {
                ::ioctl(fd,0,1);
                ::ioctl(fd2,0,1);
            }

            ::ioctl(fd,0,0);
            ::ioctl(fd2,0,0);
            usleep(motor_speed);//调整脉冲周期以调节电机转速
        }
    }
    else //否则与上述相反
    {
        for(int tmp=0;tmp<go_temp_small;tmp++)
        {
            ::ioctl(fd,1,1);
            ::ioctl(fd2,1,1);

            if(tmp<go_temp_big)
            {
                ::ioctl(fd,1,0);
                ::ioctl(fd2,1,0);
            }

            usleep(10);

            if(tmp<go_temp_big)
            {
                ::ioctl(fd,0,0);
                ::ioctl(fd2,0,0);
            }

            ::ioctl(fd,0,1);
            ::ioctl(fd2,0,1);

            usleep(motor_speed);
        }
    }
    ::close(fd);
    ::close(fd2);
}

/********************************************************************************
* 函数名称:clear按钮函数
* 功    能:清除当前页的画板信息,并解除当前页的锁定可以重新绘制
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_2_clicked()
{
    bihua_num[current_page]=-1;
    timer1->start(1);
    flag_lock[current_page]=0;
    pix.fill(Qt::gray);
    update();
}

/********************************************************************************
* 函数名称:ADD按钮点击函数
* 功    能:增加绘制页面
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_ADD_clicked()
{
    switch (current_page)
    {
    case 1:
        current_page=2;
        ui->radioButton_2->setChecked(1);
        ui->radioButton_2->setEnabled(1);
        page_size=2;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        flag_lock[current_page]=0;
        timems[current_page]=1;
        break;

    case 2:
        current_page=3;
        ui->radioButton_3->setChecked(1);
        ui->radioButton_3->setEnabled(1);
        page_size=3;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        flag_lock[current_page]=0;
        timems[current_page]=1;
        break;

    case 3:
        current_page=4;
        ui->radioButton_4->setChecked(1);
        ui->radioButton_4->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=4;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 4:
        current_page=5;
        ui->radioButton_5->setChecked(1);
        ui->radioButton_5->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=5;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 5:
        current_page=6;
        ui->radioButton_6->setChecked(1);
        ui->radioButton_6->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=6;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 6:
        current_page=7;
        ui->radioButton_7->setChecked(1);
        ui->radioButton_7->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=7;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 7:
        current_page=8;
        ui->radioButton_8->setChecked(1);
        ui->radioButton_8->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=8;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;

    case 8:
        current_page=9;
        ui->radioButton_9->setChecked(1);
        ui->radioButton_9->setEnabled(1);
        flag_lock[current_page]=0;
        page_size=9;
        pix.fill(Qt::gray);
        update();
        flag_lock[current_page-1]=1;
        timems[current_page]=1;
        break;
    case 9:flag_lock[current_page]=1;break;
    }
}

/********************************************************************************
* 函数名称:RM按钮点击函数
* 功    能:从后向前删除页面,同时删除页面上所储存的信息
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_RM_clicked()
{
    switch (page_size)
    {
    case 1:timer2->start(1);update();break;
    case 2:
        current_page=1;
        ui->radioButton_1->setChecked(1);
        ui->radioButton_2->setEnabled(0);
        page_size=1;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 3:
        current_page=2;
        ui->radioButton_2->setChecked(1);
        ui->radioButton_3->setEnabled(0);
        page_size=2;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 4:
        current_page=3;
        ui->radioButton_3->setChecked(1);
        ui->radioButton_4->setEnabled(0);
        page_size=3;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 5:
        current_page=4;
        ui->radioButton_4->setChecked(1);
        ui->radioButton_5->setEnabled(0);
        page_size=4;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page+1]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    case 6:
        current_page=5;
        ui->radioButton_5->setChecked(1);
        ui->radioButton_6->setEnabled(0);
        page_size=5;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 7:
        current_page=6;
        ui->radioButton_6->setChecked(1);
        ui->radioButton_7->setEnabled(0);
        page_size=6;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 8:
        current_page=7;
        ui->radioButton_7->setChecked(1);
        ui->radioButton_8->setEnabled(0);
        page_size=7;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;

    case 9:
        current_page=8;
        ui->radioButton_8->setChecked(1);
        ui->radioButton_9->setEnabled(0);
        page_size=8;
        bihua_num[current_page+1]=-1;
        timer1->start(1);
        flag_lock[current_page]=0;
        pix.fill(Qt::gray);
        timer2->start(1);
        update();
        break;
    }
}

/********************************************************************************
* 函数名称:radioButton点击函数
* 功    能:根据被点击的radioButton更改当前页面,并且在点击的时候调用复写函数完成本页信息的预览
* 参    数:checked 代表是否被选中
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_radioButton_1_clicked(bool checked)
{
    if(checked)current_page=1;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_2_clicked(bool checked)
{
    if(checked)current_page=2;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_3_clicked(bool checked)
{
    if(checked)current_page=3;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_4_clicked(bool checked)
{
    if(checked)current_page=4;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_5_clicked(bool checked)
{
    if(checked)current_page=5;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_6_clicked(bool checked)
{
    if(checked)current_page=6;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}


void MainWindow::on_radioButton_7_clicked(bool checked)
{
    if(checked)current_page=7;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_8_clicked(bool checked)
{
    if(checked)current_page=8;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

void MainWindow::on_radioButton_9_clicked(bool checked)
{
    if(checked)current_page=9;
    pix.fill(Qt::gray);
    timer2->start(1);
    update();
}

/********************************************************************************
* 函数名称:quit按钮点击函数
* 功    能:退出程序
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_3_clicked()
{
    close();
}

/********************************************************************************
* 函数名称:SV按钮点击函数
* 功    能:在当前储存位置储存当前的一切数据
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_4_clicked()
{

    QFile file(save_index);
    if(!file.open(QIODevice::WriteOnly))
    {
        qDebug()<<"Can't open the file!"<<endl;
    }
    QDataStream in(&file);
    for(int con3=0;con3<10;con3++)
    {
        for(int con1=0;con1<=bihua_num[con3];con1++)
        {
            for(int con2=0;con2<=step[con3][con1];con2++)
            {
                in
                        <<1
                        <<con3
                        <<con1
                        <<con2
                        <<xx[con3][con1][con2]
                        <<yy[con3][con1][con2]
                        <<angle_big[con3][con1][con2]
                        <<angle_small[con3][con1][con2]
                        <<step[con3][con1]
                        <<bihua_delay[con3][con1]
                        <<0
                        <<0;
            }
        }
    }
    for(int con1=0;con1<10;con1++)
    {
        in
                <<2
                <<con1
                <<con1
                <<flag_lock[con1]
                <<cont_replay[con1]
                <<bihua_num[con1]
                <<dian_num[con1]
                <<flag_go[con1]
                <<temp_replay[con1]
                <<timems[con1]
                <<current_page
                <<page_size;
    }

    file.close();
}

/********************************************************************************
* 函数名称:LD按钮点击函数
* 功    能:读取当前储存位置的数据作为当前数据
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_5_clicked()
{
    return;
    QFile file(save_index);
    if(!file.open(QIODevice::ReadOnly))
    {
        qDebug()<<"Can't open the file!"<<endl;
    }

    QDataStream in(&file);
    int t_xx,t_yy,t_axx,t_ayy,con1,con2,fn,curpage,noth1,noth2,noth3,noth4;

    while(!in.atEnd())
    {
        in
                >>fn
                >>curpage
                >>con1
                >>con2
                >>t_xx
                >>t_yy
                >>t_axx
                >>t_ayy
                >>noth1
                >>noth2
                >>noth3
                >>noth4;
        if(fn==1)
        {
            xx[curpage][con1][con2]=t_xx;
            yy[curpage][con1][con2]=t_yy;
            angle_big[curpage][con1][con2]=t_axx;
            angle_small[curpage][con1][con2]=t_ayy;
            step[curpage][con1]=noth1;
            bihua_delay[curpage][con1]=noth2;
        }
        if(fn==2)
        {
            flag_lock[curpage]=con2;
            cont_replay[curpage]=t_xx;
            bihua_num[curpage]=t_yy;
            dian_num[curpage]=t_axx;
            flag_go[curpage]=t_ayy;
            temp_replay[curpage]=noth1;
            timems[curpage]=noth2;
            current_page=noth3;
            page_size=noth4;
        }
    }

    file.close();

    switch(current_page)
    {
    case 1:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(0);
        ui->radioButton_3->setEnabled(0);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_1->setChecked(1);
        break;

    case 2:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(0);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_2->setChecked(1);
        break;

    case 3:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(0);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_3->setChecked(1);
        break;

    case 4:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(0);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_4->setChecked(1);
        break;

    case 5:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(0);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_5->setChecked(1);
        break;

    case 6:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(0);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_6->setChecked(1);
        break;

    case 7:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(0);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_7->setChecked(1);
        break;

    case 8:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(1);
        ui->radioButton_9->setEnabled(0);
        ui->radioButton_8->setChecked(1);
        break;

    case 9:
        ui->radioButton_1->setEnabled(1);
        ui->radioButton_2->setEnabled(1);
        ui->radioButton_3->setEnabled(1);
        ui->radioButton_4->setEnabled(1);
        ui->radioButton_5->setEnabled(1);
        ui->radioButton_6->setEnabled(1);
        ui->radioButton_7->setEnabled(1);
        ui->radioButton_8->setEnabled(1);
        ui->radioButton_9->setEnabled(1);
        ui->radioButton_9->setChecked(1);
        break;
    }
}

/********************************************************************************
* 函数名称:run all按钮点击函数
* 功    能:利用timer3定时器准确的完成从页面前向后的写作动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_6_clicked()
{
    int fd=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
    ::ioctl(fd,1,11);//  con6 PIN19 LED L
    ::close(fd);
    ui->pushButton_6->setText("Running");
    timer3->start(100);
    current_page=0;
    ui->radioButton_1->setChecked(1);
}

/********************************************************************************
* 函数名称:timer3更新函数
* 功    能:依次完成每个页面的书写动作,并且没写完一页都调用lefthand()进行换纸
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer3UpDate()
{
    timer3->stop();
    pix.fill(Qt::gray);
    update();
    current_page++;
    on_pushButton_clicked();
    usleep(100000);
    lefthand();

    switch(current_page)
    {
        case 1:ui->radioButton_1->setChecked(1);break;
        case 2:ui->radioButton_2->setChecked(1);break;
        case 3:ui->radioButton_3->setChecked(1);break;
        case 4:ui->radioButton_4->setChecked(1);break;
        case 5:ui->radioButton_5->setChecked(1);break;
        case 6:ui->radioButton_6->setChecked(1);break;
        case 7:ui->radioButton_7->setChecked(1);break;
        case 8:ui->radioButton_8->setChecked(1);break;
        case 9:ui->radioButton_9->setChecked(1);break;
    }

    if(current_page!=page_size)
    {
        timer3->start(100);
        switch(current_page)
        {
            case 1:ui->radioButton_2->setChecked(1);break;
            case 2:ui->radioButton_3->setChecked(1);break;
            case 3:ui->radioButton_4->setChecked(1);break;
            case 4:ui->radioButton_5->setChecked(1);break;
            case 5:ui->radioButton_6->setChecked(1);break;
            case 6:ui->radioButton_7->setChecked(1);break;
            case 7:ui->radioButton_8->setChecked(1);break;
            case 8:ui->radioButton_9->setChecked(1);break;
            case 9:;break;
        }
    }
    else
    {
        ui->pushButton_6->setText("RUN ALL");
        int fd=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平
        ::ioctl(fd,0,11);//  con6 PIN19 LED M
        ::close(fd);
        flag_writing=0;
        timer4->start(10);
    }
}

/********************************************************************************
* 函数名称:存储位置变化函数
* 功    能:根据spinBox的值修改当前的存储文件名称
* 参    数:cont spinBox的值
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_spinBox_valueChanged(QString cont)
{
    save_index="dat"+cont+".dat";
}

/********************************************************************************
* 函数名称:lefthand辅助机械臂运动函数
* 功    能:完成一系列的辅助机械臂动作,完成更换纸张的动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::lefthand()
{
    return; //test
    go(1000,1000);
    usleep(10000);
    int fd2=::open("/dev/step",0);//con6 低电平有效 是!cmd 所以1代表低电平

    ::ioctl(fd2,1,4);//  con6 PIN13 M3T K
    ::ioctl(fd2,1,7);//  con6 PIN16 M1W K
    usleep(100000);
    ::ioctl(fd2,1,10);//  con6 PIN19 M2L K
    usleep(1000000);
    ::ioctl(fd2,0,7);//  con6 PIN16 M1W G
    ::ioctl(fd2,0,10);//  con6 PIN19 M2L G
    usleep(10000);
    ::ioctl(fd2,0,4);//  con6 PIN13 M3T G
    usleep(10000);
    ::ioctl(fd2,1,5);//  con6 PIN14 M3L K//准备
    usleep(100000);
    ::ioctl(fd2,1,8);//  con6 PIN17 M1L k//开始
    ::ioctl(fd2,1,9);//  con6 PIN18 M2W k 小臂 -6000
    usleep(100000);
     ::ioctl(fd2,0,9);//  con6 PIN18 M2W g 小臂 -6000
    usleep(100000);
    ::ioctl(fd2,1,9);//  con6 PIN18 M2W k 小臂 -6000
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(100000);
    usleep(650000);
    ::ioctl(fd2,0,8);//  con6 PIN17 M1L g//结束
    ::ioctl(fd2,0,9);//  con6 PIN18 M2W g 小臂
    usleep(100000);
    ::ioctl(fd2,0,5);//  con6 PIN14 M3L g
    usleep(10000);
    ::ioctl(fd2,1,4);//  con6 PIN13 M3T K
    usleep(800000);
    ::ioctl(fd2,1,7);//  con6 PIN16 M1W 大臂 k
    ::ioctl(fd2,1,10);//  con6 PIN19 M2L K
    usleep(150000);
    ::ioctl(fd2,0,10);//  con6 PIN19 M2L g
    usleep(1400000);
    ::ioctl(fd2,0,7);//  con6 PIN16 M1W 大臂 g
    ::ioctl(fd2,0,4);//  con6 PIN13 M3T g
    ::close(fd2);
}

/********************************************************************************
* 函数名称:left按钮点击函数
* 功    能:调用lefthand()函数
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::on_pushButton_7_clicked()//left hand
{
    lefthand();
}

/********************************************************************************
* 函数名称:遥控输入监视函数
* 功    能:利用timer4定时触发事件来监视遥控接收器是否有按键被按下,若有则读取对应存储位置的数据
*           并且调用run all函数完成整套动作
* 参    数:无
* 返 回 值:无
*********************************************************************************/
void MainWindow::timer4UpDate()
{
    timer4->stop();
    char current_buttons[6];

    int fd = ::open("/dev/buttons", 0);

    ::read(fd, current_buttons, 6);
    ::close(fd);

    if(!flag_writing)
    {
        timer4->start(10);
    }
}

  • 0
    点赞
  • 0
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
文档学习写字机安装还在学习中1、产品概览 AX4写字机框架采用2020工业铝型材,配合5MM亚克力面板,XY轴导向采用8mm直径光轴配合直线轴承运动,上下抬笔机构采用微型直线导轨系统。本套件XY轴行程297×210mm,标配42步进电机,SG90舵机,建议运行速度一分钟3000mm。本套件采用开源Arduino系统,配合相关软件可在纸质材料上写字画图等。本套件含包装重量3KG左右,纸箱外形尺寸57×21×6cm。本套件为USB接口,连接电脑才能工作,建议WIN7系统。 2、零部件明细 (1)机器框架 8mm光杆 450mm 2条、360mm 2条 2020欧标铝型材 421mm 1条、68mm 4条 LM8UU直线轴承 8个 亚克力 25片 F624法兰轴承 10个 同步轮 2个 同步带 1.5米 3D笔架 1个 扎带 25条 电线固定带 2条 直线导轨组件 1套 (2)电器控制 42步进电机2个 Arduino控制器1套 SG90舵机1个 电源1个 USB线1条 (3)螺丝清单 M2×6 十字螺丝=4 滑台 M2×10 十字螺丝=2 舵机 M2×16 十字螺丝=2 直线导轨 M3×8 十字螺丝=8 步进电机 M3×12 十字螺丝=8 亚克力固定 M3×20 十字螺丝=17 光轴固定+限位 M3×30 十字螺丝=4 电路板固定 M4×12 十字螺丝=8 光轴紧定 M4×30 十字螺丝=1 后滑轮 M4×25 手拧螺丝=1 笔架 M4×40 十字螺丝=4 十字滑轮 M5×10 十字螺丝=8 亚克力与铝型材 M6×12 十字螺丝=6 铝型材 M2 六角螺母=4 M3 六角螺母=29 M4 六角螺母=5 M4 方块螺母=9 M5 铝型材螺母=8 φ3×20 塑料隔离柱=4 φ4×2 塑料隔离柱=2 φ4×7 塑料隔离柱=8 φ3×20 塑料隔离柱=4(激光头配套) M3×30十字螺丝=4(激光头配套) 3、机架组装 (1)组装十字滑台
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值