SKYLT 16х112-10mm: различия между версиями

Материал из DekatronPC
(Новая страница: «Категория:Индикаторы Категория:Проекты Блинкерный индикатор 16х112 точек, диаметром...»)
 
Строка 2: Строка 2:
[[Категория:Проекты]]
[[Категория:Проекты]]


Блинкерный индикатор 16х112 точек, диаметром 10мм от туристического автобуса.
Блинкерный индикатор Mobitec SKYLT разрешением 16х112 точек, диаметром 10мм от туристического автобуса.


[[Файл:Sklyt 116 112 front.jpg|мини|справа]]
[[Файл:Sklyt 116 112 front.jpg|мини|справа]]
Строка 12: Строка 12:
* Масса 12кг
* Масса 12кг


== Управление (с форума) ==
== Управление (с форума, отредактировано) ==


<syntaxhighlight lang="c">
<syntaxhighlight lang="c">
Купил знак автобуса Mobitec у кого-то здесь, на форуме, и он хорошо работает. :) Это был ICU300 для управления знаком. Идея состоит в том, чтобы подготовить несколько текстов на компьютере, а затем загрузить их в блок управления, где вы сможете выбирать между готовыми сообщениями.


Я решил вместо этого управлять знаком напрямую, чтобы иметь возможность отображать динамические значения.
Знак автобуса фирмы Mobitec, управляется модулем ICU300


знак подключен:
Кабель 4-х проводный:
красный +24 вольт
красный +24 вольт
белый RS485 D +
белый RS485 D +
Строка 27: Строка 26:
отдельный кабель для освещения белый + 24вольт.
отдельный кабель для освещения белый + 24вольт.


Кто-нибудь здесь знает что-нибудь о протоколе, это RS-485 в 4800baud.
Это RS-485 в 4800baud.
Обратный инжиниринг выполняется медленно. :-)
 
Вся помощь приветствуется.


0xff start
0xff start
Строка 51: Строка 47:


0xff end
0xff end


example, печатает 9 "A" на знаке с адресом 6:
example, печатает 9 "A" на знаке с адресом 6:

Версия 22:53, 18 марта 2021


Блинкерный индикатор Mobitec SKYLT разрешением 16х112 точек, диаметром 10мм от туристического автобуса.

Sklyt 116 112 front.jpg

Характеристики

  • Разрешение 16х112 точек диаметром 10мм;
  • Размеры 1230*250мм;
  • Размеры отображаемой области 1120*160мм;
  • Масса 12кг

Управление (с форума, отредактировано)

Знак автобуса фирмы Mobitec, управляется модулем ICU300

Кабель 4-х проводный:
красный +24 вольт
белый RS485 D +
зеленый RS485 D-
черный заземляющий

отдельный кабель для освещения белый + 24вольт.

Это RS-485 в 4800baud.

0xff start
0x06 адрес знака, обычно это 6 для переднего знака?
0xa2 всегда 0xa2

0xd0
0x70 ширина знака 112 пикселей
0xd1
0x10 высота знака 16 пикселей
0xd2
0x02 столбец, где начинается текст
0xd3
0x11 Перемещает текст вниз на 2 пикселя?
0xd4
0x69 шрифт?
тогда идет текст ascii? в примере ниже 9 "A"
затем контрольная сумма, это сумма всех байтов после начала 0xff, в одном байте (И 0xff), есть два особых случая, когда она записывается двумя байтами,
когда контрольная сумма равна 0xfe, это записывается 0xfe, 0x00, а когда он равен 0xff, он печатается как 0xfe, 0x01

0xff end

example, печатает 9 "A" на знаке с адресом 6:

0xFF, 0x06,0xA2,0xD0,0x70,0xD1,0x10,0xD2,0x03,0xD3,0x11,0xD4,0x69,
0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x41,0x08,0xFF


Другой метод это дизассемблировать код 80c31 'a, который находится на плате контроллера,
но это кажется раздражающим, если вы не дома на ассемблере 8051. : humm:
Кто-нибудь знает что-нибудь о любом дизассемблере 8051? или я должен сразу забыть этот путь?

Оттуда же, тестовая программа для этого чуда

/*
  Simple test program demonstrating how to interface with a Mobitec flip dot display
  using RS-485.
 */

#include <fcntl.h>
#include <stdio.h>
#include <termios.h>
#include <unistd.h>
#include <string.h>
#include <time.h>

/*
  Calculates the checksum and adds it to data. Size is adjusted accordingly.
*/
static void add_checksum(void *data, int *size)
{
	int csum = 0;
	int i;
	unsigned char *p = (unsigned char *)data;

	for(i=1; i<*size; i++)
	{
		csum += p[i];
	}

	p[i] = csum & 0xff;

	(*size)++;
	if(p[i] == 0xfe)
	{
		p[i+1] = 0x00;
		(*size)++;
	} else if(p[i] == 0xff)
	{
		p[i] = 0xfe;
		p[i+1] = 0x01;
		(*size)++;
	}
}

static int fd;

/* Simple header with start byte 0xff, sign address 0x06, and 0xa2 for text mark */
static const unsigned char sign_hdr[] = {0xff, 0x06, 0xa2};

/*
  Writes the supplied ascii string to the display
*/
static void write_text(const char *txt)
{
	unsigned char msg[1024];
	int len;
	
	memcpy(msg, sign_hdr, sizeof(sign_hdr));
	len = sizeof(sign_hdr);
	strcpy((char *)msg + len, txt);
	len += strlen(txt);
	add_checksum(msg, &len);
	msg[len++] = 0xff;
	
	if(write(fd, msg, len) < len)
	{
		perror("writing failed");
	}
}

/*
  Sets all pixels except the first column
*/
static void write_all_white(void)
{
	char buffer[1024];
	int len;

	len = 0;
	buffer[len++] = 0xd2; // Set x coordinate to 1
	buffer[len++] = 1;
	buffer[len++] = 0xd3; // Set y coordinate to 4
	buffer[len++] = 4;
	buffer[len++] = 0xd4; // Select bitmap font
	buffer[len++] = 0x77;
	// 0x20 - 0x3f is used with the bitmap font
	// 0x20 is no pixels set and 0x3f is all pixels set
	memset(buffer+len, 0x3f, 112);
	len += 112;

	buffer[len++] = 0xd2;
	buffer[len++] = 1;
	buffer[len++] = 0xd3;
	buffer[len++] = 9;
	buffer[len++] = 0xd4;
	buffer[len++] = 0x77;
	memset(buffer+len, 0x3f, 112);
	len += 112;

	buffer[len++] = 0xd2;
	buffer[len++] = 1;
	buffer[len++] = 0xd3;
	buffer[len++] = 14;
	buffer[len++] = 0xd4;
	buffer[len++] = 0x77;
	memset(buffer+len, 0x3f, 112);
	len += 112;

	buffer[len++] = 0xd2;
	buffer[len++] = 1;
	buffer[len++] = 0xd3;
	buffer[len++] = 19;
	buffer[len++] = 0xd4;
	buffer[len++] = 0x77;
	memset(buffer+len, 0x3f, 112);
	len += 112;

	buffer[len] = '\0';
	write_text(buffer);
}

int main(int argc, char *argv[])
{
	struct termios term_opt;
	fd = open("/dev/ttyUSB0", O_RDWR);

	if(fd <= 0)
	{
		perror("failed to open serial port");
		return -1;
	}
	
	tcgetattr(fd, &term_opt);
	
	cfmakeraw(&term_opt);
	cfsetispeed( &term_opt, B4800);
	cfsetospeed( &term_opt, B4800);
	tcsetattr(fd, TCSANOW, &term_opt);

	while(1) {
		write_text("Davs");
		usleep(4*1000*1000);
		write_text("Hejsa");
		usleep(4*1000*1000);
		write_all_white();
		usleep(4*1000*1000);
	}

	close(fd);
	
	return 0;
}

Ссылки