这是一篇长文,在我的日志中发表的。今天把它移到这里
1 EV3系统的可玩性LEGO去年发布的Mindstroms EV3,是基于LINUX/ARM系统。有了linux系统作为基础,意味着LEGO从自己封闭和专用的小角落中进入了一个开放的世界,对于开发商而言,可以利用LINUX社区中的大量资源,省去了大量基础开发的时间;对于玩家而言,大大降低了学习的时间(如果有LINUX基础)。依赖于EV3这个硬件平台,产生了各式各样的高级折腾方法,例如:a. 使用不同的开发语言,而不是LEGO提供的图形开发工具,包括:c/c++,java, python, javascript等。b. 使用第三方或自己开发传感器或其他外设。c. 使用树莓派来控制EV3的马达和传感器等。 首先,来看看EV3硬件的两个重要功能 a. 提供MINI-SD卡(TF)启动模式,这是自制固件的基础 b. 支持无线网卡,这是进入无线网络世界的入口。 1.1 限制官方固件的一些不便之处: a. 在主机中运行的官方固件是只读的,只提供了非常少量的ramdisk和tmpdisk空间。 b. 开机时不能自动启动WIFI,还需要手工选择和启动。 c. 程序需要使用usb从PC下载到主机。 d. 官方的开发模式是适合初学者的图形编程模式,对于高级玩家而言,过于简单。 1.2 目标a 使用MINI-SD卡启动,能够安装想要的工具和服务。 b 开机后无线网络自动ready,无需手工操作。 c 不需要官方或第三方操作界面。 d 直接在Linux上使用C语音开发,而不是使用第三方软件包robotc或BricxCC(后续文章) 1.3 参考网站[url=]www.lejos.org[/url] java for lego mindstrom [url=]http://sourceforge.net/projects/lejos/files/lejos-EV3/[/url] lejos固件下载地址,java爱好者使用7 [url=]https://github.com/mindboards/ev3sources[/url] ev3 1.04源码 [url=]http://icube-avr.unistra.fr/en/index.php/Hacking_the_Lego_EV3[/url] ev3源码使用说明 [url=]http://botbench.com/blog/2013/08/15/ev3-creating-console-cable/[/url] ev3 console线的制作
2 准备工作
2.1 硬件a 无线网卡 目前官方固件仅仅支持Netgear WNA1100
某讯有售,99元 b console连接线 在固件启动故障,或网络未连接成功时,通过常规的方法是无法看到出现什么问题的。幸好EV3在启动时,将端口S1作为tty的输出。原始的信息参考[url=]http://botbench.com/blog/2013/08/15/ev3-creating-console-cable/[/url]。 但我却不想把一根好好的连接线剪断,再用烙铁焊上。无意中在万能的某宝上面找到了如下的一个小东西:
LEGO NTX水晶头插座,4元一个,邮费很贵 当然还需要一个UART STC下载器(USB TO TTL 或USB转串口),一定要5根配杜邦线。 2.2 软件a 因为EV3系统是基于LINUX,所以使用LINUX来操纵EV3最方便,很多工具都是自带,只有少量软件需要安装。如果想要编译EV3的内核,最好采用ubuntu。如果仅仅修改官方固件,其他的发行版也可以,我用的是centos b 交叉编译软件 当然,如果不想编译EV3的内核,以及不想使用c/c++开发,这一步可以不做 c uart stc 驱动 在下面的网页可以找到不同操作系统的驱动 http://cn.silabs.com/products/mcu/Pages/USBtoUARTBridgeVCPDrivers.aspx d 几个重要的linux命令 a) git clone [url=]https://github.com/mindboards/ev3sources.git[/url] 下载ev3源码,需要参考其中的很多重要信息 b) fdisk 需要处理mini-sd卡分区 c) mount 需要加载固件映像文件以及mini-sd卡 d) cu 通过拨号终端的模式连接另外一台主机 centos安装 yum install uucp 1.3 固件的选择目前在网上可以找到3个主要的固件 a 官方固件1.06 b lejos固件 c 通过ev3source编译自己固件 出于对稳定性的考虑,我选择了官方固件1.06E。
3 制作流程 3.1 MINI-SD卡的准备EV3 MINI-SD卡的启动需要按照如下的规范: 两个分区 第一个分区50M,文件系统是FAT,用于放置linux内核文件 第二个分区最好大于1G,文件系统是EXT3,用于放置linux根文件系统 具体的操作细节,可以参考如下的网页 [url=]http://www.linuxidc.com/Linux/2011-11/47797.htm[/url] 3.2 固件处理
从ev3source/lms2012/open_first/script/make_image.pl中分析出ev3固件的文件格式偏移 | 文件 | 说明 | 0x0 | uBoot | mini-sd不用 | 0x50000 | uImage | linux内核文件 | 0x250000 | EV3.cramfs.bin | cramfs映像 |
编写一个小程序将uImage从文件EV3 Firmware V1.06E.bin读出
mount /dev/sdb1 /mnt/d1 #加载mini-sd卡的fat分区 cp uImage /mnt/d1 #拷贝内核镜像文件 umount /mnt/d1
mount -t cramfs -o loop,offset=0x250000 "EV3 Firmware V1.06E.bin" /mnt/d2目录/mnt/d2内容如下
cd /mnt/d2 tar –zcvf /home/root/ev3.tgz * #将EV3的文件系统打包
umount /mnt/d2 mount /dev/sdb2 /mnt/d2 #加载mini-sd卡的EXT3分区
cd /mnt/d2 tar –zxvf /home/root/ev3.tgz #解压EV3文件系统
umount /mnt/d2
3.3 console线连接杜邦线仅仅需要三根,红黄蓝 a USB TO TTL上
b NTX插座 c 连接图 ps: 原以为需要洞洞板做连接,插口回来后发现不需要,直接使用杜邦线就可以了。当然要小心点,工作时不要碰到就行。 3.4 终端显示验证接好线后,插入mini-sd卡,在mac/linux上面打开一个终端 执行cu -s 115200 -l /dev/cu.SLAB_USBtoUART 打开EV3电源,终端上会显示 EV3进入到官方操作界面,并且终端无响应。 3.5 启动WIFI按照固件启动的流程,会直接进入到lms2012提供的界面中,而没有启动wifi,我们需要做如下的修改: a. 修改mini-sd卡 关机,取出mini-sd卡,重新在linux上mount b. 增加wifi脚本 在/mnt/d2/etc/init.d目录下增加一个可执行脚本wifi.sh,主要是加载无线网卡需要的内核驱动模块,以及启动WIFI,最后通过dhcpcd获得IP。内容如下 #!/bin/sh echo "load modules compat" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/compat/compat.ko echo "load modules cfg80211" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/net/wireless/cfg80211.ko echo "load modules mac80211" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/net/mac80211/mac80211.ko echo "load modules ath" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath.ko echo "load modules ath9k_hw" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_hw.ko echo "load modules ath9k_common" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_common.ko echo "load modules ath9k" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k.ko echo "load modules ath9k_htc" export FIRMWARE_DIRS="/lib/firmware" /sbin/insmod /lib/modules/2.6.33-rc4/kernel/drivers/net/wireless/ath/ath9k/ath9k_htc.ko echo "start wifi" cd /home/root/lms2012/sys ./wpa_supplicant -B -c /etc/wpa_supplicant.conf -iwlan0 echo "requesting IP address" udhcpc --retries=10 --now -i wlan0 -h ev3 d 将wifi.sh加入启动目录level5中 cd ../rc5.d ln –s ../init.d/wifi.sh S40wifi e 修改WIFI密码 修改/mnt/d2/etc/wpa_supplicant.conf network={ ssid="Bella" psk=dbc9c6cf6d4d8e9405842d2e4ab726f33f10de62c30254ff19512af0dca1bc0f key_mgmt=WPA-PSK proto=RSN pairwise=CCMP,TKIP group=CCMP } 修改为自己wifi的ssid 使用wpa_passwd ssid passwd生成psk。注意,大小写敏感 f 删除rc5.d/S99lms,并卸载/mnt/d2 g 取出mini-sd,插入EV3,开机 如果一切顺利的话,终端的内容如下 另外,可以使用putty,telnet直接连接EV3的ip,192.168.100.10。当然为了后期方便,大家还可以把sshd(dropbear)加入到rc5.d中。 到此为止,目标A,B,C大功告成。
4 遗留问题 目前shutdown命令还不能自动关机 5 继续折腾之路
需要使用源码来编译。可以参考[url=]http://icube-avr.unistra.fr/en/index.php/Hacking_the_Lego_EV3[/url]
目前EV3的外设包括,马达,传感器等,会在后续的文章中涉及。
主要采用交叉编译的方法,生成自己想要的软件。例如,gdb, strace, http server等,和常规的linux开发差异不大。
6. 附录 提取uImage文件的源码
#include <unistd.h>
#include <fcntl.h>
#include <sys/mman.h>
#include <sys/stat.h>
int main()
{
int ifd,ofd;
int begin = 0x50000;
int end = 0x249999;
struct stat st;
unsigned char* ptr;
char* fname ="EV3 Firmware V1.06E.bin";
char* ofile ="uImage";
ifd = open(fname,O_RDONLY);
if(ifd == -1)
return -1;
ofd = open(ofile,O_CREAT | O_TRUNC | O_RDWR,0664);
if(ofd == -1)
return -1;
fstat(ifd,&st);
ptr = mmap(NULL,st.st_size,PROT_READ,MAP_SHARED,ifd,0);
if(ptr == MAP_FAILED)
return -1;
while(ptr[end] == 0xFF && end > begin )
end--;
write(ofd,ptr+begin, end-begin+1);
munmap(ptr,st.st_size);
close(ofd);
close(ifd);
return 0;
}
|