当前位置:网站首页>最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)
最简单DIY基于STM32的远程控制电脑系统①(电容触摸+按键控制)
2022-06-23 10:35:00 【daodanjishui】
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/
边栏推荐
- Personal blog system graduation project opening report
- R和RStudio下载安装详细步骤
- Noi OJ 1.3 17: calculating triangle area C language
- 详解判断大小端的方法
- Too helpless! Microsoft stopped selling AI emotion recognition and other technologies, saying frankly: "the law can not keep up with the development of AI"
- 华为云·维享会交流平台简介
- Mathematical analysis_ Notes_ Chapter 2: real and plural numbers
- Musk's 18-year-old son petitioned to change his name to sever the father son relationship
- 炫酷相册代码,祝对象生日快乐!
- Stockage d'images - référence
猜你喜欢

AI芯片技术-2022年

Step by step introduction to sqlsugar based development framework (9) -- Realizing field permission control with WinForm control

What does NFTs, Web3 and metauniverse mean for digital marketing?

Experience of using thread pool in project

个人博客系统毕业设计开题报告

技术创造价值,手把手教你薅羊毛篇

Build a QQ robot to wake up your girlfriend

新派科技美学、原生物联网操作系统重塑全屋智能

安装typescript环境并开启VSCode自动监视编译ts文件为js文件

JVM简单入门-02
随机推荐
Implementing Domain Driven Design - using ABP framework - General guidelines
NOI OJ 1.3 16:计算线段长度 C语言
Noi OJ 1.3 20: power C language for computing 2
What does NFTs, Web3 and metauniverse mean for digital marketing?
Golang 快速上手 (1)
Build the information and innovation industry ecology, and make mobile cloud based on the whole stack of independent innovation
为什么poll/select在open时要使用非阻塞NONBLOCK
NOI OJ 1.3 05:计算分数的浮点数值 C语言
韦东山设备信息查询例程学习
解决audio自动播放无效问题
Spring recruitment interview experience summary (technical post)
个人博客系统毕业设计开题报告
圖片存儲--引用
当 Pandas 遇见 SQL,一个强大的工具库诞生了
Large homework collection
NOI OJ 1.2 10:Hello, World! Size of C language
NOI OJ 1.3 13:反向输出一个三位数 C语言
UART的奇偶校验
MySQL-01. Summary of database optimization and explain field knowledge in work
web技术分享| 【高德地图】实现自定义的轨迹回放