
配备摄像头和全双工无线通道的智能小车
“FIRA小车平台”部分细节请看“圆梦小车第四代 —— FIRA小车平台”,为了控制器工作的可靠和方便,配套设计的小车供电系统细节请看“小车供电系统介绍”。此处只介绍控制部分的细节,以使编程能顺利展开。
这个支持基于 Linux 编程控制的小车体积很小,可轻松置于掌中,为学习、管理带来了方便。
一、需求分析
最基本的需求是嵌入式系统软件编程学习。基于这个前提,细分如下:
1)利用小车构建一个和现实环境交互的嵌入式控制对象
2)可通过完成对小车的控制学习MCU的基础应用、编程技能
3)可基于小车的控制需求学习RTOS,如uCOSII
4)在掌握MCU的基础编程后,可上升至Linux、WinCE、Android等高级操作系统下编程,从而实现嵌入式学习的递进过程
5)能提供有趣的编程素材,有技术含量的编程挑战,能切合嵌入式控制的发展趋势
6)能方便的实现各种学习、研究,有适合小车这个特定控制对象的开发、调试手段
二、硬件设计介绍
基于上述需求,结合小车平台的控制特征,做出如下硬件设计。
2.1 架构
从学习角度考虑,要学习MCU的基础编程(无操作系统)和Linux编程,用同一个MCU很难兼顾。
从控制角度考虑,因为小车的驱动需要PWM输出信号,码盘脉冲采集需要硬件中断,电机电流采集需要和PWM同步,必须有较强的实时性。而在Linux下完成这些很勉强,需要较高的技巧,或许还无法达到要求。
因此,在硬件架构上采用了上、下位机结构,下位机负责小车的控制,完成实时性较强的任务,作为MCU基础编程学习的平台。而上位机基于Linux,完成一些算法复杂的任务,作为高级编程的学习平台。
上、下位机之间通过UART相连,实现交互。
2.2 上位机硬件介绍
上位机要完成的任务:
1)提供一个Linux编程学习平台
2)采集图像,实现图像识别的相应的控制策略
3)实现和下位机通讯,控制小车
根据上述需求,以及市场上存在的资源,学习上可以交流的资源,选择了友善之臂公司的“Micro2440核心板”作为上位机,因为S3C2440 相对流行,且该公司的“Mini2440学习板”交流资源较多,而“Micro2440核心板”和“Mini2440学习板”软件环境一样,只是PCB形式不同。
Micro2440核心板如下:(注:目前核心板的NAND Flash 已升级至256M)

Micro2440将S3C2440的Camera接口引出,可以直接使用并口摄像头,便于图像采集、处理,相对于USB摄像头,少了一些硬件环节,应该在速度上和功耗上有优势。
核心板上的资源使用:
COM0 —— 作为终端接口,和下位机相连,构建无线终端
COM1 —— 通讯接口,和下位机相连,实现控制和数据采集
COM2 —— 通讯接口,对外扩展,实现采集其它传感器
USB Host —— 作为扩充口,方便接摄像头、U盘、Wifi卡等外设
USB Dev —— 开发环境需要,用于下载系统
Camera 口 —— 接并口摄像头,实现图像采集
其它资源小车暂时不需要,故未处理。
关于核心板的详细说明,请看“Micro2440 用户手册”。
2.3 下位机硬件设计介绍
首先,确定下位机要完成的任务:
1)电机驱动 —— 控制电机正、反转、调速、刹车、惰行
2)码盘采样 —— 采集车轮转动信息,控制行走距离和速度
3)电机电流检测 —— 测量电机工作电流,判断电机运动状态及转速
4)电池电压测量 —— 辅助电流测量,计算转速,得到快速的速度反馈。同时兼做为电池剩余电量监测,根据电压判断是否要充电,根据电机工作和不工作之间的电压差计算电池内阻变化,从而判断电池是否需要更换。
5)充电电源检测 —— 检测充电电压,判断目前是否处在充电状态
6)传感器扩展 —— 能扩充一些后续学习中所必须增加的传感器
7)和上位机通讯 —— 接受上位机控制,上传小车及传感器信息
8)无线终端链路 —— 这是一个为上位机服务的功能,因为在Linux下编程,需要用串口和PC相连,使用“超级终端”作为人机界面,而小车是移动的,用线缆很不方便,故设计一个全双工的无线链路,实现PC终端的无线操作。此无线链路有下位机控制无线模块实现。
9)实时时钟 —— 这是一个辅助功能,为做一个自主生存的机器人所预备。
根据上述任务以及学习的需求,下位机MCU选择了ST公司的STM32F103RBT6,ARM的Cortex-M3 内核,其性能如下(红色部分):

