最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)

STM32库函数开发系列文章目录

第一篇:STM32F103ZET6单片机双串口互发程序设计与实现
第二篇:最简单DIY基于STM32单片机的蓝牙智能小车设计方案
第三篇:最简单DIY基于STM32F407探索者开发板的MPU6050陀螺仪姿态控制舵机程序
第四篇:最简单DIY基于STM32F407探索者开发板和PCA9685舵机控制模块的红外遥控机械臂控制程序
第五篇:注释最详细、代码最简单的STM32+摄像头+显示屏的颜色跟踪电路软硬件方案
第六篇:最简单DIY基于STM32单片机的WIFI智能小车设计方案
第七篇:最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)



前言

    daodanjishui物联网核心原创技术之最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)。
    市面上有各种开源电脑控制软件和硬件的方案,但是有复杂的有简单的,如果想快速入门STM32控制电脑的软硬件方案,这个方案会给你一个快捷高效的方案。


一、最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)是什么?

    我记得本栏的第六篇博文:最简单DIY基于STM32单片机的WIFI智能小车设计方案的设计中大量使用了库函数和别人的开源代码,鲁迅先生的“拿来主义”表现的淋漓尽致,这也是STM32库函数开发的魅力所在,完成了串口WIFI通信实现了WIFI控制的小车。为了实现STM32控制电脑,所以诞生第七篇博文。
     随着人们日常使用电脑频率的提高,人们在日常生活中离不开电脑。人们使用电脑进行学习、办公、娱乐、影音、游戏、广告、创业、交友、编程、计算和消磨时光等等。作为嵌入式工程师的我,有必要做一期电脑控制系列的开源项目向大家介绍一下在国内外是用什么方式进行远程控制电脑的,并且让感兴趣的读者怎么通过单片机或者是软件更好地远程管理自己的电脑。
     由于国内电脑远程控制技术封锁,一些技术和理论都是本人经过摸索实践推敲得出,没有权威性,所以仅供参考。首先要谈到用软件和硬件控制电脑的方案:软件有socket编程和java 鼠标键盘控制sdk开发,硬件有单片机USB鼠标键盘库的使用。下面先介绍ST公司STM32F103ZET6自带的鼠标控制电脑的方案。用到的是正点原子战舰开发板和配套的4.3寸电容触摸屏。最终实现用单片机的触摸屏实现鼠标控制的效果。如下图所示:
在这里插入图片描述

B站视频演示地址:https://www.bilibili.com/video/BV1nt4y1x739?t=14.4

视频如下

最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)


二、拿来主义日记

1.准备硬件和接线

     硬件需要正点原子开发板和4.3寸配套的电容触摸屏,由于用到了正点原子的开源代码进行人工二次合成,所以这个方案全部免费,后期我有更猛的代码,可以实现更高级的控制效果,当然后期可能需要收费。后期能做到空中鼠标控制,控制遥杆控制,空中手机控制,控制MPU6050控制, 远程MQTT控制等等。

代码预览截图如下:
在这里插入图片描述

2.技术点说明

    技术点涉及比较多,有字库显示,触摸屏触摸控制,屏幕显示,USB鼠标控制,按键控制,LED控制,是STM32初学者很好的一个开源学习材料。daodanjishui已经整理好你所需要的材料,下载就可以愉快地学习了。代码编写规范,用正点原子最简单的代码模板进行改写的,适合新手修改和二次开发。

3.资料展示和源码展示

    文末尾有下载资料的地址。资料列表如下所示:在这里插入图片描述
源码如下:(移植了ST公司控制电脑鼠标的库)

