65.9K
CodeProject 正在变化。 阅读更多。
Home

酷炫头盔:英特尔爱迪生智能头盔,具备气候控制、自动指示和事故通知功能

starIconstarIconstarIconstarIconstarIcon

5.00/5 (5投票s)

2016年8月7日

CPOL

13分钟阅读

viewsIcon

20754

downloadIcon

67

这款新颖的英特尔爱迪生智能头盔配备便携式空调,可以在骑手发生事故时通知亲属,并可以根据头部运动自动触发指示灯。

一款基于英特尔爱迪生的智能头盔

  • 使用基于珀尔帖效应的冷却系统改变头盔内部温度
  • 冷却基于温度感应
  • 当用户向左或向右转动头部时自动触发指示灯
  • 检测事故并通过 Gmail 和 Mqtt 进行通知
  • 完全电池供电且可工作的原型

动机

在印度的卡拉布拉吉等地,人们因为过度的炎热、严重的刺激和不适而倾向于避免佩戴头盔。该国还饱受鲁莽驾驶和疏忽之苦。许多时候,骑手因未使用转向灯和指示器而造成的疏忽导致了交通事故。此外,我们没有一个完善的事故支持系统。因此,许多时候,骑手即使在事故发生后很长时间也无人照料,从而丧失生命。这项工作的主要动机是寻找一个解决方案,可以保持骑手的头部凉爽,在他们转弯时自动触发指示灯,并在骑手发生事故时通知相关部门或亲属。我们的主要目标是挽救每年因不戴头盔或不使用指示器而失去的数百万生命。

引言

世界各地每年约有 130 万人死于交通事故/摩托车事故,另有 2000 万至 5000 万人受伤。世界卫生组织在其《2010-2011 年道路安全行动十年》报告中指出,拒绝使用合适的摩托车头盔是导致交通事故死亡的主要因素之一。更令人沮丧的是,大量的交通事故死亡是由行人和摩托车骑手等弱势道路使用者造成的。

在印度,道路相关死亡事故中约有 13% 是行人造成的,而私家车、汽车和出租车的事故占 15%,机动两轮或三轮车骑手的事故占 27%。因此,如果强制所有人在骑摩托车时佩戴头盔,预计事故发生率会下降。总的来说,大多数政府已经制定了关于佩戴头盔的严格法律。然而,尽管有法律,但由于缺乏有效执行,此类案件仍在增加。到目前为止,只制定了法律,但在这方面还没有进行任何技术工作。

这是我们在日常生活中看到的情况,考虑到找到解决这个问题的方案,我们想出了这个想法,以便尽早、及时地提供事故信息……!!因为创纪录的时间很重要,如果一切都及时完成,至少我们可以挽救一半因摩托车事故而丧生的生命。

考虑到避免事故发生的三大因素,例如:

  1. 强制佩戴头盔。
  2. 避免酒后驾驶。
  3. 如果一个人遭遇事故,没有人来帮助他。与其漠不关心或忽视这个人,他可能会死亡。在这种情况下,通过智能手机通知救护车或亲属,可以在一定程度上挽救他。

在这项工作中,我们展示了我们用珀尔帖模块和 GPS 重新设计的头盔帽的配置。通过集成在头盔中的库存,可以使用基于热电效应运行的珀尔帖模块在帽子中维持舒适的温度。在发生交通事故时,可以使用 GPS 系统精确跟踪骑手的确切位置,并向急救车发送消息。此外,如果发生出血,可以用热电模块凝固血液,以便在危急情况下挽救生命。

问题

过去的一些工作已经提出了各种基于嵌入式系统的头盔解决方案。大多数过去的解决方案都采用 GPRS 生成通知。基于 SMS (GSM) 和 Web (GPRS) 的通知的主要问题之一是消息传递成本高昂,其次,与物联网提供的 M2M 协议相比,Web 协议的速度要慢很多倍。此外,大多数过去的工作都基于微控制器架构,该架构在并行编程方面存在严重限制。因此,在实时场景下,温度、事故和指示器的并行监控和控制变得非常缓慢。通过用强大的微处理器替换 GPRS、微控制器并使用低延迟传感器而不是传统传感器,可以解决这个问题。

