Делаем часы из электронной книжки PRS-505
Удивительно, но старинная электронная книга Sony prs-505 является очень классным конструктором всевозможных самоделок. В очередной раз взял эту книжку, чтобы сделать себе «бумажные» часы. Мне нравится это решение тем, что цифры получаются большие и яркие, при этом они не светятся в темноте и не мешают спать. Идея часов на электронной бумаге совершенно не новая, но мне просто захотелось снова поиграться с этой классной электронной книгой. В результате получился этакий проект выходного дня, потому что могу. Как обычно, собрал все возможные грабли и ошибки. Свой тернистый путь описал в этой статье.
Предыстория
Наверняка многие помнят мой пост «Электронная книжка в качестве дисплея» в котором я рассказывал, как работать с дисплеем электронной книги.
Фотография из поста «Электронная книжка в качестве дисплея».
Там по сути шла работа с фреймбуфером видеоустройства, в которой я выводил изображение. Основной проблемой в той статье была передача изображения на устройство. Тогда, я не нашёл в себе достаточно пороха и мотивации, чтобы довести задуманное до конца, потому книга была кому-то отдана, и идея сделать такое устройство была забыта. Но всё изменилось после выхода замечательной статьи от автора alexshnup: «Электронные чернила для Wirenboard 5 или рисуем штрихкоды на Go». В этой статье alexshnup решал проблему вывода штрих кодов на экран данной книги для отладки сканера штрих кодов. И как раз решил проблему передачи изображений на книгу.
Если кратко, то alexshnup создал модуль ядра, который при подключении книги по USB создаёт дополнительный виртуальный жёсткий диск, размером 600×800=480000 байт. Точнее, диск будет 1 МБ, но видимая область всего 480000 байт. По сути всё что попадает в память диска, попадет на экран книги. Вообще, это гениальная штука, можно даже визуально видеть как идёт разметка диска, если, например, создать там файловую систему. Например, послать изображение на книгу можно следующей командой:
djpeg -pnm -grayscale test.jpg | dd bs=1 skip=15 | dd of=/dev/sdx bs=480k
Всё описанное далее в данной статье, является идеологическим продолжением этих двух экспериментов.
Начнём, налажаем и сделаем снова
После прочтения статьи, я связался с её автором alexshnup. И он решил мне подарить одну разобранную книжку для экспериментов. В результате имея работающее оборудование на руках я радостно приступил опытам. Первое, что мне было необходимо сделать — это поставить прошивку prs-plus. И после этого можно пробовать создать тот виртуальный жёсткий диск, для передачи изображений по статье alexshnup. Не буду цитировать статью, она является исчерпывающим руководством. После этого пробую передать изображение с помощью команды dd.
Изображение переданное новым способом.
Радостно понимая, что всё, все карты мне в руки, интерфейс передачи изображений есть, можно его использовать как угодно, я стал делать кучу экспериментов. Начал писать программу часов, и отлаживать их вывод на книжку. В результате, как это обычно бывает с командой «dd» («disk destroyer») ошибся диском, и…
В результате записал вместо виртуального диска, на диск (флешку) самой книжки, превратив её в кирпич… Просто взял и записал 480000 байт fat-раздела. Даже передать не могу всех тех чувств, которые я испытал в тот момент.
Окирпиченная книжка.
Главное, как восстановить эту книжку, было непонятно. Понятно было, что нужно взять другую такую же книгу и заново на неё установить прошивку prs-plus. Затем с неё взять эти первые 480000 байт и перенести на данный кирпич.
В общем, погрустил, психанул и купил на авито новую электронную книжку Sony prs-505. При это книга была со всеми рабочими кнопками, в чехле, шлейфы были не рваные. Можно было использовать даже по прямому назначению, единственное, что аккумулятор был полумёртвый. Но для моих целей — этого было достаточно. Сейчас, с мёртвыми аккумуляторами эти книжки можно найти до тысячи рублей, по моему идеальная цена для Linux устройства, с открытыми исходниками и такой шикарной системой энергосбережения.
Свежекупленная электронная книга.
С этой книгой точно так же повторил процедуру установки прошивки, далее, как и планировал, перенёс 480000 байт fat-раздела с одной электронной книги на другую. Тем самым у меня получилось две книги, с которыми я уже развлекался. Правда, та которая была разобрана совсем начала безбожно глючить, и её я практически не использовал.
Пишем софт
Идея часов достаточно простая. Мы просто будем формировать изображение времени на холсте, а потом отправлять его во фреймбуфер. Для этого сформируем цифры и двоеточия. Напомню, разрешение книжки у нас 600×800 (я не ошибся, именно 600×800), если смотреть на неё как на лист.
ЧЧ: ММ: СС — это как раз у нас получается восемь символов. Итого, каждая цифра получается размером 100×600. Для цифр выбрал приятный шрифт «Gideon«s-Army-». Далее с помощью imagemagick формируем цифры и двоеточия следующими командами:
for i in `seq 0 9`; do convert -font Gideon’s-Army- -pointsize 150 -size 100x600\
-gravity center -rotate 90 -depth 8 caption:"$i" $i.pgm;done
convert -font Gideon’s-Army- -pointsize 150 -size 100x600 -gravity center -depth 8\
-rotate 90 caption:':' dots.pgm
В результате получаем цифры от 0 до 9 и двоеточие. Вот пример цифры 2:
Если у данного pgm-файла отрезать заголовок, то эти данные годятся сразу для записи в книгу. Об этом я подробно рассказывал в своей статье «Электронная книжка в качестве дисплея», поэтому детально на этом останавливаться не буду.
Дальше было дело техники сформировать из данных цифр битмап для записи во фреймбуфер, простым копированием матрицы с помощью отображения файла в память. Весь проект обитает в репозитории: github.com/dlinyj/sony_prs-505_clock.
Вся программа содержится в файле time.c. Весь код разбирать не буду, но остановлюсь на нескольких моментах. В данной программе я делаю просто отображение файла в память (либо фрейм-буффера, либо тестового файла, либо файл-устройства виртуального диска электронной книги). Далее мы уже работаем с файлом, как с областью памяти. В неё копирую изображения символов часов в зависимости от текущего времени.
Отображаем в память файл, в котором буду формировать изображение.
image = mmap (0, file_lenght, PROT_WRITE, MAP_SHARED, fd, 0);
Копирование изображений идёт в функции print_symbol, в которую передаю номер позиции цифры и имя файла цифры для копирования.
void print_symbol (unsigned int position, char * filename) {
void * numer_im;
int numer;
numer = open (filename, O_RDWR);
numer_im = mmap (0, NUMER_SIZE, PROT_WRITE, MAP_SHARED, numer, 0);
memcpy(&image[first_header + NUMER_PIXELS * position], &numer_im[16], NUMER_PIXELS);
munmap (numer_im, NUMER_SIZE);
close(numer);
}
Здесь открываю файл цифры, и копирую его в соответствующую позицию в области памяти отображённого файла image.
В принципе можно было каждый раз не открывать файл, читать его, потом закрывать, а просто сделать копию в памяти и осуществлять копирование от туда, но хорошая мысль пришла только сейчас.
Если вы захотите эту программу запустить у себя на компе, чтобы формировать изображение, не забудьте в Makefile изменить компилятор и убрать define:
#Не забываем привести Makefile к следующему виду.
#CFLAGS=-D __BOOK__
CC = gcc
#CC= /opt/cross/gcc-3.2.3-glibc-2.2.5/arm-unknown-linux-gnu/bin/arm-unknown-linux-gnu-gcc
Компилируем программу, и запускаем без параметров. В результате получим файл «test.pgm» с текущим временем.
Если указать конкретное файл-устройство, то уже формирование изображения будет без заголовка pgm-файла, пригодное для загрузки на книжку. Так же данную программу можно залить в книгу, и далее в автоматическом режиме обновлять время.
Я запускал эту программу на ПК, с подключённой книжкой по USB, и на ней выводил время. Запускается программа просто (скрипт start.sh, принимает файл-устройство):
#!/bin/bash
while true;do ./time $1;done
В результате можно наблюдать на экране, как идут часы.
Выводы
Программа написана таким образом, что может быть собрана и залита в электронную книгу, чтобы её превратить в часы. Может показаться забавным использовать такое сложное техническое устройство в качестве часов, но почему бы и да. Сейчас в данных книгах дохнут аккумуляторы, и замена их достаточно трудоёмкое занятие. Если бы аккумулятор заменить на его эмулятор (болванка, которая даёт возможности книжке работать, но не хранит энергию), а книжку подключить к зарядному устройству, то она бы работала постоянно.
Мои эксперименты показали, что книжка на зарядном устройстве не переходит в спящий режим и часы могут работать непрерывно. Плюс в самой книге есть встроенные часы, и она может корректно показывать время.
Из проблем, с которыми я столкнулся, и не смог разрешить — это то как добавить программу часов в автозагрузку книжки, при этом придушив загрузку самого графического интерфейса, чтобы не было конкуренции за дисплей. В целом есть ещё место для дальнейших опытов и экспериментов. Но то уже будет совсем другая история, эту книгу я победил, часы выводит, можно приступать к другим проектам.
Какие у вас есть безумные предложения для использования электронной книги Sony prs-505?
Ссылки:
- «Электронная книжка в качестве дисплея».
- «Электронные чернила для Wirenboard 5 или рисуем штрихкоды на Go».
- Репозиторий проекта.
- История моих экспериментов 1, 2, 3, 4.