/*
【Arduino】66种传感器模块系列实验(48)
实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)
实验代码之二
*/
#include <Wire.h>
#define DEVICE (0x53)
#define TO_READ (6)
byte buff ;
char str;
int regAddress = 0x32;
int x, y, z;
double roll = 0.00, pitch = 0.00;
void setup() {
Wire.begin();
Serial.begin(9600);
writeTo(DEVICE, 0x2D, 0);
writeTo(DEVICE, 0x2D, 16);
writeTo(DEVICE, 0x2D, 8);
}
void loop() {
readFrom(DEVICE, regAddress, TO_READ, buff);
x = (((int)buff) << 8) | buff;
y = (((int)buff)<< 8) | buff;
z = (((int)buff) << 8) | buff;
//we send the x y z values as a string to the serial port
Serial.print("The acceleration info of x, y, z are:");
sprintf(str, "%d %d %d", x, y, z);
Serial.print(str);
Serial.write(10);
RP_calculate();
Serial.print("Roll:"); Serial.println( roll );
Serial.print("Pitch:"); Serial.println( pitch );
Serial.println("");
delay(300);
}
void writeTo(int device, byte address, byte val) {
Wire.beginTransmission(device);
Wire.write(address);
Wire.write(val);
Wire.endTransmission();
}
void readFrom(int device, byte address, int num, byte buff[]) {
Wire.beginTransmission(device);
Wire.write(address);
Wire.endTransmission();
Wire.beginTransmission(device);
Wire.requestFrom(device, num);
int i = 0;
while(Wire.available())
{
buff = Wire.read();
i++;
}
Wire.endTransmission();
}
void RP_calculate(){
double x_Buff = float(x);
double y_Buff = float(y);
double z_Buff = float(z);
roll = atan2(y_Buff , z_Buff) * 57.3;
pitch = atan2((- x_Buff) , sqrt(y_Buff * y_Buff + z_Buff * z_Buff)) * 57.3;
}
/*
【Arduino】66种传感器模块系列实验(48)
实验四十八:GY-291 数字三轴重力加速度倾斜度模块 (IIC/SPI传输)
实验代码之三
*/
#include <Wire.h>
#define Register_ID 0
#define Register_2D 0x2D
#define Register_X0 0x32
#define Register_X1 0x33
#define Register_Y0 0x34
#define Register_Y1 0x35
#define Register_Z0 0x36
#define Register_Z1 0x37
int ADXAddress = 0xA7 >> 1;
int reading = 0;
int val=0;
int X0,X1,X_out;
int Y0,Y1,Y_out;
int Z1,Z0,Z_out;
double Xg,Yg,Zg;
void setup()
{
Wire.begin();
Serial.begin(9600);
delay(100);
Wire.beginTransmission(ADXAddress);
Wire.write(Register_2D);
Wire.write(8);
Wire.endTransmission();
}
void loop()
{
Wire.beginTransmission(ADXAddress);
Wire.write(Register_X0);
Wire.write(Register_X1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
X0 = Wire.read();
X1 = Wire.read();
X1=X1<<8;
X_out=X0+X1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Y0);
Wire.write(Register_Y1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Y0 = Wire.read();
Y1 = Wire.read();
Y1=Y1<<8;
Y_out=Y0+Y1;
}
Wire.beginTransmission(ADXAddress);
Wire.write(Register_Z0);
Wire.write(Register_Z1);
Wire.endTransmission();
Wire.requestFrom(ADXAddress,2);
if(Wire.available()<=2)
{
Z0 = Wire.read();
Z1 = Wire.read();
Z1=Z1<<8;
Z_out=Z0+Z1;
}
Xg=X_out;
Yg=Y_out;
Zg=Z_out;
Serial.print("X= ");
Serial.print(Xg);
Serial.print(" ");
Serial.print("Y= ");
Serial.print(Yg);
Serial.print(" ");
Serial.print("Z= ");
Serial.print(Zg);
Serial.println("");
delay(200);
}
实验四十九:有源蜂鸣器报警器发声模块 (低电平触发)
压电陶瓷片
压电陶瓷片,俗称蜂鸣片。压电陶瓷片是一种电子发音元件,在两片铜制圆形电极中间放入压电陶瓷介质材料,当在两片电极上面接通交流音频信号时,压电片会根据信号的大小频率发生震动而产生相应的声音来。压电陶瓷片由于结构简单造价低廉,被广泛的应用于电子电器方面如:玩具,发音电子表,电子仪器,电子钟表,定时器等方面。超声波电机就是利用相关的性质制成的。
工作原理
当电压作用于压电陶瓷时,就会随电压和频率的变化产生机械变形。另一方面,当振动压电陶瓷时,则会产生一个电荷。利用这一原理,当给由两片压电陶瓷或一片压电陶瓷和一个金属片构成的振动器,所谓叫双压电晶片元件,施加一个电信号时,就会因弯曲振动发射出超声波。相反,当向双压电晶片元件施加超声振动时,就会产生一个电信号。基于以上作用,便可以将压电陶瓷用作超声波传感器。
压电蜂鸣器
是一种电声转换器件。将压电材料粘贴在金属片上,当压电材料和金属片两端施加上一个电压后,因为逆压电效应,蜂鸣片就会产生机械变形而发出声响。压电材料有多种,用在蜂鸣片上的压电材料通常是高压极化后的压电陶瓷片。压电式蜂鸣器通常呈圆形,由压电陶瓷片、引线和共鸣腔组成。而中间的压电陶瓷片又由金属镀层、陶瓷片、胶水、金属片构成。从电学角度来看,压电陶瓷可以简化为一个电感和一个电容的串联模型。压电式蜂鸣器具有体积小、灵敏度高、耗电省、可靠性好,造价低廉的特点和良好的频率特性。因此它广泛应用于各种电器产品的报警、发声用途。最常见的莫过于音乐贺卡、电子手表、袖珍计算器、电子门铃和电子玩具等小型电子用品上作发声器件。
主要优点
1、因无可动触点部分,因此寿命长、可靠性高,连续使用可达10000小时以上,是半永久性的器件
2、不产生飞弧或者射频噪声,对其他线路无干扰
3、不会因松动而引起大的振动
4、用电子线路控制,所以能发出多种悦耳的声音及模拟声、断续声。音色纯正,不易被噪声所覆盖
5、用电压激励,所以消耗电流小,一般在20mA以下,不会超过100mA
6、小型大音量。音量可达到70分贝/20cm,而元件厚度仅为1mm以下
7、工作温度范围宽
8、便于安装,而且无电磁线圈和动圈,不必担心绝缘恶化,并无漏电的可能