你好,我是愛(ài)吃魚(yú)香ROS的小魚(yú)。本節(jié)我們繼續(xù)嘗試使用開(kāi)源庫(kù),驅(qū)動(dòng)OLED模塊,最后的效果實(shí)現(xiàn)在OLED上顯示當(dāng)前的角度信息。
本教程所使用硬件平臺(tái)為MicroROS學(xué)習(xí)板V1.0.0,可點(diǎn)擊閱讀原文購(gòu)買及查看詳情
我們MicroROS開(kāi)發(fā)板上的OLED位置如圖所示。
一、OLED模塊介紹
我們的OLDE模塊樣子如上圖所示,整個(gè)屏幕有128*64個(gè)像素點(diǎn),我們可以實(shí)現(xiàn)對(duì)每一個(gè)像素點(diǎn)的亮滅控制,以此實(shí)現(xiàn)對(duì)屏幕顯示內(nèi)容的控制。注意我們并不能控制屏幕上像素的顏色,所以我們OLED一般是單色的。
那我們?nèi)绾慰刂扑牧翜缒兀梢钥吹皆贠LED的上方一共有四個(gè)引腳,從左到右依次是GND、VCC、SCL、SDA,其中GND、VCC是用于OLED的供電使用,SCL和SDA是I2C通信使用。
聽(tīng)到I2C通信是不是覺(jué)得很熟悉,畢竟上一節(jié)驅(qū)動(dòng)MPU6050時(shí)我們就是使用的I2C協(xié)議(Wrie),別著急,我們先用著,下一節(jié)我們?cè)僭敿?xì)介紹I2C通信。
二、新建工程并安裝依賴
安裝依賴,可以直接修改>platformio.ini
[env:featheresp32]
platform = espressif32
board = featheresp32
framework = arduino
lib_deps =
https://ghproxy.com/https://github.com/rfetick/MPU6050_light.git
adafruit/Adafruit SSD1306@^2.5.7
接著打開(kāi)IMU的源碼目錄,將pio/libdeps/featheresp32/MPU6050_light/examples/GetAngle/GetAngle.ino
文件內(nèi)容復(fù)制到main.cpp中,接著修改波特率和I2C地址。
#include "Wire.h"
#include < MPU6050_light.h >
MPU6050 mpu(Wire);
unsigned long timer = 0;
void setup()
{
Serial.begin(115200);
Wire.begin(18, 19);
byte status = mpu.begin();
Serial.print(F("MPU6050 status: "));
Serial.println(status);
while (status != 0)
{
} // stop everything if could not connect to MPU6050
Serial.println(F("Calculating offsets, do not move MPU6050"));
delay(1000);
// mpu.upsideDownMounting = true; // uncomment this line if the MPU6050 is mounted upside-down
mpu.calcOffsets(); // gyro and accelero
Serial.println("Done!n");
}
void loop()
{
mpu.update();
if ((millis() - timer) > 10)
{ // print data every 10ms
Serial.print("X : ");
Serial.print(mpu.getAngleX());
Serial.print("tY : ");
Serial.print(mpu.getAngleY());
Serial.print("tZ : ");
Serial.println(mpu.getAngleZ());
timer = millis();
}
}
三、使用Adafruit庫(kù)驅(qū)動(dòng)OLED
該庫(kù)提供的驅(qū)動(dòng)例程較為復(fù)雜,小魚(yú)這里提供一個(gè)簡(jiǎn)易版本。
#include "Wire.h"
#include < Adafruit_GFX.h > // 加載Adafruit_GFX庫(kù)
#include < Adafruit_SSD1306.h > // 加載Adafruit_SSD1306庫(kù)
Adafruit_SSD1306 display; // 聲明對(duì)象
void setup()
{
Wire.begin(18, 19);
display = Adafruit_SSD1306(128, 64, &Wire);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 設(shè)置OLED的I2C地址,默認(rèn)0x3C
display.clearDisplay(); // 清空屏幕
display.setTextSize(2); // 設(shè)置字體大小,最小為1
display.setCursor(0, 0); // 設(shè)置開(kāi)始顯示文字的坐標(biāo)
display.setTextColor(SSD1306_WHITE); // 設(shè)置字體顏色
display.println("hello oled!"); // 輸出的字符
}
void loop()
{
}
根據(jù)上面的簡(jiǎn)易版本,修改原有的IMU代碼,最后得到如下代碼
/* Get tilt angles on X and Y, and rotation angle on Z
* Angles are given in degrees
*
* License: MIT
*/
#include "Wire.h"
#include < MPU6050_light.h >
#include < Adafruit_GFX.h > // 加載Adafruit_GFX庫(kù)
#include < Adafruit_SSD1306.h > // 加載Adafruit_SSD1306庫(kù)
Adafruit_SSD1306 display;
MPU6050 mpu(Wire);
unsigned long timer = 0;
void setup()
{
Serial.begin(115200);
Wire.begin(18, 19);
/*========================OLED初始化====================================*/
display = Adafruit_SSD1306(128, 64, &Wire);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 設(shè)置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(2); // 設(shè)置字體大小
display.setCursor(0, 0); // 設(shè)置開(kāi)始顯示文字的坐標(biāo)
display.setTextColor(SSD1306_WHITE); // 設(shè)置字體顏色
display.println("hello oled!"); // 輸出的字符
display.display();
/*========================IMU初始化====================================*/
byte status = mpu.begin();
Serial.print(F("MPU6050 status: "));
Serial.println(status);
while (status != 0)
{
} // stop everything if could not connect to MPU6050
Serial.println(F("Calculating offsets, do not move MPU6050"));
delay(1000);
// mpu.upsideDownMounting = true; // uncomment this line if the MPU6050 is mounted upside-down
mpu.calcOffsets(); // gyro and accelero
Serial.println("Done!n");
}
void loop()
{
mpu.update();
if ((millis() - timer) > 100)
{ // print data every 100ms
Serial.print("X : ");
Serial.print(mpu.getAngleX());
Serial.print("tY : ");
Serial.print(mpu.getAngleY());
Serial.print("tZ : ");
Serial.println(mpu.getAngleZ());
timer = millis();
/*==========================OLED顯示===========================*/
display.clearDisplay(); // 清空屏幕
display.setCursor(0, 0); // 設(shè)置開(kāi)始顯示文字的坐標(biāo)
display.print("X="); // 輸出X
display.println(mpu.getAngleX());
display.print("Y="); // 輸出Y
display.println(mpu.getAngleY());
display.print("Z="); // 輸出Z
display.println(mpu.getAngleZ());
display.display();
}
}
四、下載測(cè)試
接上OLED,將代碼編譯下載到開(kāi)發(fā)板上,觀察OLED的顯示。
五、總結(jié)
本節(jié)依然是很輕松的完成了OLED驅(qū)動(dòng),但你應(yīng)該有個(gè)疑問(wèn),為什么OLED和MPU6050代碼里都有這么一句Wire.begin(18, 19);
,為什么都是18和19,不能是其他的數(shù)值嗎?帶著疑惑,下一節(jié)小魚(yú)帶你一起探秘I2C通信以及原理圖。
-
模塊
+關(guān)注
關(guān)注
7文章
2673瀏覽量
47347 -
OLED
+關(guān)注
關(guān)注
119文章
6182瀏覽量
223854 -
I2C
+關(guān)注
關(guān)注
28文章
1482瀏覽量
123335 -
學(xué)習(xí)板
+關(guān)注
關(guān)注
0文章
43瀏覽量
12154 -
ROS
+關(guān)注
關(guān)注
1文章
276瀏覽量
16967
發(fā)布評(píng)論請(qǐng)先 登錄
相關(guān)推薦
評(píng)論