roboforum.ru

Технический форум по робототехнике.

Дисплей от siemens s65(ls020)

Обсуждение и примеры готовых и самосборных компонент для построения роботов.

Дисплей от siemens s65(ls020)

Сообщение citizen » 23 окт 2008, 21:14

Подскажите, возможно ли использовать дисплей от siemens s65 вместе с sd картой, используя только аппаратный spi?
Используется bascom-avr и библиотека для работы с экраном от Karavan.
OpenSimpleLidar - проект простого самодельного лидара.
Аватара пользователя
citizen
 
Сообщения: 369
Зарегистрирован: 12 окт 2008, 12:40
Откуда: Красногорск, Подмосковье

Re: Дисплей от siemens s65(ls020)

Сообщение EdGull » 23 окт 2008, 22:10

Караван пока не сделал библиотеку под аппаратный спи.
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Дисплей от siemens s65(ls020)

Сообщение citizen » 24 окт 2008, 01:31

Не знал, что там программный spi. Выходит, можно использовать любые выоды контроллера из одного порта?
А как тогда со скоростью обновления индикатора? За сколько примерно обновляется весь экран?
OpenSimpleLidar - проект простого самодельного лидара.
Аватара пользователя
citizen
 
Сообщения: 369
Зарегистрирован: 12 окт 2008, 12:40
Откуда: Красногорск, Подмосковье

Re: Дисплей от siemens s65(ls020)

Сообщение EdGull » 24 окт 2008, 09:30

в секундах ни то не считал, но караван видео на вего выводил :wink:
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Дисплей от siemens s65(ls020)

Сообщение Кирилл » 02 ноя 2008, 00:28

Эд, исправишь в вике статью?..
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: Дисплей от siemens s65(ls020)

Сообщение EdGull » 02 ноя 2008, 01:06

вика позволяет любому вносить исправления
Аватара пользователя
EdGull
 
Сообщения: 10211
Зарегистрирован: 28 дек 2004, 20:33
Откуда: Тольятти
Skype: Ed_Gull
прог. языки: Bascom AVR Basic
ФИО: Гуль Эдуард Викторович

Re: Дисплей от siemens s65(ls020)

Сообщение Кирилл » 02 ноя 2008, 19:02

как только получу минибот тут же исправлю :wink:
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: Дисплей от siemens s65(ls020)

Сообщение Кирилл » 29 авг 2009, 11:34

кто нибудь пробовал подключать этот дисплей с целью вывода на него картинок с SD карты?
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: Дисплей от siemens s65(ls020)

Сообщение executer » 29 авг 2009, 18:36

я с ним работаю. лежит подключенный сейчас. Только пишу в Си. И карточку не юзаю.
Аватара пользователя
executer
 
Сообщения: 784
Зарегистрирован: 30 янв 2009, 01:24
Откуда: Запорожье
прог. языки: Си, AvrASM, STL, САС, учу Си++
ФИО: Павел

Re: Дисплей от siemens s65(ls020)

Сообщение Кирилл » 29 авг 2009, 18:40

интересен именно момент считывания с карточки и передачи картинки на дисплей.
Кирилл
 
Сообщения: 432
Зарегистрирован: 20 окт 2005, 16:11
Откуда: Вильнюс,Литва
прог. языки: Basic

Re: Дисплей от siemens s65(ls020)

Сообщение MiBBiM » 16 сен 2009, 16:45

ничего сложного. активно используется функция Pset и описание bmp формата
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Дисплей от siemens s65(ls020)

Сообщение MiBBiM » 27 сен 2009, 23:37

для потомков.
Итак, есть bmp файл, sd карта, дисплей с библиотекой и bascom-avr. описываю для дислпея от nokia 3510i, но в принципе в случаем с баскомом дисплей особого значения не имеет.
Нулевой этап - проверка аппаратных вохможностей. в данном случае критичны скорость считывания с карточки и соответственно записи в дислпей. я тестировал на миниботе, это mega32+hardware spi sd card+software spi display+7.3728Mhz. отброшу нетрадиционную методику выяснения параметров (лишь упомяну, что использовался слух и вав-файл :) ) и сразу приведу данные: ~12-13кбайт/сек = канал данных с карточки. для дисплея верхний предел не находил, ибо сразу ясно, что считывание, к сожалению, тормозит. прикидываем приверную скорость работы, учитывая 8мибитный цвет и 98*67 пикселей: 12,5*1024/98/67 = 1.9 кадра/сек. с видео получается заморочка (но если использовать чересстрочную развертку и снизить количество цветов, то может что-нибудь да получится). заодним я обнаружил в библиотеке баг - при использовании функции pset сетка координат сдвинута на 1 и 1 пиксель вниз и влево соотвественно. решение - минусовать координаты на эти самые единички.
Первый этап - разбор bmp формата. подготовим в пейнте картинку 98*67 (разрешение дисплея) и сохраним в 256-тицветном формате. далее смотрим на спецификацию:
Код: Выделить всёРазвернуть
Смещение   Длина поля   Описание поля (что тут находится)
Заголовок файла
0   2   Код 4D42h - Буквы 'BM'
2   4   Размер файла в байтах
6   2   0 (Резервное поле)
8   2   0 (Резервное поле)
10   4   Смещение, с которого начинается само    изображение (растр).
Заголовок BITMAP (Информация об изображении)
14   4   Размер заголовка BITMAP (в байтах) равно 40
18   4   Ширина изображения в пикселях
22   4   Высота изображения в пикселях
26   2   Число плоскостей, должно быть 1
28   2   Бит/пиксел: 1, 4, 8 или 24
30   4   Тип сжатия
34   4   0 или размер сжатого изображения в байтах.
38   4   Горизонтальное разрешение, пиксел/м
42   4   Вертикальное разрешение, пиксел/м
46   4   Количество используемых цветов
50   4   Количество "важных" цветов.
Палитра (Карта цветов для N цветов), если используется
54   4*N   Палитра
Формат цвета
R8G8B8RESERVED8

и пред нашими очами предстанут ровно две подставы: во-первых, использование индексированных цветов (каждый байт-пиксель задает смещение в таблице) - это потребует скакать по файлу после для извлечения каждого пикселя, что очень накладно в баскоме из-за буферизации ф.с. (при считывании данных в память загружается весь сектор=512 байт).
во-вторых, 256цветный режим совсем не означет 256 градаций от черного к белому. в интерпретации корпорации зла это всего лишь ограничение на максимальное количество 24битных цветов в файле.
поскольку суммарно эти два факта жестко снижают производительность (преобразование палитр та ещё штука), то переносим анализ bmpшки на пк.
между прочим, как мне стало известно, в формате предусмотрена ширина строки только кратная четырем, что при разрешениии 98*67 дает 134 мусорных байта :crazy:
ещё одно неудобство - строки хранятся от последней к первой, если читать файл сверху.
Этап второй, придумываем свой формат для хранения имаги. здесь все просто - аппаратная платформа в наших проектах неизменная, поэтому просто сохраняем массив пикселей с разверткой по горизонтали.
Третий этап. пишем обертку вывода для вновь созданного формата на девайсе, в моем конкретном случае это:
Код: Выделить всёРазвернуть
Dim Color As Byte
Dim I As Integer
Dim K As Integer
Const Filename1 = "lb.bmp"

Open Filename1 For Binary As #4
Cls
Do
For I = -1 To 65 '-1 связано со смещением
   For K = -1 To 96 'сетки координат
      Get #4 , Color
      Pset K , I , Color 'pset X,Y, Color
   Next
Next
Loop Until Eof(#4) <> 0
Close #4

по скорости получается примерно 1,5 кадра/сек. проявилась небольшая неприятность - обновление на картинке видно на дислпее. учитывая его низкую скорость, создается невинное ощущение того, что держишь в руках китайскую девайсину. фикс пока не известен мне.
Ну и последний этап, он же самый сложный - анализ bmp на пк. разобьем решение на две подзадачи - преобразование файла в структуру пиксель-цвет и преобразование 24битного цвета в 8мибитный.
начнем с наброска преобразоватора (самое первое что пришло в голову, простое усреднение):
Код: Выделить всёРазвернуть
function convert(r: byte; g: byte; b: byte): byte;
begin
   result := r*r + g*g + b*b;
   result := sqrt(result/3)
   result := trunc(result);
end;

вот набросок на делфи для решения первой задачи (писался методом перманентного хакинга, потому чрезвычайно некрасив, но тем не менее работает :) ):
Код: Выделить всёРазвернуть
const
  filename = 'linux.bmp';
  fileout = 'output.bmp';
var
  i,k: byte;
  old: word;
  f, f2, f3: TFileStream;
  c: array[1..3] of byte;
  buf: byte;
  header: BITMAPFILEHEADER;
  info: BITMAPINFOHEADER;
  pos_palette: word;
  pos_data: word;
begin
  f := TFileStream.Create(filename, fmOpenRead);
  f.ReadBuffer(header, sizeof(header)); // читаю заголовки
  f.ReadBuffer(info, sizeof(info));
  pos_palette := f.Position;
  pos_data := header.bfOffBits;
  f.Position := pos_data; // устанавливаю указатель на данных
  // подготавливаю буффер файл для записи строк
  f2 := TFileStream.Create('buf', fmCreate);
  for i := 0 to 66 do // для сименса будут другие значения
  begin
    for k := 0 to 97 do
    begin
      f.ReadBuffer(buf, 1);
      old := f.Position;
      f.Position := pos_palette + buf;   
      f.ReadBuffer(c, 3);   // считываю и преобразовываю цвет
      f2.WriteBuffer(convert(c[1],c[2],c[3]), 1);
      f.Position := old;
    end;
    f.Position := f.Position + 2;
  end;
  // разворачиваю строки
  f3 := TFileStream.Create(fileout, fmCreate);
  f2.Seek(-98, soFromEnd);
  for i := 0 to 66 do
  begin
    for k := 0 to 97 do
    begin
      f2.ReadBuffer(buf, 1);
      f3.WriteBuffer(buf, 1);
    end;
    f2.Seek(-196, soFromCurrent);
  end;       
