单片机课程结题报告:“弹弹乐”

Similar documents
AN INTRODUCTION TO PHYSICAL COMPUTING USING ARDUINO, GRASSHOPPER, AND FIREFLY (CHINESE EDITION ) INTERACTIVE PROTOTYPING

控制器 EtherCAT EtherCAT EtherCAT 接下一个电机驱动模块 (X4) 接下一个电机驱动模块 (X5) X11 IN X4 IN X3 OUT X5 IN X6 OUT X2 X1 X4 IN X3 OUT X5 IN X6 OUT X2 X1 SYS STA DC BUS D

TX-NR3030_BAS_Cs_ indd

CL-S10w

<4D F736F F D20D4D3D6BECEC4B8E5C4A3B0E52E646F63>

Contents Viewpoint Application Story 05 News & Events 06 Technology Forum Customer Partnership Cover Story Advisory Board Inside Advantech Beautiful L

AL-M200 Series

(Pattern Recognition) 1 1. CCD

CC213

Microsoft Word - ws-chp06輸入輸出notes.doc

Data Management Software CL-S10w

电子技术基础 ( 第 版 ) 3. 图解单相桥式整流电路 ( 图 4-1-3) 电路名称电路原理图波形图 整流电路的工作原理 1. 单相半波整流电路 u 1 u u sin t a t 1 u 0 A B VD I A VD R B

Aquasnap Junior 30RH/RA RH/RA

BC04 Module_antenna__ doc

Epson

中国中医科学院文件

迈腾行车电脑编码汇编

中北大学常规事项财务报销操作指南

目 录 如 何 阅 读 本 说 明 书! 感 谢 您 惠 购 先 锋 产 品 请 务 必 阅 读 本 册 子 和 本 机 附 带 的 使 用 说 明 书 ( 基 本 版 ) 它 们 都 包 含 使 用 本 产 品 之 前 必 须 充 分 了 解 的 重 要 信 息! 在 本 说 明 书 中, 产 品

三 设 计 思 想 以 及 电 路 原 理 图 1. 小 车 以 Arduino MEGA 作 为 数 据 处 理 中 心, 将 安 装 在 小 车 上 的 超 声 波 模 块 的 信 号 汇 总 到 Arduino, 经 其 处 理 后 输 出 控 制 信 号 到 电 机 驱 动 版, 驱 动 步

Data Management Software CL-S10w

致 谢 开 始 这 篇 致 谢 的 时 候, 以 为 这 是 最 轻 松 最 愉 快 的 部 分, 而 此 时 心 头 却 充 满 了 沉 甸 甸 的 回 忆 和 感 恩, 一 时 间 竟 无 从 下 笔 虽 然 这 远 不 是 一 篇 完 美 的 论 文, 但 完 成 这 篇 论 文 要 感 谢

Epson

第一章

Microsoft Word - KSAE06-S0262.doc

1 TPIS TPIS 2 2

JLX

2/80 2

建筑学院建筑学本科专业建设发展规划.doc

Microsoft Word - 黃玉緞 _民間文學教案設計_民歌擬作舉隅

untitled

untitled

BQY.PS2

<4D F736F F D20322EABEDA473A5C1B6A1B6C7BBA1AAECB1B42E646F63>

untitled

书 名 : 额 尔 古 纳 河 右 岸 作 者 : 迟 子 建 出 版 社 : 北 京 十 月 文 艺 出 版 社 出 版 日 期 : 开 本 : 正 16 开 页 数 :262 ISBN:

untitled

Ps22Pdf

)001 (131 ) : ISBN / :

湖北省高中课程改革重大项目

...T.U.p65

书 名 : 作 者 : 出 版 社 : 中 国 电 影 出 版 社 版 权 所 有 : 烨 子 工 作 室 类 别 : 中 国 传 世 情 爱 小 说 出 版 时 间 :2005 年 10 月 字 书 数 :150 千 字 号 :ISBN /B 0030

untitled

ISBN Z

untitled

Ps22Pdf

Ps22Pdf

untitled

: : ISBN /B 007 :

untitled

()001 ( 131 ) : ISBN / I1021 :7.50

untitled

untitled

Ps22Pdf

马来西亚、约旦(上).doc

untitled

untitled

()001 ( 131 ) : ISBN / I1020 :6.50

Microsoft Word - 8-柯香君-原稿初修-0516.doc

目录 一 项目背景 背景及创新点 功能简介... 3 二 作品介绍 基于手机的蓝牙控制 ) 硬件设计 ) 电路原理图 ) 软件设计 ) 软件流程图 ) Arduino 程序源代码

