用Arduino来看看快递的暴力程度!

2015-02-049.1万
精华项目
AI 快速预览详细 收起
该项目使用DFRduino nano、BMA220加速度传感器、MicroSD模块和DS1307时间模块,构建了一个快递暴力测试设备。该设备能够测量并记录包裹在运输过程中的加速度数据,并将数据存储在SD卡中。通过对比地铁加速减速产生的加速度数据,发现快递过程中超过15m/s^2的加速度出现次数不少,甚至达到27m/s^2。这个项目不仅有助于了解快递的实际情况,还能作为STEM教育的一个有趣案例。
前些日子,玉溪同学为了试着打开快递大叔的内心世界(啧啧。。。详情请点击)而DIY了暴力快递测试设备,取得众多网友的热烈反响,遂在经过千万场内心戏之后,开始了下一次更完备的暴力测试计划。(截至发帖,玉溪同学已经远在美帝,这次把他都供出来了,希望美帝能确保他人身安全!( ´ ▽ ` )ノ ……至少小编我很安全,嗯!)

由于果壳实验室的小伙伴DFRobot对快递大叔内心世界也颇感兴趣(误,这句划掉),由于果壳实验室的小伙伴DFRobot对这项拯救人类世界的计划颇为感兴趣,决定与果壳试验一起进行项目,于是,我们这项搞机计划便轰轰烈烈开始啦!

本次测试区域仍选择在北京市内,快递路线大致为朝阳区到海淀区。因此我们的设备功能需求是:能够测量包裹撞击时加速度的强度,并将数值连同撞击时间记录在SD卡内。考虑到北京市内快递一般能实现次日达,因此我们将设备续航时间设定在24小时。

综合了功能和设备小型化的需求,我们最终选择的设备构成包括:DFRduino nano+BMA220加速度传感器+MiscroSD 模块+DS1307时间模块,同时采用一块3.7V 2000MA的锂电池+直流升压模块(输出5V)给设备供电。

用Arduino来看看快递的暴力程度!图1

DFRduino nano

用Arduino来看看快递的暴力程度!图2

BMA220加速度传感器

用Arduino来看看快递的暴力程度!图3

MiscroSD 模块

用Arduino来看看快递的暴力程度!图5

DS1307时间模块



用Arduino来看看快递的暴力程度!图4

3.7V 2000MA的锂电池与直流升压模块

选好器材之后,果壳实验室与@DFRobot 就开始愉快地撸起来了……ˊ_>ˋ

首先把这些器材用杜邦线连接起来。铛铛铛~瞬间就接好了……

用Arduino来看看快递的暴力程度!图6

喔喔,好像节奏快了一点点……再贴张连接图吧!

用Arduino来看看快递的暴力程度!图8

接着,给RTC设置时间。将DS1307RTC的例程SetTime烧写入Arduino中,打开串口监视器,看到Arduino返回的时间数据为当前时间,时间设置完成!

用Arduino来看看快递的暴力程度!图9

然后开始写代码,点击一下upload,哇,好了!(怎么可能一次就好!写代码……改代码……写代码……改代码……写代码……改代码……写代码……upload,再改……这个过程我们就略过吧!)

用Arduino来看看快递的暴力程度!图7

终于,设备调试完了(ˊ_>ˋ这回真的好了) 。

用Arduino来看看快递的暴力程度!图10

用Arduino来看看快递的暴力程度!图11

装上电池后用信封包起来,装进盒子里。

用Arduino来看看快递的暴力程度!图12

然后就愉快地让内心世界丰富的快递大叔来把快递取走了!

磕磕碰碰,中间遇到其他事情,好几天才完成了包裹寄出和回收任务,然后就开始处理数据了……(别说了,这是最痛苦难受地好不好),然后,就出结果啦……来看看快递大叔的心情……

用Arduino来看看快递的暴力程度!图13

用Arduino来看看快递的暴力程度!图14

用Arduino来看看快递的暴力程度!图15

用Arduino来看看快递的暴力程度!图16

用Arduino来看看快递的暴力程度!图17

其实快递的磕磕碰碰,汽车在快加速,或者急刹车的过程,产生的加速度也记录在设备上了。因此我们试着做一个比较好的比较,让同事带着设备走回家。 从公司到家,来回大约十三公里的路途,主要靠走路和地铁。我们获得的数据如下:

用Arduino来看看快递的暴力程度!图18

这个实验样本产生了11个数据点,对照时间,基本上是地铁加速减速产生的加速度,加速度大小主要在5~6m/s^2。

在我们试验的几个快递样本上,超过15m/s^2的加速度出现次数不少,也有几次超过20m/s^2,甚至达到27m/s^2。快递大叔的心情……啧啧……

实验至此,快递大叔的心情大家也看了,想说的道理其实大家也都懂,易碎的该包严实,贵重的要买保险……喔不,公司的同事说了,如果万一快递大叔明天心情不好了,你们几个就去给同事收发快递吧……别说了,让我先去厕所哭会……


等等……要代码?再此之前记得先安装一下RTC的库喔!


  1. <font color="rgb(51, 51, 51)"><font face="Arial, Helvetica, sans-serif">#include <Wire.h>
  2. #include <math.h>
  3. #include <SD.h>
  4. #include <DS1307RTC.h>
  5. #include <Time.h>
  6. #include <Wire.h>
  7. byte Version[3];
  8. int8_t x_data;
  9. int8_t y_data;
  10. int8_t z_data;
  11. byte range=0x03;
  12. float divi=16;
  13. float x,y,z;
  14. File myFile;
  15. void setup()
  16. {
  17.   Serial.begin(9600);
  18.   Wire.begin();
  19.   Wire.beginTransmission(0x0A); // address of the accelerometer
  20.   // range settings
  21.   Wire.write(0x22); //register address
  22.   Wire.write(range); //can be set at"0x00""0x01""0x02""0x03", refer to Datashhet on wiki
  23.   // low pass filter
  24.   Wire.write(0x20); //register address
  25.   Wire.write(0x05); //can be set at"0x05""0x04"......"0x01""0x00", refer to Datashhet on wiki
  26.   Wire.endTransmission();
  27.   
  28.   Serial.println("Initialization SD card...");
  29.   pinMode(10,OUTPUT);
  30.     if (!SD.begin(4)) {
  31.     Serial.println("initialization failed!");
  32.     return;
  33.   }
  34.   Serial.println("initialization done.");
  35.   
  36.   
  37.   
  38. }
  39.    
  40. void AccelerometerInit()// get accelerated
  41. {
  42.   Wire.beginTransmission(0x0A); // address of the accelerometer
  43.   // reset the accelerometer
  44.   Wire.write(0x04); // Y data
  45.   Wire.endTransmission();
  46.   Wire.requestFrom(0x0A,1);    // request 6 bytes from slave device #2
  47.   while(Wire.available())    // slave may send less than requested
  48.   {
  49.     Version[0] = Wire.read(); // receive a byte as characte
  50.   }
  51.   x_data=(int8_t)Version[0]>>2;
  52.    
  53.   Wire.beginTransmission(0x0A); // address of the accelerometer
  54.   // reset the accelerometer
  55.   Wire.write(0x06); // Y data
  56.   Wire.endTransmission();
  57.   Wire.requestFrom(0x0A,1);    // request 6 bytes from slave device #2
  58.   while(Wire.available())    // slave may send less than requested
  59.   {
  60.     Version[1] = Wire.read(); // receive a byte as characte
  61.   }
  62.   y_data=(int8_t)Version[1]>>2;
  63.    
  64.   Wire.beginTransmission(0x0A); // address of the accelerometer
  65.   // reset the accelerometer
  66.   Wire.write(0x08); // Y data
  67.   Wire.endTransmission();
  68.   Wire.requestFrom(0x0A,1);    // request 6 bytes from slave device #2
  69.    while(Wire.available())    // slave may send less than requested
  70.   {
  71.     Version[2] = Wire.read(); // receive a byte as characte
  72.   }
  73.    z_data=(int8_t)Version[2]>>2;
  74.    
  75.    x=(float)x_data/divi;
  76.    y=(float)y_data/divi;
  77.    z=(float)z_data/divi;
  78.    Serial.print("X=");  
  79.    Serial.print(x);         // print the character
  80.    Serial.print("  ");
  81.    Serial.print("Y=");  
  82.    Serial.print(y);         // print the character
  83.    Serial.print("  ");
  84.    Serial.print("Z=");           // print the character
  85.    Serial.print(z);  
  86. }
  87.    
  88. void loop()
  89. { double accelerated_speed;
  90.   switch(range)  //change the data dealing method based on the range u've set
  91.   {
  92.   case 0x00:divi=16;  break;
  93.   case 0x01:divi=8;  break;
  94.   case 0x02:divi=4;  break;
  95.   case 0x03:divi=2;  break;
  96.   default: Serial.println("range setting is Wrong,range:from 0to 3.Please check!");while(1);
  97.   }
  98.   AccelerometerInit();
  99.   accelerated_speed=sqrt(x*x+y*y+z*z);
  100.   Serial.print("accelerated_speed=");
  101.   Serial.println(accelerated_speed);
  102.   if(accelerated_speed>=1)
  103.   {
  104.     //get time
  105.      tmElements_t tm;
  106.      RTC.read(tm);
  107.     //write data
  108.       myFile = SD.open("test.txt", FILE_WRITE);
  109.        if (myFile) {
  110.       Serial.print("Writing to test.txt...");
  111.       //recoder time and data
  112.       myFile.print("accelerated_speed=");
  113.       myFile.print(accelerated_speed);
  114.       myFile.print("    ");
  115.       myFile.print("time=");
  116.       myFile.print(tm.Hour);//
  117.       myFile.print(':');
  118.       myFile.print(tm.Minute);//
  119.       myFile.print(':');
  120.       myFile.print(tm.Second);//
  121.       myFile.print(':');
  122.       myFile.print(", Date (D/M/Y) = ");
  123.       myFile.print(tm.Day);
  124.       myFile.write('/');
  125.       myFile.print(tm.Month);
  126.       myFile.write('/');
  127.       myFile.print(tmYear);
  128.       // close the file:
  129.       myFile.close();
  130.       
  131. Serial.println("done.");
  132.   } else {
  133.     // if the file didn't open, print an error:
  134.     Serial.println("error opening test.txt");
  135.   }
  136.       
  137.   }
  138.   delay(100);
  139.   
  140. }
  141. void print2digits(int number) {
  142.   if (number >= 0 && number < 10) {
  143.     Serial.write('0');
  144.   }
  145.   Serial.print(number);
  146. }
  147. </font></font>
复制代码







iCl6H3OJnQ8F0yYfYlo9_7JOmhVhBQw_bGBzJhgXuFogCgAAkAcAAEpQ.jpg (173.92 KB, 下载次数: 9970)

Arduino · 快递暴力测试:用DFRduino nano监测包裹加速度_image_3.webp

kvncut800IUQ2ka1UyWOBGU84wyzlgMv3gjqv_XKXwEgCgAAkAcAAEpQ.jpg (100.04 KB, 下载次数: 9879)

Arduino · 快递暴力测试:用DFRduino nano监测包裹加速度_image_6.webp

MbgT17P91UqjVdr974hSeFyGZY_pwLcBaE9WA9bwKd4gCgAAkAcAAEpQ.jpg (127.61 KB, 下载次数: 9999)

Arduino · 快递暴力测试:用DFRduino nano监测包裹加速度_image_9.webp

创作许可协议

本项目采用 None(不开放任何权利,保留所有权利) 进行许可。

评论(36)
JOVI
JOVI
学习学习
花生编程
花生编程
厉害厉害,赞!
独钓寒江雪
独钓寒江雪
为大神的作品点赞
派大星ym
派大星ym
。。。。
派大星ym
派大星ym
有意思有意思
20060606
20060606
好创意,最后续航够用了吗
汤半泛
汤半泛
图是怎么做出来的
汤半泛
汤半泛
能测试 震动了多少次吗
云天
云天
15年的作品,19年才看见,但依然很精典!!
weiking
weiking
快递各种暴力是无法避免的:(
appzpp12
appzpp12
楼主你的表格是怎么做的?
qq913622228180
qq913622228180
路过………………
Ash1
Ash1回复qq913622228180
评论内容
qq913622228180
qq913622228180回复Ash1
(嘘嘘……小点声……小心被boss发现我就挂啦!!)
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
suoma
suoma
谢谢分享学习一下,那个连接图是什么软件画的?
jczaza
jczaza
带电池的居然能寄出去了。当成炸弹缴下来了就大条了
linovee
linovee
赞~\(≧▽≦)/~,感谢分享!
请问接线图使用什么工作做的呢??
Ash1
Ash1回复linovee
介个 我也不知道~
貌似有很多可以画的 可以开个贴问一下~
Ash1
Ash1
↓ ↓ ↓ 看这里 看这里 ↓ ↓ ↓
广告时间,想自己DIY一个小伙伴看这里啦~ 项目用到的硬件我们打包放心愿单啦!
https://www.dfrobot.com.cn/wishlist.php
luna
luna回复Ash1
还差一个直流升压模块~可以某宝购买~其他只需要一键购买~~~
yoyojacky
yoyojacky
手动画图太麻烦啦.用这个吧,www.amcharts.com里面很多模板,直接数据格式化好了.填给它就好.
yoyojacky
yoyojacky
哇塞,这个很牛逼,数据分析也是醉了,看到好大的棉花糖啊。
光看评论也是醉了。
roll,pitch,yaw都上来了,直接可以做出包裹飞行姿态了。。。
好吧,快递师傅内心波动很厉害,遇到堵车心情很不好,看到包裹的时候,内心世界变化如股市,跳跃起伏的同时,导致手部肌肉收缩不均匀,这些数据也除了反应情绪,还能反应出当天快递师傅的三磷酸腺苷的水平,那么就意味着还可以分析出当天快递师傅进食的食物能量,进而反应出食品质量。。。
拯救人类的创客活动啊!必须力挺,顶起来。。。
marcusme
marcusme回复yoyojacky
太炫酷了,拯救人类,妥妥的。
Ash1
Ash1回复yoyojacky
我是来看评论的
共3条回复,已加载2条,点击查看更多共3条回复,已加载全部
baolixiaohua
baolixiaohua
测试对象不对,地铁那么稳稳当当的,做公交车,快递叔叔开车跟公交车司机差不多,这样数据才准确。还有还有,有的快递叔叔是骑电瓶车,so找一个上下班骑电瓶车或者自行车的try一下。你就可以得到数据了。。
swanglei
swanglei
哇!创意很不错。。。。。
提个建议,增加一个GPS模块,然后用GOOGLE EARTH直接绘制三维运动轨迹图。。。。效果会不会更好呢?哈哈哈