如何移植使用W5500官方提供的最新Socket库

博客
文章来源:http://www.embed-net.com/thread-55-1-1.html (此论坛为一个WIZnet用户开设的,论坛积累了大量的W5500相关应用及例程,具有很大的参考价值。) 官方提供了W5500的最新驱动库,下载地址如下: http://wizwiki.net/wiki/doku.php?id=products:w5500:driver 下面简单介绍下如何使用这套库 首先下载库源码,文件目录如下所示: 我们主要用到Ethernet文件夹下面的文件,将这些文件加入到自己的工程中,然后编译,若编译出现类似于如下错误 ..\User\Ethernet\wizchip_conf.c(113): error:  #29: expected an expression .id                  = _WIZCHIP_ID_, ..\User\Ethernet\wizchip_conf.c(114): error:  #29: expected an expression .if_mode             = _WIZCHIP_IO_MODE_, ..\User\Ethernet\wizchip_conf.c(115): error:  #29: expected an expression .CRIS._enter         = wizchip_cris_enter, ..\User\Ethernet\wizchip_conf.c(116): error:  #29: expected an expression .CRIS._exit          = wizchip_cris_exit, ..\User\Ethernet\wizchip_conf.c(117): error:  #29: expected an expression .CS._select          = wizchip_cs_select, ..\User\Ethernet\wizchip_conf.c(118): error:  #29: expected an expression .CS._deselect        = wizchip_cs_deselect, ..\User\Ethernet\wizchip_conf.c(119): error:  #29: expected an expression .IF.BUS._read_byte   = wizchip_bus_readbyte, ..\User\Ethernet\wizchip_conf.c(120): error:  #29: expected an expression .IF.BUS._write_byte  = wizchip_bus_writebyte ..\User\Ethernet\wizchip_conf.c(123): warning:  #12-D: parsing restarts here after previous syntax error }; ..\User\Ethernet\wizchip_conf.c: 1 warning, 8 errors 则需要根据自己的编译器做下设置,keil MDK设置如下所示: 主要原因是Keil MDK默认设置不支持按照结构体名称初始化结构体的原因导致。 W5500和MCU是通过SPI接口通信的,库是利用如下结构体中的相关函数指针实现SPI通信和其他功能。 _WIZCHIP WIZCHIP = { .id = _WIZCHIP_ID_, .if_mode = _WIZCHIP_IO_MODE_, .CRIS._enter = wizchip_cris_enter, .CRIS._exit = wizchip_cris_exit, .CS._select = wizchip_cs_select, .CS._deselect = wizchip_cs_deselect,…
Read More

一个家制太阳能热水收集系统(WIZ812MJ应用)

博客
这个DIY太阳能收集器的建造,只是同等商业安装系统花费的一部分。任何技艺娴熟的DIY者都可以建造这样的系统。现有的大多数材料都在这五金店中。我是从Gary Reysa的builditsolar.com 网站中得到灵感的,这大概是网络上最好的DIY太阳能的网站。基于Gary的1000美刀的太阳能热水器,他在网页上有详细的记载。这是一个回灌系统,当水泵关闭时,所有的水将从收集器和管道排出,如此就可以提供冰冻和过热保护。因此没有结冻的风险,正常水可以作为热载体。这种风格的系统在DIY太阳能社区里有一个成功的跟踪记录。我有一个好的时机来构建它,现在正在享受来自太阳的免费热水! 一些特征: 自支持4'*8'铜管,带有双层聚碳酸酯玻璃的铝翅片 良好绝缘的150加仑常压热存储容器 在水进入电热水器前,定制用于国内热水预热的PEX盘管换热器 一个万能的,便宜的开源的微分控制器,可以控制太阳能收集器,辐射供暖等。 更多构建收集器面板,点击这里 更多储热器容器细节,点击这里   更多热交换器和管道,点击这里 更多控制器细节,请访问differduino.nateful.com 更多制作细节,请查看文章来源:http://www.nateful.com/diysolar/diysolar.html
Read More

串口转以太网WIZ107SR/108SR– 私有IP&公共IP网络应用笔记

博客
WIZ107SR是WIZnet一款用于串口设备与以太网之间的网关模块,它能将穿扩数据转换成以太网数据,反之亦然。可以通过WIZ107SR提供的接口快速简便地将串口设备与以太网相连,便于开发。我们同样为WIZ107SR提供了配置工具,通过以太网让WIZ107SR更好的嵌入到产品中。今天给大家介绍关于私有IP&公共IP中的WIZ107SR的配置及应用。 直接搜寻,使用AP(使用AP的端口转发搜寻107) 1.1.图解 1.2.配置 端口转发设置 ->PC2进入AP网页(192.168.1.254)来建立端口转发,然后它在AP网页里设置服务端口和IP地址。在WIZnet内部端口是50001。请注意AP有端口转发和DMZ 功能。   例如,Wiz107SR(模块A)的IP地址是192.168.1.101。服务端口是50001-50001,内部端口是50001。Wiz107SR(模块B)的IP地址是192.168.1.102。服务端口是50002-50002,内部端口是50001。   打开配置工具WIZ107&108SR Ver1.4.3.0 Wiz107SR(模块A) 用TCP单播直接搜寻,然后进入AP的 IP地址(10.0.1.60)和 服务端口50001来搜寻Wiz107SR(模块A),因此,IP地址是192.168.1.101显示在配置工具中。 Wiz107SR(模块B) 使用TCP 单播直接搜寻,然后进入AP的 IP地址(10.0.1.60)和 服务端口50001来搜寻Wiz107SR(模块A),因此,IP地址是192.168.1.102显示在配置工具中。 2.直接搜寻,用AP(公共IP和私有IP的饱和度相同) 2.1.图解 2.2. 配置 由于因特网相当于L2 S/W HUB 私人IP 10.0.1.2 和10.0.1.33 可以转到公共IP 222.98.xxx.xxx和203.230.xxx.xxx. 请检查你AP和PC机中的公共IP 。   感谢阅读! 更多WIZnet信息: WIZnet官方中文网站:http://www.iwiznet.cn WIZnet企业官方微博:http://weibo.com/wiznet2012
Read More