本解决方案解决了快速通信、可扩展消息传递、消息和警报通道以及更好事件触发的挑战。我们使用英特尔爱迪生和 Arduino 兼容扩展板来提高原型设计速度。我们使用 Wi-Fi 连接将 IoT 板连接到互联网。我们使用了基于 I2C 的加速度计传感器,与基于串行通信的传统加速度计相比,其性能有了显著提高。通知系统将数据放入 Google 云,通过 IFTTT 的云事件和消息路由,可以将其路由到 Facebook、Twitter 等其他平台。我们还使用了 MQTT 协议,该协议可以改善 Web 服务和 http 的响应时间。由于 MQTT 本身提供 QOAS 支持,因此可以保证每个数据包以最佳延迟进行传递。本工作的方法部分将详细解释所提出系统的详细架构。

亮点

本工作的目标是提供一种尖端的近实时解决方案,通过新一代物联网处理器和协议结构驱动的智能头盔,为骑手提供道路安全、头部舒适度和骑行辅助。总体目标可总结为以下具体内容。

  1. 为骑手保持舒适的温度,并在发生事故导致头部受伤时,通过快速降低珀尔帖模块的温度来加速血液凝固过程。
  2. 除此之外,在发生事故时,定位骑手的确切位置(城市地址),同时通知预设的手机号码,并且由于数据通过 MQTT 云收集,实时城市地址将通过 IFTTT 应用程序广播到 Facebook、Twitter、Gmail 等社交媒体应用程序,以告知家人。
  3. 基于骑手头部一定时间的运动,该设备通过 Groove 加速度计传感器感应并激活头盔上的指示器。

规格

  • 硬件规格

    1. Intel Edison
    2. 英特尔爱迪生 Arduino 兼容扩展板
    3. 传感器(振动、加速度计)
    4. 带散热器的珀尔帖模块
    5. 12V 外部电源/移动电源
    6. 互联网连接(Wi-Fi)、3G
    7. 安卓手机(Android 4.0 及以上版本)
    8. SeedStudio Groove 套件
  • 软件规格

    1. 英特尔爱迪生的 Linux Yocto 操作系统
    2. Node.js
    3. IDE:英特尔 XDK 物联网版
    4. 语言:JavaScript (Node.js)
    5. PuTTY
    6. IP 网关:IFTTT
    7. 协议:MQTT.SMTP
    8. 客户端 IDE:Android Studio

Components

在本节中,我们将详细介绍本项目中使用的传感器和其他组件。

在我看来,Grove 继电器用于在温度值超过设定的阈值时打开珀尔帖模块或风扇。它将由 MCU 触发。