Guide to Install SATA Hard Disks

2 Bosch Rexroth AG Electric Drives and Controls 文档 功率范围 x AC 230 V 0.4 kw 至 3 x AC 400 V 90.0 kw 使用永磁式电机 内置的制动斩波器和电源滤波器 内置的操作面板, 可简单且快速地进行调试 可以通过输入输出和

穨control.PDF

1.ai

27 :OPC 45 [4] (Automation Interface Standard), (Costom Interface Standard), OPC 2,,, VB Delphi OPC, OPC C++, OPC OPC OPC, [1] 1 OPC 1.1 OPC OPC(OLE f

an153f

9, : Java 19., [4 ]. 3 Apla2Java Apla PAR,Apla2Java Apla Java.,Apla,,, 1. 1 Apla Apla A[J ] Get elem (set A) A J A B Intersection(set A,set B) A B A B

audiogram3 Owners Manual

目录

威 福 髮 藝 店 桃 園 市 蘆 竹 區 中 山 里 福 祿 一 街 48 號 地 下 一 樓 50,000 獨 資 李 依 純 105/04/06 府 經 登 字 第 號 宏 品 餐 飲 桃 園 市 桃 園 區 信 光 里 民

Tel:

Microsoft Word - Atmel-45136A-Pick-Best-Microcontroller-Strom-Eiland-Flodell_Article_CS

Protel Schematic

ICD ICD ICD ICD ICD

ChungShun_Beauty.pdf








1

Chapter 2 GIGA-BYTE TECHNOLOGY CO., LTD. ("GBT") GBT GBT GBT

<4D F736F F D20C9EEDBDACAD0B6ABB3CFD0C5B5E7D7D3BFC6BCBCD3D0CFDEB9ABCBBEBDE9C9DCBCB0BFE2B4E6>

关于报送高中级专业技术职务

a b c d e f g C2 C1 2


第 二 章 古 代 慢 慢 睁 开 眼 睛, 我 的 面 前 出 现 一 个 女 孩 子, 大 约 十 六 七 岁, 身 穿 淡 绿 色 布 裙, 头 上 两 个 小 圆 髻 特 别 娇 俏 可 爱 医 院 什 么 时 候 出 现 这 么 一 个 可 爱 的 古 装 护 士 啊! 这 医 院 真 有

Outline USB Application Requirements Variable Definition Communications Code for VB Code for Keil C Practice

HD ( ) 18 HD ( ) 18 PC 19 PC 19 PC 20 Leica MC170 HD Leica MC190 HD 22 Leica MC170 HD Leica MC190 HD Leica MC170 HD

JavaIO.PDF

江 西 : 失 信 被 执 行 人 曝 光 台 写 入 两 会 报 告 摘 要 1 月 27 日, 江 西 省 十 二 届 人 大 五 次 会 议 举 行 第 二 次 全 体 会 议, 江 西 省 高 级 人 民 法 院 院 长 张 忠 厚 向 大 会 作 江 西 省 高 级 人 民 法 院 工 作

形 式 审 查 不 通 过, 将 说 明 原 因 并 予 退 回, 不 予 重 新 修 改 提 交 ( 形 式 审 查 常 见 主 要 问 题 参 考 附 件 3) ( 三 ) 申 请 人 下 载 打 印 网 上 状 态 为 请 交 纸 质 材 料 至 窗 口 受 理 的 申 报 书, 报 送 项

撤 离 你 听 到 了 吗? 它 们 已 经 进 了 墙 里 边 了 那 些 金 属 的 撞 击 声 在 狂 风 之 中 很 难 听 清, 但 断 然 不 会 有 错 围 坐 在 桌 边 的 四 人 靠 得 更 紧 了 些, 并 不 是 因 为 害 怕, 而 是 为 了 取 暖 你 们 觉 得 呢?

University of Science and Technology of China A dissertation for master s degree Research of e-learning style for public servants under the context of

IP TCP/IP PC OS µclinux MPEG4 Blackfin DSP MPEG4 IP UDP Winsock I/O DirectShow Filter DirectShow MPEG4 µclinux TCP/IP IP COM, DirectShow I

CHCN.indd

Data Management Software CL-S10w

Transcription:

体感手势控制 以玩具车控制为例 组员姓名 : 黄泽蔡宁武三茗院系 : 2013 级物理学院指导老师 : 李茂奎王健完成日期 : 2015 年 5 月 6 日 摘要 我组应用体感技术, 以玩具车的控制为例, 实现了体感手势控制 采用微软 kinect 探测器, 以计算机进行视频识别, 实现手势探测, 并通过串口通信将指令发送至单片机, 实现对玩具车的远程遥控 同时, 我组将此亦将此技术用于 LED 灯光控制等方面 Our team designed a gesture controlling platform with motion sensing technology, which have been applied to a smart toy and a LED system. Our team use kinect, a sensor produced by Microsoft Corporation, to detect operators gesture and computer to analyze the video, and demands are sent to the Arduino to achieve the remote control. Besides, our team apply the technology to other fields, including the remote control of LED. 关键词 Kinect 手势控制体感 arduino

目录 一 硬件设计思路与可行性分析 1 二 程序设计思路与可行性分析 5 三 电路图 17 三 参考文献 17

一 硬件设计思路与可行性分析 硬件组成分为三部分, 探测器 数据处理系统与控制系统 探测器选用微软的 kinect 探测器, 因为其具有性能好 精度高 可靠性好的优点, 对于高精度深度数据收集与手势识别有很大的优势 ; 由于数据较多 对数据计算速度要求较高, 所以选择数据在计算机而非单片机中处理 ; 控制系统的中心是一个单片机, 单片机接收通过串口通讯由计算机发送过来的数据, 再通过数字引脚输出高低电平 PWM 引脚输出模拟信号, 起到对于直流电机的控制作用 由于并没有在单片机内进行过多的运算, 保障了响应的及时性与系统的稳定性 四个直流电机再驱动四个轮子带动小车前进, 并且通过调速实现转向的功能 整个系统可靠性高, 所需程序能够在硬件内顺利运行, 可靠性高, 市面上有能够满足要求的零部件, 并且硬件结构简单, 出现问题易于维护与修理, 性能稳定 硬件概况 1 Kinect v1.0 Kinect 是一种 3D 体感摄影机, 同时导入了即时动态捕捉 影像辨识等功能 具有两个 RGB 摄像头 一个红外传感器与一个 3D 深度传感器, 能够采集视频数据与深度数据 2 Arduino Mega2560 Arduino Mega2560 采用 USB 接口的核心电路板, 可以使用 USB 供电, 亦可使用外部电源供电 处理器核心是 ATmega2560, 同时具有 54 路数字输入 / 输出口 ( 其中 16 路可作为 PWM 输出 ),16 路模拟输入,4 路 UART 接口, 一个 16MHz 晶体振荡器, 一个 USB 口, 一个电源插座, 一个 ICSP header 和一个复位按钮 ATmega2560 内置的 4 路 UART 可以与外部实现串口通信 ;ATmega16U2 可以访问串口 0 实现 USB 上的虚拟串口 第 1 页共 19 页

原理图 PCB Layout: 第 2 页共 19 页

3 L298N 驱动模块 L298N 是一种高电压 大电流电机驱动芯片, 主要特点是 : 工作电压高, 最高工作电压可达 46V; 输出电流大, 瞬间峰值电流可达 3A, 持续工作电流为 2A; 额定功率 25W 其内含两个 H 桥的高电压大电流全桥式驱动器, 可可以用来驱动直流电动机 ; 采用标准逻辑电平信号控制 ; 具有两个使能控制端, 在不受输入信号影响的情况下允许或禁止器件工作有一个逻辑电源输入端, 使内部逻辑电路部分在低电压下工作 L298N 之接脚如下图所示,Pin1 和 Pin15 可与电流侦测用电阻连接来控制负载的电路 ; OUTl OUT2 和 OUT3 OUT4 之间分别接 2 个步进电机 ;input1~input4 输入控制电位来控制电机的正反转 ;Enable 则控制电机停转 L298 引脚图 第 3 页共 19 页

硬件原理流程图 : 开始 Kienct 是否识别到信号 是 将指令传至计算机 计算机数据分析 指令传至单片机 操作机械设备 第 4 页共 19 页

二 程序设计思路与可行性分析 : 我组的程序分为两个部分 : 使用 kinect 进行手势识别, 与对 arduino 的操控 为实现手势识别, 首先需要先找到手部的位置 我组使用点来代替手, 当 kinect 识别出手部的时候在手的位置绘制一个点, 之后追踪这个点的位置, 这样当手的姿势改变或者手被异物挡住的时候仍然可以被识别 当有新的手部出现的手部, 会识别新的手, 建立新的追踪点, 而旧的追踪点会被移除, 当两个手接触的时候追踪点会在两个手之间传递, 从而实现控制权 从一只手到另一只手 与 从一个人到另一个人 之间的交换 当追踪点建立后,kinect 实时传回追踪点的位置信息 在计算机上的程序实时分析传回的位置信息, 根据横坐标与纵坐标确定追踪点的位置, 按九宫格分为九个位置, 分别代表前进 后退 停止 三种左转模式和三种右转模式 当追踪点脱离探测范围时出发停止命令, 结束操作 将这九种模式编号, 将其通过串口通信发送至单品机, 单片机通过高低电平及模拟信号值控制车轮转动方向与转速, 实现以上九种模式 第 5 页共 19 页

软件原理流程图 : 开始 是否探测到手部 是 建立追踪点 传输追踪点位置至计算机 是否位于位置一 是 否 发送指令 1 至单片机 是否位于位置二 第 6 页共 19 页

是否位于位置八 是 发送指令 8 至单片机 发送指令 9 至单片机 单片机执行相应的操作 第 7 页共 19 页

代码如下计算机部分代码 : import java.util.map; import java.util.iterator; import SimpleOpenNI.*; import processing.serial.*; SimpleOpenNI context; Serial myport; int handveclistsize = 20; Map<Integer,ArrayList<PVector>> handpathlist = new HashMap<Integer,ArrayList<PVector>>(); color[] userclr = new color[] color(255,0,0), color(0,255,0), color(0,0,255), color(255,255,0), color(255,0,255), color(0,255,255) ; void setup() // framerate(200); size(640,480); String portname = Serial.list()[0]; myport = new Serial(this, portname, 9600); context = new SimpleOpenNI(this); if(context.isinit() == false) println("can't init SimpleOpenNI, maybe the camera is not connected!"); exit(); return; // enable depthmap generation context.enabledepth(); 第 8 页共 19 页

// disable mirror context.setmirror(true); // enable hands + gesture generation //context.enablegesture(); context.enablehand(); context.startgesture(simpleopenni.gesture_wave); // set how smooth the hand capturing should be //context.setsmoothinghands(.5); void draw() // update the cam SimpleOpenNI.updateAll(); image(context.depthimage(),0,0); // draw the tracked hands if(handpathlist.size() > 0) Iterator itr = handpathlist.entryset().iterator(); while(itr.hasnext()) Map.Entry mapentry = (Map.Entry)itr.next(); int handid = (Integer)mapEntry.getKey(); ArrayList<PVector> veclist = (ArrayList<PVector>)mapEntry.getValue(); PVector p= new PVector(); PVector p2d = new PVector(); stroke(userclr[ (handid - 1) % userclr.length ]); nofill(); strokeweight(1); Iterator itrvec = veclist.iterator(); beginshape(); while( itrvec.hasnext() ) p = (PVector) itrvec.next(); context.convertrealworldtoprojective(p,p2d); 第 9 页共 19 页

vertex(p2d.x,p2d.y); endshape(); stroke(userclr[ (handid - 1) % userclr.length ]); strokeweight(4); p = veclist.get(0); context.convertrealworldtoprojective(p,p2d); point(p2d.x,p2d.y); if (p2d.x > 210 && p2d.x<430 && p2d.y > 160 && p2d.y <320) myport.write('h'); else if(p2d.x > 210 && p2d.x < 430 && p2d.y > 320) myport.write('f'); else if (p2d.x > 210 && p2d.x < 430 && p2d.y < 160) myport.write('b'); else if (p2d.x < 210 && p2d.y > 320) myport.write('y'); else if (p2d.x > 430 && p2d.y > 320) myport.write('z'); else if (p2d.x < 210 && p2d.y > 160 && p2d.y < 320) myport.write('l'); else if (p2d.x > 430 && p2d.y > 160 && p2d.y < 320) myport.write('r'); else if (p2d.x < 210 && p2d.y < 160) myport.write('1'); else if (p2d.x > 430 && p2d.y < 160) myport.write('0'); // ----------------------------------------------------------------- // hand eventss void onnewhand(simpleopenni curcontext,int handid,pvector pos) 第 10 页共 19 页

println("onnewhand - handid: " + handid + ", pos: " + pos); ArrayList<PVector> veclist = new ArrayList<PVector>(); veclist.add(pos); handpathlist.put(handid,veclist); void ontrackedhand(simpleopenni curcontext,int handid,pvector pos) //println("ontrackedhand - handid: " + handid + ", pos: " + pos ); ArrayList<PVector> veclist = handpathlist.get(handid); if(veclist!= null) veclist.add(0,pos); if(veclist.size() >= handveclistsize) // remove the last point veclist.remove(veclist.size()-1); void onlosthand(simpleopenni curcontext,int handid) println("onlosthand - handid: " + handid); myport.write('h'); handpathlist.remove(handid); // ----------------------------------------------------------------- // gesture events void oncompletedgesture(simpleopenni curcontext,int gesturetype, PVector pos) println("oncompletedgesture - gesturetype: " + gesturetype + ", pos: " + pos); int handid = context.starttrackinghand(pos); println("hand stracked: " + handid); arduino 部分的代码 : 第 11 页共 19 页

byte input = 0; int Left_Front_IN1 = 49; int Left_Front_IN2 = 47; int Left_Front_EN = 9; int Right_Front_IN1 = 37; int Right_Front_IN2 = 35; int Right_Front_EN = 12; int Left_Behind_IN1 = 53; int Left_Behind_IN2 = 51; int Left_Behind_EN = 7; int Right_Behind_IN1 = 33; int Right_Behind_IN2 = 31; int Right_Behind_EN = 8; void setup() Serial.begin(9600); // initialize the serial communication: pinmode(left_behind_in1, OUTPUT); pinmode(left_behind_in2, OUTPUT); pinmode(right_front_in1, OUTPUT); pinmode(right_front_in2, OUTPUT); pinmode(left_behind_in1, OUTPUT); pinmode(left_behind_in2, OUTPUT); pinmode(right_behind_in1, OUTPUT); pinmode(right_behind_in2, OUTPUT); void loop() // check if enough data has been sent from the computer: if (Serial.available()>0) input = Serial.read(); // And send those to the KCar! if (input == 'F') // Forward digitalwrite(left_front_in1, HIGH); 第 12 页共 19 页

digitalwrite(left_front_in2, LOW); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, LOW); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, LOW); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, LOW); analogwrite(right_behind_en,255); if (input == 'H') //Halt digitalwrite(left_front_in1, HIGH); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); if (input == 'B') //Back digitalwrite(left_front_in1, LOW); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, LOW); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); 第 13 页共 19 页

