Ви не увійшли.
Почти УРА))) Вобщем, не выдержал купил я ардуино, удалось сегодня его правильно подключить, чтобы TX с ардуино инвертировался для мамки проектора, короче проектор уже запускается как с балластом, но выдает ошибку как будто лампы нет, сижу ищу значения, которые упустил, без которых не хочет "видеть лампу", осталось всего ничего)) Насчет частоты Вы оказались правы - 4800 even parity
Неактивний
Есть проблема с кодом. Вобщем есть первая группа сигналов (слева сигнал от мамки, справа от балласта)
0xF2 - 0x04
0xF4 - 0xFF
0x40 - 0x40
0x32 - 0x32
0x84 - 0x02
0x83 - 0x64
0x81 - 0x17
На основе кода с буржуйского форума вставил свои значения, получилось
int data;
void setup() {
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void serialEvent() {
data = Serial.read();
if (data == 0)
Serial.write(data);
if (data == 0xF2)
Serial.write(0x04);
if (data == 0xF4)
Serial.write(0xFF);
if (data == 0x40)
Serial.write(0x40);
if (data == 0x32)
Serial.write(0x32);
if (data == 0x84)
Serial.write(0x02);
if (data == 0x83)
Serial.write(0x64);
if (data == 0x81)
Serial.write(0x17);
}
Код срабатывает отлично, но дальше идет вторая группа сигналов:
0x81 - 0x97
0x40 - 0x40
0x34 - 0x34
0x84 - 0x04
0x83 - 0x46
начинаются регулярные запросы рабочего режима (с промежутком 1 сек)
0x81 - 0x98
0x92 - 0x1A
0x81 - 0x97
0x92 - 0x1B
0x81 - 0x98
0x92 - 0x1B
Как видите, на уже прописанный запрос 0x81 мамка уже ждет другой ответ 0x97, а не 0x17, так же и далее с другими запросами 0x84 и 0x83.
То есть нужно как-то прописать, чтобы в первый раз ардуино ответил на запрос 0x81 - 0x17, а на второй раз уже 0x81 - 0x97, на третий раз 0x81 - 0x98,
также на запрос 0x84 в первый раз ответил 0x02, а во второй раз 0x04, ну и так далее. Как это прописать в коде??
Неактивний
поздравляю с прогрессом )
там где 2 байтные ответы
if (data == 0xХХ ) { Serial.write(0xX1); Serial.write(0xX2); }
а то их не прописали, непорядок )
typedef enum {
INIT = 0,
WORK = 1,
SHUTDOWN = 2 // исправил, (тут запятая не ставится )
} TE_LampStatus;
TE_LampStatus LampStatus = INIT;
void setup()
{
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void serialEvent() {
data = Serial.read();
switch ( LampStatus )
{
case INIT:
if (data == 0x00 ) Serial.write(data);
else if (data == 0xF2 ) Serial.write(0x04);
else if (data == 0xF4 ) Serial.write(0xFF);
else if (data == 0x40 ) Serial.write(0x40);
else if (data == 0x32 ) Serial.write(0x32);
else if (data == 0x84 ) Serial.write(0x02);
else if (data == 0x83 ) { Serial.write(0x64); LampStatus = WORK; }
break ;
case WORK:
if (data == 0x81) Serial.write(0x17);
.
.
.
break ;
case SHUTDOWN:
break ;
}
оформляйте документ, что происходит после какого запроса ) ныне живущие будут вам благодарны
Остання редакція NoName (2015-04-09 09:16:55)
Неактивний
Ваш код с какой-то ошбкой видимо, прога пишет "Ошибка компиляции" , добавлял дополнительные скобки - не помогло
Неактивний
typedef enum вроде не принимает , да и остальное тоже ))) скачайте прогу для прошивки ардуинки, в ней формируются скетчи и все это компилируется, там есть слева кнопочка ПРОВЕРИТЬ
http://arduino.cc/download_handler.php
Остання редакція martinways (2015-04-09 11:47:08)
Неактивний
не, чето нифига не получается, я же в этом синтаксисе нуль, опять вся надежда на Вас)))
Неактивний
int data;
int StatusLamp;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
void setup() {
StatusLamp = INIT1;
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void func_unique_request( int data )
{
switch ( data )
{
case 0xF2: Serial.write(0x04); break;
default: Serial.write(0xdata); break;
}
}
void func_INIT1( int data )
{
switch ( data )
{
case 0x00: Serial.write(0x00); break;
case 0xF2: Serial.write(0x04); break;
case 0xF4: Serial.write(0xFF); break;
case 0x40: Serial.write(0x40); break;
case 0x32: Serial.write(0x32); break;
case 0x84: Serial.write(0x02); break;
case 0x83: Serial.write(0x64); break;
case 0x81: Serial.write(0x17); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = INIT2;
}
void func_INIT2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x64); break;
default : func_unique_request(data); break;
}
// code change status lamp to stepX ( example 0x81 )
if ( data == 0x83 ) StatusLamp = WORK1;
}
void func_WORK1( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x98); break;
case 0x92: Serial.write(0x1B); break;
default : func_unique_request(data); break;
}
// code change status lamp to stepX ( example 0x81 )
if ( data == 0x81 ) StatusLamp = WORK2;
}
void func_WORK2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x92: Serial.write(0x1B); break;
default : func_unique_request(data);
}
if ( data == 0x81 ) StatusLamp = WORK1;
}
void serialEvent()
{
data = Serial.read();
switch ( StatusLamp )
{
case INIT1: func_INIT1(data); break;
case INIT2: func_INIT2(data); break;
case WORK1: func_WORK1 (data); break;
case WORK2: func_WORK2 (data); break;
}
}
Sketch uses 2 180 bytes (6%) of program storage space. Maximum is 32 256 bytes.
но пока не пропишете по правильному алгоритмы запросов материнки, будут вопросы к эмулятора
код без комментариев, заберетесь. будут вопросы пишите.
Неактивний
копирую -вставляю в прогу - все-равно ошибка компиляции
sketch_apr09a.ino:23:27: error: invalid suffix "ta" on integer constant
Остання редакція martinways (2015-04-09 23:12:36)
Неактивний
Вот вставляю код из буржуфорума - принимает, Ваш - нет.
Неактивний
Вот теперь приняло Ваш файл - глюки какие-то, сейчас буду шить ардуинку))
Неактивний
проверьте связи, выгнали с компа, не проверял код, не форум, а чат какой-то )
и проработайте алгоритм. 3-5 значениями состояний, вероятно, не обойтись.
Неактивний
Добавил 2 строчки нужных ответов - и УРА!!!!! Пашет как миленький, сигнальчики идут , арудинка отвечает. Ну, дорогой мой друг, теперь я могу отдать лог анализатор в Ваши хорошие руки - пишите на мыло куда высылать нов почтой))
Только есть 1 небольшая проблемка - если выключить проектор с пульта, а потом включить - то уже будет ошибка, так как ардуинка во втором режиме, а не первом, надо еще режим Shutdown сделать, также хотелось бы прописать включение драйвера светодиода путем назначения сигнала на какую-нибудь ногу ардуинки.
Остання редакція martinways (2015-04-09 23:50:25)
Неактивний
алгоритм прорабатывайте, от ЛА не откажусь ), но пусть пока у вас будет, проект то не закончен.
"прописать включение драйвера светодиода"
укажите место где как думаете лампа включается и выключается
поздравляю )
, и схему свою покажите, подозреваю что ее нужно доработать, системщикам покажу, пусть подумают.
Остання редакція NoName (2015-04-10 00:03:03)
Неактивний
Обнаружилась проблемка - 3-4 минуты работает и перходит в ошибку, на лог анализаторе показывает, что мамка посылает в это время дополнительный пакет данных, о существовании которого я не знал (вот жеж намудрили эти хитрые япошки, я так смотрю у меня самый сложный протокол из всех существующих проекторов), просто я уже разобрал схемку для снятия данных с лампы, сегодня по новой спаяю и запишу.
Относительно того, когда включать светодиод - можно в начале второго режима INIT2
Вот мой теперешний код, добавьте в него эту функцию
int data;
int StatusLamp;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
void setup() {
StatusLamp = INIT1;
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void func_unique_request( int data )
{
switch ( data )
{
case 0xF2: Serial.write(0x04); break;
default: Serial.write(0x00); break;
}
}
void func_INIT1( int data )
{
switch ( data )
{
case 0x00: Serial.write(0x00); break;
case 0xF2: Serial.write(0x04); break;
case 0xF4: Serial.write(0xFF); break;
case 0x40: Serial.write(0x40); break;
case 0x32: Serial.write(0x32); break;
case 0x84: Serial.write(0x02); break;
case 0x83: Serial.write(0x64); break;
case 0x81: Serial.write(0x17); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = INIT2;
}
void func_INIT2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x40: Serial.write(0x40); break;
case 0x34: Serial.write(0x34); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x46); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x83 ) StatusLamp = WORK1;
}
void func_WORK1( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x98); break;
case 0x92: Serial.write(0x1B); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = WORK2;
}
void func_WORK2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x92: Serial.write(0x1B); break;
default : func_unique_request(data);
}
if ( data == 0x81 ) StatusLamp = WORK1;
}
void serialEvent()
{
data = Serial.read();
switch ( StatusLamp )
{
case INIT1: func_INIT1(data); break;
case INIT2: func_INIT2(data); break;
case WORK1: func_WORK1 (data); break;
case WORK2: func_WORK2 (data); break;
}
}
Остання редакція martinways (2015-04-10 08:32:10)
Неактивний
http://arduino.cc/en/Tutorial/Blink?fro … linkingLED
когда будете копировать текст -
сначала скопируйте в блокнот, а потом в среду
и настоятельно рекомендую взять последний сниф и обработать его,
выделить цветом повторяющиеся запросы
добавить комментарии, пусть они будут субъективны, но хоть что то.
данных лог анализатора будет достаточно для добавления доп пакетов )
ручками обработайте.
а в ошибку он переходит потому что не все запросы прописали, там были еще запросы температуры, 2 байтные ответы
делайте документ )
в setup добавить
pinMode(12, OUTPUT);
digitalWrite(12, LOW); // turn the LED off by making the voltage LOW
// не забудьте о резисторе в цепи LED
void func_INIT1( int data )
{
switch ( data )
{
case 0x00: Serial.write(0x00); break;
case 0xF2: Serial.write(0x04); break;
case 0xF4: Serial.write(0xFF); break;
case 0x40: Serial.write(0x40); break;
case 0x32: Serial.write(0x32); break;
case 0x84: Serial.write(0x02); break;
case 0x83: Serial.write(0x64); break;
case 0x81: Serial.write(0x17); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 )
{
StatusLamp = INIT2;
digitalWrite(12, HIGH); // turn the LED on (HIGH is the voltage level)
}
}
Остання редакція NoName (2015-04-10 09:15:08)
Неактивний
Итак, 3 часа мучил проектор, но таки выбил из него признание)) дописал код, теперь все работает как часики, логический анализатор - это конечно сила, огромное спасибо, что посоветовали его купить, без него ничего не получилось бы 100%.
Правда не заморачивался с включением светодиода, в принципе острой необходимости в этом нет, так как у меня с мамки при включении проектора подается питание 3.3в на оптроны балласта, этим выходом я могу, во-первых, запитать саму ардуинку (надеюсь хватит силы тока), а во вторых запустить драйвер светодиода. Но вообще можно было бы конечно и сделать эту функцию в самой ардуинке. Думаю мне придется купить ардуинку на 3.3в, а то у меня 5 вольтовая, чето на шлейфе питания материнки не нашел 5 вольт, так что хочу запитать её прямо со шлейфа идущего на оптроны балласта (который я благополучно катапультирую и вставлю на его место драйвер светодиода.
int data;
int StatusLamp;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
void setup() {
StatusLamp = INIT1;
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void func_unique_request( int data )
{
switch ( data )
{
case 0xF2: Serial.write(0x04); break;
default: Serial.write(0x00); break;
}
}
void func_INIT1( int data )
{
switch ( data )
{
case 0x00: Serial.write(0x00); break;
case 0xF2: Serial.write(0x04); break;
case 0xF4: Serial.write(0xFF); break;
case 0x40: Serial.write(0x40); break;
case 0x32: Serial.write(0x32); break;
case 0x84: Serial.write(0x02); break;
case 0x83: Serial.write(0x64); break;
case 0x81: Serial.write(0x17); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = INIT2;
}
void func_INIT2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x40: Serial.write(0x40); break;
case 0x34: Serial.write(0x34); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x46); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x83 ) StatusLamp = WORK1;
}
void func_WORK1( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x98); break;
case 0x92: Serial.write(0x1B); break;
case 0x30: Serial.write(0x30); break;
case 0x40: Serial.write(0x40); break;
case 0x34: Serial.write(0x34); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x46); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = WORK2;
}
void func_WORK2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0xB6); break;
case 0x92: Serial.write(0x2A); break;
case 0x40: Serial.write(0x40); break;
case 0x30: Serial.write(0x30); break;
case 0x34: Serial.write(0x34); break;
case 0x83: Serial.write(0x42); break;
case 0x84: Serial.write(0x00); break;
default : func_unique_request(data);
}
if ( data == 0x81 ) StatusLamp = WORK1;
}
void serialEvent()
{
data = Serial.read();
switch ( StatusLamp )
{
case INIT1: func_INIT1(data); break;
case INIT2: func_INIT2(data); break;
case WORK1: func_WORK1 (data); break;
case WORK2: func_WORK2 (data); break;
}
}
Только что обнаружил, что атмега ардуинки как раз и питается от 3.3в через стабилизатор, так что подключил её прямо к шлейфу и все работает гууд)) В скором времени выложу подробную инструкцию по переделке со своей схемой, единственное, что я до конца не понял за время моих скитаний - это как определить частоту, ( кроме метода тыка конечно) но я думаю, что у большинства проекторов частота или 4800 или 9600, судя по сообщениям с других форумов.
Остання редакція martinways (2015-04-10 16:11:23)
Неактивний
поздравляю )
но не доделали режим выключения, это раз.
во вторых по хорошему нужно решать один вопрос,
договоритесь, пусть нарисуют схему принципиальную .
вот если бы еще народ подтянулся, что б сделать полную замену платы балласта, с источником тока, что б можно было просто заменить платы. но это уже так - развитие, в единичном варианте не всегда оправдано.
и покажите свою релизную схему, покажу спецам когда увижу. могу посодействовать что б нарисовали ( задача в чистом виде не моя, иначе помог бы )
параметры юарта - осциллограф или ЛА )
Остання редакція NoName (2015-04-10 16:20:32)
Неактивний
Схема подключения проста до безобразия, там требуется обязательно инвертировать сигнал TX от ардуино, хотел сначала сделать инвертор на полевике, но потом придумал подключить светодиодные контакты оптрона не на плюс и TX ардуино, а на TX и массу, и сигнал на выходе получается наборот
А вот и само творение - оптроны с резюками напаял на саму ардуинку и подпаял к ней проводки сигнального шлейфа с мамки, питание и масса там присутствуют (в оригинале предназначались для запитки оптронов на балласте). Свободный желтый провод - это сигнал включения лампы, подключу его к драйверу светодиода.
Остання редакція martinways (2015-04-11 10:37:02)
Неактивний
а что со схемой не так? Там все в порядке, дело в том, что у ардуино очень мощная подтяжка на TX-RX ножках, я пробовал замыкать на массу амперметром - показало 60ма - этого с головой хватит для поджига светодиода второй оптопары или открытия фототранзистора первой оптопары. Работает просто и-де-аль-но! Правда еще подолбался над кодом, проектор иногда вываливался в ошибку при нажатии на пульте кнопки после простоя в рабочем режиме 7 минут. Разобрался в принципе переключениия режимов (work1 - work2), повторно проанализировал запись работы лампы (опять спасает лог анализатор), добавил-убрал нужные комманды, получился такой код
int data;
int StatusLamp;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
void setup() {
StatusLamp = INIT1;
Serial.begin(4800, SERIAL_8E1);
}
void loop() {
}
void func_unique_request( int data )
{
switch ( data )
{
case 0xF2: Serial.write(0x04); break;
default: Serial.write(0x00); break;
}
}
void func_INIT1( int data )
{
switch ( data )
{
case 0x00: Serial.write(0x00); break;
case 0xF2: Serial.write(0x04); break;
case 0xF4: Serial.write(0xFF); break;
case 0x40: Serial.write(0x40); break;
case 0x32: Serial.write(0x32); break;
case 0x84: Serial.write(0x02); break;
case 0x83: Serial.write(0x64); break;
case 0x81: Serial.write(0x17); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x81 ) StatusLamp = INIT2;
}
void func_INIT2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x97); break;
case 0x40: Serial.write(0x40); break;
case 0x34: Serial.write(0x34); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x46); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x83 ) StatusLamp = WORK1;
}
void func_WORK1( int data )
{
switch ( data )
{
case 0x81: Serial.write(0x98); break;
case 0x92: Serial.write(0x1B); break;
case 0x40: Serial.write(0x40); break;
case 0x30: Serial.write(0x30); break;
case 0x84: Serial.write(0x00); break;
case 0x83: Serial.write(0x42); break;
default : func_unique_request(data); break;
}
// code change status lamp to step2 ( example 0x81 )
if ( data == 0x83 ) StatusLamp = WORK2;
}
void func_WORK2( int data )
{
switch ( data )
{
case 0x81: Serial.write(0xB6); break;
case 0x92: Serial.write(0x2A); break;
case 0x40: Serial.write(0x40); break;
case 0x34: Serial.write(0x34); break;
case 0x84: Serial.write(0x04); break;
case 0x83: Serial.write(0x46); break;
default : func_unique_request(data);
}
if ( data == 0x83 ) StatusLamp = WORK1;
}
void serialEvent()
{
data = Serial.read();
switch ( StatusLamp )
{
case INIT1: func_INIT1(data); break;
case INIT2: func_INIT2(data); break;
case WORK1: func_WORK1 (data); break;
case WORK2: func_WORK2 (data); break;
}
}
Вот еще раз как выглядит моя ардуинка, буду вставлять потом её внутрь на место балласта под БП
Вы просили фото балласта - вот они, как видите шлейф от материнки варварски отрезан
Заказал в Китае светодиод 50ватт с линзой, коллиматором и драйвером на ибее за 17 баксов, не знаю может надо было в Украине найти, а то теперь ждать месяц.
Остання редакція martinways (2015-04-13 14:51:39)
Неактивний
утро доброе, ну что ж ждемс лампу, но плату нужно переделать, на попробовать хороша, но долговременное использование - не фонтан.
найдется кто-то, что лутом простенькую плату вытравит?
ваша схема благополучно "убивает" опто развязку, так делать нельзя )
Неактивний
у меня всю жизнь рулит навесной монтаж)) переделывать вряд ли буду, так как работает хорошо. А вот с переделкой на светодиод получается лажа, оптическая система настроена на использование лампы, купил 10-ваттный светодиод - яркости никакой, думаю с 50-ваттным будет так же, пошерстил на форумах - требуется точечный источник света, судя по опыту других умельцев получше результаты будут на сверхярком светике Cree 10вт, там светящиеся элементы сконценрированы на меньшей полощади, чем у обычных многоваттных диодов, попробую еще его, но если не хватит мощности, придется подбирать что-то из галлогеновых или ксеноновых ламп , может даже автомобильных.
Неактивний
Я тут все экспериментирую с светиками, перебираю один за другим, денег потратил уже прилично, но это же спортивный интерес, изобретать велосипед это ж круто)) Итак, ценой нескольков десятков долларов я пришел к выводу, что нужен только мощный точечный источник света, всем, кто вот тоже переделывает на диод сразу говорю - не тратьте деньги на матричные диоды, пусть они хоть 200ватт - бестолку, получил наконец-то сегодня матрицу 50ватт - в качестве мощного осветителя комнаты - в самый раз, так же чудесно сгодится в качестве кипятильника, то есть в хозяйстве нужная штука, но для проектора ну никак. Перед этим получил точечный 30-ваттник SST-90 - уже неплохо, но все-равно мало, вечером на диагонали 80см смотреть можно очень даже комфортно, а вот днем совсем неважно. Также это при условии наличия коллиматорной линзы - без нее тоже нормальной яркости не получите, линзу выбирать чем поменьше градусов, вот жду на днях 10 градусную, а то сейчас большая 60-градусная, есть надежда, что засветит мой праектар прыятнее. Но появился в природе точечный светик CREE XHP70 , мощность 30ватт, но на выходе 4000 люменов, это в 2 рааз больше, чем у моего устарелого SST90, так что думаю, что круче уже ничего не найти и скорее всего вот это чудо уже удовлетворит мои потребности, так что собираюсь покупать на ибее, продолжение следует...
P/S/ Дорогой друг, потерял ваш имейл, напишите мне свое имя и фамилию, номер склада Новой Почты в Киеве (если Вы из Киева), я ж хочу выслать Вам анализатор , че он у меня будет валяться, проектор вроде норм работает.
Остання редакція martinways (2015-05-14 23:25:44)
Неактивний