平衡車上位機/下位機程序,下位機使用STM32F103C8T6,PID原理,姿態芯片是MPU6050,用了DMP,中斷處理(硬件見博客,中斷飛了根線),即時準確;上位機使用QT寫的安卓APK,調用手機藍牙和平衡車通信;全部是工程文件,下位機用的cube環境,庫是HAL庫,直接可以打開運行,keil_v5和QT,完整程序見平衡車全部程序
下位機主要程序:
void CarParameter_Init(void);
void Xianfu_Pwm(void);
void Set_Pwm(int moto1,int moto2);
void beep();
int balance_UP(float Angle,float Mechanical_balance,float Gyro);
int turn(int encoder_left,int encoder_right,float gyro,uint8_t flag);
/* USER CODE END PFP */
/* USER CODE BEGIN 0 */
uint32_t counter_1, counter_1_last, counter_2, counter_2_last;
int16_t speed_left, speed_right;
uint8_t RxBuffer[4], rx_len, rx_temp[4];
int16_t d_offset_left, d_offset_right;
float pitch,roll,yaw;
short gyrox,gyroy,gyroz; //ÍÓÂÝÒÇÔʼÊý¾Ý
int Moto1=0,Moto2=0;
int Balance_Pwm,Velocity_Pwm,Turn_Pwm;
float Mechanical_angle=21.2;
uint8_t beep_temp;
void CarParameter_Init(void)
{
CarAngle.Kp = 390;//800
CarAngle.Kd = 1.0;//10
CarSpeed.Kp = 100;//100
CarSpeed.Ki = 0.5;//0.5
}
/* USER CODE END 0 */
int main(void)
{
/* USER CODE BEGIN 1 */
/* USER CODE END 1 */
/* MCU Configuration----------------------------------------------------------*/
/* Reset of all peripherals, Initializes the Flash interface and the Systick. */
HAL_Init();
/* USER CODE BEGIN Init */
/* USER CODE END Init */
/* Configure the system clock */
SystemClock_Config();
/* USER CODE BEGIN SysInit */
/* USER CODE END SysInit */
/* Initialize all configured peripherals */
MX_GPIO_Init();
MX_I2C1_Init();
MX_TIM1_Init();
MX_TIM2_Init();
MX_TIM3_Init();
MX_TIM4_Init();
MX_USART2_UART_Init();
/* USER CODE BEGIN 2 */
MPU_6050_Init();//if no 6050 ,this will crash this program
mpu_dmp_init();
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_1);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_2);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_3);
HAL_TIM_PWM_Start(&htim1, TIM_CHANNEL_4);
HAL_TIM_Encoder_Start(&htim2, TIM_CHANNEL_ALL);
HAL_TIM_Encoder_Start(&htim3, TIM_CHANNEL_ALL);
__HAL_UART_ENABLE_IT(&huart2,UART_IT_RXNE);//open uart2 RXNE
__HAL_TIM_SET_COUNTER(&htim2,30000);
__HAL_TIM_SET_COUNTER(&htim3,30000);
counter_1_last = 30000; counter_2_last = 30000;
CarParameter_Init();
/* USER CODE END 2 */
/* Infinite loop */
/* USER CODE BEGIN WHILE */
while (1)
{
/* USER CODE END WHILE */
/* USER CODE BEGIN 3 */
}
/* USER CODE END 3 */
}
void SystemClock_Config(void)
{
RCC_OscInitTypeDef RCC_OscInitStruct;
RCC_ClkInitTypeDef RCC_ClkInitStruct;
RCC_OscInitStruct.OscillatorType = RCC_OSCILLATORTYPE_HSE;
RCC_OscInitStruct.HSEState = RCC_HSE_ON;
RCC_OscInitStruct.HSEPredivValue = RCC_HSE_PREDIV_DIV1;
RCC_OscInitStruct.HSIState = RCC_HSI_ON;
RCC_OscInitStruct.PLL.PLLState = RCC_PLL_ON;
RCC_OscInitStruct.PLL.PLLSource = RCC_PLLSOURCE_HSE;
RCC_OscInitStruct.PLL.PLLMUL = RCC_PLL_MUL2;
if (HAL_RCC_OscConfig(&RCC_OscInitStruct) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Initializes the CPU, AHB and APB busses clocks
*/
RCC_ClkInitStruct.ClockType = RCC_CLOCKTYPE_HCLK|RCC_CLOCKTYPE_SYSCLK
| RCC_CLOCKTYPE_PCLK1|RCC_CLOCKTYPE_PCLK2;
RCC_ClkInitStruct.SYSCLKSource = RCC_SYSCLKSOURCE_PLLCLK;
RCC_ClkInitStruct.AHBCLKDivider = RCC_SYSCLK_DIV1;
RCC_ClkInitStruct.APB1CLKDivider = RCC_HCLK_DIV1;
RCC_ClkInitStruct.APB2CLKDivider = RCC_HCLK_DIV1;
if (HAL_RCC_ClockConfig(&RCC_ClkInitStruct, FLASH_LATENCY_0) != HAL_OK)
{
_Error_Handler(__FILE__, __LINE__);
}
/**Configure the Systick interrupt time
*/
HAL_SYSTICK_Config(HAL_RCC_GetHCLKFreq()/1000);
HAL_SYSTICK_CLKSourceConfig(SYSTICK_CLKSOURCE_HCLK);
/* SysTick_IRQn interrupt configuration */
HAL_NVIC_SetPriority(SysTick_IRQn, 0, 0);
}
/* USER CODE BEGIN 4 */
void HAL_GPIO_EXTI_Callback(uint16_t GPIO_Pin)
{
/* Prevent unused argument(s) compilation warning */
UNUSED(GPIO_Pin);
mpu_dmp_get_data(&pitch,&roll,&yaw);
MPU_Get_Gyroscope(&gyrox,&gyroy,&gyroz);
counter_1 = __HAL_TIM_GET_COUNTER(&htim2);
counter_2 = __HAL_TIM_GET_COUNTER(&htim3);
speed_left = counter_1 - counter_1_last;
speed_right = counter_2_last - counter_2;
counter_1_last = counter_1;
counter_2_last = counter_2;
Balance_Pwm = balance_UP(pitch,Mechanical_angle,gyroy);
Velocity_Pwm = velocity(speed_left,speed_right);
if(((rx_temp[0] == 0x35) && (rx_temp[1] == 0x36)) || ((rx_temp[0] == 0x36) && (rx_temp[1] == 0x35)))
{
Turn_Pwm =turn(speed_left,speed_right,gyroz,1); //left
beep();
HAL_GPIO_WritePin(GPIOB,led_back_Pin|led_right_Pin,GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, led_forward_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
}
else if(((rx_temp[0] == 0x37) && (rx_temp[1] == 0x38)) || ((rx_temp[0] == 0x38) && (rx_temp[1] == 0x37)))
{
Turn_Pwm =turn(speed_left,speed_right,gyroz,2); //right
beep();
HAL_GPIO_WritePin(GPIOB,led_back_Pin|led_right_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, led_forward_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_SET);
}
else if(((rx_temp[0] == 0x39) && (rx_temp[1] == 0x41)) || ((rx_temp[0] == 0x41) && (rx_temp[1] == 0x39)))
{
HAL_GPIO_TogglePin(GPIOA, PA12_Pin);
Turn_Pwm =0; //stop
beep();
HAL_GPIO_WritePin(GPIOB, led_back_Pin|led_right_Pin|led_forward_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
}
else Turn_Pwm = 0;
Moto1=Balance_Pwm-Velocity_Pwm-Turn_Pwm;
Moto2=Balance_Pwm-Velocity_Pwm+Turn_Pwm;
Xianfu_Pwm();
Set_Pwm(Moto1,Moto2);
}
void beep()
{
static uint8_t beep_num, beep_flag;
if(beep_num ++ < 20)
HAL_GPIO_WritePin(GPIOB, BZ_Pin, GPIO_PIN_SET);
else HAL_GPIO_WritePin(GPIOB, BZ_Pin, GPIO_PIN_RESET), beep_num = 20;
if(rx_temp[0] != beep_flag)
beep_num = 0;
beep_flag = rx_temp[0];
}
void Xianfu_Pwm(void)
{
if(Moto1<-7000 ) Moto1=-7000 ;
if(Moto1>7000 ) Moto1=7000 ;
if(Moto2<-7000 ) Moto2=-7000 ;
if(Moto2>7000 ) Moto2=7000 ;
if(pitch<-5||pitch>45) Moto1 = 0,Moto2 = 0;
}
void Set_Pwm(int moto1,int moto2)
{
if(moto1<0)
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, 0),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, -moto1);
else
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_1, moto1),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_2, 0);
if(moto2<0)
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, 0),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, -moto2);
else
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_3, moto2),
__HAL_TIM_SET_COMPARE(&htim1, TIM_CHANNEL_4, 0);
}
int balance_UP(float Angle,float Mechanical_balance,float Gyro)
{
float Bias;
int balance;
Bias=Angle-Mechanical_balance;
balance=CarAngle.Kp*Bias+CarAngle.Kd*Gyro;
return balance;
}
int turn(int encoder_left,int encoder_right,float gyro,uint8_t flag)
{
static float Turn_Target,Turn,Encoder_temp,Turn_Convert=0.9,Turn_Count;
float Turn_Amplitude=20,Kp=10,Kd=0; //44 20 0
if(flag == 1|| flag == 2)
{
if(++Turn_Count==1)
{
Encoder_temp=encoder_left+encoder_right;
if(Encoder_temp < 0) Encoder_temp = -Encoder_temp;
}
Turn_Convert=35/Encoder_temp;//55
if(Turn_Convert<0.7)Turn_Convert=0.7;//0.6
if(Turn_Convert>2.5)Turn_Convert=2.5;//3
}
else
{
Turn_Convert=0.75;
Turn_Count=0;
Encoder_temp=0;
}
if(flag == 1) Turn_Target += Turn_Convert;
else if(flag == 2) Turn_Target -= Turn_Convert;
else Turn_Target = 0;
if(Turn_Target>Turn_Amplitude) Turn_Target = Turn_Amplitude * 0.4 ;
if(Turn_Target<-Turn_Amplitude) Turn_Target = -Turn_Amplitude * 0.4;
Turn = -Turn_Target * Kp - gyro * Kd;
return Turn;
}
int velocity(int encoder_left,int encoder_right)
{
static float Velocity,Encoder_Least,Encoder,Movement;
static float Encoder_Integral;
if(((rx_temp[0] == 0x31) && (rx_temp[1] == 0x32)) || ((rx_temp[0] == 0x32) && (rx_temp[1] == 0x31)))
{
Movement = 19;//up
beep();
HAL_GPIO_WritePin(GPIOB,led_right_Pin|led_forward_Pin,GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOB, led_back_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_SET);
}
else if(((rx_temp[0] == 0x33) && (rx_temp[1] == 0x34)) || ((rx_temp[0] == 0x34) && (rx_temp[1] == 0x33)))
{
Movement = -19;//back
beep();
HAL_GPIO_WritePin(GPIOB, led_right_Pin|led_forward_Pin, GPIO_PIN_SET);
HAL_GPIO_WritePin(GPIOB, led_back_Pin, GPIO_PIN_RESET);
HAL_GPIO_WritePin(GPIOC, led_left_Pin, GPIO_PIN_RESET);
}
else if(((rx_temp[0] == 0x39) && (rx_temp[1] == 0x41)) || ((rx_temp[0] == 0x41) && (rx_temp[1] == 0x39)))
Movement = 0;//stop
Encoder_Least =(speed_left+speed_right)-0;
Encoder *= 0.8;
Encoder += Encoder_Least*0.2;
Encoder_Integral +=Encoder;
Encoder_Integral=Encoder_Integral-Movement; if(Encoder_Integral>10000) Encoder_Integral=10000;
if(Encoder_Integral<-10000) Encoder_Integral=-10000;
Velocity=Encoder*CarSpeed.Kp+Encoder_Integral*CarSpeed.Ki;
if(pitch<-5||pitch>45) Encoder_Integral=0;
return Velocity;
}
void USART2_IRQHandler(void)
{
HAL_UART_IRQHandler(&huart2);
/* USER CODE BEGIN USART2_IRQn 1 */
if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_RXNE)!=RESET))
{
rx_temp[rx_len++] = (uint8_t)(huart2.Instance->DR&(uint8_t)0x00FF);
__HAL_UART_ENABLE_IT(&huart2,UART_IT_IDLE); //open IDLE
}
else if((__HAL_UART_GET_FLAG(&huart2,UART_FLAG_IDLE)!=RESET))
{
__HAL_UART_DISABLE_IT(&huart2,UART_IT_IDLE); //close IDLE
if(rx_len == 2)
{
if(((rx_temp[0] == 0x42) && (rx_temp[1] == 0x43)) || ((rx_temp[0] == 0x43) && (rx_temp[1] == 0x42)))
{
HAL_GPIO_TogglePin(GPIOB,led_back_Pin|led_right_Pin|led_forward_Pin|BZ_Pin);
HAL_GPIO_TogglePin(GPIOC, led_left_Pin);
}
}
else
memset(&rx_temp, 0, sizeof(rx_temp));//clear temp
rx_len = 0;//again save
}
/* USER CODE END USART2_IRQn 1 */
}
/* USER CODE END 4 */
上位機主要程序:
#include "BLE.h"
#include "ui_BLE.h"
#include <QPainter>
#include <QMessageBox>
#include <QTime>
#include <QTimer>
#include <QBrush>
bool BLE_flag::socket_ok = false;
/* 設置藍牙的UUID碼 */
static const QLatin1String serviceUuid("00001101-0000-1000-8000-00805F9B34FB");
/* 全局變量 方便控制端調用藍牙連接成功後的socket發送數據 */
QBluetoothSocket *socket;
BLE::BLE(QWidget *parent) :
QWidget(parent),
ui(new Ui::BLE)
{
ui->setupUi(this);
ui->listWidget->installEventFilter(this);
ui->listWidget->setStyleSheet("background-color:transparent");
ui->pushButton_openBLE->setFlat(true);
QPalette palette (this->palette());
QPixmap pixmap = QPixmap("://image/背景.jpg").scaled(1090,1850);
//palette.setColor(QPalette::Background, Qt::black);
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette( palette );
if(false == BLE_flag::socket_ok)
{
//定時器檢測是否連接成功
myTime = new QTimer();
myTime->setInterval(7000);//7s定時
connect(myTime,SIGNAL(timeout()),this,SLOT(Confail()));
discoveryAgent = new QBluetoothDeviceDiscoveryAgent();
localDevice = new QBluetoothLocalDevice();
/* 給socket分配內存,限定套接字協議 */
socket = new QBluetoothSocket(QBluetoothServiceInfo::RfcommProtocol);
/* 判斷藍牙是否開啓,若開啓則不可被選中並掃描周圍藍牙設備 */
if( localDevice->hostMode() == QBluetoothLocalDevice::HostPoweredOff )
{
ui->pushButton_openBLE->setEnabled(true);
ui->pushButton_upDateBLE->setEnabled(false);
// /* 開始掃描藍牙設備 */
// discoveryAgent->start();
}
else
{
ui->pushButton_openBLE->setEnabled(false);
ui->pushButton_upDateBLE->setEnabled(true);
discoveryAgent->start();
}
/* 發現設備時會觸發deviceDiscovered信號,轉到槽顯示藍牙設備 */
connect(discoveryAgent, SIGNAL(deviceDiscovered(QBluetoothDeviceInfo)),
this, SLOT(addBlueToothDevicesToList(QBluetoothDeviceInfo)));
connect(discoveryAgent, SIGNAL(finished()), this, SLOT(findFinish()));
/* 雙擊listwidget的項目,觸發連接藍牙的槽 */
connect(ui->listWidget, SIGNAL(itemActivated(QListWidgetItem*)),
this, SLOT(connectBLE(QListWidgetItem*)));
connect(socket, SIGNAL(connected()), this, SLOT(connectOK()));
connect(socket, SIGNAL(disconnected()), this, SLOT(connectNot()));
}
else {
ui->pushButton_openBLE->setEnabled(false);
ui->pushButton_upDateBLE->setEnabled(false);
ui->pushButton_upDateBLE->setText(tr("已連接"));
}
}
BLE::~BLE()
{
delete ui;
}
/* 打開藍牙並查找藍牙設備 */
void BLE::on_pushButton_openBLE_clicked()
{
localDevice->powerOn();
ui->pushButton_openBLE->setEnabled(false);
ui->pushButton_upDateBLE->setEnabled(true);
/* 開始掃描藍牙設備 */
discoveryAgent->start();
Delay_MSec(2000);
discoveryAgent->start();
}
/* 刷新 重新查找藍牙設備 */
void BLE::on_pushButton_upDateBLE_clicked()
{
discoveryAgent->start();
ui->pushButton_upDateBLE->setEnabled(false);
}
/* 返回控制頁面 */
void BLE::on_pushButton_return_clicked()
{
socket->write(_start.toLatin1());
this->hide();
Start *s = new Start();
s->show();
}
/* 在ListWidget上顯示查找到的藍牙設備 */
void BLE::addBlueToothDevicesToList(const QBluetoothDeviceInfo &info)
{
QString label = QString("%1 %2").arg(info.address().toString()).arg(info.name());
QList<QListWidgetItem *> items = ui->listWidget->findItems(label, Qt::MatchExactly);
if (items.empty()) {
QListWidgetItem *item = new QListWidgetItem(label);
QBluetoothLocalDevice::Pairing pairingStatus = localDevice->pairingStatus(info.address());
/* 藍牙狀態pairingStatus,Pairing枚舉類型 0:Unpaired沒配對 1:Paired配對但沒授權 2:AuthorizedPaired配對且授權 */
if (pairingStatus == QBluetoothLocalDevice::Paired || pairingStatus == QBluetoothLocalDevice::AuthorizedPaired )
item->setTextColor(QColor(Qt::green));
else
item->setTextColor(QColor(Qt::black));
ui->listWidget->addItem(item);
}
}
/* 刷新完成 */
void BLE::findFinish()
{
ui->pushButton_upDateBLE->setEnabled(true);
}
/* 藍牙連接 */
void BLE::connectBLE(QListWidgetItem *item)
{
myTime->start();//開始啓動定時器
QString text = item->text();
int index = text.indexOf(' ');
if (index == -1)
return;
QBluetoothAddress address(text.left(index));
QString name(text.mid(index + 1));
// QMessageBox::information(this,tr("Info"),tr("The device is connecting..."));
ui->pushButton_openBLE->setText(tr("正在連接•••\n"));
ui->pushButton_openBLE->setStyleSheet("background-color:transparent");
socket->connectToService(address, QBluetoothUuid(serviceUuid) ,QIODevice::ReadWrite);
}
/* 連接成功 */
void BLE::connectOK()
{
discoveryAgent->stop(); //停止搜索設備
// QMessageBox::information(this, tr("HBU"), tr("<h1><font color=red size=400>連接成功!</font></h1>"));
// QMessageBox *msgBox = new QMessageBox();
// QPixmap iconImg("://image/背景.jpg");
// QIcon icon(iconImg);
// msgBox->setWindowIcon(icon);
// msgBox->setText(tr("HBU"));
// QPushButton *btn_sure = msgBox->addButton("確定", QMessageBox::AcceptRole);
// msgBox->setStyleSheet("background-color:white");
// msgBox->exec();
Delay_MSec(1000);//延時發送指令,緩衝時間
BLE_flag::socket_ok = true;
socket->write(_start.toLatin1());
this->hide();
Start *s = new Start();
s->show();
}
/* 連接失敗 */
void BLE::connectNot()
{
QMessageBox::information(this, tr("錯誤"), tr("<h1><font color=red size=400>連接失敗!</font></h1>"));
}
bool BLE::eventFilter(QObject *watched, QEvent *event)
{
if(watched == ui->listWidget && event->type() == QEvent::Paint)
{
magicTime();
}
return QWidget::eventFilter(watched,event);
}
void BLE::magicTime()
{
QPainter painter(ui->listWidget);
painter.drawPixmap(0,0,ui->listWidget->width(),ui->listWidget->height(),QPixmap("://image/背景.jpg"));
// painter.setPen(Qt::gray);
// painter.setBrush(Qt::green);
// painter.drawRect(0,0,width(),height());
}
void BLE::paintEvent(QPaintEvent *)
{
QPainter painter(this);
// painter.setPen(Qt::gray);
// painter.setBrush(Qt::black);
// painter.drawRect(0,0,width(),height());
painter.drawPixmap(0,0,width(),ui->listWidget->height()+228,QPixmap("://image/背景.jpg"));
}
void BLE::Delay_MSec(unsigned int msec)
{
QTime _Timer = QTime::currentTime().addMSecs(msec);
while( QTime::currentTime() < _Timer )
QCoreApplication::processEvents(QEventLoop::AllEvents, 100);
}
void BLE::Confail()
{
myTime->stop();//斷開定時器
ui->pushButton_openBLE->setText(tr("連接失敗"));
ui->pushButton_openBLE->setStyleSheet("background-color:transparent");
}
#include "Start.h"
#include "ui_Start.h"
#include "Control.h"
#include <QMovie>//創建動畫對象
#include <QTime>
#include <QTimer>
Start::Start(QWidget *parent) :
QWidget(parent),
ui(new Ui::Start)
{
ui->setupUi(this);
//創建動畫
QMovie *myMovie = new QMovie("://image/自行車撞車.gif");
//設置動畫
ui->labelGif->setMovie(myMovie);
//啓動動畫
myMovie->start();
//讓動畫自動適應大小
ui->labelGif->setScaledContents(true);
//定時器進行小車啓動
myTime = new QTimer();
myTime->setInterval(4000);//10s定時
connect(myTime,SIGNAL(timeout()),this,SLOT(Start_car()));
myTime->start();
//定時滾屏顯示
pTimer = new QTimer(this);
connect(pTimer, SIGNAL(timeout()), this, SLOT(scrollCaption()));
pTimer->start(400);
}
Start::~Start()
{
delete ui;
}
void Start::Start_car()
{
myTime->stop();//斷開定時器
myTime->destroyed();
pTimer->stop();
pTimer->destroyed();
this->hide();
Control *c = new Control();
c->show();
}
void Start::scrollCaption()
{
static int nPos = 0;
const QString strScrollCation = QString:: fromUtf8(" ...........( ̄▽ ̄)");
// 當截取的位置比字符串長時,從頭開始
if (nPos > strScrollCation.length())
nPos = 0;
if(nPos < 4)
{
ui->label_2->setStyleSheet("color:black");
ui->label->setStyleSheet("color:black");
}
else if(nPos < 8)
{
ui->label_2->setStyleSheet("color:red");
ui->label->setStyleSheet("color:red");
}
else if(nPos < 11)
{
ui->label_2->setStyleSheet("color:purple");
ui->label->setStyleSheet("color:purple");
}
else
{
ui->label_2->setStyleSheet("color:blue");
ui->label->setStyleSheet("color:blue");
}
ui->label_2->setText(strScrollCation.mid(nPos));
nPos++;
}
#include "Control.h"
#include "ui_Control.h"
#include <QMessageBox>
#include <QPixmap>
/* 外部變量,定義在BLE.cpp裏 藍牙連接成功後的socket */
extern QBluetoothSocket *socket;
Control::Control(QWidget *parent) :
QWidget(parent),
ui(new Ui::Control)
{
ui->setupUi(this);
// ui->pushButton_right->setEnabled(false);
QPalette palette (this->palette());
QPixmap pixmap = QPixmap("://image/自行車.jpg").scaled(1090,1850);
//palette.setColor(QPalette::Background, Qt::black);
palette.setBrush(QPalette::Background, QBrush(pixmap));
this->setPalette( palette );
ui->toolButton->setIconSize(QSize(200, 200));
ui->toolButton->setStyleSheet("border-image:url(://image/ibluetooth.png);");
ui->toolButton_beep->setIconSize(QSize(200, 200));
ui->toolButton_beep->setStyleSheet("border-image:url(://image/喇叭.png);");
ui->toolButton_pause->setIconSize(QSize(250, 150));
ui->toolButton_pause->setStyleSheet("border-image:url(://image/自行車圖標.jpg);");
ui->toolButton_foward->setIconSize(QSize(250, 250));
ui->toolButton_foward->setStyleSheet("border-image:url(://image/上.png);");
ui->toolButton_back->setIconSize(QSize(250, 250));
ui->toolButton_back->setStyleSheet("border-image:url(://image/下.png);");
ui->toolButton_right->setIconSize(QSize(250, 250));
ui->toolButton_right->setStyleSheet("border-image:url(://image/右.png);");
ui->toolButton_left->setIconSize(QSize(250, 250));
ui->toolButton_left->setStyleSheet("border-image:url(://image/左.png);");
ui->label->setScaledContents(true);
ui->label->setPixmap(*img1);
}
Control::~Control()
{
delete ui;
}
//void Control::on_pushButton_right_clicked()
//{
//// ui->pushButton_right->hide();
// socket->write(_right.toLatin1());
//}
/* 藍牙連接頁面 */
void Control::on_toolButton_clicked()
{
this->hide();
BLE *w = new BLE();
w->show();
}
void Control::on_toolButton_foward_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_forward_p.toLatin1());
}
void Control::on_toolButton_foward_released()
{
ui->label->setPixmap(*img1);
socket->write(_forward_r.toLatin1());
}
void Control::on_toolButton_back_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_back_p.toLatin1());
}
void Control::on_toolButton_back_released()
{
ui->label->setPixmap(*img1);
socket->write(_back_r.toLatin1());
}
void Control::on_toolButton_left_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_left_p.toLatin1());
}
void Control::on_toolButton_left_released()
{
ui->label->setPixmap(*img1);
socket->write(_left_r.toLatin1());
}
void Control::on_toolButton_right_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_right_p.toLatin1());
}
void Control::on_toolButton_right_released()
{
ui->label->setPixmap(*img1);
socket->write(_right_r.toLatin1());
}
void Control::on_toolButton_pause_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_pause_p.toLatin1());
}
void Control::on_toolButton_pause_released()
{
ui->label->setPixmap(*img1);
socket->write(_pause_r.toLatin1());
}
void Control::on_toolButton_beep_pressed()
{
ui->label->setPixmap(*img2);
socket->write(_beep_p.toLatin1());
}
void Control::on_toolButton_beep_released()
{
ui->label->setPixmap(*img1);
socket->write(_beep_r.toLatin1());
}