如何利用Arduino+Nodejs做一个手势识别的交互系统
发表于:2025-02-01 作者:千家信息网编辑
千家信息网最后更新 2025年02月01日,本篇文章为大家展示了如何利用Arduino+Nodejs做一个手势识别的交互系统,内容简明扼要并且容易理解,绝对能使你眼前一亮,通过这篇文章的详细介绍希望你能有所收获。接触Arduino也有些日子了,
千家信息网最后更新 2025年02月01日如何利用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安全错误
数据库的锁怎样保障安全
深圳云飞网络技术有限公司
服务器多端口镜像
iis搭建web服务器的安装
国内网络安全方面的证书
软件开发者证书有什么用
大专学历的软件开发人员
网络安全黑板报初中
软件开发和通信网优
c语言实现将数据传输到数据库
服务器直接访问url
武汉云极术网络技术有限公司
广州管理软件开发流程
上海饷哆网络技术有限公司
怎么多开安卓模拟器服务器
网络安全人员画像图片
有情怀的软件开发师
服务器可以玩欧洲卡车吗
定制化国产服务器厂家推荐
河北高性能服务器批发厂家
好的网络技术论文标题
软件开发以后的工作
网络技术上课创新点
软件开发的11种模式分别是什么
三部门加密网络安全围栏
硬科技对比互联网
多媒体信息发布系统软件开发
服务器管理教程视频教程
巨垚网络技术
PS4服务器IP
软件开发终止协议范本