使用嵌入式技术设计移动机器人控制器时,要求在 Linux 操作系统下管理硬件资源。故以移动机器人上配置的典型接近传感器为例,根据传感器的作用机理、硬件接口及 ARM 处理器的接口资源,设计了传感器的接口分配方案;并按照传感器的 接口控制时序,使用交叉编译工具设计了红外、超声波传感器的字符设备驱动程序。测试结果表明,所设计的驱动程序对传感器测试数据的读取支持良好。<br/ > The controller design by making use of embedded technology for mobile robot requires managing hardware resources under Linux operating system. Taking the typical proximity sensors amounted on the board for example, considering work principle, sensors and hardware interface of sensors and interface resource of ARM-based microprocessor, an allocation scheme of interfaces is proposed for sensor controlling. Then, the character device drivers of the infrared and ultrasonic sensors are designed by using appropriate cross compiler tools according to the control timing sequences of interface of sensors. Test results show that measurement readings can be transferred correctly to the control system through device driver developed in this paper.
移动机器人是机器人学的一个重要分支,系机械工程学、计算机科学、控制工程、电子技术、传感器技术、仿生学等多学科技术的交叉[
本文所述移动机器人,是为搭建用于目标搜索协同控制研究的群机器人系统而设计的成员机器人。此种应用背景,要求机器人具有环境感知、交互通信、行为决策、运动执行等功能[
移动机器人使用自身配置的传感器检测环境信息,检测数据送控制系统读取后,输入控制算法进行综合分析决策,以决定机器人的运动行为。然后输出
表1. 机器人控制系统组成
图1. Linux系统软件体系结构
控制信号,通过驱动模块控制差动电机做前进、后退及转向动作,不同的动作组合可以综合产生期望的行为,完成规定任务[
按照控制要求,并综合考虑其他因素,控制器模块选用三星公司的ARM9系列S3C2440芯片。该模块内部时钟400 MHz,具有丰富的外部中断资源。配置256 MB Nandflash存储芯片,64 MB SDRAM,USB,网口和串口后,可组成基本的嵌入式硬件控制平台,能够满足移动机器人控制算法的实时性要求。例如,红外传感器使用中断的方式提醒S3C2440,在传感器的作用范围内遇到障碍物时能够及时响应并处理;再如,超声波传感器的测距需要精确的计时,而该芯片具有5个16位定时器,能够获得较精确的计数时间。
为了叙述便利,只考虑接近传感器。红外传感器E18-D80NK和超声波传感器HC-SR04均可用于环境信息检测,属于外部传感器[
1) 红外传感器
根据光线反射原理,红外传感器模块检测前进方向上是否存在障碍物。对于物体透明导致无法检测的情形,可由超声波传感器补充。红外传感器E18-D80NK集发射与接收于一体,属于漫反射型光电传感器,NPN常开型输出,测量范围3~80 cm。传感器尾部安装有一个电位器,可以通过调节电位器改变检测距离。前方无障碍时,输出高电平;有障碍时,输出低电平。传感器与微处理器的外部中断接口相连,检测到障碍物时,传感器输出口以外部中断的方式通知微处理器。
2) 超声波传感器
超声波传感器利用声音在空气中的传播速度和传播时间计算出与障碍物距离[9,10],所依据的关系是:
(1)
超声波传感器模块HC-SR04如图3所示,它提供2 cm~300 cm的非接触式测距功能,精度可达3 mm。模块包括超声波发射器、接收器与控制电路。测距由控制端口TRIG触发,微处理器提供至少10 μs的高电平。超声波发射器自动发射8个40 kHz的超声波,同时ECHO端口向微处理器输出一个高电平信号,微处理器接收到ECHO端口的高电平时,定时器开始计数。当接收器检测到返回的超声波,ECHO端口输出低电平,微处理器的定时器计数停止。而微处理器S3C2440的定时器是减计数,减少的计数值就是超声波从发射到返回的时间。如果超声波接收器没有接收到返回的超声波,ECHO端口经过一段时间自动
图2. 移动机器人接近传感器的配置示意
图3. 超声波传感器模块
变为低电平[
Linux是一款多任务操作系统。由于具有开源性、低成本、多平台支持等特点,在嵌入式方面获得了广泛应用[
Linux中使用的基本设备驱动程序,分为网络设备、块设备、字符设备[
图4. 设备驱动体系结构
动程序的代码结构,包括注册、注销字符设备驱动程序的模块初始化函数;注册到对应低级文件输入输出的file_operations结构体的函数;对于使用中断功能的硬件,用中断服务函数[
红外传感器输出连接微处理器S3C2440的GPF3/EINT3引脚。根据红外传感器模块E18-D80NK的工作原理,需要使用中断方式来处理任务。表现在字符设备驱动程序里,即需要定义中断服务函数irq_interrupt(),同时在设备文件打开函数xxx_open()中,要使用request_irq()函数把中断号、中断服务函数注册到系统的中断信息列表中,处理流程如图5所示。
这样,当红外传感器设备驱动载入内核,应用程序打开并使用read()函数读取接口状态,并把状态数据由内核传回用户空间。read()函数关键代码及结构如下:
static int sc2440_irq_read(struct file *filp, char_user *buff, size_t count, loff_t *offp){
wait_event_interruptible(sc2440_waitq, ev_irq); //等待GPF3引脚中断
ev_irq = 0;
err = copy_to_user(buff, ( const void *) (&value ), min(sizeof(value), count));
//中断发生后,状态值发回用户空间
return err ? -EFAULT : min(sizeof(value), count);}
当红外传感器检测到障碍物存在时,GPF3/EINT3引脚相应检测到由高到低的电平变化,将产生中断号为IRQ_EINT3的中断,系统调用相应的中断服务函
图5. 红外传感器设备驱动流程图
数进行避碰处理,中断服务算法流程如图6所示。
关键代码及结构如下:
static irqreturn_t irq_interrupt(int irq, void *dev_id ){
struct sc2440_irq_desc *sc2440_irqs = (struct sc2440_irq_desc * ) dev_id;
int stat;
stat = s3c2410_gpio_getpin(sc2440_irqs -> pin);
//读取引脚状态
if ( stat ==0 ){
//判断是否为低电平
value = 0;
//保存状态值
ev_press = 1;
wake_up_interruptible( &sc2440_waitq );}
//唤醒进程
return IRQ_RETVAL( IRQ_HANDLED );}
//退出中断服务
根据超声波传感器模块HC-SR04的工作原理,传感器的TRIG接口与微处理器S3C2440的接口GPB9连接,而传感器的接口ECHO连接微处理器S3C2440的接口GPF6/EINT6。设备驱动程序要直接操作GPIO的寄存器,字符设备驱动使用xxx_ioctl()函数操作具体的硬件设备,操作流程如图7所示。
驱动程序操作微处理器的接口GPB9产生10 μs
图6. 红外传感器中断服务流程
图7. 超声波传感器设备驱动流程图
的高电平脉冲,启动超声波。当接口ECHO检测到由低到高的电平变换,使用中断方式打开处理器S3C2440的定时器0开始计数。而当ECHO检测到由高到低的电平变换,则使用中断方式读取定时器0的TCNTO0值,关闭定时器0。处理器的定时器是减法计数,定时器初始的装载值减去TCNTO0的值,即ECHO端口的高电平维持时间,根据式(1)即可计算得到超声波传感器的测量距离。
ioctl()函数的关键代码及结构:
static int tq2440_pwm_ioctl(struct inode *inode, struct file *file, unsigned int cmd, unsigned long arg){…
switch( cmd){
case 0:…
case 1:…
s3c2410_gpio_setpin( gpio_table[
udelay( 10 );
//GPB9/TRIG 10 μs高电平脉冲
s3c2410_gpio_setpin(gpio_table[
wait_event_interruptible(button_waitq, high);
//等待ECHO高电平状态
wait_event_interruptible(button_waitq, low);
//等待ECHO低电平状态
tconon=_raw_readl(S3C2410_TCNTO(0));
//读取TCNTO tcon = _raw_readl(S3C2410_TCON);
tcon &= ~0x1f;
_raw_writel(tcon, S3C2410_TCON);
//关闭定时器0 break;}
return 0;}
中断服务操作的算法流程如图8所示。
部分关键代码及结构:
static irqreturn_t irq_interrupt(int irq, void *dev_id ){…
//中断服务函数,响应超声波传感器ECHO down = !s3c2410_gpio_getpin(button_irqs->pin);
if( down == 0 ) {
itcon = __raw_readl(S3C2410_TCON);
itcon |= 0x1;
__raw_writel(itcon, S3C2410_TCON);
//定时器0开始计数
high = 1; ev_press = 1;
wake_up_interruptible(&button_waitq);}
//唤醒进程
else{
low = 1;ev_press = 1;
wake_up_interruptible(&button_waitq);}
//唤醒进程
return IRQ_RETVAL(IRQ_HANDLED);}
为检验驱动程序设计的正确性,须在驱动程序设计完成后进行测试。与超声波传感器驱动程序相比,红外传感器只使用read()函数读取接口状态,而超声波传感器的驱动程序操作略显复杂。下面以超声波传感器为例,按图9所示的流程编写测试程序,进行功能测试。
操作设备的应用程序,依次使用open()函数打开设备文件,用ioctl()函数操作相应的设备,用read()函数读取定时器TCNTO0的值,最后用close()函数关闭设备文件。
主要代码及结构如下:
int main(void){
buttons_fd = open("/dev/SH-OMG", 0);
//打开设备文件
ioctl(buttons_fd, 1);
//启动测距
read(buttons_fd,&atconon,sizeof(atconon));
//读取时间值
printf("the distance is 0x%x.\n", atconon);
temp = (31250 - atconon) * 173/125;
//用检测模型计算距离,单位mm printf("the distance is %d mm.\n", temp);}
图8. 超声波传感器中断服务流程
//终端显示
close(buttons_fd);
//关闭设备文件
return 0;}
把超声波设备驱动程序以可加载模块方式编译,使用insmod命令加载进Linux内核中,运行测试程序。以不同的距离遮挡超声波传感器,在串口终端上显示出经过处理的距离数据,见图10。通过与实际距离比较,可知超声波传感器及驱动程序工作正常。这表明,超声波传感器的检测数据能够正确读取并输入控制器,驱动程序的设计能够满足使用要求。
通过分析移动机器人配置的接近传感器的工作原理,确定传感器与微处理器的连接方式。然后,设计相应的Linux设备驱动程序,以操作红外、超声波传感器硬件设备。由于字符设备驱动程序结构上的相
图9. 超声波传感器测试流程
图10. 读取超声波传感器的测试数据截图
似性,本文只给出典型配置接近传感器的Linux设备驱动程序设计方法,其他功能模块的驱动程序可相应设计。
[
[
[
[
[
[
[
[
[
[
[
[
[
[