男生必备模板(理工男必备技能)

Arduino UNO——小型测距轮

现在打开百度地图,输入起点和终点,两地之间的距离马上显示在手机屏幕上。相比以往的地图,现在的电子地图,地理信息量更大。距离计算的更加精确。可这么大的面积,是怎么测量出来的呢?卫星、卷尺还是其他的。卫星能勘探地形、地面资源。但所测距离的精确度不高;卷尺灵活性不够,所测的距离不够长。排除以上两种还有其他测距工具吗?前段时间在马路上看见有人手持一个滚轮沿着马路边滚动,觉得很是新奇,上前询问,原来他是地图工作者,现在正在绘制路线,并测量两地之间的距离。原来他所用的就是用测距轮。这种测距工具,方便携带,灵活性高,测量精准度高。回来之后自己也制作了一个小型的测距轮。

男生必备模板(理工男必备技能)(1)

男生必备模板(理工男必备技能)(2)

测距轮相比传统的卷尺,可以随意滑动,可测正负(向左滑动为正,向右滑动负)。

下面就来看看做的怎么样吧。

男生必备模板(理工男必备技能)(3)

【配件图】

男生必备模板(理工男必备技能)(4)

【主要配件】

男生必备模板(理工男必备技能)(5)

测距轮的主板我采用的DFRobot最新推出的DFRduino UNO R3的主板,他完全兼容Arduino UNO R3版本。性价比也比较高,相比之下,我更钟意DFRduino UNOR3。因为它采用沉金工艺,外观精致,在追求质量的同时,也提高了颜值 。制作测距尺,还需要一个强大的配件,那就是编码器,这样才能计数。

男生必备模板(理工男必备技能)(6)

在这里我采用增量式光电旋转编码器,它能有效的兼容Arduino,PLC等各类主控器。它具有AB两相输出,可以通过旋转的光栅盘和光耦产生可识别方向的计数脉冲信号。其电路输出的类型为NPN集电极开路输出,这样的输出类型可以和内部带上拉电阻的单片机连接,然后实现转速、角度、角速度等数据的测量。

注意:编码器在不接设备的情况下,集电极开路输出,在没有上拉电阻的时候,是没有电压输出的,如要要示波器示波请在AB两相输出上加上两个上拉电阻。如果实际运用,就不需要加上拉电阻了。

男生必备模板(理工男必备技能)(7)

示波器信号

【部分配件】

Gravity I2C LCD1602彩色背光液晶屏

CableAdapter Module 4线传感器转接板

IO 传感器扩展板

数字大按钮模块(Gadgteer专用)

7.4V 2500MA 锂电池 (带充放电保护板)

高品质环保ABS硅胶车轮

【电路接线图】

男生必备模板(理工男必备技能)(8)

实物连接图

男生必备模板(理工男必备技能)(9)

【效果图】

Reset:此模式为复位模式,切换到此模式,可以清零所测的数据。这样又可以重新开始测距取值了。

男生必备模板(理工男必备技能)(10)

Detection:此模式为测距模式,切换到此模式,可以开始你的表演了,随意测距,上下左右随便滚动,完全无压力。往左滚测得是数值为正,往右滑数值为负(当测距数值为正得时候,往右滑可以看见数值随着减小)。

男生必备模板(理工男必备技能)(11)

男生必备模板(理工男必备技能)(12)

Lock:此模式为锁定,当你测得一定的距离后,选择到此模式可以锁定数据,随意你怎么滚动,数据都不会改变了,这样你就可以记录数据了。方便吧,按三下按键就可以了哦。

男生必备模板(理工男必备技能)(13)

为了让携带方便,外观漂亮。我用3D打印机打印了外壳。方方正正的,是不是看起来有点呆板。没办法,我能想到的只是如此了。相信朋友们肯定有更好的创意。3D打印的文件我以附件的形式放在文末了。

注意:因为自己找的轮毂尺寸都不合适,后面自己用3D打印机制作了一个80mm的轮毂。而轮胎还是用的高品质环保ABS硅胶车轮外的轮胎