W5500问题集锦(二)

博客
W5500自去年9月推出,已经有一年的时间。一年间,不乏很多客户纷纷将目光投向了W5500这颗性价比很高的全新硬件TCP/IP以太网芯片,无论是在工控、安防、交通,还是在智能医疗、智能家居等众多领域中,得到了广泛应用及认可。同时,也收到了很多客户在使用过程中的问题反馈,比如W5500中断问题、切换端口问题,及W5500做服务器,多端口连接等常见问题。这些,我们都一一帮助大家分析,一同解决!那么,为了提高技术支持效率,也特此将这些问题再次整理给大家,以供分享!期待能有所帮助! 1. W5500作为服务器时,如何获取来自连接方的IP地址及端口 问题描述:w5500作为服务器时,如何获取来自连接方的IP地址及端口?我怎么没有找到寄存器呢 读DIPR 和SIPR都不对, 是不是没有查询方法呀? UDP和TCP模式我都试过了,整了一天也没找出明堂来,如果实在不行,只能依靠,谁来连接W5500,谁就在DATA区自报家门了,但这样做感觉有点不是很爽,按说是可以获取到来自连接方的IP地址及端口的 比如W5500接在网络上,要对它进行搜索和设置,那么就要UDP广播包,目前可以收到广播包,但量回应的包,去对方收不到,只能怀疑是目标地址和端口没有更新在dipr寄存器了,请支招儿,谢谢!! 答1:TCP Server模式下,在连接建立后,由硬件更新目标IP和端口值。 答2:收到信息的前面6个字节即为对方IP地址和端口号。 答3:TCP Server 模式下,可以读取Sn_DIPR和Sn_DPORT来确定连接方的IP及端口。这个是可以,你可以打印这个地址里的信息来查看。 W5500 As TCP Server 原帖来自:9MCU   2. W5500一个独立端口作为Server模式可以支持多少个客户端连接 问题描述1:W5500一个独立端口端口作为TCP Server模式打开一个端口,此端口已经映射到外网,现在可能有多个客户端连接过来,可以支持多少个客户端连接?经测试,只能支持一个连接,连接上一个客户端后,后连的客户端根本连接不上;而采用ENC28J60采用uip协议时,利用TCP方式监听端口,是可以支持客户端多连接的。不知w5500内部的硬件协议栈能否支持作为server,多个客户端连接过来? 答1:可以这样用,但是要把5500的Socket都设置成TCP Server,然后端口都一致。这样就可以有8个客户连接进来了。 问题描述2:就是说,每个独立端口实际上对应的是一个连接,最多只能有8个连接,对吧? 答2:是的 答3:按照你初始化第一个Socket 0为TCP Server的方式,将其他Socket 1~7 配置成参数一致的TCP Server即可 原帖来自:9MCU 3. W5500无法清中断 问题描述:这几天一直在调试W5500,MCU用的是STM32F205, 可以正常的收发,非中断方式。 现在改用中断模式,无法清除中断。 用户手册上写,Sn_IR,清除需对应位写1。但此寄存器为只读寄存器,每次对此寄存器进行写操作都会导致看门狗复位。 有没有人遇到类似情况,求教 注:UDP方式 答:问题已解决,是回环测试后又产生了SEND_OK中断,最终因超时引起看门狗复位。 屏蔽发送中断后一切正常。 原帖来自:9MCU 4. 问一下:无论是通用寄存器中断IR还是socket中断寄存器SN_IR中断的清除都是我们使用MCU对该寄存器进行手动写0XFF么?谢谢哦。期待回信。。。 问题描述:W5500的中断是不是可以理解成二级中断?首先判断是不是通用寄存器IR的中断,如果不是然后判断中断是不是来自SN_IR。如果来自SN那么进行检测SN的中断触发。。检测到中断之后,需要手动的向产生中断的IR寄存器写入0XFF进行中断的清除? 请问是这种思路么? 答1:请看看 W5500中断寄存器的理解 http://www.9mcu.com/9mcubbs/foru … ead&tid=1062343 答2:首先,可以类似的说成是二级中断,通用寄存器的中断和Socket中断的细分不同。 其次,清中断就是往对应位上写1。 原帖来自:9MCU 5. W5500中断寄存器的理解 W5500中断寄存器的理解 W5500中文手册V1.0 写的不够清楚,该文是本人结合中英文手册及自己理解,整理出有关中断部分的理解,如有不正确的请指正。 一:引脚 INTn 为中断输出(Interrupt output) 低电平:W5500的中断生效; 高电平:无中断或者处于中断生效等待中 二:中断相关寄存器 2.1  IR (连接中断寄存器) [R/W] [0x0015] [0x00] 该寄存器主要指示网络连接错误或唤醒引起当的中断。 某位为1 且 该位中断没有被屏蔽就可以引发中断,INTn引脚将会被拉低,中断处理完毕后,可以由主机写为‘1’清除该位中断. IR 为‘0×00’时,INTn引脚将会被拉高。 2.2  IMR (连接中断屏蔽寄存器) [R/W][0x0016][0x00] 中断屏蔽寄存器(IMR)是用来屏蔽中IR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。 每个中断屏蔽位对应中断寄存器(IR)中的一个位. 如果IMR某位写0,即使IR中对应位为1了,也不会引发中断,INTn引脚不会被拉低。 2.3 SIR ( Socket 中断寄存器) [R/W] [0x0017] [0x00] SIR就是指示哪个Socket发生的中断的。 如果某个Socket发生的中断,该寄存器的对应位将被置为1 ,直到被主机置‘1’清除。如果Sn_IR不等于‘0×00’, 就会引发中断,INTn引脚将被拉低。 2.4  SIMR (Socket 中断屏蔽寄存器) [R/W] [0x0018] [0x00] SIMR寄存器来屏蔽中SIR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。 每个中断屏蔽位对应中断寄存器(SIR)中的一个位. 如果SIMR某位写0,即使IR中对应位为‘1’了,也不会引发中断,INTn引脚不会被拉低。 2.5 Sn_IR (Socket n 中断寄存器) [R] [0x0002] [0x00] Sn_IR 寄存器用于提供给Socket n 中断类型信息,如建立(Establishment)、终止(Termination)、接收数据(Receiving data)和超时(Timeout)。当触发一个中断即Sn_IMR的对应位是’1′的时候,Sn_IR的对应位也将会变成‘1’。 如果想把Sn_IR位清零的话,主机应该将该位置‘1’ 这里的[R],而不是[R/W] 表示不能由主机写‘1’让W5500产生中断,只能由主机设置‘1’ ,清除某一位中断。 2.6 Sn_IMR (Socket n 中断屏蔽寄存器) [R/W] [0x002C] [0xFF] Sn_IMR 负责屏蔽Socket n的中断。某位写‘1’,则开启中断;写‘0’,屏闭中断。 每一位都对应了Sn_IR寄存器的相应位。Socket n的中断触发并且Sn_IMR的对应位为‘1’时,Sn_IR的对应位变为‘1’。如果Sn_IMR和Sn_IR的对应位均为‘1’且SIR 寄存器的相应为‘1’,INTn 引脚便会拉低并使主机产生中断。 2.7  INTLEVEL (低电平中断定时器寄存器) [R/W] [0x0013 – 0x0014] [0x0000] 该寄存器用于设置中断生效等待的时间(IAWT)。当下一个中断触发,中断引脚将会在INTLEVEL时间后,拉低中断引脚(INTn)。 A.  当Socket 0的超时中断被触发,S0_IR[3] & SIR[0]设置为‘1’,然后 INTn 引脚才被拉低。 B.  当Socket 1的连接中断在前一个中断未处理完成之前被触发,则INTn 引脚仍然为低,S1_IR[0] & SIR[1]位设置为‘1’。 C.  如果主机是通过完全清理S0_IR[3]位来完成中断清除,则INTn引脚被拉高,但是此时S1_IR[0] & SIR[1]仍然保持为‘1’。 D.  即使S1_IR[0] &  SIR[1]位被设置为‘1’,但是在 INTLEVEL 期间,INTn不能被拉低。只有过了INTLEVEL时间,INTn才能被拉低。 三:中断方式设计程序 通过以上介绍,可知几个寄存器之间有如下关系: A:3个中断寄存器 IR,SIR ,Sn_IR,它们对应的3个中断屏蔽寄存器IMR,SIMR,Sn_IMR(也可以认为是中断使能寄存器)。只有使能对应位中断,该位为‘1’时才能引发中断,拉低INTn。 B:一次中断处理结束,清除对应状态位后,都会拉高INTn,如果还有别的中断状态寄存器为‘1’,就等待一定时间再拉低INTn。这个时间是由INTLEVEL寄存器来设定的。对于主机来说来一次中断,只能处理一个事件。 C :IR寄存器与网络连接状态有关的寄存器,跟SIR,Sn_IR 没有关系。而SIR 和Sn_IR 是同时出现的,SIR 指出是Socket n发生了中断事件,Sn_IR指出了Socket n 发生了什么中断事件,如收到数据 超时等。 因此如果主机采用中断方式,检测到INTn才能被拉低了,进入中断服务函数可以采用先判断是不是IR中断,不是就读取SIR状态,找到触发中断的那个Socket n。然后读取 对应的Sn_IR 进行处理。每次处理完,就对相应寄存器的相应位清除。 原帖来自:9MCU 6. W5500上传数据错误 问题描述1:我现在使用CC2530单片机和MCU通过SPI接口和W5500连接,使用W5500库函数,下载进去程序之后,在电脑中可以ping 通W5500设备,在电脑中打开TCP工具,程序中设置MCU自动上传数据和接收到什么数据就返回什么数据,但是这两个数据都出现错误,不能接收到正常的数据,这个数据通过串口发送出来,都是正常的数据,在TCP工具中偶尔可以见到几包正确的数据,但是大多数时候都是错误数据包,搞不清楚哪里设置错误,请大神指点一下。 答1:你好,你可以用Wireshark抓包看看有无丢包。 如果没有丢包的话,就是说裸数据阶段就出现问题了。 看一下你SPI的速率,试着提升一下SPI速率试一下。有可能你SPI处理数据太慢了导致的。 问题描述2:我单步执行的时候,数据还是错误的,但是没有出现丢包的现象,在内部数据还是正确的,但是执行到W5500发送出来的时候,就是错误的。 //SCK时钟4MHZ,时钟频率/8 U1BAUD = 0×00; // BAUD_M = 0 U1GCR |= 0×11; // BAUD_E = 17 SPI的速率我这是设置的4M,我也尝试着提高了速率,但是没什么效果,减少速率也是不行,大多数数据都是错误的,中间偶尔会出现几包正确数据。 答2:问题已经解决,是库函数没设置好,send_data_processing()和recv_data_processing()中,ptr一开始是16位,因为移位使数据溢出,可以设置成32位,或者在移位的时候,进行强制类型转换的时候,多使用括号,不要因为优先级不同,不能安装自己想要实现的功能来运行。 原帖来自:9MCU 7. W5500作为客户端直接连接电脑和交换机失败。通过路由器可以 问题描述:/********************************************* * 函数名  : Detect_Gateway * 描述    : 检查网关服务器 * 输入    : 无 * 输出    : 无 * 返回值  : 成功返回TRUE(0xFF),失败返回FALSE(0×00) * 说明    : 无 ******************************************************/ unsigned char Detect_Gateway(void) { unsigned char ip_adde[4]; ip_adde[0]=IP_Addr[0]+1; ip_adde[1]=IP_Addr[1]+1; ip_adde[2]=IP_Addr[2]+1; ip_adde[3]=IP_Addr[3]+1;   //检查网关及获取网关的物理地址 Write_W5500_SOCK_4Byte(0,Sn_DIPR,ip_adde);//向目的地址寄存器写入与本机IP不同的IP值 Write_W5500_SOCK_1Byte(0,Sn_MR,MR_TCP);//设置socket为TCP模式 Write_W5500_SOCK_1Byte(0,Sn_CR,OPEN);//打开Socket os_dly_wait (100);//Delay(5);//延时5ms if(Read_W5500_SOCK_1Byte(0,Sn_SR) != SOCK_INIT)//如果socket打开失败 { Write_W5500_SOCK_1Byte(0,Sn_CR,CLOSE);//打开不成功,关闭Socket return FALSE;//返回FALSE(0×00) }   Write_W5500_SOCK_1Byte(0,Sn_CR,CONNECT);//设置Socket为Connect模式   do…
Read More

