步驟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
+關注
關注
120文章
6286瀏覽量
228104 -
加速度計
+關注
關注
6文章
728瀏覽量
46880
發布評論請先 登錄
Analog Devices Inc. ADXL373微功耗3軸MEMS加速度計數據手冊

Analog Devices Inc. ADXL367 MEMS加速度計數據手冊

ADXL382 低噪聲密度、低功耗、3 軸加速度計數據手冊和產品介紹

高性能石英加速度計,滿足最嚴苛應用需求
十軸姿態傳感器模塊 | 集成加速度計、陀螺儀、磁力計,自帶BLE5.0藍牙

ADS1258 AVSS 5ms內電壓跳變后,讀取加速度計的值變為原來的一半是為什么?
MEMS加速度計的工作原理是什么
PCB Piezotronics推出357A67型三軸電荷輸出加速度計

EPSON工業級加速度計選型

e2studio開發三軸加速度計LIS2DW12(4)----測量傾斜度

e2studio開發三軸加速度計LIS2DW12(3)----檢測活動和靜止狀態

e2studio開發三軸加速度計LIS2DW12(2)----基于中斷信號獲取加速度數據

e2studio開發三軸加速度計LIS2DW12(1)----輪詢獲取加速度數據

評論