一、Arduino
Arduino是一个开放源码电子原型平台,拥有灵活、易用的硬件和软件。Arduino专为设计师,工艺美术人员,业余爱好者,以及对开发互动装置或互动式开发环境感兴趣的人而设的。
Arduino可以接收来自各种传感器的输入信号从而检测出运行环境,并通过控制光源,电机以及其他驱动器来影响其周围环境。板上的微控制器编程使用Arduino编程语言(基于Wiring)和Arduino开发环境(以Processing为基础)。Arduino可以独立运行,也可以与计算机上运行的软件(例如,Flash,Processing,MaxMSP)进行通信。Arduino开发 IDE 接口基于开放源代码,可以让您免费下载使用开发出更多令人惊艳的互动作品。
二、超声波模块——HC-SR04
超声波发射器向某一方向发射超声波,在发射的同时开始计时,超声波在空气中传播,途中碰到障碍物就立即返回来,超声波接收器收到反射波就立即停止计时。
1、超声波测距原理:时间差测距法
声波在空气中的传播速度为340m/s,根据计时器记录的时间t,就可以计算出发射点距障碍物的距离s,即:s=340m/s× t / 2
2、工作原理:
1)通过某个引脚(IO)给至少10us的高电平信号触发测距;2)触发测距以后模块自动发送8个40khz的方波,自动检测是否有信号返回;3)如果有信号返回,通过IO输出一高电平,高电平持续时间就是超声波从发射到返回的时间4)测试距离=(高电平时间*声速(340M/S))/2;
VCC 是超声波距离传感器的电源,连接Arduino上的5V引脚。
Trig (Trigger) 引脚用于触发超声波脉冲——A0
Echo 回声当接收到反射信号时,引脚产生一个脉冲。脉冲的长度与检测发射信号所需的时间成正比——A1
GND 应该连接到Arduino的GND
代码示例:
int TrgPin = A0;
int EcoPin = A1;
float dist;
void setup()
{
Serial.begin(9600);//设置TrgPin为输出状态
pinMode(TrgPin, OUTPUT);// 设置EcoPin为输入状态
pinMode(EcoPin, INPUT);
}
void loop()
{
digitalWrite(TrgPin, LOW);
delayMicroseconds(8);
digitalWrite(TrgPin, HIGH);
delayMicroseconds(10);// 维持10毫秒高电平用来产生一个脉冲
digitalWrite(TrgPin, LOW);
dist = pulseIn(EcoPin, HIGH) / 58.00;// 读取脉冲的宽度并换算成距离
Serial.print("Distance:");
Serial.print(dist);
Serial.println("cm");
delay(300);
}
三、舵机——SG90舵机
舵机是一种位置(角度)伺服的驱动器。舵机只是一种通俗的叫法,其实质是一个伺服马达。
其中SG90为模拟舵机,其需要不断的发送相应角度的PWM信号,才能旋转到指定位置。例如:我现在让它旋转90度,我就需要在一个时间内不断的发送90度的PWM信号,舵机转动到指定位置就会停止。
舵机的转动角度大多为0~180°,其内部结构包括电机,控制电路和机械结构三部分。电机有三根线引出,分别接VCC、GNG和信号线。
主要有两种引出线的格式:
棕、红、橙(棕色连接GND、红色连接VCC、橙色连接信号);
红、黑、黄(红色连接VCC、黑色连接GND、黄色连接信号)。
工作原理
舵机的控制信号为周期是20ms 的脉宽调制(PWM)信号,其中脉冲宽度从0.5ms-2.5ms,相对应舵盘的位置为0—180度,呈线性变化。也就是说,给它提供一定的脉宽,它的输出轴就会保持在一个相对应的角度上,无论外界转矩怎样改变,直到给它提供一个另外宽度的脉冲信号,它才会改变输出角度到新的对应的位置上。舵机内部有一个基准电路,产生周期20ms,宽度1.5ms的基准信号,有一个比较器,将外加信号与基准信号相比较,判断出方向和大小,从而产生电机的转动信号。
控制电路板接受来自信号线相应的PWM控制信号,进而控制电机转动,电机带动一系列齿轮组,减速后传动至输出舵盘。舵机的输出轴和位置反馈电位计是相连的,舵盘转动的同时,带动位置反馈电位计,电位计将输出一个电压信号到控制电路板,进行反馈,然后控制电路板根据所在位置决定电机的转动方向和速度,从而达到目标停止。
舵机的控制需要MCU产生一个周期为20ms的脉冲信号,以0.5ms到2.5ms的高电平来控制舵机转动的角度。
代码示例:
#include <Servo.h> //加入含有舵机控制库的头文件#define PIN_SERVO 9 //舵机信号控制引脚
Servo myservo;
int pos=0;void setup()
{ myservo.attach(PIN_SERVO); //舵机初始化
} void loop() //0到180,再从180到0
{ for (pos=0;pos<=180;pos+=1){myservo.write(pos);delay(10);}for (pos=180;pos<=0;pos-=1){myservo.write(pos);delay(10);}//myservo.write(90); //PWM输出
}
四、水泵&继电器
说白了就是一个继电器控制的电机,电路导通则开始工作
继电器原理:弱电控制强电
NC:常闭端 NO:常开端 COM:公共端
VCC:电源正极 GND:电源负极 IN:信号输入端
五、语音播报——SYN6288
核心板接口为:BUSY GND TXD RXD VCC BIN0 NP0,其中 VCC GND 是用来供电,电压支持 3-5V,推荐使用5V;BUSY 为忙标志,高电平为忙(处于播放中),低电平为空闲;TXD RXD 为串口通信,其中 TXD 为发送端,接外设接收端;BIN0 BP0为喇叭接口,可以直接与 8R 0.5W 喇叭连接。记住喇叭必须是8R 0.5W。
官方给的示例:(播报内容被我改了)
/*
1.项目名称:Arduino综合测试板SYN6288语音合成模块测试程序
2.配套APP:无
3.主要原理:具体参考SYN6288数据手册,通过串口发送语音对应的数据
4.配套上位机:无
5.项目组成:SYN6288语音合成模块、Arduino综合测试板
6.项目功能:将文字转换为语音朗读出来。具体操作请看演示视频*///此处发送内容为:[m4][v16][t5]欢迎使用SYN6288语音合成模块
//v[0~16]:0背景音乐为静音,16背景音乐音量最大
//m[0~16]:0朗读音量为静音,16朗读音量最大
//t[0~5]:0朗读语速最慢,5朗读语速最快
//其他不常用功能请参考数据手册
void xiwan(){ //语音播报unsigned char i = 0;unsigned char head[20];head[0] = 0xFD; //FD 00 22 01 01 0D 0Ahead[1] = 0x00;head[2] = 0x0B;head[3] = 0x01;head[4] = 0x01;head[5] = 0xBF;head[6] = 0xAA; // C4 E3 BA C3 20 CE D2 CA C7 C8 AB head[7] = 0xCA;head[8] = 0xBC;head[9] = 0xCF;head[10] = 0xB4;head[11] = 0xCD;head[12] = 0xEB;head[13] = 0xC8;for(i=0; i<43; i++){Serial.write(head[i]);}
}void setup() {Serial.begin(9600);
}void loop() {xiwan();delay(2000);
}
全部代码如下:
#include <Servo.h>
//水泵+————继电器常开 -————地
//继电器公共端————正极
//各模块与arduino共地int relayPin = 13; //继电器引脚负也接到单片机上
int TrgPin = A0; //超声波引脚
int EcoPin = A1; //超声波引脚Servo myservo; //定义Servo对象来控制舵机
int pos = 0; //角度存储变量
float dist; //距离void xiwan() { //语音播报--开始洗碗unsigned char i = 0;unsigned char head[20];head[0] = 0xFD;head[1] = 0x00;head[2] = 0x0B;head[3] = 0x01;head[4] = 0x01;head[5] = 0xBF;head[6] = 0xAA;head[7] = 0xCA;head[8] = 0xBC;head[9] = 0xCF;head[10] = 0xB4;head[11] = 0xCD;head[12] = 0xEB;head[13] = 0xC8;for (i = 0; i < 43; i++) {Serial.write(head[i]);}
}void end() { //语音播报--洗碗完成unsigned char s = 0;unsigned char head1[20];head1[0] = 0xFD;head1[1] = 0x00;head1[2] = 0x0B;head1[3] = 0x01;head1[4] = 0x01;head1[5] = 0xCF;head1[6] = 0xB4;head1[7] = 0xCD;head1[8] = 0xEB;head1[9] = 0xCD;head1[10] = 0xEA;head1[11] = 0xB3;head1[12] = 0xC9;head1[13] = 0xF6;for (s = 0; s < 53; s++) {Serial.write(head1[s]);}
}void setup() {myservo.attach(9, 500, 2500); //修正脉冲宽度pinMode(TrgPin, OUTPUT); //设置TrgPin为输出状态pinMode(EcoPin, INPUT); // 设置EcoPin为输入状态pinMode(relayPin, OUTPUT); //设置引脚13为输出接口Serial.begin(9600); //设置波特率为9600,这里要跟软件设置相一致。当接入特定设备时,我们也要跟其他设备的波特率达到一致。digitalWrite(relayPin, HIGH); //防止一上电继电器就工作
}void loop() {digitalWrite(TrgPin, LOW);delayMicroseconds(8);digitalWrite(TrgPin, HIGH);delayMicroseconds(10); // 维持10毫秒高电平用来产生一个脉冲digitalWrite(TrgPin, LOW);dist = pulseIn(EcoPin, HIGH) / 58.00; // 读取脉冲的宽度并换算成距离if (dist <= 6 && dist > 1) // 距离小等于6cm{digitalWrite(relayPin, LOW); //水泵开始工作xiwan(); //语音播报delay(2000); //等待语音播报完成for (pos = 0; pos <= 180; pos++) { // 0°到180°myservo.write(pos); // 舵机角度写入delay(5); // 等待转动到指定角度}for (pos = 180; pos >= 0; pos--) { // 从180°到0°myservo.write(pos); // 舵机角度写入delay(5); // 等待转动到指定角度}}else {digitalWrite(relayPin, HIGH); //水泵停止工作end(); //语音播报delay(2000); // 等待播报}
}