#include "mainwindow.h" #include "ui_mainwindow.h" #include "QKeyEvent" #include "QDebug" #include #include //#include "bs.h" int KP[44];double kp=3,ki=0,kd=0;int kp1=3,ki1=0,kd1=0;double pkp=0, pki = 0,pkd = 0;int pwm_left,pwm_right; QString cmd(""); int a=0; long t; double xa=0,ya=0,za=0; double xg=0,yg=0,zg=0; double xxa,yya,zza;double kp2 = 10; double ki2 = 0; double kd2 = 0; double g1; double ra=0,rollg=0;const float alpha = 0.5; QElapsedTimer f; IMUfilter *imufilter; QByteArray ba(""); int outMax = 255; int outMin = -255; float lastInput = 0; double ITerm =0; double Setpoint = 0; double gg=0; double Compute(double input) { double error = Setpoint - input; ITerm+= (ki2 * error); if(ITerm > outMax) ITerm= outMax; else if(ITerm < outMin) ITerm= outMin; double dInput = (input - lastInput); double output = kp2 * error + ITerm + kd2 * dInput; if(output > outMax) output = outMax; else if(output < outMin) output = outMin; lastInput = input; return output; } char blankString[] = QT_TRANSLATE_NOOP("SettingsDialog", "N/A"); MainWindow::MainWindow(QWidget *parent) : QMainWindow(parent), ui(new Ui::MainWindow) { ui->setupUi(this); serial = new QSerialPort(this); QSerialPortInfo info=QSerialPortInfo::availablePorts().at(0); // Check info of the port qDebug() << "Name : " << info.portName(); /*qDebug() << "Manufacturer: " << info.manufacturer(); //if showing manufacturer, means Qstring &name is good qDebug() << "Busy: " << info.isBusy() << endl; */// Initialize Serial serial->setPortName("COM6"); //serial->open(QIODevice::ReadWrite); serial->setBaudRate(QSerialPort::Baud57600); serial->setDataBits(QSerialPort::Data8); serial->setParity(QSerialPort::NoParity); serial->setStopBits(QSerialPort::OneStop); serial->setFlowControl(QSerialPort::NoFlowControl); if(serial->open(QIODevice::ReadWrite)); /*QString description; QString manufacturer; QString serialNumber;int i=0; /*foreach (const QSerialPortInfo &info, QSerialPortInfo::availablePorts()) { cout<textBrowser->setText("Key(s) Pressed:"); connect(ui->horizontalSlider,SIGNAL(valueChanged(int)),this,SLOT(value0(int))); connect(ui->horizontalSlider_2,SIGNAL(valueChanged(int)),this,SLOT(value1(int))); connect(ui->horizontalSlider_3,SIGNAL(valueChanged(int)),this,SLOT(value2(int))); connect(ui->horizontalSlider_5,SIGNAL(valueChanged(int)),this,SLOT(value3(int))); connect(ui->horizontalSlider_4,SIGNAL(valueChanged(int)),this,SLOT(value4(int))); connect(ui->horizontalSlider_6,SIGNAL(valueChanged(int)),this,SLOT(value5(int))); connect(ui->horizontalSlider_7,SIGNAL(valueChanged(int)),this,SLOT(value6(int))); connect(ui->horizontalSlider_8,SIGNAL(valueChanged(int)),this,SLOT(value7(int))); connect(ui->lineEdit,SIGNAL(returnPressed()),this,SLOT(value8())); connect(ui->lineEdit_2,SIGNAL(returnPressed()),this,SLOT(value9())); connect(ui->lineEdit_3,SIGNAL(returnPressed()),this,SLOT(value10())); connect(ui->lineEdit_4,SIGNAL(returnPressed()),this,SLOT(value11())); connect(ui->lineEdit_5,SIGNAL(returnPressed()),this,SLOT(value12())); connect(ui->lineEdit_6,SIGNAL(returnPressed()),this,SLOT(value13())); connect(ui->lineEdit_7,SIGNAL(returnPressed()),this,SLOT(value14())); connect(ui->lineEdit_8,SIGNAL(returnPressed()),this,SLOT(value15())); connect(ui->radioButton,SIGNAL(pressed()),this,SLOT(value16())); connect(ui->radioButton_2,SIGNAL(pressed()),this,SLOT(value17())); connect(ui->lineEdit_9,SIGNAL(returnPressed()),this,SLOT(value18())); connect(ui->radioButton_3,SIGNAL(pressed()),this,SLOT(value19())); //connect(serial, SIGNAL(readyRead()), this, SLOT(readData())); timer = new QTimer(this); connect(timer, SIGNAL(timeout()), this, SLOT(readData())); timer->start(16); for(int i=0;i<44;i++) KP[i]=0; // create graph and assign data to it: ui->widget->legend->setVisible(true); //ui->widget->addGraph()->setName("AccelAng"); ui->widget->setInteractions(QCP::iRangeDrag | QCP::iRangeZoom); //ui->widget->axisRect()->setRangeZoom(Qt::Horizontal | Qt::Vertical); ui->widget->axisRect()->setRangeZoom(Qt::Horizontal); ui->widget->axisRect()->setRangeZoomFactor(1.5); ui->widget->addGraph()->setName("Theta"); ui->widget->addGraph()->setName("ThetaDot"); ui->widget->addGraph()->setName("Velocity"); ui->widget->addGraph()->setName("ThetaOffset"); ui->widget->addGraph()->setName("Displacement"); //ui->widget->graph(0)->setData(x, y); ui->widget->xAxis->setLabel("Time(s)->"); ui->widget->yAxis->setLabel("Angle(°),Disp(m),Vel(m/s)"); ui->widget->graph(0)->setPen(QPen(Qt::red)); ui->widget->graph(1)->setPen(QPen(Qt::green)); ui->widget->graph(2)->setPen(QPen(Qt::blue)); ui->widget->graph(3)->setPen(QPen(Qt::black)); ui->widget->graph(4)->setPen(QPen(Qt::cyan)); ui->widget->xAxis->setRange(0,50); ui->widget->yAxis->setRange(15,-15); f.start(); //imufilter = new IMUfilter(0.015, 20); } MainWindow::~MainWindow() { timer->stop(); QFile file("C:/Users/yikes/Desktop/graph.jpg"); ui->widget->saveJpg( "C:/Users/yikes/Desktop/graph.jpg", 0, 0, 1.0, -1 ); delete ui; } void MainWindow::BlueP() { QString b(""); for(int i=0;i<44;i++) if(KP[i]==1)b.append(i+47); b.append("\n"); ba.clear(); ui->textBrowser->setText("Key(s) Pressed:"+b); if(a==-1) { if(b.length()>1){ ba.append(b.toUtf8()); } else { ba.append("stop\n"); } } else if(a==1){ QString s(""); /*s.append("l"); s.append(QString::number(pwm_left,'g',9)); s.append("\nr"); s.append(QString::number(pwm_right,'g',9)); s.append("\n");//only for pwm */ if(pkp!=kp){ s.append("p");pkp=kp; s.append(QString::number(kp,'g',5)); s.append(",\n"); goto zz; } if(pki!=ki){ s.append("i");pki=ki; s.append(QString::number(ki,'g',5)); s.append(",\n"); goto zz; } if(pkd!=kd){ s.append("d");pkd=kd; s.append(QString::number(kd,'g',5)); s.append(",\n"); goto zz; } zz: qDebug()<isOpen() && serial->isWritable()) { qDebug()<write(ba); if (serial->bytesToWrite() > 0) { serial->flush(); serial->bytesWritten(ba.length()); } } else { cout<< "An error occured" << endl; qDebug()<msleep(1000); } void MainWindow::keyPressEvent(QKeyEvent * event) { int p=event->key(); if(p>46&&p<91){ KP[p-47]=1; BlueP(); } } void MainWindow::keyReleaseEvent(QKeyEvent * event) { int r=event->key(); if(r>46&&r<91){ KP[r-47]=0; BlueP();} } void MainWindow::value0(int k) { pwm_left=k-255; ui->lineEdit->setText(QString::number(pwm_left)); BlueP(); } void MainWindow::value1(int k) { pwm_right=k-255; ui->lineEdit_2->setText(QString::number(pwm_right)); BlueP(); } void MainWindow::value2(int k) { kp=k/10000000.0+kp1; ui->lineEdit_3->setText(QString::number(kp,'g',9)); BlueP(); } void MainWindow::value3(int k) { ki=k/10000000.0+ki1; ui->lineEdit_5->setText(QString::number(ki,'g',9)); BlueP(); } void MainWindow::value4(int k) { kd=k/10000000.0+kd1; ui->lineEdit_4->setText(QString::number(kd,'g',9)); BlueP(); } void MainWindow::value5(int k) { kp=kp-kp1+k; kp1=k; ui->lineEdit_8->setText(QString::number(kp1)); ui->lineEdit_3->setText(QString::number(kp,'g',9)); BlueP(); } void MainWindow::value6(int k) { ki=ki-ki1+k; ki1=k; ui->lineEdit_7->setText(QString::number(ki1)); ui->lineEdit_5->setText(QString::number(ki,'g',9)); BlueP(); } void MainWindow::value7(int k) { kd=kd-kd1+k; kd1=k; ui->lineEdit_6->setText(QString::number(kd1)); ui->lineEdit_4->setText(QString::number(kd,'g',9)); BlueP(); } void MainWindow::value8() { QString s=ui->lineEdit->text(); pwm_left=s.toInt(); ui->horizontalSlider->setSliderPosition(pwm_left+255); } void MainWindow::value9() { QString s=ui->lineEdit_2->text(); pwm_right=s.toInt(); ui->horizontalSlider_2->setSliderPosition(pwm_right+255); } void MainWindow::value10() { QString s=ui->lineEdit_3->text(); kp=s.toDouble(); kp1=(int)kp; ui->horizontalSlider_3->setSliderPosition((kp-kp1)*10000000); ui->horizontalSlider_6->setSliderPosition(kp1); } void MainWindow::value11() { QString s=ui->lineEdit_4->text(); ki=s.toDouble(); ki1=(int)ki; ui->horizontalSlider_4->setSliderPosition((ki-ki1)*10000000); ui->horizontalSlider_8->setSliderPosition(ki1); } void MainWindow::value12() { QString s=ui->lineEdit_5->text(); kd=s.toDouble(); kd1=(int)kd; ui->horizontalSlider_5->setSliderPosition((kd-kd1)*10000000); ui->horizontalSlider_7->setSliderPosition(kd1); } void MainWindow::value13() { QString s=ui->lineEdit_6->text(); int k=s.toInt(); kd=kd-kd1+k; kd1=k; ui->horizontalSlider_8->setSliderPosition(kd1); } void MainWindow::value14() { QString s=ui->lineEdit_7->text(); int k=s.toInt(); ki=ki-ki1+k; ki1=k; ui->horizontalSlider_7->setSliderPosition(ki1); } void MainWindow::value15() { QString s=ui->lineEdit_8->text(); int k=s.toInt(); kp=kp-kp1+k; kp1=k; ui->horizontalSlider_6->setSliderPosition(kp1); } void MainWindow::value16() { a=1;//BlueP(); } void MainWindow::value17() { a=-1;//BlueP(); } void MainWindow::value18() { QString s=ui->lineEdit_9->text(); cmd = s; ui->lineEdit_9->clear();BlueP(); } void MainWindow::value19() { a=0;//BlueP(); } void MainWindow::newData(double w, double x,double y,double z,double a,double t) { ui->widget->graph(0)->addData(t,w); ui->widget->graph(1)->addData(t,x); ui->widget->graph(2)->addData(t,y); ui->widget->graph(3)->addData(t,z); ui->widget->graph(4)->addData(t,a); ui->widget->replot(); } double zoff,xoff;volatile int ch=0; double compAngleY=0;double gyroYangle; void MainWindow::readData() { //timer->stop(); if(ch==1)return; x:; if(!(serial->bytesAvailable()>25))return; ch=1; double g=0,xs,ys,zs; int i,j,k,l,m,n,o; //QThread::currentThread()->sleep(10); //while(serial->bytesAvailable()>2){ QThread::currentThread()->msleep(1); char c[1]; while(1) { if(!(serial->bytesAvailable())){ch=0;return;} serial->read(c,1); if(c[0]=='a') { if(!(serial->bytesAvailable()>25)) QThread::currentThread()->msleep(1); break; } } QByteArray data = serial->readLine(); qDebug()<sleep(1); xs=data.mid(0,i-1).toDouble(); xa=data.mid(i+1,j-i-1).toDouble(); //QThread::currentThread()->sleep(1); ya=data.mid(j+1,k-j-1).toDouble(); za=data.mid(k+1,l-k-1).toDouble(); ys=data.mid(l+1,n-l-1).toDouble()/1000; //g= data.mid(n+1,o-n-1).toDouble(); //double pitch = atan(-xs / sqrt(xa * xa + ya * ya)) * 57.2958; //compAngleY = 0.93 * (compAngleY + za * 0.015) + 0.07 * pitch; /*imufilter->updateFilter(za,ys,g,xs*10.0,xa*10.0,ya*10.0); imufilter->computeEuler(); double temp = imufilter->getPitch()* 57.2958;; */ //gyroYangle += za * 0.015; //if (gyroYangle < -180 || gyroYangle > 180) // gyroYangle = compAngleY; //zs=data.mid(l+1,m-l-1).toDouble(); /*if(data[1]=='1') { xa=data.mid(i+1,j-i-1).toDouble(); ya=data.mid(j+1,k-j-1).toDouble(); za=data.mid(k+1,data.length()-k-2).toDouble(); } else { xg=data.mid(i+1,j-i-1).toDouble(); yg=data.mid(j+1,k-j-1).toDouble(); zg=data.mid(k+1,data.length()-k-1).toDouble(); } rollg+=yg; xxa = xa * alpha + (xxa * (1.0 - alpha)); zza = za * alpha + (zza * (1.0 - alpha)); ra= 0.98* (rollg) + ((qAtan2(-zza, xxa)*180.0))/(3.141592653); //qDebug()<40000){gg+=g*(t-f.elapsed())/1000;} //xs=atan2(za,-ya)*57.2958; //ra= 0.96* (ra+gg) + 0.04*xs; //double angle = atan2(-za,xa); //qDebug()<40000) newData(xs,xa,ya,za,ys,(t=f.elapsed())/1000.0); if(serial->bytesAvailable()>25) goto x; else ch=0; } /*void MainWindow::mouseWheel() { //ui->widget->replot(); } */