步骤1:介绍加速度计ADXL335
在本教程中,我们将展示如何使用库显示球并使用加速度计使其在屏幕上移动。我们将使用的加速度计是ADXL335。
该传感器可以测量x,y和z轴上的加速度,就像重力引起的加速度一样。因此,如果传感器在静止状态下与地面平行,则只有一根轴会感觉到重力加速度。倾斜设备时,其他轴也会开始感觉到重力加速度。这样,就有可能分析设备的移动方式。
步骤2:将加速度计添加到OLED设置
现在我们知道了OLED和加速度计的工作原理,现在该创建设置了。
首先,我们需要按照上图所示的以下方式将传感器添加到OLED设置中。
传感器的针脚如下所示连接到Arduino:
VCC – 5V
GND – GND
X – A3
Y – A2
Z和ST保持未连接状态
步骤3:代码
设置好连线后,我们可以使用以下代码创建游戏:
#include
#include
#include
#include
using namespace JUGL;
SSD1306_128x64 driver;
const int xpin = A3; //Assign pin A3 to x
const int ypin = A2; //Assign pin A2 to y
int x, y, x1, y1, r, varx, vary, width, height; //Define variables
int xy [2]; //Array to hold (x,y) coordinate
//Declaration of functions
void Circle(IScreen& scr);
void move_right(IScreen& scr);
void stop_right(IScreen& scr);
void move_left(IScreen& scr);
void stop_left(IScreen& scr);
void move_up(IScreen& scr);
void stop_up(IScreen& scr);
void move_down(IScreen& scr);
void stop_down(IScreen& scr);
void setup(){
IScreen& screen = driver; //Make reference to driver
screen.Begin(); //Initialize screen
width = screen.GetWidth(); //Get width of screen (128)
height = screen.GetHeight(); //Get height of screen (64)
Circle(screen); //Draw circle
}
void loop(){
x1 = analogRead(xpin); //Read x analog data
y1 = analogRead(ypin); //Read y analog data
IScreen& screen = driver; //Make reference to driver
if(x1《500){ //Check if sensor is tilted to the right
move_right(screen); //Move ball right
if(varx》=width-1-r ){ //Check if ball reached end of screen
stop_right(screen); //Stop moving
}
}
if(x1》520){ //Check if sensor is tilted to the left
move_left(screen); //Move ball left
if(varx=height-1-r){ //Check if ball reached end of screen
stop_up(screen); //Stop moving
}
}
if(y1》510){ //Check if sensor is tilted down
move_down(screen); //Move ball down
if(varyr){ //Check if ball is within boundaries
scr.Flush(); //Display on screen
}
}
void stop_left(IScreen& scr){
scr.Clear(); //Clear screen
varx = r; //Update varx
xy[0] = varx; //Store new varx value
scr.FillCircle(Point(5,xy[1]),r); //Draw circle
scr.Flush(); //Display on screen
}
void move_up(IScreen& scr){
scr.Clear(); //Clear screen
vary += 10; //Move ball 10 pixels up, assign value to vary
xy[1] = vary; //Store new vary value
scr.FillCircle(Point(xy[0],vary),r); //Draw circle
if(varyr){ //Check if ball is within boundaries
scr.Flush(); //Display on screen
}
}
void stop_down(IScreen& scr){
scr.Clear(); //Clear screen
vary = r; //Update vary
xy[1] = vary; //Store new vary value
scr.FillCircle(Point(xy[0],5),r); //Draw circle
scr.Flush(); //Display on screen
}
第4步:代码说明
所以这是代码中正在发生的事情。首先,我们包含了运行该程序所需的所有库。 JUGL库包含绘制圆所需的功能,而JUGL_SSD1306_128x64库用于初始化屏幕。最后一个库还包含“ DrawPoint”和“ Flush”功能,以绘制圆的每个像素并将其显示在屏幕上。 SPI和Wire库用于通过SPI或I2C与设备通信。在这种情况下,我们正在使用I2C通信。由于该库支持许多驱动程序,因此需要指定我们正在使用的驱动程序。第6行通过指定在128x64屏幕上使用驱动程序SSD1306来解决此问题。以下是该库支持的其他驱动程序:
EPD 2.0
EPD 1.44
EPD 2.7
PCF8833
KS0107
在代码的下一部分,我们将Arduino的模拟输入A3和A2分别分配给传感器的x和y引脚。我们还定义了将要使用的变量,并创建一个数组来保存x和y坐标(球的原点)。然后,对将在此程序中使用的功能进行前向声明。
接下来,我们转到代码的设置部分。在这里,我们引用了正在使用的驱动程序。基于参考,我们初始化屏幕,并获取其宽度和高度。最后,我们将函数称为“圆形”。该函数清除屏幕并设置球的半径和原点。我们使用库中的“ FillCircle”和“ Flush”功能绘制球并显示。这将在屏幕的左下角生成一个球,该球的半径为5个像素,原点为(5,5)。
步骤5:动作中的传感器
现在我们有了球,我们可以使用传感器使其移动。
在程序的循环部分中,我们引用了我们再次使用的驱动程序。然后,我们从引脚x和y读取数据,并将值分别分配给变量x1和y1。上表显示了每个引脚的值,具体取决于设备的倾斜度。
通过将这些值与“静止”值进行比较,我们可以确定设备是否向右,向左倾斜,等。让我们以程序中的第一种情况为例。
我们知道,如果设备向右倾斜,则“静止”值将减小。发生这种情况时,程序将调用函数“ move_right”。该函数清除屏幕,然后将值10添加到变量“ varx”(在这种情况下为零)。这表示我们要在x轴上移动球原点的像素数。然后,我们将新值“ varx”存储在数组的第一个位置。最后,我们调用“ FillCircle”和“ Flush”函数在屏幕上显示一个新的圆,该新圆与x轴上的上一个圆相距10个像素。只要引脚X的值小于510,该过程就会不断重复,从而擦除上一个圆,并在每次迭代时将新的像素画出10个像素。这给人一种错觉,那就是球在向右移动。
但是,如果球到达屏幕末端,则会调用“ stop_right”功能。此函数清除屏幕,将varx设置为126,并将此值存储在数组的第一个位置。然后调用函数“ FillCircle”和“ Flush”绘制并显示一个球,球的原点为(126,xy [1])。换句话说,该程序将停止将球向右移动10个像素,而是将在屏幕y所在的任何位置继续在屏幕右侧的边缘绘制相同的圆。
当设备向左,向上或向下倾斜时,使用相同的想法。
步骤6:传感器在起作用-继续
每次我们在屏幕上移动球时,都需要跟踪x和y轴的变化。如前所述,这是通过在每次球的原点发生变化时将新的x和y值存储在数组中来完成的。例如,如果我们将球向右移动并停止,以使绘制的最后一个球的原点为(30,5),则要从那里向上移动球,则必须考虑到球的变化。 x轴,以便在绘制新球时,其原点位于(30,15)。换句话说,数组中保存的值用作下一个要绘制的球的参考位置。
责任编辑:wv
-
OLED
+关注
关注
121文章
6370浏览量
234267 -
加速度计
+关注
关注
6文章
823浏览量
48322
发布评论请先 登录
石英加速度计让空间受限的平台拥有“高精度感知”
探索NXP FXLS8964AF 3轴低g加速度计:特性、应用与设计要点
深入解析FXLS8971CF:3轴低g加速度计的卓越性能与应用
深入解析FXLS8961AF:汽车应用中的3轴低g加速度计
探索Series 660低成本可嵌入式加速度计:应用与技术解析
IMI微功耗ICP®嵌入式加速度计:无线物联网设备的理想之选
加速度计伺服电路模块原理与应用
如何为你的项目选择合适的加速度计?
石油钻井为何离不开抗高温抗冲击的石英加速度计?
MEMS加速度计与石英加速度计的发展现状与水平对比
洞察万物运动:详解加速度计的分类与广泛应用
为什么在振动分析中加速度计最常用?
超高精度MEMS加速度计能否撼动石英加速度计的市场地位?
航空航天对石英加速度计的要求?
怎样使OLED和加速度计交互
评论