Pages: [1]   Go Down
Author Topic: signals for shift registers over long distance  (Read 7236 times)
0 Members and 1 Guest are viewing this topic.
0
Offline Offline
Newbie
*
Karma: 0
Posts: 14
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I have a hefty project to fix, The new years party was a success, I managed to turn data/clock line corruption into my advantage (programming the effects took minutes - as there wasn't much I could do thanks to bad signals, lol)

Anyhow, here's a pic to excite you:



and a video to finish you off:
[media]http://www.youtube.com/watch?v=P9J-kIuw6Q8[/media]


So let me explain, there are two lines at the moment I need control over, with long distance and 14 MIC5891 shift registers.
  • One line is a clock line, it is linear topology branching from the arduino mega 2560 pin 8.
  • The other line is from pin 9, it is serial data into the MIC5891 data in pin, this IC has a serial out, which cascades to the next MIC5891 data input
The clock line is.... 15.9 feet long, every 15 inches or so, there is a MIC5891 tied to the line. some are 6 inches apart, others 30 inches apart.

The data line output to the next input is similar, 15 inches between or so, with variance.

Right now it appears the clock line is just crazy full of false cycles as you get further away from its origin at the arduino. The wire is 18guage solid core.

The power supply is also a crazy schematic, branching out in a star pattern from a central PSU, then stubbed connections to bus's for the mic5891 ICs

I was looking into using the maxim RS-485 or cheaper equivalent, but I know there must be other people here with arduinos and such that came across this issue. Searching the forum with my skills does not produce much help, only more about RS-485s, lol, makes me think I am gonna need a ton of these things, considering there are 14 mic5891 shift registers.

What have you guys seen that works in long chains of one wire data and clock lines?

Also, there are plenty more pics of this thing and hot chicks if you guys want them.

So far, $1000 +/- 50, over 1500 feet of wire (loads of antennas), 1474 LEDs (7 broken = 1467 working LEDs), and loads of man hours
« Last Edit: January 06, 2011, 12:22:58 pm by deuplonicus » Logged

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 634
Posts: 34547
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Basically you need to know how fast these clock lines are going.

Then you need to arrange a low impedance driver to handle this. Your problem is that reflections and capacitance are messing up your signal. You can use a RS455 line driver and a RS485 line receiver on each of the inputs, but note there is no need to actually use the RS485 protocol.
Logged

Ontario
Offline Offline
God Member
*****
Karma: 25
Posts: 888
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Another possibly cheap approach would be to use 75 ohm coax for the timing signals.  Tie the shield to ground.  You should be able to score 25 to 50 feet of CATV cable for $2 at a dollar store.
Logged

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 634
Posts: 34547
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
cheap approach would be to use 75 ohm coax for the timing signals
So how does that get over the impedance mismatches then? All you are doing is providing a shield to the signal and that is not the problem.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 14
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

How many lines can an RS455 line driver handle? I mean with 14 ICs on one side of the sign, and 15 on the other side, this gets expensive fast. Are there other options?

Also I'm having trouble finding RS455
« Last Edit: January 06, 2011, 07:19:03 pm by deuplonicus » Logged

Ontario
Offline Offline
God Member
*****
Karma: 25
Posts: 888
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
how does that get over the impedance mismatches

It doesn't.  It just shields the signal from picking up RF and crosstalk and helps reduce radiation losses.

It seems to be your supposition that reflections and ringing are the main problem.  My guess is that he's picking up RF and AC interference.  Without being there with a scope on the line and a signal generator, it's tough to be sure which is the most critical to address or whether a partial fix is sufficient to achieve reliable operation.

30 feet of CATV cable is cheap, and may help enough to get him on his way.  A box-load of RS485 drivers would take some time and effort to set up.
Logged

Ontario
Offline Offline
God Member
*****
Karma: 25
Posts: 888
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
How many lines can an RS455

RS485 is a multidrop bus.  You can have up to 32 devices on a standards conforming bus, but there are parts that support over 100.

Have a look at http://en.wikipedia.org/wiki/EIA-485

A popular bus driver is a MAX485: http://www.maxim-ic.com/datasheet/index.mvp/id/1111
Logged

Greenwood, Indiana
Offline Offline
God Member
*****
Karma: 0
Posts: 508
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

http://lms.uni-mb.si/~meolic/students/mpk/designingRS485.pdf

This is nice if you can get it but I believe there are now pin compatible alternates by other manufacturers.
http://pdfserv.maxim-ic.com/en/ds/MAX3080-MAX3089.pdf
« Last Edit: January 06, 2011, 10:24:48 pm by mrmeval » Logged

If it was designed by man it can be repaired by man.

0
Offline Offline
Newbie
*
Karma: 0
Posts: 14
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

looks like my best bet is the max1480B for the main driver, as it has built-in complete isolation from the power supply via transformers and opto-isolation. so as to eliminate some EMI as a precaution as I'm pretty certain ringing is also the case as Grumpy Mike says. Grumpy can I verify this in any easy way with an oscilloscope?

and something like the TI 75176 for receivers
http://www.jameco.com/webapp/wcs/stores/servlet/Product_10001_10001_50964_-1

mainly because they are cheap.

Now I'm wondering, since I really have three 15ft+ lines (clock, latch and output enable), I coulddn't find anything that can drive three lines, so it looks like I would need three drivers, and 14x3 receivers = 42 for ONE letter, the other letter would have 45 receivers and three drivers,,,

That is pretty hefty, in fact more work here than the 28 circuit boards I already created with 51 soldering points on each for driving the LEDs. But as everything in electronics, things only get more complicated.

I just want to make sure this is the best solution before I get excited about it and spend a ton of money and time. I will be checking this stuff with my teachers in a few days when the new semester starts.
« Last Edit: January 07, 2011, 09:06:06 am by deuplonicus » Logged

Seattle WA
Offline Offline
Full Member
***
Karma: 1
Posts: 208
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

I think you're all making this too complicated. Even at the maximum data rate for the shift registers, 5 MHz, the clock line is too short, at 16', to produce much in the way of transmission line effects. I think gardner's supposition that it's picking up noise from the environment is generally correct. You shouldn't have much trouble with the 15" data lines, but a small inline resistor on each one will form an RC filter with the input & output capacitance of the pins that should suppress any noise.

The easiest thing to try to begin with would be to add a differential driver to the clock line. This will suppress any external interference.

You could try current mode for the clock line. Get a high current open-collector buffer on the line, connect the far end to Vcc, and make the on state the state where you have a substantial current, 20 mA should do, flowing in the line when it's on and no current when it's off. The receivers then become a small resistor (1-10 ohm) and a simple one op-amp differential amplifier. This is basically immune to all but the most extreme noise, which is why it's commonly used in industrial controls where wire runs can be in the thousands of feet and the electrical noise levels are often outlandish.
Logged

0
Offline Offline
Newbie
*
Karma: 0
Posts: 14
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Adding a differential driver for the clock line would mean I would need a receiver at each shift register right?

Could you elaborate more on this open-collector buffer idea? I'm a little confused about it the way you explained it.

Thanks for all the input guys! We are getting closure, every time I hear something new and research it, I learn ton!
Logged

Seattle WA
Offline Offline
Full Member
***
Karma: 1
Posts: 208
Arduino rocks
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Given your description of your system, I think you'd need a receiver on each one... but a receiver can be just a op-amp wired up as a differential amplifier, which is just an op-amp and half a dozen resistors. Super cheap and simple.

The current mode signalling for the clock requires you to find a way to turn on and off the current in the clock line. You don't need a buffer -- a simple NPN transistor (such as a PN2222) wired up with the emitter grounded, the base connected to your clock pin with a resistor (say 1K), and the collector connected to your clock pin. The far end of the clock line should be connected to your positive power supply. Therefore, when you turn on the clock pin, current will flow in the clock line.

At each shift register, put a small resistor in series with the line. 10 ohms is reasonable. Then put a differential op-amp amplifier on each one. A differential amp is a bog standard op-amp circuit. See http://en.wikipedia.org/wiki/Operational_amplifier_applications#Differential_amplifier for how to make this circuit. Make the gain high enough so that it hit the positive rail when the current is on and not so high that you get noise interference.
Logged

Pages: [1]   Go Up
Jump to: