«Hello, Rust!» на ЖК-дисплее
Мы создадим простую программу, которая выводит «Hello, Rust!» на ЖК-экран. Это поможет быстро проверить, что проводка, настройка I2C и конфигурация дисплея верны, прежде чем переходить к следующему упражнению.
Драйверы HD44780
Драйверы можно найти, выполнив поиск по названию аппаратного контроллера HD44780. Иногда помогает поиск по названию модуля дисплея, например lcd1602.
Пока я искал, я наткнулся на несколько крейтов на Rust, которые могут управлять этим ЖК-дисплеем. Некоторые из них даже поддерживают асинхронный режим. Также можно написать собственный драйвер по даташиту, но это выходит за рамки этой главы.
Tip
Если вы хотите научиться писать собственные драйверы для embedded Rust, можно обратиться к книге Rust Embedded Drivers (RED)
Сейчас мы воспользуемся одним из готовых крейтов. Позже вы можете попробовать и другие. Просто прочитайте документацию крейта и при необходимости адаптируйте код.
В этом упражнении мы будем использовать крейт hd44780-driver
Проект из шаблона
Начнём с создания нового проекта из шаблона.
cargo generate --git https://github.com/ImplFerris/pico2-template.git --tag v0.3.2
Когда появится запрос, задайте проекту имя, например «hello-lcd», и выберите embassy в качестве HAL.
Дополнительные крейты
Добавьте в Cargo.toml следующую зависимость вместе с уже существующими:
#![allow(unused)]
fn main() {
hd44780-driver = "0.4.0"
}
Дополнительные импорты
Добавьте импорты, необходимые для I2C и драйвера ЖК-дисплея.
#![allow(unused)]
fn main() {
// I2C
use embassy_rp::i2c::Config as I2cConfig;
use embassy_rp::i2c::{self}; // для удобства импортируем с псевдонимом
// Драйвер ЖК-дисплея
use hd44780_driver::HD44780;
use embassy_time::Delay;
}
Адрес I2C
Адаптеры I2C для LCD1602 обычно используют адрес 0x27, хотя некоторые модули используют 0x3F в зависимости от адаптера. Проверьте даташит своего модуля или попробуйте оба адреса, если не уверены.
#![allow(unused)]
fn main() {
const LCD_I2C_ADDRESS: u8 = 0x27;
}
Настройка I2C
Настроим интерфейс I2C, используя GPIO 16 для SDA и GPIO 17 для SCL, с частотой 100 кГц.
#![allow(unused)]
fn main() {
let sda = p.PIN_16;
let scl = p.PIN_17;
let mut i2c_config = I2cConfig::default();
i2c_config.frequency = 100_000; //100 кГц
let i2c = i2c::I2c::new_blocking(p.I2C0, scl, sda, i2c_config);
}
Инициализация ЖК-дисплея
Теперь создадим экземпляр драйвера ЖК-дисплея с нашим интерфейсом I2C:
#![allow(unused)]
fn main() {
// Инициализация ЖК-дисплея
let mut lcd =
HD44780::new_i2c(i2c, LCD_I2C_ADDRESS, &mut Delay).expect("failed to initialize lcd");
}
Очистка дисплея
Перед тем как что-либо вывести, сбросим и очистим экран:
#![allow(unused)]
fn main() {
// Очищаем экран
lcd.reset(&mut Delay).expect("failed to reset lcd screen");
lcd.clear(&mut Delay).expect("failed to clear the screen");
}
Вывод текста на ЖК-дисплей
Наконец, выведем наше сообщение на ЖК-дисплей:
#![allow(unused)]
fn main() {
// Выводим в верхней строке
lcd.write_str("Hello, Rust!", &mut Delay)
.expect("failed to write text to LCD");
}
Клонируйте существующий проект
Можно клонировать проект, который я создал, и перейти в папку hello-lcd.
git clone https://github.com/ImplFerris/pico2-embassy-projects
cd pico2-embassy-projects/lcd/hello-lcd/
Версия на rp-hal
Можно клонировать проект, который я создал, и перейти в папку hello-lcd (версия на rp-hal).
git clone https://github.com/ImplFerris/pico2-rp-projects
cd pico2-rp-projects/lcd/hello-lcd/