以下是传感器的规格:

  • Grove 压电振动传感器 - 用于事故检测

    您可以在此 wiki 链接 中了解更多关于该传感器信息。

  • Grove 温度传感器 - 用于温度检测和触发冷却单元

    Grove 温度传感器是一种电子 Grove 设备,主要用于感应周围环境的温度变化。

    Grove 温度传感器使用热敏电阻来检测周围温度。当环境温度降低时,热敏电阻的电阻会增加。正是这种特性被我们用来计算周围温度。该传感器的可检测范围为 -40 至 125 摄氏度,精度为 ±1.5 摄氏度。

    1. 电压:3.3 ~ 5V
    2. 在 25 摄氏度下的最大功率额定值:300mW
    3. 零功率电阻:10KΩ
    4. 工作温度范围:-40 至 125 摄氏度
  • 3 轴加速度计 - 用于头部运动检测和自动指示

    3 轴加速度计 Grove 设备主要使用 MMA7660FC 和数字输出 I2C。该 Grove 设备主要用于通过中断引脚 (INT) 感应数据变化、测量方向和运动识别。该模块功耗低,采用低剖面电容 MEMS 传感元件。

    以下是 3 轴加速度计传感器的特性:

    1. Grove 兼容接口
    2. 轴运动/方向感应
    3. 数字输出 (I2C)
    4. 10,000g 冲击生存能力
    5. 符合 RoHS/WEEE 无铅标准
    6. 5V 直流输入

  • Grove 继电器 - 用于切换珀尔帖模块,Grove 继电器模块是一个数字常开开关。通过它,我们可以用低电压(例如控制器上的 5V)控制高压电路。板上有一个指示 LED,当被控端子闭合时会亮起。
     
  • 规格
    1. 工作电压:3.3V~5V
    2. 工作电流:100mA
    3. 继电器寿命:100,000 次
    4. 最大切换电压:250VAC/30VDC
    5. 最大切换电流:5A

  • Grove RGB LCD 背光 - 用于显示(好的,没有显示屏的物联网设备看起来不好看。:))

    这个 Grove 可以让你通过简单紧凑的 Grove 接口将颜色设置为你喜欢的任何颜色。它将 I2C 作为微控制器的技术策略。因此,用于数据交换和背光控制的引脚数量从大约 10 个减少到 2 个,为其他测试任务节省了 IO。此外,Grove - LCD RGB 背光支持用户定义的字符。

    在我看来,它主要用于以绿色显示实时温度信息,一旦温度超过阈值,它就会将其颜色变为红色并开始闪烁。同样,它显示骑手的状态。如果骑手发生事故,它会将其颜色变为红色并开始闪烁。

  • 规格

    1. Vcc 电压:5V
    2. I/O 电压:3.3/5V
    3. 工作电流 < 60mA
    4. CGROM:10880 位
    5. CGRAM:64*8 位
    6. 多彩 RGB 背光
    7. 内置英文和日文字体
    8. I2C 通信,仅需两个 IO
    9. 自动上电复位

  • 珀尔帖模块

    珀尔帖是一种热电效应 (TEE) 器件,其热性能可以通过电信号控制。

  • 基本上,有两种效应——它们是:
    1. 珀尔帖效应
    2. 塞贝克效应

    TE 制冷器、TE 加热器和热泵都是基于 TEE 的设备,所有这些设备都称为珀尔帖效应。珀尔帖设备不是吸热器。相反,它是一个热驱动器。从冷却侧排出的热量会积聚在设备的较热侧,并且必须以某种方式散发掉。否则,设备可能会停止工作,并且可能会导致冷却侧温度升高,这在实践中是不可行的。[维基]

散热器

在珀尔帖设备用于冷却目的时,必须将散热器视为不可或缺的一部分。其所有性能特征都随着散热器的温度变化而变化。因此,最终的散热器应具有吸收无限量热量的能力,而不会提高设备温度。一般而言,我们需要考虑一个散热器,它可以吸收设备的所有剩余热量,并帮助设备温度不会超过可接受的水平。因此,在实践中,我们可以使用一个散热器,它可以将设备的温度提高 5 到 15 摄氏度,高于可耐受的温度。

  • 工作电压:最高 13.5V
  • 电压可以是两个方向。唯一的区别是会升温或降温的一侧。
  • 额定电流:最高 4.4 安培
  • 功率:最高 36 瓦
  • 温差:在 30 摄氏度常温且无负载的情况下,最高可达 59 摄氏度。
  • p-n 结数:127
  • 占地面积:4 厘米 x 4 厘米
  • 厚度:4 毫米
  • 重量:28 克
  • 模块出厂编号:TEC1-12704
  • 珀尔帖模块的地线连接到继电器的一个触点。当温度传感器达到设定的阈值(例如 30 摄氏度)时,传感器将触发 MCU 为 Grove 继电器开关供电,从而闭合电路并允许基极电流流动,从而切换珀尔帖模块开始在头盔内部冷却,为骑手提供舒适的温度。

