能够测量分隔两个位置的距离的需求可以在我们日常生活的不同领域有许多应用。
从获得两个位置之间足够距离的那一刻起,就可以通过执行这些功能的算法来开发和设计自动门系统、安全系统、监控和各种自动化系统。
从那里,您将学习如何组装有趣的机器人。这个有趣的机器人是一个小型机器人,它使用带有 LED 和超声波传感器的教学案例来计算距离。
其案例如图1所示。
对于这个教学案例的实施,您将学习如何使用 UNO arduino 组装基本电路并创建编程。
如您所见,外壳具有类似于笑脸的结构和一些侧面 LED,以指示其前方物体或人的接近程度。LED 点亮的这个距离将在所提供的程序中实现。
在这个项目中,使用了超声波传感器 HC-SR04,它的工作原理是发射和接收声波。
在本文中,您将学习如何编程和使用 HC-SR04 超声波传感器并了解其工作原理。
因此,通过本文,您将了解到:
现在,我们将开始全面介绍使用 Arduino UNO 开发的 Didactic 超声波传感器 HC-SR04。
该项目包括展示一个使用 HC-SR04 超声波传感器和 UNO arduino 开发板的教学模型。
该项目基本上由 LED、超声波传感器 HC-SR04、UNO arduino 开发板组成,它将发送必要的脉冲来读取传感器的距离,如图 2 所示。
超声波传感器发出的信号类似于在空间中传播的波,通过这种方式,它将检测到离物体最近的结构,如图 3 所示。
HC-SR04 超声波传感器基本上由一个振荡晶体、一个发射器和接收器声波脉冲以及电源引脚构成。
传感器发送高频声波。它们与路径上的某个物体发生碰撞并返回传感器,传感器将捕获它们。
最后,我们使用平均速度方程,如方程 1 所示,它允许我们计算声波行进的距离。
Espaço (m) = Velocidade (m/s)* 速度 (s)
根据计算出的距离,LED 将被激活以指示有趣机器人与物体的接近程度。
要设置实验,首先确保您的 Arduino 已通过断开 USB 电缆的连接来关闭。现在,将组件连接起来,如下图 5 所示。
根据图 5 所示的接线图,实验由传感器、arduino uno 电路、LED 和电阻器组成的电路组成。
使用的传感器是 HC-SR04,它有 4 个引脚,电源引脚 (Vdc) 通过原型板连接到 arduino uno 的 5 伏电压,以及它的 GND。
触发引脚将连接到数字引脚 4,它负责每 10 微秒(微秒)发送一次脉冲。最后是连接到数字引脚 5 的 Echo 引脚。
正确连接电路后,根据完整代码开始编程,如下图所示。
//inicio - leds
int Led_azul1 = 2;
int Led_azul2 = 3;
int Led_amarelol = 6;
int Led_amarelo2 = 7;
int Led_vermelho1 = 8;
int Led_vermelho2 = 9;
int Led_verde1 = 10;
int Led_verde2 = 11;
//fim - leds
int inches = 0;
float cm = 0;
int triggerPin = 4;
int echoPin = 5;
long readUltrasonicDistance(int triggerPin, int echoPin)// funçao responsavel por processar o sinal dos pinos Trig e Echo
{
pinMode(triggerPin, OUTPUT); // apaga o pino de Trig
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
// coloca o pino de Trig em nivel logico alto por 10 us
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
// Lê o pino Echo, e retorna o tempo de trajetoria da onda em microsegundos
return pulseIn(echoPin, HIGH);
}
void setup()
{
pinMode(Led_azul1,OUTPUT);
pinMode(Led_azul2,OUTPUT);
pinMode(Led_amarelol,OUTPUT);
pinMode(Led_amarelo2,OUTPUT);
pinMode(Led_vermelho1,OUTPUT);
pinMode(Led_vermelho2,OUTPUT);
pinMode(Led_verde1,OUTPUT);
pinMode(Led_verde2,OUTPUT);
Serial.begin(9600);
}
void loop()
{
// medida do sinal em centimetros
cm = 0.01723 * readUltrasonicDistance(4, 5);
// para converter o valor de centimetros em polegadas basta dividir por 2.54
inches = (cm / 2.54);
/*ANOTACOES
distancia minima 3
distancia maxima 336
intervalo 333
Quantidade de leds 8
relação cm/leds = 41.625
led_azul1 3 cm a 44.625 cm
led_azul2 44.625 cm a 86.25 cm
led_amarelo1 86.25 cm a 127.875 cm
led_amarelo2 127.875 cm a 169.5 cm
led_vermelho1 169.5 cm a 211.125 cm
led_vermelho2 211.125 cm a 252.75 cm
led_verde1 252.75 cm a 294.375 cm
led_verde2 294.375 cm a 336 cm
*/
//INICIO - CONDICAO LEDS
if((cm>=3)&&(cm<44.625)){
digitalWrite(Led_azul1, HIGH);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=44.625)&&(cm<86.25)){
digitalWrite(Led_azul1,LOW);
digitalWrite(Led_azul2,HIGH);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=86.25)&&(cm<127.875)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,HIGH);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=127.875)&&(cm<169.5)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,HIGH);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=169.5)&&(cm<211.125)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, HIGH);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=211.125)&&(cm<252.75)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, HIGH);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=252.75)&&(cm<294.375)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,HIGH);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=294.375)&&(cm<336)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,HIGH);
}
//FIM - CONDICAO LEDS
inches = (cm / 2.54);
Serial.print(inches);Serial.print("in, ");Serial.print(cm);Serial.println("cm");delay(100); // aguarda 100 milisegundos
}
正确连接电路后,根据下面给出的代码开始编程,该代码说明了每个 LED 的数字引脚的定义、变量的初始化以及负责处理 Trigger 和 Echo 引脚上的信号的函数。
//inicio - leds
int Led_azul1 = 2;
int Led_azul2 = 3;
int Led_amarelol = 6;
int Led_amarelo2 = 7;
int Led_vermelho1 = 8;
int Led_vermelho2 = 9;
int Led_verde1 = 10;
int Led_verde2 = 11;
//fim - leds
int inches = 0;
float cm = 0;
int triggerPin = 4;
int echoPin = 5;
long readUltrasonicDistance(int triggerPin, int echoPin)// funçao responsavel por processar o sinal dos pinos Trig e Echo
{
pinMode(triggerPin, OUTPUT); // apaga o pino de Trig
digitalWrite(triggerPin, LOW);
delayMicroseconds(2);
// coloca o pino de Trig em nivel logico alto por 10 us
digitalWrite(triggerPin, HIGH);
delayMicroseconds(10);
digitalWrite(triggerPin, LOW);
pinMode(echoPin, INPUT);
// Lê o pino Echo, e retorna o tempo de trajetoria da onda em microsegundos
return pulseIn(echoPin, HIGH);
}
之后,我们就有了 void setup 函数。所有 LED 引脚都配置为数字输出。代码如下所示。
void setup()
{
pinMode(Led_azul1,OUTPUT);
pinMode(Led_azul2,OUTPUT);
pinMode(Led_amarelol,OUTPUT);
pinMode(Led_amarelo2,OUTPUT);
pinMode(Led_vermelho1,OUTPUT);
pinMode(Led_vermelho2,OUTPUT);
pinMode(Led_verde1,OUTPUT);
pinMode(Led_verde2,OUTPUT);
Serial.begin(9600);
}
LED 根据距离范围触发。void 循环函数中的代码如下所示。
void loop()
{
// medida do sinal em centimetros
cm = 0.01723 * readUltrasonicDistance(4, 5);
// para converter o valor de centimetros em polegadas basta dividir por 2.54
inches = (cm / 2.54);
/*ANOTACOES
distancia minima 3
distancia maxima 336
intervalo 333
Quantidade de leds 8
relação cm/leds = 41.625
led_azul1 3 cm a 44.625 cm
led_azul2 44.625 cm a 86.25 cm
led_amarelo1 86.25 cm a 127.875 cm
led_amarelo2 127.875 cm a 169.5 cm
led_vermelho1 169.5 cm a 211.125 cm
led_vermelho2 211.125 cm a 252.75 cm
led_verde1 252.75 cm a 294.375 cm
led_verde2 294.375 cm a 336 cm
*/
//INICIO - CONDICAO LEDS
if((cm>=3)&&(cm<44.625)){
digitalWrite(Led_azul1, HIGH);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=44.625)&&(cm<86.25)){
digitalWrite(Led_azul1,LOW);
digitalWrite(Led_azul2,HIGH);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=86.25)&&(cm<127.875)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,HIGH);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=127.875)&&(cm<169.5)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,HIGH);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=169.5)&&(cm<211.125)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, HIGH);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=211.125)&&(cm<252.75)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, HIGH);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=252.75)&&(cm<294.375)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,HIGH);
digitalWrite(Led_verde2,LOW);
}
else if((cm>=294.375)&&(cm<336)){
digitalWrite(Led_azul1, LOW);
digitalWrite(Led_azul2, LOW);
digitalWrite(Led_amarelol,LOW);
digitalWrite(Led_amarelo2,LOW);
digitalWrite(Led_vermelho1, LOW);
digitalWrite(Led_vermelho2, LOW);
digitalWrite(Led_verde1,LOW);
digitalWrite(Led_verde2,HIGH);
}
//FIM - CONDICAO LEDS
inches = (cm / 2.54);
Serial.print(inches);Serial.print("in, ");Serial.print(cm);Serial.println("cm");delay(100); // aguarda 100 milisegundos
}
正如您在上面的代码中看到的,传感器以厘米为单位读取距离。
之后,我们验证插入此距离的间隔,并激活一组 LED 来发出距离信号。
从物体到有趣的机器人的距离越大,激活的 LED 数量就越多。
除此代码外,还开发了一个特殊案例,它将接收超声波传感器、电阻器和 LED。Arduino 将与外部连接。
搞笑机器人案例如图 12 所示。
从电路的组装和arduino uno的编程,可以存储教学案例横向区域中使用的每个LED,以及将超声波传感器和对应于所需螺钉的孔耦合到结案。
这可以在图 13 中看到。
紧接着,外壳的背面将存储为 LED 选择的电阻器。为此,为每个电阻器建模了一个小腔,如图 14 所示。
为了最终确定控制结构,我们开发了NEXTPCB 印刷电路板。该板旨在帮助对有趣的机器人进行编程。
从有趣的机器人项目中,开发了NEXTPCB 印刷电路板,如图 15 所示。
该印刷电路板是根据以下电子原理图开发的。
如果需要,您可以访问此链接并下载所有文件以生产您的印刷电路板 - NEXTPCB Gerber 文件
从这个项目中,您将能够组装您的有趣机器人并使用NEXTPCB 印刷电路板获得您的印刷电路板。
因此,从这个项目的开发中,除了分析与NANO arduino的通信外,还可以了解HR-SR04超声波传感器的结构并了解其操作。
当传感器发出声波爆发时,实验得出结论,在某些情况下,这些爆发与具有不均匀表面的结构发生碰撞。
当发生这种现象时,距离值有可能出现错误。您会注意到,在某些位置,不止一个 LED 会亮起。
我们感谢NEXTPCB 印刷电路板提供印刷电路板。
此外,我们要感谢Escola Robô Lúdico do Brasil 对该项目的支持和发展。
声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉
全部0条评论
快来发表一下你的评论吧 !