Cortex-M3 是ARM推出的面向控制应用的MCU,其性能符合小车的控制需求。而且有较大的内存,可以尝试RTOS,uCOSII已有成功移植到STM32的案例,参考资源丰富。
此外,ARM为了让使用者不至于因为不同公司的软件支持差异而带来困扰,制定了一个软件编程标准 CMSIS —— Cortex Microcontroller Software Interface Standard ,所有生产Cortex-M系列MCU的公司均应遵循此标准,这样使用者替换MCU就可以减少许多麻烦。( 详见 :http://www.onarm.com/ )
之所以放弃8位机,一方面是考虑要学习RTOS,8位机内存太小。另一方面是要实现无线终端,要求很快的通讯速度,8位机难以胜任。
根据上述需求设计的下位机控制板如下:

下位机控制板正面

下位机控制板反面
从图中可以看出,因为上位机选择的是Micro2440核心板,下位机控制板还需将核心板的接口引出,相当于核心板的基板。
插上核心板后的控制板如下:

驱动电机、码盘采样、电流、电压检测 均用MCU内置资源实现,只需选择相应I/O口即可,详见下面MCU资源使用说明。
充电电压检测 将充电电压分压后送入MCU的AD通道,一是可以检测是否处在充电状态,二是可以检测充电电压是否正常,分压比为 1/4,额定充电电压10V。
传感器扩展 选用I2C接口,因为目前很多智能数字传感器均支持I2C,而且I2C不需要片选线,通过地址区分可在一条总线上接多个传感器。
附加了一根I/O线作为传感器扩展的特殊需求,此线可作为模拟量采集,以支持一些只有模拟输出的传感器,如GP2D12红外测距,EC03、XV3500CB陀螺仪等。也可以作为数字I/O,辅助I2C实现可靠的信号采集,如:利用此I/O产生中断信号,通知MCU,以达到快速、同步采集某些信息的目的。
和上位机通讯 直接将相应的UART口交叉互联。
无线终端链路 是将上位机Micro2440的终端通讯口COM0和下位机STM32的UART相连,下位机将UART收到的数据通过上行无线通道送出,同时将下行无线通道的接收数据通过UART发送给上位机Micro2440。
因为终端通讯协议支持“回显”、“退格”等功能,使用半双工通讯很难可靠实现,因此设计了全双工的无线通道。
而无线模块是半双工的,所以使用了二个无线模块,一个作为上行通道,一个作为下行通道,利用不同频道使其同时工作,实现全双工通讯。
因Micro2440的终端通讯速率为115.2k bps,速度较高,故选用了2.4GHz载波的24L01 无线模块,主要考虑性价比较高,且目前使用比较普遍。
24L01最高位速率达2M bps ,但综合其通讯机制,实际的通讯速率约在800k bps,能够胜任115.2k bps的终端通讯要求。
24L01的控制接口为SPI,STM32有硬件SPI,可以方便、可靠的驱动24L01无线模块。
24L01有128个频道,可通过寄存器方便的改变,从而保证多模块同时工作时不相互干扰。
此UART接口也设计了并接的4芯插座,以方便实现有线终端模式。
实时时钟 是STM32内置的功能,硬件设计了备份电池,可以基于时钟记录小车运行日志。如果将小车用于连续工作的自学习研究,这个功能应该有用。
2.4、下位机控制板资源说明:(操作相关)
电源开关 —— 控制电机电源及5V,只是控制信号,接地时电源有效。
充电插座 —— 便于使用标准的稳压电源充电,1.2mm同轴插座,内正外负。
电源插头 —— 插到配套的电源板上,(电源板介绍详见“小车供电系统介绍”),五芯信号分配(自左至右):GND,BAT(电池供电),电源开关控制,5V供电,10V充电电源(供给电源板,为方便操作,将充电插座设计在控制板上)。
复位按钮 —— 同时复位上位机和下位机。
JTAG口 —— 下位机MCU(STM32)的程序下载、调试接口。
BOOT0、1跳线 ——下位机MCU(STM32)的启动模式选择,详见STM32手册。
COM0插座 —— 无Micro2440时,可作为STM32的UART1接口,扩展UART外设。注意:此时TXD、RXD的顺序,自左至右为:VCC RXD TXD GND。有Micro2440 时,可作为Micro2440的有线终端通讯口,使用TTL电平的UART,如“USB转UART接口”。自左至右为:VCC TXD RXD GND。
COM2插座 —— Micro2440的UART2接口,扩展UART外设。可作为Micro2440的UART扩展口,接外设。自左至右为:VCC TXD RXD GND。
COM0、2电源选择跳线 —— 选择上述COM0、COM2插座的VCC,可以是5V或3.3V 。
USB Dev 接口 —— 可作为STM32或Micro2440的USB Dev口,通过“USB选择跳线”切换。Micro2440系统下载时需要使用USB Dev口。
USB Dev口选择跳线 —— 将USB Dev 口接到STM32 或Micro2440上;3个跳线同步,靠左侧时为STM32,靠右侧时为 Micro2440。
USB Host 接口 —— Micro2440的USB Host,可插U盘、摄像头、WiFi等USB外设。
NOR/NAND 选择跳线 —— Micro2440 启动选择,短接选择NAND Flash启动,正常使用时选择这个状态;断开为NOR Flash启动,可进入BIOS菜单,实施更新系统等操作。
摄像头接口 —— Micro2440的CMOS摄像头接口,20针,按友善之臂配套的CAM130摄像头模块设计,130万像素。(插针定义详见Micro2440用户手册)
传感器扩展接口 —— 用于扩充加速度、陀螺仪等传感器,以实现惯性导航。接口接下位机 STM32,使用I2C总线。五芯插座信号分配(自上而下): 1 — GND,2 — SCL,3 — SDA, 4 — 模拟量输入或数字量I/O, 5 — 5V电源输出。
Micro2440插座 —— 插核心板,因未使用所有信号,故只设计了使用的插针所需的插座,略增加几个是为了核心板能安装稳固(注意插装方向)。
小车驱动、采集插针 —— 按照小车底盘设计,小车底盘不分前后,左右侧一样,中心对称设计。从控制板正面看,左侧“自上而下”和右侧“自下而上”的信号顺序相同,均为:
VB — 电池电压测量,MI — 电机电流测量,GND — 信号地,P1 — 码盘信号,P2 — 空, (间隔) 3V3 — 3.3V电源,供驱动逻辑电路,CT3 — 电机控制信号 Ctrl3,CT2 — 电机控制信号 Ctrl2,CT1 — 电机控制信号 Ctrl1,BAT — 电池供电,供电机,GND — 电源地。
2.5下位机MCU资源分配:(编程相关)
左侧电机驱动、检测用:
Ctrl-L1 —— PA2,Output push-pull,电机PWM控制,可用T2CH3产生PWM。(PWM频率建议使用 125Hz)
Ctrl-L2 —— PA1,Output push-pull,电机工作状态控制,详见底盘介绍中的控制逻辑。
Ctrl-L3 —— PA0,Output push-pull, 电机工作状态控制,详见底盘介绍中的控制逻辑。
MotorL-Puls —— PB9,Input-pull-down,电机码盘信号,用EXTI 9中断。
MotorL-I —— PC0,Analog Input,左侧电机电流,用ADC_IN10 采集。
L-Vbat —— PC1,Analog Input,左侧电机供电电压,用ADC _IN11 采集。
右侧电机驱动、检测用:
Ctrl-R1 —— PA8,Output push-pull,电机PWM控制,可用T1CH1产生PWM。(PWM频率建议使用 125Hz)
Ctrl-R2 —— PC9,Output push-pull,电机工作状态控制,详见底盘介绍中的控制逻辑。
Ctrl-R3 —— PC8,Output push-pull, 电机工作状态控制,详见底盘介绍中的控制逻辑。
MotorR-Puls —— PC7,Input-pull-down,电机码盘信号,用EXTI 7中断。
MotorR-I —— PC5,Analog Input,左侧电机电流,用ADC_IN15 采集。
R-Vbat —— PC4,Analog Input,左侧电机供电电压,用ADC_IN14 采集。
上位机无线终端接口:(接Micro2440 的 COM0)
STM32-TXD1 —— PA9,打开串口时Alternate function push-pull,关闭时Input pull-up,为Micro2440有线终端方式提供可能;使用UART 1。
STM32-RXD1 —— PA10,Input pull-up,使用UART 1。
与上位机无线通讯:(接Micro2440 的 COM2)
STM32-TXD3 —— PC10,打开串口时Alternate function push-pull,关闭时Input pull-up,为Micro2440用COM2接外设提供可能;使用UART 3,要Remap。
STM32-RXD3 —— PC11,Input pull-up,使用UART 3,要Remap
无线终端上行通道:(从小车发送到PC)
SPI-MOSI —— PB15,Alternate function push-pull,SPI口主数据输出,使用SPI 2。
SPI-MISO —— PB14,Input-pull-down,SPI口主数据输入,使用SPI 2。
SPI-SCK —— PB13,Alternate function push-pull,SPI口主时钟,使用SPI 2。
24L01T-CS —— PA6,Output push-pull,上行无线模块片选信号输出。
24L01T-CE —— PA7,Output push-pull,上行无线模块发送使能信号输出。
24L01T-IRQ —— PB5,Input pull-up,上行无线模块中断信号输入,用 EXTI 5 中断。
无线终端下行通道:(从PC发送到小车,SPI口和上行共用 SPI 2)
24L01R-CS —— PA5,Output push-pull,下行无线模块片选信号输出。
24L01R-CE —— PA4,Output push-pull,下行无线模块发送使能信号输出。
24L01R-IRQ —— PB0,Input pull-up,下行无线模块中断信号输入,用 EXTI 0 中断。
充电电源检测:
DC-CHECK —— PC2,Analog Input,充电电源电压检测,使用ADC_IN12。
传感器扩展:(使用I2C接口,配一根 I/O线)
SCL —— PB6,Alternate function open-drain,I2C时钟输出,使用I2C 1。
SDA —— PB7,Alternate function open-drain,I2C数据线,使用I2C 1。
GYRO-IN —— PC3,暂时设置为 Analog Input,使用ADC_IN13,可根据需要修改。