设计

框图

  • 英特尔爱迪生将通过晶体管作为开关连接到珀尔帖模块。
  • 珀尔帖是一种由 12V 电源驱动的温度冷却解决方案。电源将由 12V 电池组提供。敷料的地线将连接到 Grove 继电器的一个输入端。当 MCU 向继电器供电并触发它时。这将激活珀尔帖并触发冷却。
  • MCU 将通过 Grove 温度测量传感器持续监控温度。当内部温度高时,将使用步骤 2 中提到的方法激活敷料。
  • MCU 将通过 MQTT 物联网网关与云集成。骑手的移动将通过 MQTT 网关集成到云端。手机将持续跟踪 GPS 数据,然后将该数据发送回 Google 云,以获取 GPS 数据的纬度和经度的城市地址。
  • MCU 将通过 Grove 振动传感器持续跟踪撞击情况。发生事故时,传感器将生成一个信号,该信号将触发通知。该通知及 GPS 城市地址将推送到云端。然后,可以通过 IFTTT 网关将其分发到 Facebook/Twitter 或任何其他渠道。
  • 加速度计将监测头部运动。当骑手长时间向右/左看时,可以触发头盔指示灯。

电路原理图

序列图

算法

    Actor Edison
participant Vibration
            loop
 (Till Ride Completes)
Vibration -> Edison: Vibration Value
participant MqTT
Activate MqTT
alt Vibration Value gt 1000
 Edison -> LCD : RED
 Edison -> Buzzer : ON
 Edison -> MqTT: Accident Message
else Normal
 Edison -> Edison: Keep Monitoring
end
Deactivate MqTT
Accelerometer -> Edison : (x,y,z)
alt x gt +5
 Edison -> Buzzer : ON
 Edison -> LeftIndicator: ON
else 
alt x lt -5
 Edison -> RightIndicator: ON
Edison -> Buzzer : ON
Else    Edison->RightIndicator: OFF
   Edison -> Buzzer : OFF
    end
 Edison -> LeftIndicator : OFF
 Edison -> Buzzer : OFF
 end
 TemperatureSensor -> Edison : Temparature
alt Temperature gt 40
Edison -> LCD : RED
Edison -> Relay_Peltier: ON
 Edison -> Buzzer : ON
else Normal
 Edison -> LCD : GREEN
 Edison -> Relay_Peltier: OFF
 Edison -> Buzzer: OFF
end
Edison -> LCD : Display Temperature
end    

Using the Code

在了解了整个设计概念和组件后,终于到了对我们的英特尔爱迪生板进行编码的时候了。请记住,我们需要开发以下代码:

  • 使用振动传感器进行事故检测
  • 发生事故时生成 Gmail 通知
  • 使用加速度计检测头部左右运动
  • 基于加速度计数据触发左右指示灯
  • 测量温度
  • 温度超过阈值时打开珀尔帖
  • 温度恢复正常时关闭珀尔帖
  • 在 LCD 上显示数据
  • 在事件发生时触发蜂鸣器一段时间

让我们先看看整个代码,它被分成几个部分:

  //////////////////////////// 1. Accelerometer for Indication/////////
var digitalAccelerometer = require('jsupm_mma7660');

// Instantiate an MMA7660 on I2C bus 0
var myDigitalAccelerometer = new digitalAccelerometer.MMA7660(
          digitalAccelerometer.MMA7660_I2C_BUS, 
          digitalAccelerometer.MMA7660_DEFAULT_I2C_ADDR);

// place device in standby mode so we can write registers
myDigitalAccelerometer.setModeStandby();

// enable 64 samples per second
myDigitalAccelerometer.setSampleRate(digitalAccelerometer.MMA7660.AUTOSLEEP_64);

