工业级智能停车系统设计方案

本项目是一个采用traffic led模块、arduino uno/nano,以及tof10120飞行时间传感器的工业级智能停车系统。项目采用一块切边的垫子作为停车区,先测量垫子长度,再根据这个数值定义不同距离的代码,一个接一个的点亮(on)和熄灭(off)这些leds,以帮助司机安全停车:
当汽车即将进入停车区域时,绿色led点亮。然后,黄色led点亮,提醒司机即将接近目标停车位置,这表明汽车车身已经有一半位于停车区域。
当红色led开始闪烁时,警告司机缓慢行驶并留意,到达停车点后关闭汽车,或者继续移动直到红色led停止闪烁。
作为一个用以理解停车系统的原型,项目使用的均为廉价元件。读者可对电路进行升级,如改变代码中的测量距离数值,甚至替换电路中的传感器等,使项目更加实用。
tof10120飞行时间传感器  
tof10120激光模块最大的优势在于测距远、操作简单,程序中仅仅需要通过单片机给模块串口发送命令字符串,就可以向单片机发送回距离数据。如果发送自动测距的字符串命令,则模块会按照一定频率自动回送数据,相关物理量都可以通过命令字符串设置。传感器仅需要串口就可以实现。
tof10120基于sharp低成本标准cmos工艺和spad技术,可为自动对焦(af)提供精确、可重复的长距离测量,测量结果不受物体反射的影响。主要特点包括:
・采用940nm激光;
・小型陶瓷封装(20×13.2×2.0mm);
・ 可在室内测量长达1.8m长度,精度5%;
・测量距离不受姆堡反射的影响;
・先进广促俄串扰补偿技术;
・30ms高速测量;
・单电源供电;
・txd接口用于设备控制和数据传送;
・无铅,符合rohs指令。
tof10120典型测距范围为100-1800mm,电源电压3-5v,消耗电流35ma,兼容arduino、esp8266、esp32等5v和3.3v控制板,适合-20°c to +70°c等室内外环境。
tof10120支持uart、i2c通讯,1#引脚、2#引脚、3#引脚、4#引脚、5#引脚、6#引脚分别为gnd、vdd、rxd、txd、sda、scl。在六个引脚中,本项目只使用了其中的gnd, vdd, sda, and scl四个脚。
根据数据表,tof10120的i2c地址为0xa4,但寻址采用高7bit即0x52,这相当于82。
交通led模块  
该模块为司机提供指示,本身带有限流电阻,无需额外连接电阻器。
模块共有4个公头,gnd引脚链接与控制器的gnd引脚,或数字引脚。这样,5v信号将熄灭模块,gnd or low电平信号将启动模块。其中,r标号代表红色led, y标号代表黄色led,g标号代表绿色led,高电平信号时led点亮。
连接电路  
首先,按照电路图,5v电源由lm7805三端稳压器提供给arduino nano,后面需要连接一个470uf的去耦铝电解电容器。
其中,5v稳压连接到arduino nano的vin引脚,tof10120激光测距模块的scl、sda引脚分别连接于arduino板子的a5、a4引脚,电源线链接于arduino板子的5v和接地引脚。
信号灯led模块的gnd引脚链接到arduino板子的5号引脚,红色led链接到arduino的4号引脚,黄色led连接到3号引脚,绿色led连接到2号引脚。
pcb设计  
接下来,设计arduino nano pcb开发板,母头用于3.3v、12v、5v和接地,左侧作为vero板用来焊接其他电子元件,arduino nano的左右两侧都设计母头来连接跳线,也可连接传感器和电子元器件,例如tof10120传感器和oled显示模块的i2c引脚。
最后,将traffic led模块连接于arduino板子的5、4、3、2引脚,再用公头连来连接tof10120传感器的gnd、vdd、scl、sda引线。
做完上述连接后,就使用下述代码进行i2c寻址:
#include
void setup()
{
wire.begin();
serial.begin(115200);
serial.println(\ni2c scanner);
}
void loop()
{
byte error, address;
int ndevices;
serial.println(scanning...);
ndevices = 0;
for(address = 0; address <= 127; address++ )
{
wire.begintransmission(address);
error = wire.endtransmission();
if (error == 0)
{
serial.print(i2c device found at address 0x);
if (address<16)
serial.print(0);
serial.print(address, hex);
serial.println( !);
ndevices++;
}
else if (error==4)
{
serial.print(unknow error at address 0x);
if (address<16)
serial.print(0);
serial.println(address,hex);
}
}
if (ndevices == 0)
serial.println(no i2c devices found\n);
else
serial.println(done\n);
delay(30000);
}
#include
void setup()
{
wire.begin();
serial.begin(115200);
serial.println(\ni2c scanner);
}
void loop()
{
byte error, address;
int ndevices;
serial.println(scanning...);
ndevices = 0;
for(address = 0; address <= 127; address++ )
{
wire.begintransmission(address);
error = wire.endtransmission();
if (error == 0)
{
serial.print(i2c device found at address 0x);
if (address<16)
serial.print(0);
serial.print(address, hex);
serial.println( !);
ndevices++;
}
else if (error==4)
{
serial.print(unknow error at address 0x);
if (address 0) && (y_inches 3) && (y_inches 6) && (y_inches 10) && (y_inches 20 )
{
digitalwrite(red_pin, low);
digitalwrite(yellow_pin, low);
digitalwrite(green_pin, low);
}
if ( y_inches < 0 )
{
digitalwrite(red_pin, low);
digitalwrite(yellow_pin, low);
digitalwrite(green_pin, low);
}
}
int serial_putc( char c, struct __file * )
{
serial.write( c );
return c;
}
void printf_begin(void)
{
fdevopen( &serial_putc, 0 );
}
void sensorread(unsigned char addr,unsigned char* datbuf,unsigned char cnt)
{
unsigned short result=0;
// step 1: instruct sensor to read echoes
wire.begintransmission(82); // transmit to device #82 (0x52), you can also find this address using the i2c_scanner code, which is available on electroniclinic.com
// the address specified in the datasheet is 164 (0xa4)
// but i2c adressing uses the high 7 bits so it's 82
wire.write(byte(addr)); // sets distance data address (addr)
wire.endtransmission(); // stop transmitting
// step 2: wait for readings to happen
delay(1); // datasheet suggests at least 30us
// step 3: request reading from sensor
wire.requestfrom(82, cnt); // request cnt bytes from slave device #82 (0x52)
// step 5: receive reading from sensor
if (cnt <= wire.available()) { // if two bytes were received
*datbuf++ = wire.read(); // receive high byte (overwrites previous reading)
*datbuf++ = wire.read(); // receive low byte as lower 8 bits
}
}
int readdistance(){
sensorread(0x00,i2c_rx_buf,2);
lenth_val=i2c_rx_buf[0];
lenth_val=lenth_val< 0) && (y_inches 3) && (y_inches 6) && (y_inches 10) && (y_inches 20 )
{
digitalwrite(red_pin, low);
digitalwrite(yellow_pin, low);
digitalwrite(green_pin, low);
}
if ( y_inches < 0 )
{
digitalwrite(red_pin, low);
digitalwrite(yellow_pin, low);
digitalwrite(green_pin, low);
}
}
int serial_putc( char c, struct __file * )
{
serial.write( c );
return c;
}
void printf_begin(void)
{
fdevopen( &serial_putc, 0 );
}
void sensorread(unsigned char addr,unsigned char* datbuf,unsigned char cnt)
{
unsigned short result=0;
// step 1: instruct sensor to read echoes
wire.begintransmission(82); // transmit to device #82 (0x52), you can also find this address using the i2c_scanner code, which is available on electroniclinic.com
// the address specified in the datasheet is 164 (0xa4)
// but i2c adressing uses the high 7 bits so it's 82
wire.write(byte(addr)); // sets distance data address (addr)
wire.endtransmission(); // stop transmitting
// step 2: wait for readings to happen
delay(1); // datasheet suggests at least 30us
// step 3: request reading from sensor
wire.requestfrom(82, cnt); // request cnt bytes from slave device #82 (0x52)
// step 5: receive reading from sensor
if (cnt <= wire.available()) { // if two bytes were received
*datbuf++ = wire.read(); // receive high byte (overwrites previous reading)
*datbuf++ = wire.read(); // receive low byte as lower 8 bits
}
}
int readdistance(){
sensorread(0x00,i2c_rx_buf,2);
lenth_val=i2c_rx_buf[0];
lenth_val=lenth_val<<8;
lenth_val|=i2c_rx_buf[1];
delay(300);
return lenth_val;
}
上面是编程代码,前提是已经下载了 wire.h 库文件,代码中的距离单位为英寸,欢迎实践和分享。


苹果公司公开支持AR/VR技术
郭台铭预言制造业最后赢家将是中国
FLIR固定安装式红外热像仪助力电力等公用事业公司及早发现问题
变电站的定义/组成/功能/分类
LCD行业被玻璃短缺所拖累
工业级智能停车系统设计方案
802.11ax Wi-Fi标准的设计时遇上的常见挑战及解决方法
华为终端:五年内进全球前三
全球最大水上漂浮式光伏电站采用华为智能光伏解决方案
美国空军全球打击司令部正在进行变革并开启一个威慑的新时代
中国为什么做不起来操作系统和芯片,只因没有它
浅析思瑞浦宽压Buck—TPP36308的多种拓扑方案
Telegram发布新群组语音聊天功能
GOME手机U7评测 最超值的千元手机
富士康铺路大陆物联网 “11屏3网2云”瞄准大数据
排母可以单独使用吗(使用与作用问答详解)
基于RGASM方法与ASM方法的脸部特征定位的比较
物联网网关助力气体数据在线监测,防范安全事故风险
中航锂电A6项目获25亿金融支持
传感器的发展阶段以及智能传感器的优势