找回密码
 马上注册

QQ登录

只需一步,快速开始

查看: 27649|回复: 12

利用官方固件搭建EV3自制系统

  [复制链接]
发表于 2014-7-12 20:48:53 | 显示全部楼层 |阅读模式
这是一篇长文,在我的日志中发表的。今天把它移到这里
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         交叉编译软件
所谓交叉编译,就是在x86的linux系统上生成arm的执行代码,可以参考http://bbs.cmnxt.com/thread-12083-1-1.html
当然,如果不想编译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处理

编写一个小程序将uImage从文件EV3 Firmware V1.06E.bin读出

  • 将linux内核镜像写入mini-sd

mount /dev/sdb1 /mnt/d1          #加载mini-sd卡的fat分区 cp uImage /mnt/d1                #拷贝内核镜像文件 umount /mnt/d1

  • cramfs映像处理

mount -t cramfs -o loop,offset=0x250000 "EV3 Firmware V1.06E.bin" /mnt/d2
目录/mnt/d2内容如下

  • 将linux文件系统写入mini-sd

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上

  • 红-GND
  • 黄-RXD
  • 蓝-TXD

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      继续折腾之路

  • 其他WIFI网卡的支持











需要使用源码来编译。可以参考[url=]http://icube-avr.unistra.fr/en/index.php/Hacking_the_Lego_EV3[/url]
  • 控制EV3提供的外设











目前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;
}







如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
发表于 2014-7-12 22:24:01 | 显示全部楼层
高手,感谢分享。麻烦发个消息告诉我 LEGO NTX水晶头插座 及 UART STC下载器(USB TO TTL 或USB转串口)的链接。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-7-13 01:57:16 | 显示全部楼层
楼主能把带的2.6内核升级3.3吗。2.6内核使用USB HUB有问题。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2014-7-13 09:27:56 | 显示全部楼层
这个才是高大上的玩法
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-1-14 12:55:31 | 显示全部楼层
Mark下备用!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2015-10-31 10:52:23 | 显示全部楼层
mark
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-10-20 21:50:02 | 显示全部楼层
有没有长而细的带有乐高水晶头的数据线卖?

如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2016-11-29 15:28:48 | 显示全部楼层
高手,标注一下
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-2-24 00:38:43 | 显示全部楼层
闻香识女人 发表于 2016-10-20 21:50
有没有长而细的带有乐高水晶头的数据线卖?

可以自制。。需要那种特殊的钳子。。
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-2-24 00:39:16 | 显示全部楼层
学习了,可惜没有编程基础,看代码懵逼
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2017-2-24 07:11:45 | 显示全部楼层
厉害呀,学习下
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2018-6-25 00:36:42 | 显示全部楼层
Mark
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

发表于 2020-3-26 14:17:33 | 显示全部楼层
其实就是整一套嵌入式Linux开发环境!学习了,以后有时间也搞一下,就当回顾以前学习内容了!
如果您觉得我的帖子对您有用,请不吝给我一个“赞”!
回复

使用道具 举报

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

本版积分规则

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

GMT+8, 2024-8-24 03:37 , Processed in 0.103149 second(s), 20 queries .

Powered by Discuz! X3.5

Copyright © 2001-2020, Tencent Cloud.

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