digitalwrite(right_front_in1, LOW); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, LOW); digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); if (input == 'L') //Turn Left digitalwrite(left_front_in1, LOW); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, LOW); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, LOW); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, LOW); analogwrite(right_behind_en,255); if (input == 'R') //Turn Right digitalwrite(left_front_in1, HIGH); digitalwrite(left_front_in2, LOW); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, LOW); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, LOW); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, LOW); 第 14 页共 19 页

digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); if (input == 'Z') //Turn Left Forward digitalwrite(left_front_in1, HIGH); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, LOW); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, LOW); analogwrite(right_behind_en,255); if (input == 'Y') //Turn Right Forward digitalwrite(left_front_in1, HIGH); digitalwrite(left_front_in2, LOW); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, LOW); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); if (input == '0') //Turn Left Back 第 15 页共 19 页

digitalwrite(left_front_in1, HIGH); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, HIGH); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, LOW); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, LOW); digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); if (input == '1') //Turn Right Back digitalwrite(left_front_in1, LOW); digitalwrite(left_front_in2, HIGH); analogwrite(left_front_en,255); digitalwrite(left_behind_in1, LOW); digitalwrite(left_behind_in2, HIGH); analogwrite(left_behind_en,255); digitalwrite(right_front_in1, HIGH); digitalwrite(right_front_in2, HIGH); analogwrite(right_front_en,255); digitalwrite(right_behind_in1, HIGH); digitalwrite(right_behind_in2, HIGH); analogwrite(right_behind_en,255); 第 16 页共 19 页

三 电路图 四 参考文献 1 arduino 程序设计基础, 陈吕洲, 北京 : 北京航空航天大学出版社,2014.1, ISBN 978-7-5124-1339-9 2 Kinect 人机交互开发实践, 吴国斌, 李斌, 阎骥洲, 北京 : 人民邮电出版社,2013,ISBN 978-7-115-30029-4 3 学 arduino 玩转 kinect 制作项目,Melgar,E.R, Diez,C.C. Jaworski,P. 北京 : 人民邮电出版社,2014.3,ISBN 978-7-115-34248-5 4 MSDN https://msdn.microsoft.com/zh-cn/ 5 CSDN http://www.csdn.net/ 6 L298N 技术手册 第 17 页共 19 页