Android Things 教程:Andorid 扩展显示 —— HDMI、OLED、LED 矩阵、7 段显示、LCD

使用 Android Things 创建智能设备时,可能需要在屏幕上显示一些内容。它可以根据您的需要以各种方式完成。

在这篇博文中,我们将比较五种使用不同类型的外部显示器在屏幕上显示信息的方法。

HDMI 显示

当您想要开始使用 Android Things 时,这可能是最简单的解决方案。如果您的主板提供 HDMI 端口(Raspberry Pi 3),只需将其连接至电视机即可。

然后,您可以使用 Android 框架创建 activity,扩充 XML 布局,并以与您的 Android 手机/平板电脑项目中完全相同的方式操作视图。

@Override
protected void onCreate(Bundle savedInstanceState) {
    super.onCreate(savedInstanceState);
    setContentView(R.layout.main_activity);
    Textview textview = (TextView) findViewById(R.id.my_textview);

    textview.setText("Hello!!1!");
    textview.animate().scaleXBy(2.f).scaleYBy(2.f).setDuration(500L).start();
}

“一个物联网项目的专用电视?#认真的吗?

虽然在开发阶段使用大型电视机可能没有问题,但您可能需要更小的 HDMI 屏幕,例如您可以以 40 美元购买的 “Waveshare 5 英寸 800 * 480 LCD”。

HDMI 显示

要使屏幕在 Raspberry Pi 3 上工作,您必须将 Android Things SD 卡安装到您的计算机上,并修改 /boot/config.txt 文件添加以下行:

max_usb_current=1
hdmi_group=2
hdmi_mode=1
hdmi_mode=87
hdmi_cvt 800 480 60 6 0 0 0

如果你正在建造一个 “pepper”/”buddy” 式的机器人,使用一个小的 HDMI 屏幕是一个好主意。Waveshare 屏幕支持 SPI 上的触摸输入。Android Things 还没有开箱即用。如果您需要一个支持触摸输入的屏幕,与 Android Things 兼容,您可以考虑购买官方的 Raspberry Pi 屏幕。

优点

  • 大彩色屏幕
  • 易于显示内容和动画视图

缺点

  • 只适用于大型物联网项目
  • 这里提出了最昂贵的解决方案

OLED 显示

SSD1306

比 HDMI 屏幕小得多,OLED显示器可以是一个很好的选择。SSD1306 是一种单色的 0.96 英寸屏幕,价格不到 10 美元,可通过 I²C 连接到电路板。

GitHub 上有一个官方驱动程序,还有一个示例项目

驱动程序提供了一个 setPixels(int x, int y, boolean on) 方法,让我们轻松使用像素。

举个例子,下面的代码每 2 个像素打开一个:

ssd1306 = new Ssd1306(I2C_PORT);
ssd1306.clearPixels();
for (int x = 0; x < ssd1306.getLcdWidth(); x++) {
    for (int y = 0; y < ssd1306.getLcdHeight(); y++) {
        ssd1306.setPixel(x, y, (x % 2) == (y % 2));
    }
}
ssd1306.show();

你可以使用这个方法来创建一个有趣的迷宫游戏

但是,你会很快发现,逐个设置像素会变得相当麻烦。这也是为什么驱动程序,还提供了 BitmapHelper 方法让我们在屏幕上轻松绘制位图的原因之一。

透明/黑色像素将被跳过。

SSD1306 Android

Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.android);
BitmapHelper.setBmpData(ssd1306, 0, 0, bmp, false);

使用 Bitmap API,我们也可以通过 Paint 和 Canvas 实例显示一些文本:

String text = "Hello!!1!";
Paint paint = new Paint(Paint.ANTI_ALIAS_FLAG);
paint.setTextSize(30f);
paint.setColor(Color.WHITE);
paint.setTextAlign(Paint.Align.LEFT);
Bitmap textAsBitmap = Bitmap.createBitmap(WIDTH, HEIGHT, ARGB_8888);
Canvas canvas = new Canvas(textAsBitmap);
canvas.drawText(text, 0, 0.5f * HEIGHT, paint);
BitmapHelper.setBmpData(ssd1306, 0, 0, textAsBitmap, true);

SSD1306 文本显示

优点

  • 一个不错的显示 10 美元左右
  • 易于通过 Bitmap API 显示内容

缺点

  • 不要指望显示大量的数据
  • 如果您的字体太小,文字将不会被读取。你可能需要一些非常自定义的字体或者黑客(在下一节中解释)通过 Bitmap API 渲染一个小字体

LED 矩阵

LED 矩阵

