你好,我是愛吃魚香ROS的小魚。本節我們繼續嘗試使用開源庫,驅動OLED模塊,最后的效果實現在OLED上顯示當前的角度信息。
本教程所使用硬件平臺為MicroROS學習板V1.0.0,可點擊閱讀原文購買及查看詳情
我們MicroROS開發板上的OLED位置如圖所示。
一、OLED模塊介紹
我們的OLDE模塊樣子如上圖所示,整個屏幕有128*64個像素點,我們可以實現對每一個像素點的亮滅控制,以此實現對屏幕顯示內容的控制。注意我們并不能控制屏幕上像素的顏色,所以我們OLED一般是單色的。
那我們如何控制它的亮滅呢,可以看到在OLED的上方一共有四個引腳,從左到右依次是GND、VCC、SCL、SDA,其中GND、VCC是用于OLED的供電使用,SCL和SDA是I2C通信使用。
聽到I2C通信是不是覺得很熟悉,畢竟上一節驅動MPU6050時我們就是使用的I2C協議(Wrie),別著急,我們先用著,下一節我們再詳細介紹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
接著打開IMU的源碼目錄,將pio/libdeps/featheresp32/MPU6050_light/examples/GetAngle/GetAngle.ino
文件內容復制到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庫驅動OLED
該庫提供的驅動例程較為復雜,小魚這里提供一個簡易版本。
#include "Wire.h"
#include < Adafruit_GFX.h > // 加載Adafruit_GFX庫
#include < Adafruit_SSD1306.h > // 加載Adafruit_SSD1306庫
Adafruit_SSD1306 display; // 聲明對象
void setup()
{
Wire.begin(18, 19);
display = Adafruit_SSD1306(128, 64, &Wire);
display.begin(SSD1306_SWITCHCAPVCC, 0x3C); // 設置OLED的I2C地址,默認0x3C
display.clearDisplay(); // 清空屏幕
display.setTextSize(2); // 設置字體大小,最小為1
display.setCursor(0, 0); // 設置開始顯示文字的坐標
display.setTextColor(SSD1306_WHITE); // 設置字體顏色
display.println("hello oled!"); // 輸出的字符
}
void loop()
{
}
根據上面的簡易版本,修改原有的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庫
#include < Adafruit_SSD1306.h > // 加載Adafruit_SSD1306庫
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); // 設置OLED的I2C地址
display.clearDisplay(); // 清空屏幕
display.setTextSize(2); // 設置字體大小
display.setCursor(0, 0); // 設置開始顯示文字的坐標
display.setTextColor(SSD1306_WHITE); // 設置字體顏色
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); // 設置開始顯示文字的坐標
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();
}
}
四、下載測試
接上OLED,將代碼編譯下載到開發板上,觀察OLED的顯示。
五、總結
本節依然是很輕松的完成了OLED驅動,但你應該有個疑問,為什么OLED和MPU6050代碼里都有這么一句Wire.begin(18, 19);
,為什么都是18和19,不能是其他的數值嗎?帶著疑惑,下一節小魚帶你一起探秘I2C通信以及原理圖。
-
模塊
+關注
關注
7文章
2707瀏覽量
47474 -
OLED
+關注
關注
119文章
6200瀏覽量
224210 -
I2C
+關注
關注
28文章
1487瀏覽量
123757 -
學習板
+關注
關注
0文章
44瀏覽量
12167 -
ROS
+關注
關注
1文章
278瀏覽量
17009
發布評論請先 登錄
相關推薦
評論