探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)

**

------------探测距离机器人模型:通过超声波测距控制舵机转向,LED灯,语音播放,蜂鸣器(米思齐mixly,arduino)

一、 初始化设置

在初始化这里要先设置波特率。并且把初始超声波测距的初值赋值为0.
之后主要是设置蜂鸣器里面播放的音乐,我设置的是胡夏的“那些年”,有兴趣可以搜个乐谱自己打上去。tonelist为频率,几乎都是一样的,读者可以直接把我的输入在自己的上面。而musiclist为音符,就是我们熟悉的“do re mi fa so la si".而highlist为音高,想了解的可以自己搜一下。最后的rhythmlist为节拍,先看是以几分音符为一拍,比如一个音乐为四分之四拍,每个对应为1拍。(我们知道,音符节奏分为一拍、半拍、1/4拍、1/8拍,我们规定一拍音符的时间为1;半拍为0.5;1/4拍为0.25;1/8拍为0.125……,)几个特殊音符说明如下:

第一,普通音符。如第一个音符3,对应频率350,占1拍。

第二,带下划线音符,表示0.5拍;两个下划线是四分之一拍(0.25)。

第三,有的音符后带一个点,表示多加0.5拍,即1+0.5。

第四,有的音符后带一个“—”,表示多加1拍,即1+1。
读者可以自己搜乐谱来绘制自己的蜂鸣器音乐。

二、设置自己的音乐播放

根据自己想让你的执行蜂鸣器的时候播放到音乐的什么位置而停来设置i从1到某数。
三、主功能控制

我们需要先设置好每一个模块的管脚,注意数字输出和模拟输出的区别,在此程序区别不大,就不加赘述了。然后把它们之间的对应关系整理好,让他们能正常的执行你想要的功能。
在这里我分别把3个LED灯接在面包板上并对应管脚A2,2,12的正极接在S,负极接在G。
把语音模块接在A5上,其中P-L接在S,正极接V,负极接G。
把蜂鸣器和舵机分别用上面接在管脚8的播放程序procedure和管脚4控制。
然后把这些接在arduino板子上。

四,硬件连接
把各个模块按照程序里的管脚连接上去,并且把语音模块的语音录好如果觉得声音较小还可以接一个功放模块,超声波和舵机通过支架接好,LED灯必须接电阻,否则会烧坏。




在这里插入图片描述

五、运行上传并执行

看官可以根据自己的喜好设计个外形,把这些模块封装起来。
在这里插入图片描述
六、arduino代码
编程能力好的也可以在arduino里用代码写,具体如下:

#include <Servo.h>

volatile int juli;
volatile float speed;
volatile long updown;

float tonelist[]={1046.5,1174.7,1318.5,1396.9,1568,1760,1975.5};

long musiclist[]={0,1,1,2,3,3,3,4,3,3,0,3,2,1,2,2,2,4,3,3,0,2,1,7,1,1,7,1,7,6,5,5,5};

long highlist[]={0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,0,-1,0,0,-1,0,-1,-1,-1,-1,-1};

long rhythmlist[]={8,8,8,8,4,4,4,8,8,2,8,8,8,8,4,4,4,8,8,2,4,4,4,8,8,4,8,4,4,4,8,8,2};

void procedure() {
  for (int i = 1; i <= 30; i = i + (1)) {
    tone(8,tonelist[(int)(musiclist[(int)(i - 1)] - 1)] * pow(2, highlist[(int)(i - 1)]));
    delay((2000 / rhythmlist[(int)(i - 1)]));
    noTone(8);
    delay(10);
  }
}

float checkdistance_A1_A0() {
  digitalWrite(A1, LOW);
  delayMicroseconds(2);
  digitalWrite(A1, HIGH);
  delayMicroseconds(10);
  digitalWrite(A1, LOW);
  float distance = pulseIn(A0, HIGH) / 58.00;
  delay(10);
  return distance;
}

Servo servo_4;

void setup(){
  Serial.begin(9600);
  juli = 0;
  speed = 120.0;
  updown = 0;
  pinMode(8, OUTPUT);
  pinMode(A1, OUTPUT);
  pinMode(A0, INPUT);
  pinMode(12, OUTPUT);
  servo_4.attach(4);
  pinMode(2, OUTPUT);
}

void loop(){
  juli = checkdistance_A1_A0();
  Serial.println(String(juli).toInt());
  if (juli < 10) {
    pinMode(A2, OUTPUT);
    digitalWrite(A2,HIGH);
    pinMode(A5, OUTPUT);
    digitalWrite(A5,HIGH);
    digitalWrite(12,LOW);
    servo_4.write(90);
    delay(1000);

  } else if (juli < 30) {
    digitalWrite(2,HIGH);
    digitalWrite(12,LOW);
    procedure();
  } else {
    digitalWrite(12,HIGH);
    servo_4.write(180);
    delay(1000);

  }
  pinMode(A5, OUTPUT);
  digitalWrite(A5,LOW);
  pinMode(A2, OUTPUT);
  digitalWrite(A2,LOW);
  digitalWrite(2,LOW);
  delay(1000);

}

感兴趣的朋友可以自己动手试试,欢迎关注后续文章。

发布了30 篇原创文章 · 获赞 29 · 访问量 9299

猜你喜欢

转载自blog.csdn.net/qq_44629109/article/details/88901991