虽然在技术上有所不同,但您可以像使用 SSD1306 OLED 显示器一样使用 LED 矩阵:手动设置像素或使用 Bitmap API。这里唯一的区别是,不是操纵 128x64 像素(对于 ssd1306),我们只能操纵 8x8 像素。 这确实是相当不同的。

上图中的元件是 MAX7219 LED 点阵模块。 个模块还没有官方的驱动,所以我创建了一个,可以在 github.com/Nilhcem/ledcontrol-androidthings上找到。

以下是如何使用此驱动程序显示位图的方法:

LedControl ledControl = new LedControl(SPI_NAME, 1);
Bitmap bmp = BitmapFactory.decodeResource(getResources(), R.drawable.image);
ledControl.draw(0, bmp);

如果您喜欢通过 setLed(int addr, int row, int col, boolean on) 方法,还可以手动打开和关闭像素。

为了在 LED 矩阵上显示一些文本,我们将使用一个由 Python Sense Hat 库源代码启发的黑客技术:

首先,您将在项目中添加大量字符的精灵表(sprite sheet) :

精灵表

然后,您可以创建一个 textToBitmap(String message) 方法,该方法将针对给定消息中的每个字符搜索关联的位图 sprite,并将其复制到给定位置(此处的实现)的新位图:

Hello

最后,您可以创建一个 Handler 来模拟从右向左移动位图,使用移动的光标(此处的实现)仅复制位图的 8 x 8 部分。

Scroll

在 SithHAT RGB Led 矩阵上使用着色器,滚动文本的完整源代码 github.com/Nilhcem/ledmatrixfun-androings

优点

  • 超便宜(约2美元)
  • 独特的复古风格

缺点

  • Hacky,只适用于有限的字符范围
  • 8x8 像素相当有限。 但是你可以购买多个点矩阵,并链接它们

7 段显示

7 段显示

从技术上讲,7 段显示器与 LED 矩阵有很多相似之处。 它仍然是要知道你想打开哪些部分。用于某些 LED 矩阵模块的 MAX7219CNG 显示驱动器,也可用于 7 段显示器。

有一个官方数字 TM1637 驱动器以及一个字母数字 HT16K33 驱动器(由 RainbowHAT 使用)。如果您使用他人,您可能需要创建自己的驱动程序。

AlphanumericDisplay segment = new AlphanumericDisplay(I2C_NAME)
segment.setBrightness(Ht16k33.HT16K33_BRIGHTNESS_MAX);
segment.setEnabled(true);
segment.display("WTF?");

优点

  • 比 LED 矩阵还要便宜
  • 驱动程序使它非常易于使用。完美的显示数字

缺点

  • Hacky,只适用于有限的字符范围
  • 有限的空间。再次,您可能想要购买倍数并链接它们

LCD 显示

LCD

最后,最后一种方式可以是使用 LCD 屏幕,例如 LCD 模块 1602A。再次,没有官方的驱动程序,但我已经移植了 LiquidCristal Arduino 库的 Android Things,和驱动程序可在 github.com/Nilhcem/1602A-androngthings

这个组件是理想的显示字母数字句子。

Lcd1602 lcd = new Lcd1602(RS, EN, D4, D5, D6, D7);
lcd.begin(16, 2);
lcd.clear();
lcd.print("Hello,");
lcd.setCursor(0, 1);
lcd.print("Android Things!");

您还可以创建最多 8 个自定义字符,每像素绘制这些像素

int[] heart = {0b00000, 0b01010, 0b11111, 0b11111, 0b11111, 0b01110, 0b00100, 0b00000};
lcd.createChar(0, heart);
lcd.write(0);

提示:不要试图成为一个艺术家,结果将是丑陋的。这会让你伤心。

丑陋的 Android

优点

  • 便宜(约2美元)
  • 理想的小句子

缺点

  • 预设字符的范围有限
  • 限制为 8 个自定义字符。 你不能在屏幕的整个表面上绘制自定义的东西

结论

从不到 1 美元到超过 50 美元,有很多方法可以在外部显示器上显示一些信息。虽然有些组件比其他组件使用起来不太直观,但总体来说还是很简单的。

我在本文中只介绍了几个组件。如果你买了一些没有在这里列出的,你可能需要创建自己的驱动程序。如果发生这种情况,我建议您为不同的平台(例如 Arduino)找到一个实现,并将源代码移植到Android Things。

这可能需要一段时间,但最后,您会很高兴在您的项目中使用带有自制驱动程序的组件。

英语原文链接:http://nilhcem.com/android-things/external-displays

尚未评分
您的评分将帮助我们做出更好的玩法

观光\评论区

Copyright © 2017 玩点什么. All Rights Reserved.