// place device into active mode
myDigitalAccelerometer.setModeActive();

var x, y, z;
x = digitalAccelerometer.new_intp();
y = digitalAccelerometer.new_intp();
z = digitalAccelerometer.new_intp();

var ax, ay, az;
ax = digitalAccelerometer.new_floatp();
ay = digitalAccelerometer.new_floatp();
az = digitalAccelerometer.new_floatp();

var outputStr;

var myInterval = setInterval(function()
{
  myDigitalAccelerometer.getRawValues(x, y, z);

  outputStr = "Raw values: x = " + digitalAccelerometer.intp_value(x) +
  " y = " + digitalAccelerometer.intp_value(y) +
  " z = " + digitalAccelerometer.intp_value(z);

 //-------------------- LEFT AND RIGHT For INDICATION-----------------------//
var X= digitalAccelerometer.intp_value(x);

if(X<0) //<- Left Condition
  {
    if(Math.abs(X)>5)
    {
     buzzPin.write(1);
     console.log("LEFT.................");
     lPin.write(1);    // Left Indicator On
     rPin.write(0);    // Right Indicator Off
    }
    else
    {
     buzzPin.write(0); // When Head is in left position but becoming straight, 
                       // switch off the indicator
     lPin.write(0);
    }
  }
  if(X>0) // <- Right Condition
  {
    if(X>5)
    {
    rPin.write(1);
    lPin.write(0);
    buzzPin.write(1);
    console.log("RIGHT..........");
    }
    else
    {
   rPin.write(0);
  buzzPin.write(0);
    }  
  }
}, 500); //<- Keep Measuring accelerometer in every 500ms
//--------------------------- Accelerometer Processing Ends Here----------------/

// round off output to match C example, which has 6 decimal places
function roundNum(num, decimalPlaces)
{
  var extraNum = (1 / (Math.pow(10, decimalPlaces) * 1000));
  return (Math.round((num + extraNum) 
    * (Math.pow(10, decimalPlaces))) / Math.pow(10, decimalPlaces));
}
//////////////////2. Mqtt Initialization  ////////////////////////////
var mraa=require('mraa');
var nodemailer = require('nodemailer');

//////////3.  Setting Gmail for package nodemailer/////////////

//var transporter = nodemailer.createTransport('smtps://gmail.com');
var smtpConfig = {
    host: 'smtp.gmail.com',
    port: 465,
    secure: true, // use SSL
    auth: {
        user: 'yourmailId@gmail.com',

        pass: 'your_gamil_password'
    }
};
var transporter = nodemailer.createTransport(smtpConfig);

var mailOptions = {
    from: '"Your Name"<yournames@gmail.com>',                // sender address
    to: 'receiver1smail@gmail.com','receiver2smail@gmail.com'// list of receivers
                                                             // ( your friend/relative)
    subject: 'Helmet Project Accident Notification',         // Subject line
    text: 'Accident Happened ',                              // plaintext body
    html: '<b>Accident </b>'                                 // html body
};

//////////////////////4. Sensors and Pin Initialization////////////////////////////////////////
var vibSensor=new mraa.Aio(1);
var tempPin = new mraa.Aio(0);
var buzzPin=new mraa.Gpio(7);
buzzPin.dir(mraa.DIR_OUT);
var fanPin=new mraa.Gpio(6);
fanPin.dir(mraa.DIR_OUT);
var lPin=new mraa.Gpio(4);
var rPin=new mraa.Gpio(2);
rPin.dir(mraa.DIR_OUT);
lPin.dir(mraa.DIR_OUT);

fanPin.write(0);//Peltier Relay
//////////////////////////////////////////////////////////////////////

var at=0; //accident timer;
var mqtt    = require('mqtt');
var client  = mqtt.connect('mqtt://iot.eclipse.org');