#include "led.h"
#include "delay.h"
#include "sys.h"
#include "usart.h"
#include "lcd.h"
#include "key.h"  
#include "24cxx.h" 
#include "I2C.h"
#include "touch.h" 
#include "usb_lib.h"
#include "hw_config.h"
#include "usb_pwr.h" 
#include "string.h"
#include "spi.h"
#include "malloc.h"
#include "sdio_sdcard.h"  
#include "w25qxx.h"    
#include "ff.h"  
#include "exfuns.h"   
#include "text.h"		
#include "usart3.h"
#include "fontupd.h" 
//ALIENTEK Mini STM32开发板范例代码21  二次开发为战舰4.3寸电容屏鼠标触控板
//触摸屏实验  
//技术支持:daodanjishui  	2022.5.15
//装载画图界面 
void Load_Draw_Dialog(void)
{
LCD_Clear(WHITE);//清屏
POINT_COLOR=BLUE;//设置字体为蓝色
LCD_ShowString(lcddev.width-24,0,200,16,16,"RST");//显示清屏区域
POINT_COLOR=RED;//设置画笔蓝色
} 
//计算 x1,x2 的绝对值
u32 usb_abs(u32 x1,u32 x2)
{
if(x1>x2)return x1-x2;
else return x2-x1;
}
int main(void)
{ 
//short temp2[3];//存放mpu6050数据的数组
//u8 tmp_buf[33]="qwertyuiopasdfghjklzxcvbnmqwert";	 //发射寄存器
//u8 tmp_buf[33];
u8 key;
//short X=0,Y=0;		 //发送到电脑端的坐标值
//short X1=0,Y1=0;		 //发送到电脑端的坐标值
s8 x0,y0; //发送到电脑端的坐标值
u8 keysta=0;
//short rollsta=0;  
//[0]:0,左键松开;1,左键按下;
//[1]:0,右键松开;1,右键按下
//[2]:0,中键松开;1,中键按下
u8 tpsta=0;  //0,触摸屏第一次按下;1,触摸屏滑动
int xlast, ylast; //最后一次按下的坐标值
u8 *p;//发送命令的指针
//char *p1;//工具指针
u16 t=999;		//加速第一次获取链接状态
//u16 rlen=0;//发送字符串的长度
//u8 constate=0;	//连接状态
u8 timex;	//设置循环次数
//char temp[30][30];
NVIC_PriorityGroupConfig(NVIC_PriorityGroup_2);//中断分组设置 
delay_init();  //延时初始化
uart_init(115200); //串口 1 初始化
LCD_Init();  //初始化液晶
LED_Init(); //LED 初始化
KEY_Init();  //按键初始化
TP_Init();  //初始化触摸屏                                  
MYI2C_Init();//I2C初始化
//W25QXX_Init();				//初始化W25Q128
usart3_init(115200);		//初始化串口3 
my_mem_init(SRAMIN);		//初始化内部内存池
//exfuns_init();				//为fatfs相关变量申请内存  
//f_mount(fs[0],"0:",1); 		//挂载SD卡 
//f_mount(fs[1],"1:",1); 		//挂载FLASH.
delay_ms(40);
font_init();			//检查字库是否OK	
POINT_COLOR=RED;
LCD_ShowString(60,50,200,16,16,"战舰 STM32");
LCD_ShowString(60,70,200,16,16,"USB Mouse TEST");
LCD_ShowString(60,90,200,16,16,"daodanjishui");
LCD_ShowString(60,110,200,16,16,"2022.5.15"); 
LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL +  KEY_DOWN:SCROLL -");
//LCD_ShowString(60,130,200,16,16,"KEY_DOWN:SCROLL -");
LCD_ShowString(60,150,200,16,16,"KEY1:RIGHT Button"); 
LCD_ShowString(60,170,200,16,16,"KEY0:LEFT Button");
delay_ms(1800);
USB_Port_Set(0); //USB 先断开
delay_ms(300);
USB_Port_Set(1); //USB 再次连接
USB_Interrupts_Config(); // USB 中断配置
Set_USBClock(); //USB 时钟设置
USB_Init();  //USB 初始化	
Load_Draw_Dialog();


  while(1)
  {		 
		key=KEY_Scan(0);//按键扫描	
		if(key==WKUP_PRES)			//WK_UP 退出测试		 
		{ 
			printf("WKUP_PRES");	
      LCD_ShowString(60,130,200,16,16,"KEY_UP:SCROLL +");			
       //rollsta=1;//滚轮向上		
       Joystick_Send(0,0,0,1);			
		}
		else if(key==KEY0_PRES)	//KEY0 向ID0发送数据 
		{   
     printf("KEY0_PRES");
		  keysta|=0X02;					//发送鼠标右键	
	    LCD_ShowString(60,130,200,16,16,"KEY1:RIGHT Button");
			Joystick_Send(2,0,0,0);
		}
		else if(key==KEY1_PRES)	//KEY1 向ID1发送数据 
		{ 
			  printf("KEY1_PRES");
        LCD_ShowString(60,130,200,16,16,"KEY_DOWN:SCROLL -");
			  //rollsta=-1;
		    //发送滚轮数据到电脑  向下	
        Joystick_Send(0,0,0,(u8)-1);		
    
			
		}else if(key==KEY2_PRES){
			 printf("KEY2_PRES");
			 keysta|=0X01;					//发送鼠标左键 	
       Joystick_Send(1,0,0,0);	
       LCD_ShowString(60,130,200,16,16,"KEY0:LEFT Button");
  
			
		}else if(keysta)//之前有按下
		{
			keysta=0; //发送松开命令给电脑
			Joystick_Send(0,0,0,0);
		}
    		 		 
			    tp_dev.scan(0); //触摸屏扫描
			   if(tp_dev.sta&TP_PRES_DOWN) //触摸屏被按下
        {
				 //最少移动 5 个单位,才算滑动
					if(((usb_abs(tp_dev.x[0],xlast)>4)||(usb_abs(tp_dev.y[0],ylast)>4))&&tpsta==0)
					{
					 xlast=tp_dev.x[0]; //记录刚按下的坐标
					 ylast=tp_dev.y[0];
					 tpsta=1;
					 }
					if(tp_dev.x[0]<lcddev.width&&tp_dev.y[0]<lcddev.height)
					{ 
					 if(tp_dev.x[0]>(lcddev.width-24)&&tp_dev.y[0]<16)Load_Draw_Dialog();
						 else{ 
							 TP_Draw_Big_Point(tp_dev.x[0],tp_dev.y[0],RED);  //画图 
						 }
					 if(bDeviceState==CONFIGURED)
						{
										 if(tpsta)//滑动
										{
											x0=(xlast-tp_dev.x[0])*3;//上次坐标与得到的坐标之差,扩大 2倍
											y0=(ylast-tp_dev.y[0])*3;
											xlast=tp_dev.x[0]; //记录刚按下的坐标
											ylast=tp_dev.y[0];
											Joystick_Send(keysta,-x0,-y0,0); //发送数据到电脑
											delay_ms(5);
										}
						 } 
					}
         }else { tpsta=0;delay_ms(1); }//清除	
				
        if(bDeviceState==CONFIGURED)
				 LED1=0;//USB配置成功,则绿灯亮
          else 
         LED1=1;
				 

		    if(timex)timex--;
 	      //if(timex==1)LCD_Fill(30+54,125,239,122,WHITE);//清屏
	      t++;
	      delay_ms(10); //10毫秒
	    if(t==1000)				 
		      t=0;
	     if((t%20)==0)LED0=!LED0;
			myfree(SRAMIN,p);		//释放内存	
     }

	
} 

三、运行与调试

请看录制好的视频演示。


四、总结

    总结:通过STM32单片机使用USB数据与电脑相连,不需要安装电脑驱动就可以用单片机控制电脑的鼠标,触摸屏和按键都可以同时控制鼠标的操作,程序设计精妙,拿来主义表现良好。
    后期会推出体感遥控器的开源软硬件的方案,daodanjishui嵌入式核心技术值得期待。请认准我的品牌,不断更新和创新是我的特色。追求原创开源是我的宗旨。。

最后附上本博文代码下载地址
直接跳转

地址:https://www.cirmall.com/circuit/30852/

  • 0
    点赞
  • 15
    收藏
    觉得还不错? 一键收藏
  • 打赏
    打赏
  • 1
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包

打赏作者

daodanjishui

你的鼓励将是我创作的最大动力

¥1 ¥2 ¥4 ¥6 ¥10 ¥20
扫码支付:¥1
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

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

余额充值