×

如何组装有趣的机器人

消耗积分:0 | 格式:zip | 大小:0.06 MB | 2022-12-01

旧念

分享资料个

描述

能够测量分隔两个位置的距离的需求可以在我们日常生活的不同领域有许多应用。

从获得两个位置之间足够距离的那一刻起,就可以通过执行这些功能的算法来开发和设计自动门系统、安全系统、监控和各种自动化系统。

从那里,您将学习如何组装有趣的机器人。这个有趣的机器人是一个小型机器人,它使用带有 LED 和超声波传感器的教学案例来计算距离。

其案例如图1所示。

poYBAGNtnC2AByb9AAB8FSQBRG0414.jpg
图 1 - 实施 HC-SR04 超声波传感器的教学案例。
 

对于这个教学案例的实施,您将学习如何使用 UNO arduino 组装基本电路并创建编程。

如您所见,外壳具有类似于笑脸的结构和一些侧面 LED,以指示其前方物体或人的接近程度。LED 点亮的这个距离将在所提供的程序中实现。

在这个项目中,使用了超声波传感器 HC-SR04,它的工作原理是发射和接收声波。

在本文中,您将学习如何编程和使用 HC-SR04 超声波传感器并了解其工作原理。

因此,通过本文,您将了解到:

  • 了解HC-SR04超声波传感器的结构;
  • 了解HC-SR04超声波传感器的操作;
  • 执行超声波传感器 HC-SR04 和 Arduino UNO R3 之间的通信
  • 将超声波传感器 HC-SR04 的结构展示给 SILICIOS LAB 开发的教学案例。

现在,我们将开始全面介绍使用 Arduino UNO 开发的 Didactic 超声波传感器 HC-SR04。

探索如何开发有趣的机器人

该项目包括展示一个使用 HC-SR04 超声波传感器和 UNO arduino 开发板的教学模型。

该项目基本上由 LED、超声波传感器 HC-SR04、UNO arduino 开发板组成,它将发送必要的脉冲来读取传感器的距离,如图 2 所示。

pYYBAGNtnEKAfVV_AAgIyTMGc34249.jpg
图 2 - 为超声波传感器的操作建议的电路。
 

超声波传感器发出的信号类似于在空间中传播的波,通过这种方式,它将检测到离物体最近的结构,如图 3 所示。

HC-SR04 超声波传感器基本上由一个振荡晶体、一个发射器和接收器声波脉冲以及电源引脚构成。

传感器发送高频声波。它们与路径上的某个物体发生碰撞并返回传感器,传感器将捕获它们。

最后,我们使用平均速度方程,如方程 1 所示,它允许我们计算声波行进的距离。

Espaço (m) = Velocidade (m/s)* 速度 (s)

根据计算出的距离,LED 将被激活以指示有趣机器人与物体的接近程度。

要设置实验,首先确保您的 Arduino 已通过断开 USB 电缆的连接来关闭。现在,将组件连接起来,如下图 5 所示。

poYBAGNtnEmAQ_9rAAFnKlmpWAg991.png
图 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 所示。

pYYBAGOIFnCAI3fvAAB6CiriFbM097.jpg
图 12- 用于超声波传感器、电阻器和 LED 的教学案例。
 

从电路的组装和arduino uno的编程,可以存储教学案例横向区域中使用的每个LED,以及将超声波传感器和对应于所需螺钉的孔耦合到结案。

这可以在图 13 中看到。

poYBAGNtnC2AByb9AAB8FSQBRG0414.jpg
图 13 - 将 LED 和传感器安装到外壳上。
 

紧接着,外壳的背面将存储为 LED 选择的电阻器。为此,为每个电阻器建模了一个小腔,如图 14 所示。

poYBAGOIN6WADzRUAAB602PnUdc557.jpg
图 14 - 用于存放电阻器的后壳结构。
 

为了最终确定控制结构,我们开发了NEXTPCB 印刷电路板该板旨在帮助对有趣的机器人进行编程。

NEXTPCB印刷电路板

从有趣的机器人项目中,开发了NEXTPCB 印刷电路板,如图 15 所示。

poYBAGOIN6iAEMu2AADHJhPkQ5s731.png
图 15 - 有趣的机器人 NEXTPCB 印刷电路板。
 

该印刷电路板是根据以下电子原理图开发的。

poYBAGOIN6uAIx5rAAMsd0Vz0n8527.png
图 15 - 控制滑稽机器人的电子原理图。
 

如果需要,您可以访问此链接并下载所有文件以生产您的印刷电路板 - NEXTPCB Gerber 文件

从这个项目中,您将能够组装您的有趣机器人并使用NEXTPCB 印刷电路板获得您的印刷电路板

结论

因此,从这个项目的开发中,除了分析与NANO arduino的通信外,还可以了解HR-SR04超声波传感器的结构并了解其操作。

当传感器发出声波爆发时,实验得出结论,在某些情况下,这些爆发与具有不均匀表面的结构发生碰撞。

当发生这种现象时,距离值有可能出现错误。您会注意到,在某些位置,不止一个 LED 会亮起。

致谢

我们感谢NEXTPCB 印刷电路板提供印刷电路板。

此外,我们要感谢Escola Robô Lúdico do Brasil 对该项目的支持和发展。


声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容侵权或者其他违规问题,请联系本站处理。 举报投诉

评论(0)
发评论

下载排行榜

全部0条评论

快来发表一下你的评论吧 !