找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 15547|回复: 7

利用LabView建立NXT的I2C通讯

  [复制链接]
发表于 2010-2-19 10:42:53 | 显示全部楼层 |阅读模式
NI(National Instruments)为LEGO异业结盟的伙伴,LEGO NXT上的程序开发环境为NXT-G,是利用NI LabView为基础所建立,LEGO NXT使用者若希望自行开发LEGO NXT周边感测器,是无法在NXT-G内找到相对应的程序元件,因此,就必须通过LabView开发环境来扩建与自制开发感测器相对应的程序元件。
本文将针对NXT进阶玩家,介绍在LabView开发环境中,如何建立NXT与具备I2C通讯能力的感测器沟通的程序,读者可参考下述范例程式的步骤,撰写符合自己需求的程式,驱动NXT的I2C通讯功能。在建立范例程式前,必须安装LEGO NXT ToolKit安装档,否则下述的部分选项将无法显示。
  
步骤1、载入App元件
在Block Diagram中点选滑鼠右键后,选取All Functions,选取NXT Toolkit,选取Application Control,选取Invoke Node,载入App元件。

步骤2、将APP元件转成NXTSystemCall元件
在APP上点选滑鼠右键,选取Select Class,选取NXT InputOutput,选取NXTSystemCall,如图4所示。


12179069091.jpg
图4 将APP转成NXTSystemCall元件

步骤3、设定NXTSystemCall为I2C Master Write
在NXTSystemCall上点选滑鼠右键,选择Methods,选择欲传输的方式NXTCommLSWrite,此为NXT I2C Master Write模式,如图5所示,若要更改为NXT I2C Master Read模式则要选择NXTCommLSRead,I2C Master Read与I2C Master Write,两者在通讯结构上有所差异,本范例程式为I2C Master Write模式,因此选择NXTCommLSWrite。 I2C通讯协定为荷兰飞利浦(Philips)公司于1992年所发表之串列传输技术,能让CPU与周边晶片间获得速简的连通,如果读者希望更了解I2C通讯协定技术的内容,可参阅I2C相关说明文件【5】,本文在此不另加叙述。
  

12179069381.jpg
图5 选择NXTSystemCall的模式

步骤4、载入Generic Refnum Name元件
在Block Diagram点选滑鼠右键,选取All Functions,选取NXT Toolkit,选取Application Control,选取Generic Refnum Name。

步骤5、Generic Refnum Name元件与NXTSystemCall元件相连结
将Generic Refnum Name元件与NXTSystemCall元件连结,Generic Refnum Name元件的功能就犹如程式的定义档,因此若缺少此元件,NXTSystemCall元件将无法正常运作。

步骤6、载入Array元件
在Block Diagram中点选滑鼠右键,选取All Functions,选取NXT Toolkit,选取Array,选取Build Array,并将Array连结至NXTSystemCall上的Buffer位置。

步骤7、扩充Array元件,并连结变数输入
将Array元件由1扩充为5,并将5个输入变数连结至Array,本范例设定为NXT传送5个位元组(byte)至感测器,此5个位元组分别为Address、Register、 data1、data2、data3,如图6所示。


12179069508.jpg   
图6 将5个数入变数与Array连结

步骤8、载入Set Type/Mode元件与Get Status元件
在Block Diagram中点选滑鼠右键,选取All Functions,选取Select a VI…,接着选择LabView内建NXT相关函式库位置,NXT Toolkit内建相关函式库存放位置在LabView资料夹内,存放位置在LabVIEW7.1/vi.lib/addons/NXT Toolkit/Library VIs/Block support中;选择LEGO.SetTypeAndMode.vi与LowSpeed.GetStatus.vi两个档案,将两个副程式元件载入,SetTypeAndMode用来设定Port,GetStatus用来取得通讯状态之结果。

