Baco Led Matrix

Dit topic is gesloten

@JesperR; Heb je de originele chip verwijdert en een PIC in de plaats gezet, of stuur je de CPLD aan met de PIC?

Nee de CPLD is er af en ik heb een klein printje gemaakt voor een PICje achter elk display.

WOW ziet er goed uit! Dit had dat bedrijf vast niet gedacht dat ze de displays aan Baco verkochten.

www.tinuselectronics.nl Because DIY Electronics Matters!!!!

Ik heb inmiddels een paar FDS185 schermpjes verkregen, en die zijn vrijwel hetzelfde (qua aansturing) als de FDS184; alleen het schuifregister is nu 240 bits diep i.p.v. 192.

Plaatje:
http://www.uploadarchief.net/files/download/dsc00267.jpg

De lijntjes langs de zijkanten waren omdat ik ergens een bugje had waardoor er af en toe een klokje teveel naar het schuifregister ging.

Code:
http://www.uploadarchief.net/files/download/fds185.c

Mooi! Die zijn goed terecht gekomen.

Blurp, Kan jij nu een samenvatting maken met de commando's hoe en wat en hoe je dit bord heb aangesloten.

Dat zou wel erg fijn zijn.

Dit is de informatie die ik vond over het aansluiten, is dit nog relevant ?

* Kristal bord vervangen naar 16 Mhz (Moet overeenkomen met Arduino)
* 100 ohm weerstand tussen de Optische ontvanger en de CPLD verwijderen en Arduino TXout op de CPLD aansluiten.

[Bericht gewijzigd door Xtremer op maandag 15 april 2013 10:15:50 (53%)

Ja, die aanluiting klopt nog steeds. Welke uC je gebruikt maakt eigenlijk niet uit, zolang je maar een serieel signaal kunt maken dat aan de volgende vereisten voldoet:

- baudrate 1/4 van de kristalfrequentie van je FDS bord
- Geen start/stop/parity bits, MSB first.

De Arduino (of eigenlijk de ATMEGA328, want ik gebruik geen enkele arduino-SW) kan dit alleen met de UART in SPI mode.

Ik lees geen signaal terug van het bord, de verbinding is "write only"

Omdat de ATMEGA zijn output hoog maakt als er geen data klaar staat om de versturen, en de FDS een continu hoog signaal interpreteert als "klok een 1 in in de schuifregisters) moet je continu 0x0 in het transmitregister schrijven.

Alternatief is een inverter tussen ATMEGA en FDS plaatsen. (en alle commando's inverteren.

Voor de codes: zie de sources:
http://www.uploadarchief.net/files/download/fds184.c
http://www.uploadarchief.net/files/download/fds185.c

Ik ga nog wel eens een mooier artikeltje schrijven, maar dan wil ik eerst eens een paar borden daisy chainen.

Zo vanavond nog even doorgewerkt aan wat meer panelen en het totaal bestaat nu uit 10 panelen, goed voor een 2 meter breed scherm.
http://img41.imageshack.us/img41/2847/20130415215126.jpg
http://imageshack.us/a/img17/5634/20130415215203.jpg
Het printje wat achterop elk display zit
http://imageshack.us/a/img51/3895/20130415215238.jpg
Voor de volledigheid even de code erbij gezet die op elke micro controller draait, dit is dus alleen een framebuffer die ontvangt op de uart met ~256Kbaud.

http://www.uploadarchief.net/files/download/hardware.c

Deze tekst gebruikt ongeveer 70Watt op 6,7Volt, interessant genoeg vallen de verschillen tussen de panelen bijna niet meer op wanneer de spanning hoger word( van 5 naar 6,5 Volt).

Supervet!
heb je die PIC's nou als SMD gebruikt? :-P
Ziet er indrukwekkend uit, misschien een leuk idee om in de stand op beuzen te hangen :-p

Nee gewoon als DIP maar de layout zit enkel op de top layer. Dit omdat dan geen componenten en sporen aan de kant van het display zitten. De printjes zitten enkel met tape erop geplakt.

Ja dat is inderdaad een leuk idee, is waarschijnlijk van een hele afstand wel te zien. Er is vast en zeker wel wat te regelen als t zover is :)

Dan mag ik denk ik alvast namens het hele (Rosmalen) beurs-team zeggen dat we daar wel belangstelling voor hebben. Elk jaar zijn we weer druk aan het zoeken naar een leuke zelfbouw-aandachtstrekker, en die tesla gaat ook een keer vervelen ;)