获知你的家用公共IP

博客
我们总是在不在家的时候,需要访问我们的电脑或设备,由于大多数人拥有来自ISP的动态IP,我们可以做一个小型设备来给我们的Android手机发送一个简单的通知,这样我们就可以总有IP用了,有了我们的路由,任何网络连接设备都有了访问家用网的可能性。 有了这个系统,我们不再需要复杂的设置、仿真DDNS系统,就可以拥有公共的IP通知系统,在这种情况下,它是私有的,数据只能存储在你的手机上。 我们需要: Arduino uno o mega (推荐 Mega,可控制传感器) Shield ethernet W5100 APP Omniblug Home IP 步骤1:组装 Arduino和插板的组装非常简单,我们只需要像图中一样连接两部分。 现在,我们将例程编译至Arduino 最要注意的是来自例程的ip和端口,因为我们将在移动app中使用。(如图) 步骤2:连接路由 用网线连接 Arduino 和路由器 我们可以用5v的usb路由来给arduino自行供电。我们可以看到图中的连接。 Pin 1 - VCC Pin 4 - GND 步骤3:给Arduino模块编程 最后一步,我们用移动app配置Arduino模块。 根据app中的调整,最好用同样的IP y PORT。 记住,为了方便配置,我们必须连接WIFI 选项“Module”,只要点击按钮“Send configuration”(发送配置) 等上几秒,直到信息完全显示。 你会立刻在手机上收到通知,是用路由的公共IP完成的。 这就行了。 我们可以配置了公共消息系统IP,准备就绪。 Arduino检测到了公共IP,你的路由已被更改。 原文来自: http://www.instructables.com/id/KNOW-YOUR-HOME-PUBLIC-IP/
Read More