步骤9、设定SetTypeAndMode所需要的3个输入参数
将输入参数连结至NXTSystemCall之Port位置,如图7所示。这3个参数分别是Port、Sensor Type、Sensor Mode。
(I) Port用来选择使用NXT的4个Port的哪一个Port,本范例程式设定为0,亦即是使用NXT的Port1。
(II) Sensor Type用来选择NXT所要使用的感测器种类,本范例程式设定为11,亦即设定的Port具有I2C功能,Sensor Type其余定义由表1详述【6】。
(III) Sensor Mode用来设定数值的刻度(scale),本范例程式设定为0,亦即使设定处理的数值刻度为正常刻度(raw value),Sensor Mode其余定义由表2详述【6】。


12179069587.jpg
图7 设定SetTypeAndMode之输入参数

表1 Sensor Type的定义


12179073712.jpg
表2 Sensor Mode的定义

12179073834.jpg
步骤10、设定GetStatus所需要的1个输入参数与3个输出参数
将回圈连结至NXTSystemCall之Generic Refnum Name位置,并设定GetStatus之输入与输出参数,如图8所示。输入参数为前述之Port设定值,输出参数如下列说明。
(I) LSStatus,表示输出状态,其输出值的意义由表3详述【6】。
(II) Idle,用来表示传送是否结束。
(III) Fatal Error,用来表示处理过程中是否出现错误。

12179073950.jpg
图8 设定GetStatus之输出与输入参数

表3 LSStatus的定义
12179074115.jpg


步骤11、设定NXTSystemCall的回传数目
由于此范例为Master Write,并无回传值,因此在此设定为0,并将其与NXTSystemCall的Return Length连结,至此程式已完成,执行此程式可驱动NXT产生Master Write讯号至感测器端,完成I2C命令传递的动作。
  
结论
本文最后利用示波器撷取NXT传送的I2C讯号,检视实际程式运行后NXT输出结果是否正确。将NXT接上自行设计的I2C感测器,在此以笔者设计的NXT开发板为例,图9红色框部分为笔者所设计的NXT开发板,在接收NXT所传送I2C的命令后,可产生相对应的动作,使用者可根据上述的程式范例建构自己的NXT驱动程式后,再将NXT与自行设计的控制板连接后进行测试。

12179075034.jpg
图9 NXT开发板

执行LabView程式后,NXT传送5个位元组讯号,讯号图形如图10所示,其中channel 1为SDA讯号,channel 2为SCL讯号,由图10可知在SCL震荡期间,SDA一共传送5组9bit脉波讯号(8bits data与1bit Ack),其分别对应LabView程式内所设定的Address、Register、data1、data2、data3等5个输入数值。接着将图10之第1个位元组局部放大,以图11表示,由图11可知第1个位元组具有Start Status、Address R/W以及Ack等特征,符合I2C通讯协定之起始讯号之特征。最后将图10之第5个位元组局部放大,以图12表示,由图12可知第5个位元组具有data3、Ack以及Stop Status等特征,亦符合I2C通讯协定之结尾讯号之特征。藉由这些讯号图形所具备的特征,证实上述的范例程式执行后,正常驱使NXT产生I2C通讯讯号,完成I2C通讯命令的传递。
注:LEGO超音波感测器需利用NXT之Master Read模式来沟通,本文所介绍之Master Write模式并不适用。

12179074392.jpg   
图10 NXT传送5个位元组至感测器之I2C讯号图

12179074765.jpg   
图11 第1个位元组的区域放大图

12179074905.jpg
图12 第5个位元组的区域放大图
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2010-2-19 21:31:09 | 显示全部楼层
爱死你啦!!!要的就是这个!!原来我找半天找不到I2C的模块原来是这样……
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-5-5 18:32:55 | 显示全部楼层
好,正需要
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-5-7 15:19:04 | 显示全部楼层
要好好学习了
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-10-17 20:40:47 | 显示全部楼层
版主真好,
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2010-10-24 17:25:47 | 显示全部楼层
版主太强大了   哈哈
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-6-28 15:59:55 | 显示全部楼层
对我帮助很大啊
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2012-9-12 18:08:58 | 显示全部楼层
很好,学习中!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

您需要登录后才可以回帖 登录 | 马上注册

本版积分规则

QQ|手机版|中文乐高 ( 桂ICP备13001575号-7 )

GMT+8, 2024-6-20 22:53 , Processed in 0.123227 second(s), 23 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

快速回复 返回顶部 返回列表