男生必备模板(理工男必备技能)(14)

男生必备模板(理工男必备技能)(15)

程序:

Arduino UNO——小型测距轮

现在打开百度地图,输入起点和终点,两地之间的距离马上显示在手机屏幕上。相比以往的地图,现在的电子地图,地理信息量更大。距离计算的更加精确。可这么大的面积,是怎么测量出来的呢?卫星、卷尺还是其他的。卫星能勘探地形、地面资源。但所测距离的精确度不高;卷尺灵活性不够,所测的距离不够长。排除以上两种还有其他测距工具吗?前段时间在马路上看见有人手持一个滚轮沿着马路边滚动,觉得很是新奇,上前询问,原来他是地图工作者,现在正在绘制路线,并测量两地之间的距离。原来他所用的就是用测距轮。这种测距工具,方便携带,灵活性高,测量精准度高。回来之后自己也制作了一个小型的测距轮。

男生必备模板(理工男必备技能)(16)

男生必备模板(理工男必备技能)(17)

男生必备模板(理工男必备技能)(18)

测距轮相比传统的卷尺,可以随意滑动,可测正负(向左滑动为正,向右滑动负)。

下面就来看看做的怎么样吧。

男生必备模板(理工男必备技能)(19)

【配件图】

男生必备模板(理工男必备技能)(20)

【主要配件】

男生必备模板(理工男必备技能)(21)

测距轮的主板我采用的DFRobot最新推出的DFRduino UNO R3的主板,他完全兼容Arduino UNO R3版本。性价比也比较高,相比之下,我更钟意DFRduino UNOR3。因为它采用沉金工艺,外观精致,在追求质量的同时,也提高了颜值 。制作测距尺,还需要一个强大的配件,那就是编码器,这样才能计数。

男生必备模板(理工男必备技能)(22)

在这里我采用增量式光电旋转编码器,它能有效的兼容Arduino,PLC等各类主控器。它具有AB两相输出,可以通过旋转的光栅盘和光耦产生可识别方向的计数脉冲信号。其电路输出的类型为NPN集电极开路输出,这样的输出类型可以和内部带上拉电阻的单片机连接,然后实现转速、角度、角速度等数据的测量。

注意:编码器在不接设备的情况下,集电极开路输出,在没有上拉电阻的时候,是没有电压输出的,如要要示波器示波请在AB两相输出上加上两个上拉电阻。如果实际运用,就不需要加上拉电阻了。

男生必备模板(理工男必备技能)(23)

示波器信号

【部分配件】

Gravity I2C LCD1602彩色背光液晶屏

CableAdapter Module 4线传感器转接板

IO 传感器扩展板

数字大按钮模块(Gadgteer专用)

7.4V 2500MA 锂电池 (带充放电保护板)

高品质环保ABS硅胶车轮

【电路接线图】

男生必备模板(理工男必备技能)(24)

实物连接图

男生必备模板(理工男必备技能)(25)

【效果图】

Reset:此模式为复位模式,切换到此模式,可以清零所测的数据。这样又可以重新开始测距取值了。

男生必备模板(理工男必备技能)(26)

Detection:此模式为测距模式,切换到此模式,可以开始你的表演了,随意测距,上下左右随便滚动,完全无压力。往左滚测得是数值为正,往右滑数值为负(当测距数值为正得时候,往右滑可以看见数值随着减小)。

男生必备模板(理工男必备技能)(27)

男生必备模板(理工男必备技能)(28)

Lock:此模式为锁定,当你测得一定的距离后,选择到此模式可以锁定数据,随意你怎么滚动,数据都不会改变了,这样你就可以记录数据了。方便吧,按三下按键就可以了哦。

男生必备模板(理工男必备技能)(29)

为了让携带方便,外观漂亮。我用3D打印机打印了外壳。方方正正的,是不是看起来有点呆板。没办法,我能想到的只是如此了。相信朋友们肯定有更好的创意。3D打印的文件我以附件的形式放在文末了。

注意:因为自己找的轮毂尺寸都不合适,后面自己用3D打印机制作了一个80mm的轮毂。而轮胎还是用的高品质环保ABS硅胶车轮外的轮胎

