作者:陈宇洋
随着 汽车 新四化进程的加速,智能 汽车 的概念开始走到台前。蔚来、小鹏、威马等一众新势力也均为自家产品打上了“智能 汽车 ”的标签。
虽然各家产品不同,智能化取向不同,但都会以同一个卖点进行营销宣传——整车OTA能力。大家都心照不宣的表示:“可以通过后期OTA升级增加或开放全新的智能化功能”。
所以,OTA究竟是何方神圣?
先跟大家聊聊OTA这个词汇代表着的含义。
有人会问:“OTA是个啥东西?”
“嗨,我知道!”
有网友解读到“OTA乃是Online Travel Agency的缩写,也就是在线旅行社的意思。“当然了,OTA这个缩写有很多不同的解释,在线旅行社自然也不会是今天的答案。
逐字解释一下 汽车 领域的OTA。OTA乃是Over the Air的简写,其含义空中下载技术。我们可以简单理解为通过信息传输的方式对产品进行软件优化。其最早是安卓系统在手机上推出的一个便捷技术,使手机软件升级不再依赖于连接电脑、下载然后再更新的复杂 *** 作。更白话的形容就是你手边正在使用的智能手机版本升级、王者荣耀的更新都可以称之为OTA。
以现阶段来说, 汽车 OTA可以分为两大类:Firmware over the air,简称FOTA(硬件在线升级)和Software over the air,简称SOTA(软件在线升级)。
以特斯拉为例,这家公司可以通过FOTA对BMS、刹车等车辆基础硬件和 汽车 底层安全相关的功能进行OTA升级,而SOTA方面可以对车机 娱乐 系统进行OTA。
目前以造车新势力为主的智能 汽车 ,或是智能网联 汽车 都可以理解为是一种“软件” 汽车 。
和传统燃油车不同,新能源 汽车 并没有那么复杂的机械结构,原本成千上万的机械零部件正在逐步被更复杂的电子电气化架构所取代。 如果说传统燃油车就好比机械手表,智能网联 汽车 就好比Apple Watch。机械手表调整时间需要准确的时间,还需要手动去调。而Apple Watch则可以实时同步线上的标准时间。
其实, 汽车 电子化的趋势一直都保持着高速发展。举一个简单的例子,大概10年前, 汽车 的油门还是拉线式,通过纯机械连接的方式控制节气门的开度。5年前,传统燃油车的油门就已经全部更换为电子式,通过电子信号来控制节气门的开度。
而来到了新能源 汽车 上,其动力系统本身就是结构更简单的电动机,可以通过电子信号直接控制电机的转数进而控制车速。也可以说,新能源车的所有硬件都是通过软件程序进行控制的。所以,新能源 汽车 是可以通过OTA的形式,改变电机的输出模式,增加辅助驾驶功能的丰富性,甚至通过线上的模式解锁动力电池中藏电的比例。
之所以新能源车更容易实现整车OTA,其主要原因是 新能源车型在设计之处采用集中式的电子电气架构。而现阶段燃油车则大部分都采用了分布式电子电气架构。 当然,同样的整车OTA其实在燃油车上也可以实现。比如凯迪拉克CT5,通过重新设计整车电子架构也实现了同样的OTA能力。
「 Q3:OTA的弊端有哪些?」
汽车 OTA要比手机OTA复杂的多,首当其冲的就是安全问题。
根据360智能网联 汽车 安全实验报告提供的数据来看: 电子电气架构从分布式向集中式衍变,软硬件将会解耦,硬件不再被某一特定功能所独享,共享的硬件将面临非法调用、恶意占用等安全威胁。尤其是未来ECU的功能整合程度会进一步提升,代码量增多的同时也会导致漏洞的增长。
所以,OTA安全大体可分为三个部分。 第一是云端服务器的安全,第二是车端安全,第三是车与云之间的通讯安全。 在这三个环节中,软件内容不仅需要认真还需要进行加密,从而保证数据在传输过程中不会被黑客所窃取。一旦黑客在 汽车 OTA升级的过程中利用这些漏洞对升级包进行篡改或是植入后门软件等恶意程序,后果是不堪设想的。黑客还有可能会利用漏洞对升级包进行解析从而获取信息。
所以,OTA的最初目的不是为了改善出行体验,而是为了减少安全漏洞。
聊到整车OTA,就不得不提及其中的鼻祖:特斯拉。
与传统车企采用的分布式电子电气架构不同,特斯拉在设计之初就已经考虑周全。通过采用集中式的电子电气架构,特斯拉的产品可以实现整车OTA功能,让每一辆特斯拉都能不断的增加新功能。同时,通过对于底层动力系统相关控制器的升级,其产品的性能还可以获得升级,并持续改善用户体验。甚至,他们还能通过预留的硬件,在后期的OTA中开放一些新功能。
这也是特斯拉的高明之处。
可以说, 整车OTA代表了一种未来的趋势。 通过整车OTA,用户不仅可以升级车载 娱乐 系统,还可以对全车其他模块进行升级,例如辅助驾驶、动力表现、制动系统、悬架系统、甚至是延长续航里程等等。与传统燃油车不同,特斯拉可以说是一辆可以不断进化的 汽车 。
还记得曾有一位特斯拉车主说过:“特斯拉给我带来了从未有过的用车体验,每一次升级之后总会有些新功能出现,甚至有种时常在开新车的感受。”
这也是整车OTA带来的另一个优势,与传统 汽车 相比,在消费者购买完成之后,与 汽车 制造商的关系也就此终结。除了质保之外,消费者更多的是与一个相对独立的4S体系打交道。而整车OTA的存在, 不管是车辆软件出现故障还是更新,都可以通过OTA的方式解决。相较于传统的线下召回升级的模式来说,整车OTA不单单能减少维护成本,更是提升用户体验。
在安全性方面,特斯拉也走在了前列。
以Model 3为例,其中央集中式电子电气架构中,只有CCM(中央计算模块)、BCM RH(右车身控制模块)、BCM LH(左车身控制模块)三大主要控制模块,并且具有高度可扩展的特性。
特斯拉还将网络安全纳入架构设计的过程中,同时通过设立“安全研究员名人堂“漏洞悬赏计划,鼓励白帽黑客们对其架构进行测试和验证,不断的修复被爆出的安全问题,以此来达到有效减少网络安全威胁的目的。
OTA将会是未来 汽车 发展的必然趋势。
智能小车程序
#include "reg52h"
#define det_Dist 255 //单个脉冲对应的小车行走距离,其值为车轮周长/4
#define RD 9 //小车对角轴长度
#define PI 31415926
#define ANG_90 90
#define ANG_90_T 102
#define ANG_180 189
/============================全局变量定义区============================/
sbit P10=P1^0; //控制继电器的开闭
sbit P11=P1^1; //控制金属接近开关
sbit P12=P1^2; //控制颜色传感器的开闭
sbit P07=P0^7; //控制声光信号的开启
sbit P26=P2^6; //接收颜色传感器的信号,白为0,黑为1
sbit P24=P2^4; //左
sbit P25=P2^5; //右 接收左右光传感器的信号,有光为0
unsigned char mType=0; //设置运动的方式,0 向前 1 向左 2 向后 3 向右
unsigned char Direction=0; //小车的即时朝向 0 朝上 1 朝左 2 朝下 3 朝右
unsigned sX=50; unsigned char sY=0; //小车的相对右下角的坐标 CM(sX,sY)
unsigned char StartTask=0; //获得铁片后开始执行返回卸货任务,StartTask置一
unsigned char Inter_EX0=0; // 完成一个完整的任务期间只能有一次外部中断
// Inter_EX0记录外部中断0的中断状态
// 0 动作最近的前一次未中断过,
// 1 动作最近的前一次中断过
unsigned char cntIorn=0; //铁片数
unsigned char bkAim=2; //回程目的地,0为A仓库,1为B仓库,2为停车场,
//(在MAIN中接受铁片颜色判断传感器的信号来赋值)
unsigned char Light_Flag=0;//进入光引导区的标志(1)
unsigned int cntTime_5Min=0;//时间周期数,用于 T0 精确定时
unsigned int cntTime_Plues=0; //霍尔开关产生的脉冲数
/============================全局变量定义区============================/
/------------------------------------------------/
/-----------------通用延迟程序-------------------/
/------------------------------------------------/
void delay(unsigned int time) // time05ms延时
{
unsigned int i,j;
for(j=0;j<time;j++)
{
for(i=0;i<60;i++)
{;}
}
}
/-----------------------------------------------/
/-------------------显示控制模块----------------/
/-----------------------------------------------/
/数码管显示,显示铁片的数目(设接在P0,共阴)/
void Display(unsigned char n)
{
char Numb[12]={0x3F,0x06,0x5B,0x4F,0x66,0x6D,0x7D,0x07,0x7F,0x6F,0x37,0x77};
P0=Numb[n];
}
/-----------------------------------------------/
/-------------------传感器模块------------------/
/-----------------------------------------------/
/光源检测程序: /
/用于纠正小车运行路线的正确性/
unsigned char LightSeek()
{ void Display(unsigned char);
bit l,r;
l=P24;
r=P25;
if(l==0&&r==1)
{
//Display(1);
return (3); //偏左,向右开
}
if(r==0&&l==1)
{
//Display(3);
return(1); //偏右,向左开
}
if((l==1&&r==1)||(l==0&&r==0))
{//Display(9);
return(0); //没有偏离,前进
}
}
/铁片检测程序: /
/判断铁片的颜色,设定bkAim,0为A仓库,1为B仓库,2为停车场/
void IornColor()
{
delay(4000);
bkAim=(int)(P26);
Display((int)(P26)+2);
}
/-----------------------------------------------/
/------------------运动控制模块-----------------/
/-----------------------------------------------/
/====基本动作层:完成基本运动动作的程序集====/
/运动调整程序: /
/对小车的运动进行微调/
void ctrMotor_Adjust(unsigned char t)
{
if(t==0)
{
P2=P2&240|11; //用来解决两电机不对称的问题
delay(6);
}
if(t==3)
{
P2=P2&250; //向左走
delay(1);
}
if(t==1)
{
P2=(P2&245);
delay(1); //向右走
}
P2=((P2&240)|15);
delay(10);
}
/直走程序: /
/控制小车运动距离,dist为运动距离(cm),type为运动方式(0 2)/
/只改变小车sX 和 sY的值而不改变Direction的值 /
void ctrMotor_Dist(float dist,unsigned char type)
{unsigned char t=0;
mType=type;
P2=((P2&240)|15);
cntTime_Plues=(int)(dist/det_Dist);
while(cntTime_Plues)
{
if(Inter_EX0==1&&StartTask==0)
{
cntTime_Plues=0;
break;
}
if(Light_Flag==1) t=LightSeek();
if(type==0) //向前走
{
P2=P2&249;
delay(40);
ctrMotor_Adjust(t);
}
if(type==2) //向后退
{
P2=P2&246;
delay(50);
ctrMotor_Adjust(t);
}
P2=((P2&240)|15);
if(mType==2) delay(60);//刹车制动 05ms
else delay(75);
}
}
/拐弯程序: /
/控制小车运动角度,type为运动方式(1 3) /
/只改变小车Direction的值而不改变sX 和 sY的值/
void ctrMotor_Ang(unsigned char ang,unsigned char type,unsigned char dir)
{
unsigned char i=0;
mType=type;
P2=((P2&240)|15);
cntTime_Plues=(int)((PIRD90/(180det_Dist)12)ang/90);
while(cntTime_Plues)
{
if(Inter_EX0==1&&StartTask==0)
{
cntTime_Plues=0;
break;
}
if(type==1) //向左走
{
P2=P2&250;
delay(100);
ctrMotor_Adjust(0);
}
if(type==3) //向右走
{
P2=P2&245;
delay(100);
ctrMotor_Adjust(0);
}
P2=((P2&240)|15);
delay(50);//刹车制动 05ms
}
if(!(Inter_EX0==1&&StartTask==0))
{
Direction=dir;
}
}
/====基本路线层:描述小车基本运动路线的程序集====/
/当小车到达仓库或停车场时,放下铁片或停车(0,1为仓库,2为停车场)/
void rchPlace()
{unsigned int time,b,s,g;
time=(int)(cntTime_5Min0065535);//只有一个数码管时,轮流显示全过程秒数 个 十 百
b=time%100;
s=(time-b100)%100;
g=(time-b100-s10)%10;
if(bkAim==2)
{
//到达停车场了,停车
EA=0;
P2=((P2&240)|15);
while(1)
{
Display(10); //N
delay(2000);
Display(cntIorn);
delay(2000);
Display(11);//A
delay(2000);
Display(b);
delay(2000);
Display(s);
delay(2000);
Display(g);
delay(2000);
}
}
else
{
if(Inter_EX0==1&&StartTask==1)P10=0; //到达仓库,卸下铁片
}
}
/无任务模式: /
/设置小车的固定运动路线,未发现铁片时的运动路线/
void BasicRoute()
{ //Light_Flag=1;
ctrMotor_Dist(153,0);
//Light_Flag=0;
ctrMotor_Ang(ANG_90,1,1);
ctrMotor_Dist(100-sX,0);
ctrMotor_Dist(125,2);
ctrMotor_Dist(73,0);
ctrMotor_Ang(ANG_90,1,2);
//Light_Flag=1;
ctrMotor_Dist(153,0);
//Light_Flag=0;
ctrMotor_Ang(ANG_180,1,0);
rchPlace();
}
/任务模式: /
/设置小车的发现铁片后的运动路线/
void TaskRoute()
{
//基本运行路线表,记载拐弯 0 向前 1 左拐 2 向后 3 右拐,正读去A区;反读去B区
StartTask=1;
ctrMotor_Ang(ANG_90_T,1,2);
if(bkAim==1) //仓库A
{
ctrMotor_Dist(10,0);
P2=((P2&240)|15);
delay(60);
ctrMotor_Ang(ANG_90_T,1,3);
ctrMotor_Dist(100-sX,2);
ctrMotor_Ang(ANG_90_T,1,2);
Light_Flag=1;
ctrMotor_Dist(153,2);
Light_Flag=0;
// ctrMotor_Ang(208,1,0);
}
else if(bkAim==0) //仓库B
{
ctrMotor_Dist(10,0);
P2=((P2&240)|15);
delay(60);
ctrMotor_Ang(ANG_90_T,1,3);
ctrMotor_Dist(100-sX,0);
ctrMotor_Ang(ANG_90_T,1,0);
Light_Flag=1;
ctrMotor_Dist(153,2);
Light_Flag=0;
//ctrMotor_Ang(208,1,0);
}
delay(5000);
rchPlace();
}
/---------------------------------------------/
/-------------------主程序段------------------/
/---------------------------------------------/
void main()
{
delay(4000);
P2=0xff; //初始化端口
P07=0;
P1=0;
TMOD=0x01; //初始化定时器0/1 及其中断
TL0=0;
TH0=0;
TR0=1;
ET0=1;
ET1=1;
IT0=1; //初始化外部中断
EX0=1;
IT1=1;
EX1=1;
EA=1;
P11=1;
while(1)
{
Display(cntIorn);
bkAim=2;
BasicRoute();
if(Inter_EX0==1)
{
TaskRoute();//按获得铁片后的路线运动
IE0=0;
EX0=1;
}
Inter_EX0=0;
}
}
/----------------------------------------------------/
/----------------------中断程序段--------------------/
/----------------------------------------------------/
/定时器0中断程序: /
/当时间过了5分钟,则就地停车并进入休眠状态/
void tmOver(void) interrupt 1
{
cntTime_5Min++;
TL0=0;
TH0=0;
if(cntTime_5Min>=4520)
{
Display(5);
P2=((P2&240)|15);
EA=0; //停车程序
P07=1;
delay(4000);
PCON=0X00;
while(1);
}
}
/外部中断0中断程序: /
/发现铁片,发出声光信号并将铁片吸起,发光二极管和蜂鸣器/
/并联在一起(设接在P07) 0为A仓库,1为B仓库,2为停车场/
void fndIorn(void) interrupt 0
{
unsigned char i;
P10=1;
P2=((P2&240)|15); //停车
P07=1;
delay(1000);//刹车制动 05ms
P07=0;
Inter_EX0=1;
cntIorn++;
Display(cntIorn);
for(i=0;i<40;i++)
{
P2=P2&249;
delay(2);
P2=((P2&240)|15);
delay(2);
}
P2=P2&249;
delay(100);
P2=((P2&240)|15); //停车
IornColor(); //判断铁片黑白,设置bkAim
for(i=0;i<95;i++)
{
P2=P2&249;
delay(3);
P2=((P2&240)|15);
delay(2);
}
P2=((P2&240)|15); //停车
delay(4000); //把铁片吸起来
EX0=0;
}
/外部中断1中断程序: /
/对霍尔开关的脉冲记数,对小车的位置进行记录,以便对小车进行定位/
void stpMove(void) interrupt 2
{
cntTime_Plues--;
if(Direction==0) //向上
{
if(mType==0) sY+=det_Dist;
else if(mType==2)
sY-=det_Dist;
}
else if(Direction==1) //向左
{
if(mType==0) sX+=det_Dist;
else if(mType==2)
sX-=det_Dist;
}
else if(Direction==2) //向下
{
if(mType==0) sY-=det_Dist;
else if(mType==2)
sY+=det_Dist;
}
else if(Direction==3) //向右
{
if(mType==0) sX-=det_Dist;
else if(mType==2)
sX+=det_Dist;
}
简单的写的话不会区别偏离黑线距离远近的,复杂点儿的话会分区编程,简单版如下:
void turn_left()
{
P10 = 0; //左前轮
P11 = 1; //右前轮
P12 = 0; //左后轮
P13 = 1; //右后轮
}
unsigned char judge()
{
switch(P2 & 0x)
case 0x:
{
break;
}
return 某变量(用于选择拐弯方向程序)
}
转弯比较简单,就是一个轮转,另一个不转达到转弯目的,你也可以用速度高低来控制,自己DIY就行。
以上就是关于OTA升级:当真是智能汽车的一大利器吗全部的内容,包括:OTA升级:当真是智能汽车的一大利器吗、50分悬赏循迹小车完整程序,、求最简单的51单片机智能循迹小车原理图以及程序以及制作过程,不胜感激!!等相关内容解答,如果想了解更多相关内容,可以关注我们,你们的支持是我们更新的动力!
欢迎分享,转载请注明来源:内存溢出
评论列表(0条)