W5500中断寄存器的理解

博客
中断部分,W5500中文手册V1.0 写的不够清楚,该文是本人结合中英文手册及自己理解,整理出有关中断部分的理解,如有不正确的请指正。   一:引脚 INTn 为中断输出(Interrupt output) 低电平:W5500的中断生效; 高电平:无中断或者处于中断生效等待中   二:中断相关寄存器 2.1  IR (连接中断寄存器) [R/W] [0x0015] [0x00]  该寄存器主要指示网络连接错误或唤醒引起当的中断。 某位为1 且 该位中断没有被屏蔽就可以引发中断,INTn引脚将会被拉低,中断处理完毕后,可以由主机写为‘1’清除该位中断. IR 为‘0x00’时,INTn引脚将会被拉高。  2.2  IMR (连接中断屏蔽寄存器) [R/W][0x0016][0x00] 中断屏蔽寄存器(IMR)是用来屏蔽中IR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。 每个中断屏蔽位对应中断寄存器(IR)中的一个位. 如果IMR某位写0,即使IR中对应位为1了,也不会引发中断,INTn引脚不会被拉低。 2.3 SIR ( Socket 中断寄存器) [R/W] [0x0017] [0x00]  SIR就是指示哪个Socket发生的中断的。 如果某个Socket发生的中断,该寄存器的对应位将被置为1 ,直到被主机置‘1’清除。如果Sn_IR不等于‘0x00’, 就会引发中断,INTn引脚将被拉低。 2.4  SIMR (Socket 中断屏蔽寄存器) [R/W] [0x0018] [0x00] SIMR寄存器来屏蔽中SIR中断的,某位写‘1’,则开启中断;写‘0’,关闭中断。 每个中断屏蔽位对应中断寄存器(SIR)中的一个位. 如果SIMR某位写0,即使IR中对应位为‘1’了,也不会引发中断,INTn引脚不会被拉低。   2.5 Sn_IR (Socket n 中断寄存器) [R] [0x0002] [0x00] Sn_IR 寄存器用于提供给Socket n 中断类型信息,如建立(Establishment)、终止(Termination)、接收数据(Receiving data)和超时(Timeout)。当触发一个中断即Sn_IMR的对应位是'1'的时候,Sn_IR的对应位也将会变成‘1’。 如果想把Sn_IR位清零的话,主机应该将该位置‘1’ 这里的[R],而不是[R/W] 表示不能由主机写‘1’让W5500产生中断,只能由主机设置‘1’ ,清除某一位中断。 2.6 Sn_IMR (Socket n 中断屏蔽寄存器) [R/W] [0x002C] [0xFF] Sn_IMR 负责屏蔽Socket n的中断。某位写‘1’,则开启中断;写‘0’,屏闭中断。 每一位都对应了Sn_IR寄存器的相应位。Socket n的中断触发并且Sn_IMR的对应位为‘1’时,Sn_IR的对应位变为‘1’。如果Sn_IMR和Sn_IR的对应位均为‘1’且SIR 寄存器的相应为‘1’,INTn 引脚便会拉低并使主机产生中断。  2.7  INTLEVEL (低电平中断定时器寄存器) [R/W] [0x0013 – 0x0014] [0x0000] 该寄存器用于设置中断生效等待的时间(IAWT)。当下一个中断触发,中断引脚将会在INTLEVEL时间后,拉低中断引脚(INTn)。  假设某一时段 先后发生2个中断 ,Socket 0 和scoket1 A.  当Socket 0的超时中断被触发, SIR[0]& S0_IR[3]设置为‘1’,指出是第0个Socket发生了超时中断。接着 INTn 引脚才被拉低,告知主机发生了中断。 B.  当Socket 1的连接中断在前一个中断未处理完成之前被触发,则INTn 引脚仍然为低,S1_IR[0] & SIR[1]位设置为‘1’。 C.  如果主机处理完中断,然后清理S0_IR[3]位及SIR[0],虽然此时S1_IR[0] & SIR[1]仍然保持为‘1’,INTn引脚仍将被拉高。 D.  即使S1_IR[0] &  SIR[1]位被设置为‘1’,但是在 INTLEVEL 期间,INTn不能被拉低。只有过了INTLEVEL时间,INTn才能被拉低。 三:中断方式设计程序 通过以上介绍,可知几个寄存器之间有如下关系: A:3个中断寄存器 IR,SIR ,Sn_IR,它们对应的3个中断屏蔽寄存器IMR,SIMR,Sn_IMR(也可以认为是中断使能寄存器)。只有使能对应位中断,该位为‘1’时才能引发中断,拉低INTn。 B:一次中断处理结束,清除对应状态位后,都会拉高INTn,如果还有别的中断状态寄存器为‘1’,就等待一定时间再拉低INTn。这个时间是由INTLEVEL寄存器来设定的。对于主机来说来一次中断,只能处理一个事件。 C :IR寄存器与网络连接状态有关的寄存器,跟SIR,Sn_IR…
Read More

