SKYLT 16х112-10mm: различия между версиями
Материал из DekatronPC
Radiolok (обсуждение | вклад) |
Radiolok (обсуждение | вклад) (→Ссылки) |
||
Строка 215: | Строка 215: | ||
== Ссылки == | == Ссылки == | ||
* https://github.com/radiolok/weatherstation - репозиторий | |||
* https://www.drive2.ru/b/483982204754461359/ Статья на drive.ru | * https://www.drive2.ru/b/483982204754461359/ Статья на drive.ru | ||
* https://elektronikforumet.com/forum/viewtopic.php?f=2&t=65130&view=next форум | * https://elektronikforumet.com/forum/viewtopic.php?f=2&t=65130&view=next форум | ||
* https://raw.githubusercontent.com/duffrohde/mobitec-rs485/master/skilt.c пример программы управления | * https://raw.githubusercontent.com/duffrohde/mobitec-rs485/master/skilt.c пример программы управления |
Текущая версия на 22:24, 27 марта 2021
Блинкерный индикатор Mobitec SKYLT разрешением 16х112 точек, диаметром 10мм от туристического автобуса.
Характеристики
- Разрешение 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;
}
Ссылки
- https://github.com/radiolok/weatherstation - репозиторий
- https://www.drive2.ru/b/483982204754461359/ Статья на drive.ru
- https://elektronikforumet.com/forum/viewtopic.php?f=2&t=65130&view=next форум
- https://raw.githubusercontent.com/duffrohde/mobitec-rs485/master/skilt.c пример программы управления