如何利用Arduino+Nodejs做一个手势识别的交互系统
发表于:2024-11-11 作者:千家信息网编辑
千家信息网最后更新 2024年11月11日,本篇文章为大家展示了如何利用Arduino+Nodejs做一个手势识别的交互系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。接触Arduino也有些日子了,
千家信息网最后更新 2024年11月11日如何利用Arduino+Nodejs做一个手势识别的交互系统
本篇文章为大家展示了如何利用Arduino+Nodejs做一个手势识别的交互系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。
接触Arduino也有些日子了,就想着做一个小玩意儿检验一下哈。不恰当的地方欢迎交流一下。。。
本次接到命令要做一个智能手势识别交互的系统产品。主要用到的硬件模块有SeeedStudio也就是矽递科技公司开发一款Arduino Uno开发板图1、一款PAJ传感器图2。软件方面就主要是Arduino IDE和Nodejs架设的Web服务器。目标产品的预想是通过手势动作控制Web界面的滚动与切换。
图1:
图2:
介绍完所需材料模块,那就开始进行积木搭建咯。。
因为模块比较少,就省去了扩展板
下面是Arduino IDE程序:
代码在这里:
//调用两个库函数#include#include "paj7620.h"#define GES_REACTION_TIME 800#define GES_QUIT_TIME 1000//定义一个LED输出引脚,用来进行握手测试const int ledPin = 13;//定义一个初始状态字符String ledStatus = "off";// 用来从Nodejs客户端获取信息String inputString = "";boolean stringComplete = false;/** * * arduino board setup * */void setup(){ // 设置波特率 Serial.begin(115200);//定义LED引脚 pinMode(ledPin, OUTPUT); //PAJ uint8_t error = 0; Serial.println("\nPAJ7620U2 TEST DEMO: Recognize 15 gestures."); error = paj7620Init(); // initialize Paj7620 registers if (error) { Serial.print("INIT ERROR,CODE:"); Serial.println(error); } else { Serial.println("INIT OK"); } Serial.println("Please input your gestures:");}/** * * Default arduino loop function * it runs over and over again * */void loop(){ uint8_t data = 0, data1 = 0, error; error = paj7620ReadReg(0x43, 1, &data); // Read Bank_0_Reg_0x43/0x44 for gesture result. if (!error) { switch (data) { case GES_RIGHT_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_LEFT_FLAG) { Serial.println(" "); Serial.println(" "); } else if(data == GES_FORWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); } break; case GES_LEFT_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_RIGHT_FLAG) { Serial.println(""); Serial.println(" "); } else if(data == GES_FORWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); } break; break; case GES_UP_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_DOWN_FLAG) { Serial.println(""); Serial.println(" "); } else if(data == GES_FORWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); } break; case GES_DOWN_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_UP_FLAG) { Serial.println(""); Serial.println(" "); } else if(data == GES_FORWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else if(data == GES_BACKWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); } break; case GES_FORWARD_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_BACKWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } break; case GES_BACKWARD_FLAG: delay(GES_REACTION_TIME); paj7620ReadReg(0x43, 1, &data); if(data == GES_FORWARD_FLAG) { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } else { Serial.println(""); Serial.println(" "); delay(GES_QUIT_TIME); } break; case GES_CLOCKWISE_FLAG: Serial.println(""); Serial.println(" "); break; case GES_COUNT_CLOCKWISE_FLAG: Serial.println(""); Serial.println(" "); break; default: paj7620ReadReg(0x44, 1, &data1); if (data1 == GES_WAVE_FLAG) { Serial.println(""); Serial.println(" "); } break; } } delay(100); updateLedStatus();}void updateLedStatus() { //检测LED状态是否被完整接收 if (stringComplete) { if (inputString == "on\r") { ledStatus = "on"; } if (inputString == "off\r") { ledStatus = "off"; } //把LED状态发送到服务器 Serial.println(ledStatus); inputString = ""; stringComplete = false; } // 通过当时状态判断行为动作状态 digitalWrite(ledPin, ledStatus == "on" ? HIGH : LOW);} void serialEvent() { while (Serial.available()) { // 接收新字节 char inChar = (char)Serial.read(); inputString += inChar; // 如果接收到换行符则中断 if (inChar == '\r') { stringComplete = true; } }}
接着是Web服务器的搭建,使用的是Nodejs。
其中server.js文件:
var app = require('http').createServer(handler), io = require('socket.io').listen(app), fs = require('fs'), url = require('url'), SerialPort = require('serialport').SerialPort, // initialize serialport using the COM5 serial port // remember to change this string if your arduino is using a different serial port sp = new SerialPort('COM5', { baudRate: 115200 }), // this var will contain the message string dispatched by arduino arduinoMessage = '', /** * helper function to load any app file required by client.html * @param { String } pathname: path of the file requested to the nodejs server * @param { Object } res: http://nodejs.org/api/http.html#http_class_http_serverresponse */ readFile = function(pathname, res) { // an empty path returns client.html if (pathname === '/') pathname = 'client.html'; fs.readFile('htmlarduino/client/' + pathname, function(err, data) { if (err) { console.log(err); res.writeHead(500); return res.end('Error loading client.html'); } res.writeHead(200); res.end(data); }); }, /** * * This function is used as proxy to print the arduino messages into the nodejs console and on the page * @param { Buffer } buffer: buffer data sent via serialport * @param { Object } socket: it's the socket.io instance managing the connections with the client.html page * */ sendMessage = function(buffer, socket) { // concatenating the string buffers sent via usb port arduinoMessage += buffer.toString(); // detecting the end of the string if (arduinoMessage.indexOf('\r') >= 0) { // log the message into the terminal // console.log(arduinoMessage); // send the message to the client socket.volatile.emit('notification', arduinoMessage); // reset the output string to an empty value arduinoMessage = ''; } };// creating a new websocketio.sockets.on('connection', function(socket) { // listen all the serial port messages sent from arduino and passing them to the proxy function sendMessage sp.on('data', function(data) { sendMessage(data, socket); }); // listen all the websocket "lightStatus" messages coming from the client.html page socket.on('lightStatus', function(lightStatus) { sp.write(lightStatus + '\r', function() { // log the light status into the terminal console.log('the light should be: ' + lightStatus); }); });});// just some debug listenerssp.on('close', function(err) { console.log('Port closed!');});sp.on('error', function(err) { console.error('error', err);});sp.on('open', function() { console.log('Port opened!');});// L3T'S R0CK!!!// creating the server ( localhost:8000 )app.listen(8000);// server handlerfunction handler(req, res) { readFile(url.parse(req.url).pathname, res);}
其中还有用到Nodejs的socket.io模块进行前后台数据调用。serialport模块进行跟Arduino串口匹配通信。通过npm命令就可以安装
Web页面就比较简单了:
手势识别控制Web
上述内容就是如何利用Arduino+Nodejs做一个手势识别的交互系统,你们学到知识或技能了吗?如果还想学到更多技能或者丰富自己的知识储备,欢迎关注行业资讯频道。
手势
模块
状态
系统
服务器
服务
产品
内容
动作
命令
技能
知识
开发
控制
恰当
简明
简明扼要
两个
串口
也就是
数据库的安全要保护哪些东西
数据库安全各自的含义是什么
生产安全数据库录入
数据库的安全性及管理
数据库安全策略包含哪些
海淀数据库安全审计系统
建立农村房屋安全信息数据库
易用的数据库客户端支持安全管理
连接数据库失败ssl安全错误
数据库的锁怎样保障安全
应用软件开发行业竞争
数据库权限定义
怎么对网络安全软件做推广
青岛电子计算机网络技术
福顺网络技术有限公司
企业网络安全 市场分类
修改浏览器代理服务器
武汉交易软件开发服务
浦发银行需要软件开发岗位吗
望江网络安全排名
IP视频监控网络技术视频教程
网络安全儿童画简介
数据库统计男女员工人数
数据库的二级索引
1995信息网络安全
5e服务器有意思的指令
网络安全系统设计销售认证资质
中央单位网络安全
降低数据库执行时间
网络安全工程师美女
北京点点网络技术有限公司
国家网络安全体系
郑州做网络安全平均工资
高校问卷调查系统数据库设计
nc57数据库导入
营销侧软件开发
金塍网络技术有限公司
搞好网络安全的好处
控制面板的服务器管理器
数据库 免费课件