Hauntbox:用于控制你的自动化、电子创意家居的开源硬件盒子

博客
Hauntbox 是一个开源硬件控制器,可以满足用任意传感器和控制器建立复杂的、自动化的萦绕在心头的电子项目。 它不需要焊接或者预先学什么知识,是完全可控制、并与Arduino插板兼容。 无需编程,就用开源支持控制器,让你出没的地方及项目轻松加入声音,并实现自动化! 什么是Hauntbos? Hauntsbos让一些基于自真实世界的,传感器输出的物理事件发生。 在你出没的地方或者其他项目中加入自动化操作,简直轻松的难以置信! Hauntbox是一个支持控制器及自动化设备,可以用浏览器配置的,并且是开源、兼容Arduino的。很酷因为你可以自动输入输出,不需要编程! 详细技术参数 Hauntbox Arduino compatible 16 MHz ATmega 2560 Flash:256 KB flash (这意味着大量的黑客空间) 8 KB SRAM 4 KB EEPROM 7-12V 输入电压 5/12/24V 输出可选,依据你的电源 每个输出供应 300mA (集电极开路) W5100 以太网控制器 (可与官方 Arduino库无缝对接) microSD 卡槽 用于固件hacking、更新的FTDI 针头引脚 for firmware hacking/updating 运动传感器 轻松登入任意界面 快速的螺丝接线端可连接到你的 (5V, GND, 触发输出) 符合内部标准的 2" ABS 管,抗气候性更强 accepts standard 2" ABS pipe as a shroud for tuning the beam 声音模块 快速的螺丝接线端可连接到你的Hauntbox (5V, GND, 触发输入) 播放单个或者打乱的触发声音 可选的环境/背景跟踪 以上这些都只需零基础编程 与Arduino完全兼容,单板设计包括给爱冒险的固件黑客用的 FTDI header 创造灵感 我们都是充满激情的技术宅,黑客和创客,也总是想找到一个简单的方法将自动化的力量带入我们的项目、恶作剧和家中的小玩意。在捣鼓数年计算机后,我们决定创建自己的梦想产品。 它是如何工作的? 这是一个系统的一部分。传感器和输出插入到你的Hauntbox,然后把它接入网络。你用你的电脑浏览器告诉它要做什么,或者在家庭挽留过中可以用iPad/智能手机中的简单可视化界面。 怎样控制? Hauntbox支持多达6个输入,6个输出。首先,去设置页面,对你的输入输出进行设置。你可以给他们命名,设置他们的运行电压和他们的最小再触发时间。   设置页面 然后转向"Program" 页面,设置你的控制。每一项都可以通过点击复选框进行开关控制。 你可以用Hauntbox做什么呢? 简单来说: 任何你想要达到输出300mA的地方。Whatever you want up to 300mA per output. 与标准的Arduino40mA输出相比。对于120V设备,只要把动力系统连到Hauntbox上就OK了! 详细说: 万圣节道具 任何通过动力系统的120V AC 设备到 15A relays (allowing much higher power items such as pumps, wiper motors, etc) 音效制作 电磁铁 LEDs 照明 闪光灯 紫外线灯 压气爆破筒 线性制动器 还有更多 更多关于声音模块
Read More
用Arduino+OSC建立一个iPad铁路王国巡视机