Overigens vind ik de opzet met 1 PIC per display behoorlijk overkill, omdat je ook best met 1 PIC voor de hele rij af had gekund. Maar een belangrijk argument is dat de displays wel modulair te gebruiken zijn zo. Echter door het op deze manier aan elkaar te solderen wordt dat voordeel weer een beetje teniet gedaan. Het mooiste zou natuurlijk zijn als je er per display stekkertjes aan maakt waarmee je ze doorkoppelt.

If you want to succeed, double your failure rate.

Ja ben ik met je eens, dat had een stuk zuiniger gekund kwa aantal PIC's. De printjes zelf zijn opgezet om modulair te zijn maar halverwege besloot ik om 2 panelen van een meter te maken. Overigens hoef ik t voor de kostprijs van zoon print niet te laten, ik gok dat op ongeveer 2€.

En schiet t.z.t. maar een mailtje naar me toe voor t ding te gebruiken op de beurs, dan regelen we wel dat het daarkomt.

Klopt, zo'n PICje kost ook geen kale knikker meer, en het werkt toch prima zo.

Susteren zie ik... kan bijna niet mooier, want ons rijdend magazijn woont in Roosteren. Je hoort het wel tegen die tijd, hoop dat hij nog een jaartje blijft werken :P

If you want to succeed, double your failure rate.

Op 16 april 2013 17:55:25 schreef Jochem:
Klopt, zo'n PICje kost ook geen kale knikker meer, en het werkt toch prima zo.

Susteren zie ik... kan bijna niet mooier, want ons rijdend magazijn woont in Roosteren. Je hoort het wel tegen die tijd, hoop dat hij nog een jaartje blijft werken :P

He daar heb ik vroeger gewoont, op de hei :)

Maar dat is nou pas een lichtkrant!

Hallo,

Inmiddels heb ik twee FDS185 in serie gezet. Dus het signaal dat naar de TOTX op het eerste bord doorverbonden naar de TORX op het tweede bord.
Omdat ik uiteraard te gierig ben voor een stukje glasvezel heb ik wederom de 100E weerstanden erafgestookt en draadjes gebruikt.

Code heb ik simpel gehouden, gewoon een inverse van het plaatje op het eerste display:
http://www.uploadarchief.net/files/download/dubbelnijn.jpg

Hoe werkt het:
Voor het eerste display stuurde ik de volgende sequence:
0b11 0000 000a om bitje 'a' in het schuifregister te klokken.

Welnu, het bitje voor display 2 zet ik ervoor: 0b011 0000 00ba.
Codefragment:

c code:


	uint8_t b = vp[i];            // vp is pointer naar "videoram"
	for (j = 0; j< 8; j++) {
		WRITE_DISPLAY(0x03);
		if (b&1) {
			WRITE_DISPLAY(0x01);
		} else {
			WRITE_DISPLAY(0x02);
		}
		b >>= 1;
	}

Nu nog een artikeltje schrijven met het hele verhaal van voor tot achter....

Mooi werk!
Alle extra info is hier zeker welkom want ik heb geen flauw benul wat je in je software nou eigenlijk precies doet. C is voor mij abacadabra.
Ik ben voornemens het door een kennis te laten omzetten in pseudo-code zodat ik het snap en kan herschrijven en tweaken in assembly voor een PIC18F26K22. Met usb aansluiting erbij zodat hij ook direct vanuit de pc aangestuurd kan worden.

Op 1 april 2013 17:11:26 schreef zerobase:
Letters even gedraaid en de SPI-output mode van LSBFIRST naar MSBFIRST gezet:

[afbeelding]

@Zerobase
Geweldig!!, werkt prima! dank je wel voor de uitgebreide foto's en prima beschrijving! bord draait prima hier.

Nog een vraagje,
Zou je de arduino code kunnen posten waar de truuks die je in de post boven beschrijft? ter lering ende vermaak?

