Ви не увійшли.
martinways, день добрый, только вспоминал что давно нет отчета о результатах.
от ЛА не отказываюсь ), но может переделаем плату? тогда для теста потребуется. некогда раскидать на схеме пару оптронов и инвертор )
Неактивний
У меня уже нет времени переделывать и энтузиазма тоже, так как цель достигнута, в моей понимании - схема предельно проста и доработок не требует, работает идеально, что от нее еще можно хотеть? Я честно говоря даже не понимаю, почему она Вам не нравится - выход из ардуинки мощный, светодиоду оптопары хватает, сигналы отрабатываются на ура. Пару часов погонял проектор - все гуд. Смысл туда лепить дополнительные транзисторы-ключи и т.д., зачем? Пусть людишки собирают как у меня и всё заработает при условии правильного снятия алгоритма. Так что ЛА ждет Вас))
Неактивний
Здравствуйте! Я с электроникой достаточно знаком, но вот в программировании мало чего понимаю. Проблема такая: есть проектор benq mp615p, лампа там мертвая, замыкание оптрона не помогает, значит UART. Есть возможность попробовать снять с другого проектора лампу (тоже benq, но другая модель, по характеристикам примерно одинаковые) для снятия осциллограмм с оптронов. Есть возможность заказать ардуинку с программатором для неё, но вот можно ли написать код с осциллограмм? Или может кто знает где взять скетч готовый? Или без лог анализатора не получится? Хелп!))
Неактивний
привет,
если прочитать 6 страниц ))) то видно что без ЛА не обойтись, и желательно работать с рабочим объектом )
задача изначально была поставлена такая - убрать штатный блок управления лампой, а какая задача у Вас?
Неактивний
Здравствуйте, эту тему я всю прочитал))) задача переделывать проекторы на светодиоды (есть клиенты), но все проекторы с мертвыми лампами. Для некоторых можно взять лампу для снятия характеристик. Купить железки тоже не проблема, но во первых я не знаю язык "С" (впрочем как и любой другой), а во вторых под каждый проектор придется писать свой код)))). Может уже появились более простые способы обмануть uart????? Или изучать язык программирования все таки придется чтобы самому делать эмуляторы баласта? ((
Неактивний
код вы можете использовать с данной темы, он будет работать, а вот таблицу запрос - ответ нужно подбирать для каждого производителя отдельно
большинство команд например для benq совпадет но возможны отличия в разных версиях. для запуска нужен живой "объект".
лампа без мозгов, но для корректного запуска нужен в полной мере функционирующий балласт, он без работающей лампы не даст полную картину для эмулирования.
и закажите плату, хотя martinways`а я так и не убедил )
Неактивний
Приветствую, NoName! Последние полгода были у меня не очень приятные (болел), так что проектором не занимался, недавно вытащил, потестил ,пришел к выводу, что проектор дрянь в смысле изображения, мне нужно четко видеть текст. Так что я ему верну его балласт и лампу и продам. Купил другой проектор, классом повыше Epson EH-TW6600, там уже четкость гораздо лучше, все-таки кинотеатральный (хоть и средний) уровень. Так вот обошелся он мне каким-то чудом в 34000 в одном интернет-магазине (при цене в других магазинах 68000) и конечно же я тут же взялся его разбирать))))) Так как я так и не уговорил Вас взять в подарок ЛА, то он мне сейчас пригодился)) Подключил ЛА и увидел, что алгоритм там совсем иной, частота 9600 EVEN и команды такого плана:
Мать:4D 0D
Балласт: 4D 47 59 0D
Мать:53 0D
Балласт: 53 30 45 0D
Мать: 51 0D
Балласт: 51 32 0D
Мать: 4C 33 46 0D
Балласт: 41 0D
Мать: 54 0D
Балласт: 54 31 46 0D
Ну и так далее. Как видите общение идет группами сигналов и каждая группа заканчивается на 0D, так вот я не мог изменить старый скетч, так как не знаю синтаксиса, получается если 1 сигнал - 1 ответ, это у нас например case 0x53: Serial.write(0x53); break; , а вот как быть с группой? как сделать условие, если 54 0D , то балласт отвечает 54 31 46 0D ?
Неактивний
Вот засада, я целый день обновляю эту страницу, жду Вашего сообщения, а Вашего сообщения не было видно, только вот сейчас появилось, видимо старая страница в кеше засела. Прежде всего измените Ваше сообщение, добавьте НЕ болейте, а то пожелали, блин, по -дружески))) я суеверный))
Вот что успел записать, надо хотя бы старт и разгон лампы реализовать, а потом по ходу будем добавлять другие режимы (они скорее всего там есть), мне так проще, так как при возникновении ошибки буду смотреть на какой минуте она появилась и че нужно будет добавить в скетч.
Мать:4D 0D
Балласт: 4D 47 59 0D
Мать:53 0D
Балласт: 53 30 45 0D
Мать: 51 0D
Балласт: 51 32 0D
Мать: 4C 33 46 0D
Балласт: 41 0D
Мать: 51 0D
Балласт: 51 32 0D
Мать: 54 0D
Балласт: 54 31 46 0D
Потом 2 последних чередуются , идет постепенный разогрев лампы и некоторые данные ответа балласта меняются (видимо указывают матери температуру и еще что-то, но как показала практика с переделкой прошлого проектора, то можно матери выдавать одинаковые значения
Ну и потом идет такое
Мать: 4C 32 46 0D
Балласт: 41 0D
Мать: 44 0D
Балласт: 44 32 45 0D
Ну и снова каждую секунду чередуются
Мать: 51 0D
Балласт: 51 32 0D
Мать: 54 0D
Балласт: 54 32 33 0D
А вот код, который мы использовали в про
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;
}
}
шлый раз, но там реализованы разные режимы, думаю все надо будет удалять
Неактивний
Форум чето жутко глючит, сообщения не редактируются, какие-то php ошибки возникают...
Неактивний
есть такое дело с форумом, давайте полный сниф протокола.
баласт переехал на ASCII ) может так и проще для кода. частом не на ATmel реализован ?
cкайп скинул в личку, пишите туда . буду сам логировать прогресс на форуме )
Неактивний
Good day,
I have an Optoma EP752 with OSRAM PT-VIP-03MID.
The protocol for this module it is little different then the your module.
I read the RX/TX lines and in make a little arduino code but no success.
This the code:
int data; //Initialise integer 'data'
int powerPin = 2; //Enable pin 2
void setup() {
Serial.begin(9600, SERIAL_8E1); //Set up serial communication
pinMode(powerPin, OUTPUT); //Set pin 2 to output
}
void loop() {
}
void serialEvent() {
data = Serial.read(); //set 'data' to input received from ballast
delay(5);
if (data == 0x00)
Serial.write(0x00); //echo
if (data == 0x70)
Serial.write(0x70); // Enable comnication
if (data == 0xF0)
Serial.write(0xF0); Serial.write(0x01); // Company ID.
if (data == 0xF1)
Serial.write(0xF1); Serial.write(0x16); Serial.write(0x11); //Lamp driver ID
if (data == 0xF3)
Serial.write(0xF3); Serial.write(0x00); //Selected Waveform
if (data == 0xF2)
Serial.write(0xF2); Serial.write(0x64); //Waveform ID
if (data == 0xF4)
Serial.write(0xF4); Serial.write(0x80); //Act Gain
if (data == 0xF6)
Serial.write(0xF6); Serial.write(0x02); //Waveform Count
if (data == 0xFA)
Serial.write(0xFA); Serial.write(0x60);//Min Gain
if (data == 0xFB)
Serial.write(0xFB); Serial.write(0x80); //Max Gain
if (data == 0x72 && data == 60)
Serial.write(0x72); Serial.write(0x60); //Lamp power
if (data == 0xF5)
Serial.write(0xF5); Serial.write(0x01);
//default : func_unique_request(data); break;
}
https://www.dropbox.com/s/b0c5paibctzqn … 1.ino?dl=0
https://www.dropbox.com/s/jl9be4j7fpbpj … cdata?dl=0
Остання редакція Ионуц (2016-01-09 23:24:00)
Неактивний
error in code
pls use
if ( )
{
}
if (data == 0xF0)
{ Serial.write(0xF0); Serial.write(0x01); } // Company ID.
if (data == 0xF1)
{ Serial.write(0xF1); Serial.write(0x16); Serial.write(0x11); } //Lamp driver ID
Неактивний
In the bottom of my message I attach also the Saleae file.
I am novice in programming and I will correct the code.
What concern me is this:
if (data == 0x72 && data == 60)
Serial.write(0x72); Serial.write(0x60); //Lamp power
If you will se in raw RX/TX the mainboard send consecutive this command 72h 60h togheter. I don't know if my condition is correct.
72h is ~" Set Gain" command and 60h is min gain.
Остання редакція Ионуц (2016-01-09 23:44:04)
Неактивний
it will not work
if (data == 0x72 && data == 60)
Serial.write(0x72); Serial.write(0x60); //Lamp power
Logic version 1.1.15 does not open the file
what version you have ?
Неактивний
22.757439999999999,Async Serial IN ,0x72
22.758600000000001,Async Serial IN,0x60
22.759760000000000,Async Serial OUT,0x72
22.760919999999999,Async Serial OUT,0x60
void serialEvent()
{
static int cmd_2b = 0;
data = Serial.read(); //set 'data' to input received from ballast
delay(5);
if ( data == 0x00 ) Serial.write(0x00); //echo
.
.
.
if ( cmd_2b > 0)
{
Serial.write(cmd_2b); Serial.write(data);
cmd_2b = 0;
data = 0;
// Serial.write(0x72); Serial.write(0x60); //Lamp power
}
if (data == 0x72)
{
cmd_2b = data;
}
}
Неактивний
example code in message http://forum.arduino.ua/viewtopic.php?pid=613#p613
incorrect, sorry )
its for example protocol
Неактивний
example code in message http://forum.arduino.ua/viewtopic.php?pid=613#p613
incorrect, sorry )
its for example protocol
Finally I use case variant and I ignore that consecutive commands and it works.
#include <SoftwareSerial.h>
int data;
int rest;
int StatusLamp;
int ledPin = 13;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
#define TAG_LEN 2
#define ARR_LEN 1
byte code[TAG_LEN];
int bytes_read = 0;
char ss[] = {0x72, 0x60};
void setup() {
StatusLamp = INIT1;
Serial.begin(9600, SERIAL_8E1);
pinMode(13, OUTPUT);
}
void loop() {
}
void serialEvent() {
while (Serial.available() > 0)
data = Serial.read();
//Serial.flush();
//delay(200);
switch ( data )
{
case 0x00: Serial.write(0x00); break; //echo
case 0x70: Serial.write(0x70); break; // Enable comnication
case 0xF0: Serial.write(0xF0); Serial.write(0x01); break;// Company ID.
case 0xF1: Serial.write(0xF1); Serial.write(0x16); Serial.write(0x11);; break; //Lamp driver ID
case 0xF3: Serial.write(0xF3); Serial.write(0x00); break;
case 0xF2: Serial.write(0xF3); Serial.write(0x64); break;
case 0xF4: Serial.write(0xF4); Serial.write(0x80); break;
case 0xF6: Serial.write(0xF6); Serial.write(0x02); break;
case 0xFA: Serial.write(0xFA); Serial.write(0x60); break;
case 0xFB: Serial.write(0xFB); Serial.write(0x80); break;
//case (0x72 && 0x60): Serial.write(0x72); Serial.write(0x60); break;
case 0xF5: Serial.write(0xF5); Serial.write(0x01); break;
default : func_2hex_read(data); break;
}
}
void func_2hex_read(int data) {
digitalWrite(ledPin, HIGH);
}
void software_Reset()
// Restarts program from beginning but
// does not reset the peripherals and registers
{
asm volatile (" jmp 0");
}
Now I study how to read 2 ore more consecutive commands and compare with something.
I hope that somebody will use my information because also me I search and I found only on this forum.
Остання редакція Ионуц (2016-01-12 23:22:39)
Неактивний
Added check 2b CMD
success in your work )
#include <SoftwareSerial.h>
int data;
int rest;
int StatusLamp;
int ledPin = 13;
int cmd_2b = 0;
#define INIT1 1
#define INIT2 2
#define WORK1 3
#define WORK2 4
#define TAG_LEN 2
#define ARR_LEN 1
byte code[TAG_LEN];
int bytes_read = 0;
char ss[] = {0x72, 0x60};
void setup() {
StatusLamp = INIT1;
Serial.begin(9600, SERIAL_8E1);
pinMode(13, OUTPUT);
}
void loop() {
}
void serialEvent() {
while (Serial.available() > 0)
data = Serial.read();
//Serial.flush();
//delay(200);
// added by me :)
if ( cmd_2b > 0)
{
Serial.write(cmd_2b); Serial.write(data);
cmd_2b = 0;
// Serial.write(0x72); Serial.write(0x60); //Lamp power
}
else
switch ( data )
{
case 0x00: Serial.write(0x00); break; //echo
case 0x70: Serial.write(0x70); break; // Enable comnication
case 0xF0: Serial.write(0xF0); Serial.write(0x01); break;// Company ID.
case 0xF1: Serial.write(0xF1); Serial.write(0x16); Serial.write(0x11);; break; //Lamp driver ID
case 0xF3: Serial.write(0xF3); Serial.write(0x00); break;
case 0xF2: Serial.write(0xF3); Serial.write(0x64); break;
case 0xF4: Serial.write(0xF4); Serial.write(0x80); break;
case 0xF6: Serial.write(0xF6); Serial.write(0x02); break;
case 0xFA: Serial.write(0xFA); Serial.write(0x60); break;
case 0xFB: Serial.write(0xFB); Serial.write(0x80); break;
// added by me :)
case 0x72: cmd_2b = data; break;
//case (0x72 && 0x60): Serial.write(0x72); Serial.write(0x60); break;
case 0xF5: Serial.write(0xF5); Serial.write(0x01); break;
default : func_2hex_read(data); break;
}
}
void func_2hex_read(int data) {
digitalWrite(ledPin, HIGH);
}
void software_Reset()
// Restarts program from beginning but
// does not reset the peripherals and registers
{
asm volatile (" jmp 0");
}
Остання редакція NoName (2016-01-13 01:20:24)
Неактивний
Схема подключения проста до безобразия, там требуется обязательно инвертировать сигнал TX от ардуино, хотел сначала сделать инвертор на полевике, но потом придумал подключить светодиодные контакты оптрона не на плюс и TX ардуино, а на TX и массу, и сигнал на выходе получается наборот
http://forum.arduino.ua/img/members/161/schem.jpg
А вот и само творение - оптроны с резюками напаял на саму ардуинку и подпаял к ней проводки сигнального шлейфа с мамки, питание и масса там присутствуют (в оригинале предназначались для запитки оптронов на балласте). Свободный желтый провод - это сигнал включения лампы, подключу его к драйверу светодиода.
http://forum.arduino.ua/img/members/161/IMG_0210.jpg
Интересная у вас схема получилась. Вопрос только в том что повторив вашу схему с arduino UNO R3.
RX сигнал не приходит TX всё ок . Менял оптроны нет результата в чём секрет.
То есть вы предлагаете 4 контакт оптрона подтянуть на плюс.
И что значит что оптроны не нужны. То есть я выкидываю оптроны и все концы с материнки подключаю напрямую к arduino.
когда UART проинициализирован и нет передачи RX, TX = VDD
на плате martinways TX был проинвертирован, и он таким образом сделал инвертор, что у Вас я не знаю.
для начала народ дает осциллограмму с "живого" железа
берите пример с Ионуц. )
Неактивний
http://mainloop.ru/wp-content/uploads/2012/05/uart.gif
когда UART проинициализирован и нет передачи RX, TX = VDD
на плате martinways TX был проинвертирован, и он таким образом сделал инвертор, что у Вас я не знаю.
для начала народ дает осциллограмму с "живого" железа
берите пример с Ионуц. )
Проектор тот же только различия в arduino.Материка отвечает на сигналы ТХ но так как на RX arduino не чего не приходит arduino поморгает ТХ светодиодом и всё мать в ошибку.