end;

на выходе получаем файл *.bmp, хотя на самом деле от bmp в нем ничего и не осталось :D
закидываем на карточку, проверяем и ужасаемся цветопередаче :D естетвенно, метод усреднения ничего хорошего и не мог дать, лишь бы показывал различие между соседними областями пикселей.
вообще, пример интересного преобразования показан в этой статье, так что ждите продолжения :D
.
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Дисплей от siemens s65(ls020)

Сообщение MiBBiM » 03 окт 2009, 21:40

второй весьма логичный способ: разбиение более широкого типа (r8g8b8) на равные сегменты, количество которых задается узким типом (r3g3b2). если на пальцах, то делим составляющие цвета (красный, зеленый, синий) на соответственно 8, 8 и 4 равные отрезка и берем целую часть от деления.
Код: Выделить всёРазвернуть
function color_encode(r: byte; g:byte; b:byte): byte;
var
  segment: byte;
  value: byte;
begin
  segment := 256 div 8;
  value := (r div segment) shl 5;
  result := value;
  value := (g div segment) shl 2;
  result := result or value;

  segment := 256 div 4;
  value := b div segment;
  result := result or value;
end;

Далее, пишем функцию декодирования, чтобы примерно оценить результат:
Код: Выделить всёРазвернуть
function color_decode(color: byte): TColor;
var
  r,g,b: byte;
  segment: byte;
begin
  segment := 256 div 7;
  r := (color shr 5) * segment;
  g := ((color and $1C) shr 2) * segment;
  segment := 256 div 3;
  b := (color and $03) * segment;
  result := RGB(r,g,b);
end;

Результаты преобразования вполне сносные, по крайней мере я доволен :)
Также можно сократить исходник, используя компонент Timage: в него встроен объект Tpicture, инкапсулирующий метод загрузки изображения из bmp файла (можно использовать Tbitmap, если не нужна визуальная реализация). В таком хитром случае процедура формирования выхода будет выглядеть примерно так:
Код: Выделить всёРазвернуть
  for i := 0 to 66 do
    for k := 0 to 97 do with bmp_preview.Canvas do  // bmp_preview - TImage class
    begin
      col := ColorToRGB(Pixels[k,i]); // any 24 or more bits variable
      buf := color_encode(col, col shr 8, col shr 16);
      file_out.WriteBuffer(buf, 1);  // file_out - TFileStream class
    end;

Исследование вылилось в программу BMP to MBI. Да, новоиспеченый формат я нарек MBI, MiniBot Image.
03.10.png
03.10.png (4.17 КиБ) Просмотров: 18473

03.10.1.png
03.10.1.png (10.16 КиБ) Просмотров: 18784

03.10.2.png
03.10.2.png (11.86 КиБ) Просмотров: 18671

03.10.3.png
03.10.3.png (8.15 КиБ) Просмотров: 18801

Что не реализовано в формате:
  • малейшая проверка на валидность, хотя бы два первых байта.
  • информация о разрешении хранимого изображения (можно и не включать; если размер файла <> Ш*В текущего дисплея, то пикча несовместима)
  • программа принимает любой bmp, но на выходе только 98*67 mbi файл. это легко правится тремя строчками, поэтому и не реализовано :)
P.S. да, исходник для чтения на бейсике не изменился:
Код: Выделить всёРазвернуть
Dim Color As Byte
Dim I As Integer
Dim K As Integer
Const Filename1 = "lb.mbi"

Open Filename1 For Binary As #4
Cls
Do
For I = -1 To 65 '-1 связано со смещением
   For K = -1 To 96 'сетки координат
      Get #4 , Color
      Pset K , I , Color 'pset X,Y, Color
   Next
Next
Loop Until Eof(#4) <> 0
Close #4
Вложения
BMP to MBI.rar
программа
(172.88 КиБ) Скачиваний: 49
source.rar
сырцы
(10.6 КиБ) Скачиваний: 38
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Дисплей от siemens s65(ls020)

Сообщение MiBBiM » 09 окт 2009, 20:18

вдогонку архив с уже отконвертированными пикчами и тестовой прошивкой
Вложения
display.rar
(8.17 КиБ) Скачиваний: 67
Tomorrow will be. Better
Аватара пользователя
MiBBiM
 
Сообщения: 1866
Зарегистрирован: 29 окт 2007, 18:11
Откуда: Пермь
прог. языки: Brainfuck/Basic/Delphi/C++/Lisp/x86asm/JavaScript

Re: Дисплей от siemens s65(ls020)

Сообщение bodja » 19 окт 2009, 22:41

Как обычно ,придумываем велосипед :)
Небольшой подарок от меня.
На выходе файл может быть сжат,что бы распаковывал контроллер "на лету".
Вложения
ScreenBin8.zip
(15.77 КиБ) Скачиваний: 73
bodja
 
Сообщения: 47
Зарегистрирован: 19 мар 2006, 01:30
Откуда: Украина,г.Бердичев

След.

Вернуться в Готовые модули

Кто сейчас на конференции

Сейчас этот форум просматривают: нет зарегистрированных пользователей и гости: 1