Epson projector lockups
[Deleted User]
Posts: 0
I'm trying to come up with a better way to handle our serial control of Epson projectors for about 60 university classrooms. The problem we are having is that occasionally, the projectors will lock up and have to be recycled manually, sometimes even by having to physically unplug them.
I've talked to a few people about this, and have heard that Epson projectors are just notorious for this, but I'd like to think there's a logical way to handle data to prevent this. The code we're using now was written before I started working here, and to me it seems a bit archaic and slightly more complicated that it should be. Maybe not, though, it could just be that I don't fully understand it. It was originally written for Accents, if that matters.
Okay, this is going to be long, but here are the subroutines:
(* This program defines and resets the classroom turnoff *)
(* every time a button is pushed or a motion sensor detects. *)
Define_Call 'RESETIT'
{
Timeout = 0
Cycled = 0
cancel_wait 'Shut_Down_Wait'
wait Room_Off 'Shut_Down_Wait'
{
timeout = 1 // Sets the variable that causes the shutdown
}
}
(* This routine handles any serial data from the LCD Projector *)
(* It is called when the program detects a signal from the projector *)
(* It first copies the data into an array where it can be parsed. *)
(* *)
(* This routine just sends an inquary to the projector If nothing comes *)
(* back the projector is off The first character stays N to let the program *)
(* know the querry was unsuccessful else it will return a : and cause *)
(* the GETIT routine to run. *)
Define_Call 'PING' (* Sends a null and Causes a send from Projector *)
{ (* Also causes GETIT to receive the message from the projector *)
Proj_Latch = 0
Allow = 1
word = 'N '
Send_String LCD_Proj, "$0D" (* Sends a null and Causes a send from Projector *)
}
(* This routine handles the projector on and off *)
Define_Call 'PROJ_ON_OFF'
{
If ((HOLDOFF = 0) AND (allow = 0))
{
HOLDOFF = 1
WAIT 901 'HOLDOFF_POWER'
HOLDOFF = 0
Call 'PING' (* Quaries the projector *)
wait 4 (* Waits plenty of time to let the projector to answer and GETIT to process the reply *)
if ((word[1] = 'N')and (Word[1] <> 'E')) (* If projector didn't answer then it is off and needs to be turned on *)
{
Allow = 1
Proj_Latch = 0
Send_String LCD_Proj,"'PWR ON',$0D" (* Turn on command *)
HOLDOFF = 1
WAIT 450
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
Else (* If the first character is anything else, the projector is on *)
If ((Word[1] <> 'N') and (Allow = 0)) (* If it is on and not locked *)
{
Allow = 1
Send_String LCD_Proj,"'PWR OFF',$0D" (* Send power off command *)
HOLDOFF = 1
WAIT 900
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
}
}
DEFINE_CALL 'PROJ_OFF'
{
If (HOLDOFF = 0)
{
Holdoff = 1
wait 901
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
CALL 'PING'
Wait 4
If ((Word[1] <> 'N') and (Allow = 0)) (* If it is on and not locked *)
{
Allow = 1
Send_String LCD_Proj,"'PWR OFF',$0D" (* Send power off command *)
HOLDOFF = 1
WAIT 900
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
}
}
(* This routine switches the projector as needed *)
Define_Call 'TO_PC' (* Switch to PC *)
{
If (HOLDOFF = 0)
{
HOLDOFF = 1
wait 20
HOLDOFF = 0
Call 'PING'
wait 4
IF ((Proj_Latch = 1)AND (Allow = 0)) // Checks for projector being on and unlocked
{
Allow = 1 // Locks out other commands
Send_String LCD_Proj, "'SOURCE?',$0D" (* Send Source query tp Projector *)
wait 4 (* Wait for proj to answer and GETIT to process the response *)
If ((Allow = 0)and (Proj_Source = 1)) (* If the source is on VCR, Switch to SVGA *)
{
Allow = 1
Send_String LCD_Proj, "'SOURCE 21',$0D" (* Switch command *)
Proj_Source = 0
}
}
}
}
// This routine switches the projector to composite video mode if needed
Define_Call 'TO_VCR'
{
If (Holdoff = 0)
{
Call 'PING'
HOLDOFF = 1
wait 20
HOLDOFF = 0
wait 4
If ((Proj_Latch = 1)And (allow = 0)) // Checks for projector being on and unlocked
{
Allow = 1 // Lockout other commands
Send_String LCD_Proj, "'SOURCE?',$0D" (* Send Source query tp Projector *)
wait 4 (* Wait for proj to answer and GETIT to process the response *)
If ((Allow = 0)and (Proj_Source = 0)) (* If the source is on VCR, Switch to SVGA *)
{
Allow = 1 // Lockout other commands
Send_String LCD_Proj, "'SOURCE 41',$0D" (* Switch command *)
Proj_Source = 1
}
}
}
}
Define_call 'NTI_SLIDE'
{
SEND_STRING NTI,"'CS 01,04,01',$0D" (* Slide Projector to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,04,02',$0D" (* Slide Projector to Flat Screen *)
}
Define_Call 'NTI_PC'
{
SEND_STRING NTI,"'CS 01,01,01',$0D" (* PC to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,01,02',$0D" (* PC to Computer Flat Screen *)
}
Define_Call 'NTI_LAPTOP'
{
SEND_STRING NTI,"'CS 01,02,01',$0D" (* LAPTOP to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,02,02',$0D" (* LAPTOP to Computer Flat Screen *)
}
Define_Call 'NTI_DOC'
{
SEND_STRING NTI,"'CS 01,03,01',$0D" (* DOC Camera to Epson Projector *)
SEND_STRING DOC_CAM,"$02,'AV0',$20,$20,$03" (* Sets Doc Cam to its own camera *)
WAIT 2
SEND_STRING NTI,"'CS 01,03,02',$0D" (* DOC Camera to Computer Flat Screen *)
}
=================================
And here are the Data Events:
DEFINE_EVENT
DATA_EVENT [NTI]
{
ONLINE:
{
SEND_COMMAND NTI,"'SET BAUD 9600,N,8,1'" (* Defines the VGA Switch serial channel *)
}
}
DATA_EVENT [LCD_PROJ]
{
ONLINE:
{
(* SEND_COMMAND LCD_PROJ,"'CHARD-250'" *)
SEND_COMMAND LCD_PROJ,"'SET BAUD 9600,N,8,1'" (* Defines the Projector Switch serial channel *)
SEND_COMMAND LCD_PROJ,"'HSOFF'" (* Turns off the handshaking *)
}
}
DATA_EVENT [NTI]
{
ONLINE:
{
SEND_COMMAND Doc_Cam,"'SET BAUD 9600,N,8,1'" (* Defines the VGA Switch serial channel *)
}
}
DATA_EVENT [LCD_PROJ]
{
STRING:
{
Word = DATA.TEXT (* Copies the buffer into an array *)
Proj_Latch = 1
Word = ' '
Allow = 0
If ((Word[8] = '2')or (Word[8] = '1')) (* Gets first digit of the source data *)
Proj_Source = 0 (* If it is one the projector is set to SVGA *)
If (Word[8] = '4') (* If it is a 4 the projector is set to RCA Video *)
Proj_Source = 1
If (Word[1] = 'E')
Allow = 1
}
}
========================================
Does this make sense, or do I need to try and explain it more or include more code? Any comments, suggestions, tips?
Thanks.
I've talked to a few people about this, and have heard that Epson projectors are just notorious for this, but I'd like to think there's a logical way to handle data to prevent this. The code we're using now was written before I started working here, and to me it seems a bit archaic and slightly more complicated that it should be. Maybe not, though, it could just be that I don't fully understand it. It was originally written for Accents, if that matters.
Okay, this is going to be long, but here are the subroutines:
(* This program defines and resets the classroom turnoff *)
(* every time a button is pushed or a motion sensor detects. *)
Define_Call 'RESETIT'
{
Timeout = 0
Cycled = 0
cancel_wait 'Shut_Down_Wait'
wait Room_Off 'Shut_Down_Wait'
{
timeout = 1 // Sets the variable that causes the shutdown
}
}
(* This routine handles any serial data from the LCD Projector *)
(* It is called when the program detects a signal from the projector *)
(* It first copies the data into an array where it can be parsed. *)
(* *)
(* This routine just sends an inquary to the projector If nothing comes *)
(* back the projector is off The first character stays N to let the program *)
(* know the querry was unsuccessful else it will return a : and cause *)
(* the GETIT routine to run. *)
Define_Call 'PING' (* Sends a null and Causes a send from Projector *)
{ (* Also causes GETIT to receive the message from the projector *)
Proj_Latch = 0
Allow = 1
word = 'N '
Send_String LCD_Proj, "$0D" (* Sends a null and Causes a send from Projector *)
}
(* This routine handles the projector on and off *)
Define_Call 'PROJ_ON_OFF'
{
If ((HOLDOFF = 0) AND (allow = 0))
{
HOLDOFF = 1
WAIT 901 'HOLDOFF_POWER'
HOLDOFF = 0
Call 'PING' (* Quaries the projector *)
wait 4 (* Waits plenty of time to let the projector to answer and GETIT to process the reply *)
if ((word[1] = 'N')and (Word[1] <> 'E')) (* If projector didn't answer then it is off and needs to be turned on *)
{
Allow = 1
Proj_Latch = 0
Send_String LCD_Proj,"'PWR ON',$0D" (* Turn on command *)
HOLDOFF = 1
WAIT 450
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
Else (* If the first character is anything else, the projector is on *)
If ((Word[1] <> 'N') and (Allow = 0)) (* If it is on and not locked *)
{
Allow = 1
Send_String LCD_Proj,"'PWR OFF',$0D" (* Send power off command *)
HOLDOFF = 1
WAIT 900
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
}
}
DEFINE_CALL 'PROJ_OFF'
{
If (HOLDOFF = 0)
{
Holdoff = 1
wait 901
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
CALL 'PING'
Wait 4
If ((Word[1] <> 'N') and (Allow = 0)) (* If it is on and not locked *)
{
Allow = 1
Send_String LCD_Proj,"'PWR OFF',$0D" (* Send power off command *)
HOLDOFF = 1
WAIT 900
{
CANCEL_WAIT 'HOLDOFF_POWER'
HOLDOFF = 0
}
}
}
}
(* This routine switches the projector as needed *)
Define_Call 'TO_PC' (* Switch to PC *)
{
If (HOLDOFF = 0)
{
HOLDOFF = 1
wait 20
HOLDOFF = 0
Call 'PING'
wait 4
IF ((Proj_Latch = 1)AND (Allow = 0)) // Checks for projector being on and unlocked
{
Allow = 1 // Locks out other commands
Send_String LCD_Proj, "'SOURCE?',$0D" (* Send Source query tp Projector *)
wait 4 (* Wait for proj to answer and GETIT to process the response *)
If ((Allow = 0)and (Proj_Source = 1)) (* If the source is on VCR, Switch to SVGA *)
{
Allow = 1
Send_String LCD_Proj, "'SOURCE 21',$0D" (* Switch command *)
Proj_Source = 0
}
}
}
}
// This routine switches the projector to composite video mode if needed
Define_Call 'TO_VCR'
{
If (Holdoff = 0)
{
Call 'PING'
HOLDOFF = 1
wait 20
HOLDOFF = 0
wait 4
If ((Proj_Latch = 1)And (allow = 0)) // Checks for projector being on and unlocked
{
Allow = 1 // Lockout other commands
Send_String LCD_Proj, "'SOURCE?',$0D" (* Send Source query tp Projector *)
wait 4 (* Wait for proj to answer and GETIT to process the response *)
If ((Allow = 0)and (Proj_Source = 0)) (* If the source is on VCR, Switch to SVGA *)
{
Allow = 1 // Lockout other commands
Send_String LCD_Proj, "'SOURCE 41',$0D" (* Switch command *)
Proj_Source = 1
}
}
}
}
Define_call 'NTI_SLIDE'
{
SEND_STRING NTI,"'CS 01,04,01',$0D" (* Slide Projector to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,04,02',$0D" (* Slide Projector to Flat Screen *)
}
Define_Call 'NTI_PC'
{
SEND_STRING NTI,"'CS 01,01,01',$0D" (* PC to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,01,02',$0D" (* PC to Computer Flat Screen *)
}
Define_Call 'NTI_LAPTOP'
{
SEND_STRING NTI,"'CS 01,02,01',$0D" (* LAPTOP to Epson Projector *)
WAIT NTI_DELAY
SEND_STRING NTI,"'CS 01,02,02',$0D" (* LAPTOP to Computer Flat Screen *)
}
Define_Call 'NTI_DOC'
{
SEND_STRING NTI,"'CS 01,03,01',$0D" (* DOC Camera to Epson Projector *)
SEND_STRING DOC_CAM,"$02,'AV0',$20,$20,$03" (* Sets Doc Cam to its own camera *)
WAIT 2
SEND_STRING NTI,"'CS 01,03,02',$0D" (* DOC Camera to Computer Flat Screen *)
}
=================================
And here are the Data Events:
DEFINE_EVENT
DATA_EVENT [NTI]
{
ONLINE:
{
SEND_COMMAND NTI,"'SET BAUD 9600,N,8,1'" (* Defines the VGA Switch serial channel *)
}
}
DATA_EVENT [LCD_PROJ]
{
ONLINE:
{
(* SEND_COMMAND LCD_PROJ,"'CHARD-250'" *)
SEND_COMMAND LCD_PROJ,"'SET BAUD 9600,N,8,1'" (* Defines the Projector Switch serial channel *)
SEND_COMMAND LCD_PROJ,"'HSOFF'" (* Turns off the handshaking *)
}
}
DATA_EVENT [NTI]
{
ONLINE:
{
SEND_COMMAND Doc_Cam,"'SET BAUD 9600,N,8,1'" (* Defines the VGA Switch serial channel *)
}
}
DATA_EVENT [LCD_PROJ]
{
STRING:
{
Word = DATA.TEXT (* Copies the buffer into an array *)
Proj_Latch = 1
Word = ' '
Allow = 0
If ((Word[8] = '2')or (Word[8] = '1')) (* Gets first digit of the source data *)
Proj_Source = 0 (* If it is one the projector is set to SVGA *)
If (Word[8] = '4') (* If it is a 4 the projector is set to RCA Video *)
Proj_Source = 1
If (Word[1] = 'E')
Allow = 1
}
}
========================================
Does this make sense, or do I need to try and explain it more or include more code? Any comments, suggestions, tips?
Thanks.
0
Comments
We have the same problem with Sanyo XP-30/41 and I know that Sharp has the same issue. I was told it was caused by a bad chip they use in the controller board. I would suspect a static discharge when the lamp is fired to be another cause. Anyways I added a line of code that sends a 'dumb' command to the projector every few seconds so to keep the controller and projector in constant communication. I also added a relay that can be used to remove the power from projector (hard reset) via the controller.
Ed,
With all respects to Tom (hi Tom!), I wouldn't recommend sending regular commands, dumb or otherwise, to any LCD projector - especially during it's lamp warm-up phase (once the projector is in full operation it seems to be safe). In Sharp LCD units that's known to cause lockups - there's an AMX Tech Note about that one. One thing the note doesn't mention: on a big number of Sharp P20s, polling the projector for power-status while it's off will actually physically destroy the green LCD panel (we got burned big-time on that one). It's not clear from the code you posted if it's polling the projector or not - if it is I would delete that part. You don't mention the model of projector you're using, but if it's using Epson's VP21 protocol then sending it a change-input command when it's off will give an 'ERR' response. In my code I just send the change-input command to the projector and, if I get an 'ERR' response, I know that I need to turn it on. Simple, but it works.
Thanks for all the tips. Our lead programmer, Garry Ray wrote the code, and has since resolved the issue. Originally, we were using button pushes to trigger status polls on the projectors. After consulting several programmers, including E.J. Hudock at Lafayette College, Garry modified the program to use a combination of button pushes and timed calls to create a very tight, efficient system. Everything's working great now.
Again, thanks, we used every piece of advice we received!
I have a couple of Epsons going into a facility, and the customer mentioned that he had heard of issues polling projectors too frequently. I have never had the problem with an Epson but am now starting to wonder.
The projectors I ran into issues with are now at least 4 years old and they had a fix available at the time (replace the motherboard at a cost of $300 per projector). I would hope that the problem has since been fixed once and for all.
There was a definite correlation between polling frequency and lockup incidences. Sending commands to them (command or request) was a bit like playing Russian Roulette - you were lucky most of the time but every so often you'd get the loaded chamber.
Cannot confirm or deny but thought you should know.
We've got 300+ Epsons here of the following models: EMP810, EMP821, EMP822, EM1810, EB1925, EMP400, EB410, EB450, EBG5200, EHTW3600. I poll them all at 10 second intervals and have seen no projector lockup issues for the past 6 years. My polling code alternates between asking for power state and error state. I'd have no hesitation in recommending them.
Roger McLean
Swinburne University
Are we talking power status every 5 seconds, or power status every 60 seconds
So, since the major users of the things tended to be people who moved them around before we started using them in the classrooms, they were constantly being unplugged, thus clearing out the memory leak, never allowing the leak to get to the point of actually locking the box up.
Our solution, since the Epson engineers who showed up on campus to help us for two weeks determined the problem was the leak, and then therefor said there was nothing to do since they weren't in charge of firmware upgrade schedules, was to just plan on a hard power reset initiated by the AMX system in the room each night. (the previous sentence does diagram out correctly believe it or not...)
We installed a bunch of power controllers and ran wires back to the relays on the NI-whatevers.
I dunno about the projectors today since I don't happen to do them now. but, you might be still fighting a years-old ghost in the machine and the fix might be a $49 power controller box. Lame? yes... but it is what it is...
I wonder if they have fixed it fully. The current customer is the one who brought it up to me. He was suggesting a power polling rate of every 5 minutes. I'm used to polling every 5 seconds.
Obviously Roger has had no problems, and a power query at 10 seconds does not seem excessive to me. But maybe that is because they're all hanging upside down on the other side of the planet. So instead of leaking out the memory leaks in.
Come to think of it - I've got a few memory leaks as well. I just really don't want to try a reboot.
Did you stand on top of the dinosaurs to get the projectors mounted on the poles?
did you ever see the intro to the old The Flintstones cartoon? Same thing...
(: And my smiles are upside down as well, which means they also work differently! I always wondered what the ceiling/floor/front/rear projection option was for - now I realise it is for which hemisphere and side of the International Date Line you are on. For the record we are Ceiling + Front, since we are upside down and by the time you read this I'm already enjoying tomorrow.
We had Hitachi projectors prior to moving to Epson. We had a similar memory leak with them (particularly the Hitachi CP-X385) which required a hard power-off for 30 seconds to fix it. It was known locally as a "deep sleep" issue. My memory is getting a bit hazy on this one, but we had a fan mod done on them which drew a small amount of air in standby, which addressed maybe 95% of the units. If a fan mod addresses the issue it sounds to me more like a capacitor not discharging correctly in standby than a memory leak. Perhaps this cap supplied power to the engine logic, since you couldn't power the unit on/off via RS232, IR or even the buttons on the unit itself.
Roger McLean
Swinburne University
http://www.amxforums.com/showthread.php?3872-Control-Epson-Projector-via-IP