var LCD = require('jsupm_i2clcd');
var myLCD = new LCD.Jhd1313m1(6, 0x3E, 0x62);
var B=3975;   

Loop();
var avgTemp=0;
var n=1;
function Loop()//<--- This function continuesly runs, detects accident notifies
{

//------------------------- 5. Read Temperature-----------------------------

var tempValue=tempPin.read();
var resistance=(1023.0-tempValue)*10000.0/tempValue; //get the resistance of the sensor;
var temperature=1/(Math.log(resistance/10000.0)/B+1/298.15)-273.15;//convert to temperature 
                                                                   //via datasheet
temperature=Math.floor((temperature )* 100) / 100;
//console.log(temperature);
avgTemp=avgTemp+temperature;
n=n+1;
//----------------------------------------------------------------

//---------------------- 6. Vibration sensor for Accident detection----------------
var vibVal=vibSensor.read();

//console.log("\n==========\nAccident Trigger: "+vibVal+"\n==========\n");
if(vibVal>800 ) // <- Threshold for Accident
{
console.log("\n==========\nAccident Trigger: "+vibVal+"\n==========\n");
myLCD.setColor(255,0,0);
myLCD.setCursor(1,0);
myLCD.write("Accident");
buzzPin.write(1);
at=10;
client.publish('rupam/Accident', 'Accident Happened....'); //<- Mqtt notification on Accident

transporter.sendMail(mailOptions, function(error, info){
    if(error){
        return console.log(error);
    }
    console.log('Message sent: ' + info.response);
}); //<-- Gmail Notification on Accident
myLCD.setColor(0,255,0);
}

//--------------------------- End of Accident Module--------------------------------
if(n>=10)
{
myLCD.clear();
 myLCD.setCursor(0,0);
myLCD.write("Temp: ");
//console.log(at);
if(at==0)
{
buzzPin.write(0);
myLCD.setColor(0,255,0);
}
else
{
if(at>0)
{
myLCD.setColor(255,0,0);
at--;
}
}
myLCD.setCursor(0,6);

//myLCD.write(""+avgTemp);
//myLCD.setCursor(1,0);

avgTemp=avgTemp/n;
avgTemp=Math.floor((avgTemp )* 100) / 100;
myLCD.write(""+avgTemp);
myLCD.setCursor(1,0);

//-------------------------- 7. Controlling Peltier--------------------------------
//console.log("Pwm Duty cycle="+roundNum(fanSpeed*100,2));

if(avgTemp>=30) // <- Above 30'c cooling will start
{
at=10; // at will be decremented at every Loop call. When it is 0, the buzzer is Off. 
       // So buzzer doesn't go on for ever. Only a short 2 sec buzzing

fanPin.write(1);
myLCD.setCursor(1,0);
myLCD.setColor(255,0,0);
myLCD.write("HOT");
}
else
{
fanPin.write(0); //<-- Cooling stops once temperature is Normal
myLCD.setColor(0,255,0);
myLCD.setCursor(1,0);
myLCD.write("Normal");
}
//---------------------------------- End of Peltier Control Part--------------------------

n=1;
console.log("Temperature="+avgTemp+" 'C");
avgTemp=0;
}
setTimeout(Loop,1000);
} 
//-------------------- End of Loop--------------------------------

结果

振动传感器

温度传感器

温度 LED 指示

正常

基于加速度计的指示灯触发

左转向灯
右转向灯

佩戴智能头盔的联合作者

结论

这是我们致力于创造更优、更智能的连接云的头盔的努力。头盔可以通过更好的电池和电源单元设计得到改进,使其更加时尚。我们可以添加 GPS 传感器或使用 Android 伴侣应用程序来收集当前 GPS 地址,以在发生事故时通知亲属,并提供事故的确切地址。我们计划继续开发这个项目。请告诉我们您的想法和宝贵的建议。

历史

  • 2016 年 8 月 7 日:初始版本
© . All rights reserved.