男生必备模板(理工男必备技能)(30)

男生必备模板(理工男必备技能)(31)

程序:

#include <Wire.h>

#include "DFRobot_RGBLCD.h"

DFRobot_RGBLCD lcd(16, 2);

//rgb_lcd lcd;

#define A 3

#define B 4

#define Key 12//key

#define D 79 //Diameter 79mm

float C = 0; //perimeter

unsigned int Distance;

int VA = 0;

int VB = 0;

unsigned long Count = 0;//count

unsigned int Count_1 = 0; //Negative count

unsigned char flag = 1, Mark = 0;

unsigned long lasttime = 0, Modetime = 0;

//Length measurement range is ± 6 M

void setup()

{

Serial.begin(9600);

lcd.init();

lcd.setRGB(255, 255,0);

lcd.setCursor(2, 0 );

lcd.print("M:");

lcd.setCursor(2, 1 );

lcd.print("D:");

lcd.setCursor(12, 1 );

lcd.print("cm");

pinMode(A, INPUT_PULLUP); //Pull-up input

pinMode(B, INPUT_PULLUP);

pinMode(Key, INPUT);

attachInterrupt(1, interrupt, RISING);

C = D * PI;

}

void loop()

{

if (millis() - 150 > lasttime)//Detect keys once every 150ms

{

if (digitalRead(Key) == HIGH)

if (digitalRead(Key) == HIGH)

Mark = 1;

if (Mark > 2)

Mark = 0;

while (digitalRead(Key) == HIGH);

lasttime = millis();

}

if (millis() - 100 > Modetime)//Refresh the data every 100ms

{

if (Mark == 0) //Cleared

{

lcd.setCursor(6, 0 );

lcd.print("Reset ");

Distance = C * Count / 40;

flag = 3;

lcd.setCursor(11, 0 );

lcd.print(" ");

}

if (Mark == 1) //Calculate the measured value

{

lcd.setCursor(6, 0 );

lcd.print("Detection");//

lcd.setCursor(4, 1 );

if (Count > 0 && Count < 0xffff)//Determine whether the length is positive

{

lcd.print('-');//The length is negative

Distance = C * Count / 40;

}

else if (Count == 0 && Count_1 == 0 )//Determine whether the length is zero

{

lcd.setCursor(4, 1 );

lcd.print(' ');

Distance = C * Count / 40;

}

else//Length is positive

{

lcd.print(' ');

Distance = Count_1 * C / 40;

}

}

else if (Mark == 2) //lock

{

lcd.setCursor(6, 0 );

lcd.print("Lock ");

Count = 0;

Count_1 = 0;

}

Modetime = millis();

}

lcd.setCursor(5, 1 );//Displays the value of Distance

lcd.print(Distance / 10000);

lcd.print((Distance / 1000) % 10);

lcd.print((Distance / 100) % 10);

lcd.print('.');

lcd.print((Distance / 10) % 10);

lcd.print(Distance % 10);

}

void interrupt()//Interrupt handler

{

VB = digitalRead(B);

if (Mark == 1)//Detects whether the current mode is a measurement

{

if (VB == 1)//To determine whether the positive measurement

{

flag = 1;

if (Count > 0xffff)

{

Count_1 -= 1;

}

Count = 1;

}

else//Reverse measurement

{

flag = 0;

Count -= 1;

if (Count > 0xFFFF)

{

Count_1 = 1;

}

}

//Count is cleared over the range

if (Count < 0xFFFF && Count > 0x294A)

Count = 0;

else if (Count < 0xFFFFD6B5 && Count > 0xFFFF)

Count = 0;

}

}

,

免责声明:本文仅代表文章作者的个人观点,与本站无关。其原创性、真实性以及文中陈述文字和内容未经本站证实,对本文以及其中全部或者部分内容文字的真实性、完整性和原创性本站不作任何保证或承诺,请读者仅作参考,并自行核实相关内容。文章投诉邮箱:anhduc.ph@yahoo.com

    分享
    投诉
    首页