用Arduino+OSC建立一个iPad铁路王国巡视机

博客
简介 这个教程告诉你如何建立一个iPad控制的铁路王国。如果你还不知道用Arduino进行工作,请阅读我的 Arduino OSC step by step howto 帖子。 [embed]http://v.youku.com/v_show/id_XODEwMTk4ODA4.html[/embed] 1. 硬件设置 展示出如何连接到一起 网络设置 把伺服机附在铁路组件上(轨道,火车站) 2. 软件设置 准确的Arduino代码 试样的TouchOSC配置 1. 硬件设置 我们来看一下设置原理图是如何连接的。 一个伺服机连接到数字引脚19,20,21 给Arduino Ethernet 指定一个IP 192.168.0.178 iOS将通过DHCP分配一个IP 192.168.0.12 硬件组件 组件 你需要如下组件以构建你的设置: 1. Arduino 板(Mega2560,UNO...等) 2. 传感器插板(选用) 3. 无线模块或无线路由器(如果用的是有线Arduino网络,是选用的) 4. 低功耗伺服单元,推荐一个mini或微型伺服器 5. 电源,例如 无线,局域网,伺服器同时推荐选用7.4v 6. 启用无线 AP/路由,DHCP(用于iPad) 伺服器扩展线连接到数字引脚19,20,21. 网线连在无线模块到LAN模块之间。为什么?因为模块仅支持无线串口通信,所以它无法支持侦听网络socket。因此,我把它作为一个无线AP配置,连接我LAN接口及我的路由器,你可以如你所愿使用任意路由,而不一定想我那样堆叠那些模块。请阅读我的 Arduino OSC step by step howto 帖子,看下用普通路由如何工作。 铁路网络组件设置 你需要计算出伺服器在组件上的位置,像我,我就补到下面了,你可以使出任何招数,让他们能一起工作就行。 http://www.youtube.com/watch?v=Hv9IVDAbao0 http://www.youtube.com/watch?v=spidtmUTUuo 2. 软件设置 Arduino 代码 修改IP地址 给Arduino和你的iOS/Android设备修改IP地址,以配合你的设置。例如:iOS上的192.168.0.12,然后搜索"mylp"行   1 byte myIp[]  = { 192, 168, 0, 178 }; // Specify your arduino  IP here and the “destlp” line. 1 byte myIp[]  = { 192, 168, 0, 12 }; // your IPad Address here< 01 02 03 04 05 06 07 08 09 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29…
Read More

[培训笔记]TCP/IP使世界变成地球村