Als ik een voeding aan wil sluiten om er een permanent project van de maken (ik gebruik nu een 7,2 volt accu), wat zijn dan de waarden die het beste bij het bord passen? Voltage en MAh? Is bijvoorbeeld een 250MAh voeding genoeg? (gaat om 1 FDS132 paneel)

Alvast hartelijk dank!

@Bodil:

Code die ik heb gebruikt voor het plaatsen van de tekst staat bij een vorig bericht.

Ik heb de lichtkrant nu op 3,3V draaien. De leds lichten dan wel zwak op. Bij 3V is het afgelopen. Bij 3V3 trekt de lichtkrant net geen 200mA.

Bij 5V is de tekst helder genoeg, de lichtkrant trekt dan iets van 750 mA.

Een 250 mAh accu is denk ik wat aan de krappe kant voor een FDS-132.

EDIT:
Heb nog wat zitten experimenteren met een FDS-132 met de CPLD er nog op. Ik kan nu ook individuele leds aan- en uitzetten.

De code van Blurp werkt voor een deel dus ook op de FDS-132.

Het lukt alleen (nog) niet om de lijnen te selecteren. Alleen op de onderste van de 7 lijnen branden de leds, de andere lijnen blijven uit.

[Bericht gewijzigd door zerobase op vrijdag 19 april 2013 22:22:07 (30%)

Nog een stukje code geschreven om tekst te laten scrollen op de lichtkrant (dit is met de CPLD er af). Uploaden naar uploadarchief.net lukt niet, daarom maar hier als codeblok.

Weet iemand trouwens hoe die witte 4-polige voedingsconnector heet die op de achterkant van de lichtkrant zit? Krokodilleklemmen werken ook, maar een stekker werkt toch handiger. Ebay zal ze vast hebben en anders Mouser of Farnell wel.

Vwb de code: Daar zijn nog wel wat optimalisaties te maken. waaronder:
- Bitmaps in program memory (EEMEM)
- Wegschrijven data naar schuifregisters interrupt driven maken. Hiermee kun je wachtlussen (delayMicroseconds) in de code voorkomen.

c code:


#include <delay.h>
#include <SPI.h>

#define FRAMEBUFFER_WIDTH 35
#define FRAMEBUFFER_DEPTH  7

const int strobe = 10;
const int resred = 9;
const int row_c  = 7;
const int row_b  = 6;
const int row_a  = 5;

// Character map
//
unsigned char character_map[4*FRAMEBUFFER_DEPTH]  =
{
  0x0E,0x11,0x11,0x11,0x1F,0x11,0x11,  // 'A'
  0x11,0x11,0x11,0x1F,0x11,0x11,0x11,  // 'H'
  0x01,0x01,0x01,0x01,0x01,0x01,0x1F,  // 'L'
  0x0E,0x11,0x11,0x11,0x11,0x11,0x0E   // 'O'
};

// The contents of the framebuffer is what is written to the ledbar
//
unsigned char framebuffer[FRAMEBUFFER_WIDTH * FRAMEBUFFER_DEPTH] = {0};


// Write row <x> to FDS-132
//
void setDisp(int row)
{
  int i;
  unsigned char *p=framebuffer;
  
  for (i=FRAMEBUFFER_WIDTH-1; i>=0; i--)
  {
    SPI.transfer( *(p + row*FRAMEBUFFER_WIDTH + i) );
  }
}

// Activate row <x>
//
void setRow (int row)
{
  digitalWrite (row_a, row & 1);
  digitalWrite (row_b, row & 2);
  digitalWrite (row_c, row & 4);
}

// Shift framebuffer row <x> left 1 bit
//
void shift_left(int row)
{
  unsigned char *p=framebuffer;
  int i, j;
  unsigned char ff;

  // Bits that fall-off on the left side are added back on the right side
  ff = (*(p+row*FRAMEBUFFER_WIDTH) & 0x01) << 7;
  
  *(p+row*FRAMEBUFFER_WIDTH) >>= 1;
  for (i=1; i<FRAMEBUFFER_WIDTH; i++)
  {
    *(p-1+i+row*FRAMEBUFFER_WIDTH) |= (*(p+i+row*FRAMEBUFFER_WIDTH) & 0x01) << 7;
    *(p+i+row*FRAMEBUFFER_WIDTH)  >>= 1;
  }

  // Add to the right side what fell-off on the left side  
  *(p+(row+1)*FRAMEBUFFER_WIDTH-1) |= ff;
}

// Arduino setup
//
void setup()
{
  int i;
  unsigned char *p=framebuffer;
  
  pinMode (strobe, OUTPUT);
  pinMode (resred, OUTPUT);
  pinMode (row_c,  OUTPUT);
  pinMode (row_b,  OUTPUT);
  pinMode (row_a,  OUTPUT);
  
  digitalWrite (strobe, HIGH);
  digitalWrite (resred, HIGH);
  
  SPI.setBitOrder(MSBFIRST);
  SPI.begin();

  // Load framebuffer with 'HALLO'
  for (i=0; i<FRAMEBUFFER_DEPTH; i++)
  {
    *(p + i*FRAMEBUFFER_WIDTH+28) = character_map[7+i];
    *(p + i*FRAMEBUFFER_WIDTH+29) = character_map[i];
    *(p + i*FRAMEBUFFER_WIDTH+30) = character_map[14+i];
    *(p + i*FRAMEBUFFER_WIDTH+31) = character_map[14+i];
    *(p + i*FRAMEBUFFER_WIDTH+32) = character_map[21+i];    
  }
};


// Arduino loop
//
void loop()
{
  int row;
  int i = 0;
  
  int tellertje=0;
  
  while (1)
  {
    for (row=0; row<7; row++)
    {
      digitalWrite (resred, LOW);
      digitalWrite (strobe, LOW);
      setRow(row);
      setDisp(row);
      digitalWrite (resred, HIGH);
      digitalWrite (strobe, HIGH);
      delayMicroseconds (2000);      // Determines scrolling speed
      shift_left(row);
    }
  }
}

Stekkers heb ik bij mouser gehaald maar anderen zullen het ook wel verkopen.
Contacten moet je er apart bij kopen.
571-111237224
MFG Part No:1-1123722-4
1-1123722-4
TE Connectivity Power to the Board
TARIC:8538909999 ECCN:EAR99 COO:CN

@zerobase

Dank je wel voor de info en de code!
Ik heb nu een 4.5volt 500mah adapter in gebruik en dat werkt prima, het is alleen inderdaad zo dat als je meerdere leds laat branden dat de boel zwak(ker) oplicht, maar het werkt!
We gaan weer aan de slag!

Ik heb bij baco een stekker gekocht die op de kleine aansluiting past, die hebben ze gewoon liggen, de grote gebruik ik dus niet. Via het de kleine aansluiting werkt alles ook.

En nogmaals bedankt!

Gr, Bodil.

[Bericht gewijzigd door Bodil op maandag 22 april 2013 20:39:59 (23%)

Door de info in dit topic heb ik de fds132 ook aan de praat, waarvoor dank!
Ik heb de CLPD eraf gestookt met een verfbrander (nog geen minuut werk, en het display werkt nog).
Dit is natuurlijk niet heel verstandig maar door het gebied rondom de CLPD af te dekken
met plaatjes aluminium is het denk ik relatief veilig.

Op dit moment stuur ik het bord aan met een raspberry PI.
Deze is helaas eigenlijk te traag (python), het bord knippert aanzienlijk.
Weet iemand of de shift registers simpel te nullen zijn?
Op dit moment klok ik 300 nullen in maar dat kost te veel waardevolle tijd.

Hier kan ook uw advertentie staan!

Reset hoog houden? Zeg maar wat.

[Bericht gewijzigd door Damic op zaterdag 27 april 2013 23:40:50 (28%)

Ben Belg sowat :D :: plaatjes zijn meestal klikbaar

Waarom schrijf je de code niet in C? Dat is veel sneller betreft het aansturen van de GPIO. en maak je gebruik van de SPI poort?

De reset (RESRED) heeft geen effect, deze werkt meer als een enable voor zover ik weet.
Ik zal eens naar C gaan kijken, maar ik kan nog niet overweg met C.
SPI zal waarschijnlijk wel een aardig verschil maken ja. Ik klok alles nu via de gpio in.
Waarschijnlijk zal ik toch naar een microcontroller toe moeten uiteindelijk.

Hier kan ook uw advertentie staan!

Dit topic is gesloten