博客
在地球上,人类是很渺小的个体,分布在全世界的各个角落。随着科技的发展,人们现在可以非常容易的同远在千里之外的亲人、朋友进行实时联络,获得和分享世界另一端正在发生的事情,这是多么令人难以置信的事情,但是互联网改变了这一切,让这些不可思议的想法成为现实,使得地球变成了一个小村庄,而TCP/IP便是实现互联网通信的纽带。 在世界上各地,各种各样的电脑运行着各自不同的操作系统为大家服务,这些电脑在表达同一种信息的时候所使用的方法是千差万别。计算机使用者意识到,计算机只是单兵作战并不会发挥太大的作用。只有把它们联合起来,电脑才会发挥出它最大的潜力。于是人们就想方设法的用电线把电脑连接到了一起。但是简单的连到一起是远远不够的,就好像语言不同的两个人互相见了面,完全不能交流信息。因而他们需要定义一些共通的东西来进行交流,TCP/IP 就是为此而生。TCP/IP不是一个单一协议,而是一个协议族的统称。里面包括了IP协议,IMCP协议,TCP协议,以及我们更加熟悉的HTTP、FHP协议等等。电脑有了这些,就好像学会了外语一样,就可以和其他的计算机终端做自由的交流了。简单地说,PC就实现了网络互联。 那先学习下TCP/IP协议的结构,它是如何分层的呢?如图1所示:   图1  TCP/IP层次结构图   TCP(Transmission Control Protocol)是传输控制协议的简称,它是网络中各层协议的综合,反映了一个网络中文件传输的过程,由上层协议到底层协议,再由底层协议到上层协议。如图1所示,TCP/IP协议族按照层次由上到下,层层封装,属于核心组件不能卸载或删除,但可以重置。最上面的就是应用层Application,这里面有http、smtp、telnet、TFTP、DNS、E-mail、ftp等我们熟悉的协议。第二层是传输层Transport,TCP和UDP协议就在这个层次。传输层仅用于彼此通信,可以提供流量控制,可检测数据段,及对数据段排序,不对字节流作解释。第三层是网络层,IP协议就在这里,它负责对数据加上IP地址和其他的数据以确定传输的目标。第四层是叫数据链路层,这个层次为待传送的数据加入一个以太网协议头,并进行CRC编码,为最后的数据传输做准备。最后是硬件物理层,负责网络的传输,这个层次的定义包括网线的制式,网卡的定义等等。发送协议的主机从上自下将数据按照协议封装,而接收数据的主机则按照协议 从得到的数据包解开,最后拿到需要的数据。这种结构非常有栈的味道,所以也把TCP/IP协议族称为TCP/IP协议栈。 一、应用层 应用层直接和应用程序接口并提供常见的网络应用服务。应用层是开放系统的最高层,是直接为应用进程提供服务的。其作用是在实现多个系统应用进程相互通信的同时,完成一系列业务处理所需的服务。应用层使用最为广泛,需要的协议标准也是最多的。在应用层可以实现运输、访问和管理,收发电子邮件以及虚拟终端目录服务远程作业录入信息通信等等。例如DNS、HTTP、FTP等协议都是应用在这一层。 二、传输层 传输层是最关键的一层,也是唯一负责总体的数据传输和数据控制的一层。传输层提供端到端的交换数据的机制。传输层对应用层提供可靠的传输服务,对网络层提供可靠的目的地站点信息。TCP是最常用的的传输层协议,它的主要功能是:对一个进行的对话或连接提供可靠的传输服务,在通向网络的单一物理连接上实现该连接的复用,在单一连接上提供端到端的序号与流量控制、差错控制及恢复等服务。   1、TCP连接建立 (a)连接建立                         (b)连接终止 图2 TCP协议的建立与终止过程   TCP是因特网中的传输层协议,使用三次握手协议建立连接。当主动方发出SYN连接请求后,等待对方回答SYN+ACK,并最终对对方的 SYN 执行 ACK 确认。如图2(a)所示,TCP三次握手的过程如下: 客户端发送SYN(SEQ=x)报文给服务器端,进入SYN_SEND状态。 服务器端收到SYN报文,回应一个SYN (SEQ=y)ACK(ACK=x+1)报文,进入 SYN_RECV状态。 客户端收到服务器端的SYN报文,回应一个ACK(ACK=y+1)报文,进入 Established状态。 三次握手完成,TCP客户端和服务器端成功地建立连接,可以开始传输数据了。   2、TCP连接终止 建立一个连接需要三次握手,而终止一个连接要经过四次握手,这是由TCP的半关闭(half-close)造成的。具体过程如图2(b)所示。 (1) 某个应用进程首先调用close,称该端执行“主动关闭”(active close)。该端的TCP于是发送一个FIN分节,表示数据发送完毕。 (2) 接收到这个FIN的对端执行 “被动关闭”(passive close),这个FIN由TCP确认。 (3) 一段时间后,接收到这个文件结束符的应用进程将调用close关闭它的套接字。这导致它的TCP也发送一个FIN。 (4) 接收这个最终FIN的原发送端TCP(即执行主动关闭的那一端)确认这个FIN。 三、网络层 TCP/IP协议体系中的网络层功能由IP协议规定和实现,故又称IP层。网络层介于运输层和数据链路层之间,它在数据链路层提供的两个相邻端点之间的数据帧的传送功能上,进一步管理网络中的数据通信,将数据设法从源端经过若干个中间节点传送到目的端,从而向运输层提供最基本的端到端的数据传送服务。 网络层的目的是实现两个端系统之间的数据透明传送,具体功能包括寻址和路由选择、连接的建立、保持和终止等。它提供的服务使传输层不需要了解网络中的数据传输和交换技术。IP定义了在TCP/IP互联网上数据传送的基本单元和数据格式,完成路由选择功能,选择数据传送的路径并且包含了一组不可靠分组传送的规则,指明了分组处理、差错信息发生以及分组的规则。IP协议的主要功能有:无连接数据报传输、数据报路由选择和差错控制。与IP协议配套使用实现其功能的还有地址解析协议ARP、逆地址解析协议RARP、因特网报文协议ICMP、因特网组管理协议IGMP。 四、数据链层 数据链路层在物理层提供的服务的基础上向网络层提供服务,其最基本的服务是将源自网络层来的数据可靠地传输到相邻节点的目标机网络层。为达到这一目的,数据链路必须具备一系列相应的功能,主要有:如何将数据组合成数据块,在数据链路层中称这种数据块为帧(frame),帧是数据链路层的传送单位;如何控制帧在物理信道上的传输,包括如何处理传输差错,如何调节发送速率以使与接收方相匹配;以及在两个网络实体之间提供数据链路通路的建立、维持和释放的管理。 五、物理层 物理层(Physical Layer)是TCP/IP协议栈中最低的一层,它直接面向实际承担数据传输的物理媒体(即通信通道),物理层的传输单位为比特(bit),即一个二进制位(“0”或“1”)。实际的比特传输必须依赖于传输设备和物理媒体,但是,物理层不是指具体的物理设备,也不是指信号传输的物理媒体,而是指在物理媒体之上为上一层(数据链路层)提供一个传输原始比特流的物理连接。物理层规定:为传输数据所需要的物理链路创建、维持、拆除,而提供具有机械的,电子的,功能的和规范的特性。简单的说,物理层确保原始的数据可在各种物理媒体上传输。包括网线的制式,网卡的定义等,这一层无协议的编写。 By David
Read More

W5500EVB UDP模式的测试与理解

博客
之前的博文中已经介绍过W5500EVB 在TCP模式下的两种(Server及Client)数据传输的实现过程,那么传输控制协议中,UDP也是非常常用的,这种无连接的协议在更多场合为用户提供了便捷,比如发电子邮件,QQ聊天发收消息等...好,那今天就学习一下,UDP模式在W5500EVB上的简单实现。 一 实验硬件及其连接 二 UDP实验相关知识 W5500是一款全硬件TCP/IP嵌入式以太网控制器,为嵌入式系统提供了更加简易的互联网连接方案。W5500集成了TCP/IP协议栈,10/100M以太网数据链路层(MAC)及物理层(PHY),用户无需特别关注TCP 和 UDP的实现过程,只需最好相应配置和查询工作即可。下面主要讲解TCP和UDP区别,供参考 1 基于连接与无连接 TCP---传输控制协议提供的是面向连接、可靠的字节流服务。当客户和服务器彼此交换数据前,必须先在双方之间建立一个TCP连接,之后才能传输数据。TCP提供超时重发,丢弃重复数据,检验数据,流量控制等功能,保证数据能从一端传到另一端。 每个数据包的传输过程是:先建立链路、数据传输、然后清除链路。数据包不包含目的地址。受端和发端不但顺序一致,而且内容相同。它的可靠性高。 UDP---用户数据报协议是面向无连接的,每个数据包都有完整的源、目的地址及分组编号,各自在网络中独立传输,传输中不管其顺序,数据到达收端后再进行排序组装,遇有丢失、差错和失序等情况,通过请求重发来解决。它的效率比较高,是一个简单的面向数据报的运输层协议。UDP不提供可靠性,它只是把应用程序传给IP层的数据报发送出去,但是并不能保证它们能到达目的地。由于UDP在传输数据报前不用在客户和服务器之间建立一个连接,且没有超时重发等机制,故而传输速度很快。 2、对系统资源的要求(TCP较多,UDP少) 3、UDP程序结构较简单 4、流模式与数据报模式 5、TCP保证数据正确性,UDP可能丢包,TCP保证数据顺序,UDP不保证 6、TCP是面可靠的字节流服务 ,UDP 并不提供对 IP协议的可靠机制、流控制以及错误恢复功能等 下图为TCP 和UDP应用 三 关键程序介绍 3.1编译工具为IAR5.4 3.2 1-5 UDP实验例程实现功能: 以UDP模式不断向 目标 IP地址 和端口 发送数据 test:ecountr,同时若收到 目标IP发来信息,将信息copy回复。本例中用网线直接和PC机相连接。PC机ip作为 目标ip ,注意PC机的IP与EVB IP处于同一网段内。 3.3 实验函数流程: Step 1 :初始化STM32时钟 GPIO USART 等 Step2: 初始化SPI 和W5500 Step3: 配置MAC地址 本机IP地址 子网掩码 默认网关等信息,配置完后再读取以上信息,并打印到串口 Step4:初始化8 个socket Step5 :实时读取socket 0状态,如果是socket 0是关闭的,则打开socket 0 作为UDP端口。如果读取 socket 0为UDP模式则向 目标 IP地址 和端口 发送数据 test:ecountr,同时若收到 目标IP发来信息,将信息copy回复。 3.4 部分子程序讲解 uint8 getSn_SR(SOCKET s)//获取SOCKET s状态 { return IINCHIP_READ(Sn_SR(s)); } /*W5500 SPI 通信协议的实现 W5500 SPI数据帧 有三种 依次为数据段 控制段 和数据段 */ uint8 IINCHIP_READ(uint32 addrbsb) { uint8 data = 0; IINCHIP_ISR_DISABLE();    //关闭中断 IINCHIP_CSoff();       // CS=0, SPI使能片选 IINCHIP_SpiSendData( (addrbsb & 0x00FF0000)>>16);// 写入地址段高8位 Address byte 1 IINCHIP_SpiSendData( (addrbsb & 0x0000FF00)>> 8);// 写入地址段低8位Address byte 2 IINCHIP_SpiSendData( (addrbsb & 0x000000F8))    ;// 以读模式写入控制段 data =…
Read More