Gå til innhold

16x48 led matrix! hjelp til feilsøking!


Anbefalte innlegg

hei! 

 

jeg har laget en 16x48 led matrix og har gjort en STOR tabbe.. lester på www.instructables.com og fant noe jeg kunne koble etter :) men har et stort problem.. står at de 16 radene skal ha +5v og de 48 små radene skal ha gnd.. men jeg har gjort motsatt... 

 

har koblet dette på et bread bord så er ikke noe problem å koble dette rundt og bytte deler..

post-311604-0-53031400-1431731080_thumb.jpg

 

men alle lysene er loddet så det håpte jeg at jeg ikke trengte å koble rundt.. 

har spurt på tråden om arduino med koden men kom på at det kan jo være noe på bread bordet som er galt så lagte bare en ny tråd og håper det ikke gjør noe.. 

 

når jeg kobler til stømforsyningen så blinker alle lysene og lyser og tar helt av men når jeg kobler inn arduino (som er koble til bread bordet) i pc-en så stopper alt å lyse så vet ikke hvor feilen kan ligge..

 

tror kansje jeg må brukte transistor på alle de 48 radene? og ikke transistor på de 16? eller pnp transistor på de 16 og npn transistor på de 48? eller går det ann å få 74HC595 IC til å gi ut GND isteden for 5+V?

må vel gjør noe med kodene for å bruke transistor på alt? (har nok av deler og ikke noe problem å få tak i noen små deler)

 

fant også denne koden som funker til denne (hvis jeg hadde gjort det rett) så legger den med så hvis noen kan kode god og ser hva jeg kan forrande på så hadde jeg sotte veldig stor pris på hvis noen gadd å forandre det og kansje fortelt men hva de gjorde og koff så lærer jeg kansje noe i tillet :)

 

 

int x;
int y;
int latchPin1 = 5; //Arduino pin connected to blue 12 RCLK of 74HC595
int clockPin1 = 6; //Arduino pin connected to green 11 SRCLK of 74HC595
int dataPin1 = 7; //Arduino pin connected to violet 14 SER of 74HC595

//-- Rows (Positive Anodes) --
int latchPin2 = 9; //Arduino pin connected to yellow Latch 12 RCLK of 74HC595
int clockPin2 = 10; //Arduino pin connected to white Clock 11 SRCLK of 74HC595
int dataPin2 = 8; //Arduino pin connected to grey Data 14 SER of 74HC595

//=== B I T M A P ===
//Bits in this array represents one LED of the matrix
// 8 is # of rows, 7 is # of LED matrix we have
byte bitmap[8][34]; // Change the 7 to however many matrices you want to use.
int numZones = sizeof(bitmap) / 8;
int maxZoneIndex = numZones-1;
int numCols = numZones * 8;

int rr=0;
uint8_t msg[34];
String msgs;

byte alphabets[][5] = {
0x00, 0x00, 0x00, 0x00, 0x00,// (space)
0x00, 0x00, 0x5F, 0x00, 0x00,// !
0x00, 0x07, 0x00, 0x07, 0x00,// "
0x14, 0x7F, 0x14, 0x7F, 0x14,// #
0x24, 0x2A, 0x7F, 0x2A, 0x12,// $
0x23, 0x13, 0x08, 0x64, 0x62,// %
0x36, 0x49, 0x55, 0x22, 0x50,// &
0x00, 0x05, 0x03, 0x00, 0x00,// '
0x00, 0x1C, 0x22, 0x41, 0x00,// (
0x00, 0x41, 0x22, 0x1C, 0x00,// )
0x08, 0x2A, 0x1C, 0x2A, 0x08,// *
0x08, 0x08, 0x3E, 0x08, 0x08,// +
0x00, 0x50, 0x30, 0x00, 0x00,// ,
0x08, 0x08, 0x08, 0x08, 0x08,// -
0x00, 0x60, 0x60, 0x00, 0x00,// .
0x20, 0x10, 0x08, 0x04, 0x02,// /
0x3E, 0x51, 0x49, 0x45, 0x3E,// 0
0x00, 0x42, 0x7F, 0x40, 0x00,// 1
0x42, 0x61, 0x51, 0x49, 0x46,// 2
0x21, 0x41, 0x45, 0x4B, 0x31,// 3
0x18, 0x14, 0x12, 0x7F, 0x10,// 4
0x27, 0x45, 0x45, 0x45, 0x39,// 5
0x3C, 0x4A, 0x49, 0x49, 0x30,// 6
0x01, 0x71, 0x09, 0x05, 0x03,// 7
0x36, 0x49, 0x49, 0x49, 0x36,// 8
0x06, 0x49, 0x49, 0x29, 0x1E,// 9
0x00, 0x36, 0x36, 0x00, 0x00,// :
0x00, 0x56, 0x36, 0x00, 0x00,// ;
0x00, 0x08, 0x14, 0x22, 0x41,// <
0x14, 0x14, 0x14, 0x14, 0x14,// =
0x41, 0x22, 0x14, 0x08, 0x00,// >
0x02, 0x01, 0x51, 0x09, 0x06,// ?
0x32, 0x49, 0x79, 0x41, 0x3E,// @
0x7E, 0x11, 0x11, 0x11, 0x7E,// A
0x7F, 0x49, 0x49, 0x49, 0x36,// B
0x3E, 0x41, 0x41, 0x41, 0x22,// C
0x7F, 0x41, 0x41, 0x22, 0x1C,// D
0x7F, 0x49, 0x49, 0x49, 0x41,// E
0x7F, 0x09, 0x09, 0x01, 0x01,// F
0x3E, 0x41, 0x41, 0x51, 0x32,// G
0x7F, 0x08, 0x08, 0x08, 0x7F,// H
0x00, 0x41, 0x7F, 0x41, 0x00,// I
0x20, 0x40, 0x41, 0x3F, 0x01,// J
0x7F, 0x08, 0x14, 0x22, 0x41,// K
0x7F, 0x40, 0x40, 0x40, 0x40,// L
0x7F, 0x02, 0x04, 0x02, 0x7F,// M
0x7F, 0x04, 0x08, 0x10, 0x7F,// N
0x3E, 0x41, 0x41, 0x41, 0x3E,// O
0x7F, 0x09, 0x09, 0x09, 0x06,// P
0x3E, 0x41, 0x51, 0x21, 0x5E,// Q
0x7F, 0x09, 0x19, 0x29, 0x46,// R
0x46, 0x49, 0x49, 0x49, 0x31,// S
0x01, 0x01, 0x7F, 0x01, 0x01,// T
0x3F, 0x40, 0x40, 0x40, 0x3F,// U
0x1F, 0x20, 0x40, 0x20, 0x1F,// V
0x7F, 0x20, 0x18, 0x20, 0x7F,// W
0x63, 0x14, 0x08, 0x14, 0x63,// X
0x03, 0x04, 0x78, 0x04, 0x03,// Y
0x61, 0x51, 0x49, 0x45, 0x43,// Z
0x00, 0x00, 0x7F, 0x41, 0x41,// [
0x02, 0x04, 0x08, 0x10, 0x20,// "\"
0x41, 0x41, 0x7F, 0x00, 0x00,// ]
0x04, 0x02, 0x01, 0x02, 0x04,// ^
0x40, 0x40, 0x40, 0x40, 0x40,// _
0x00, 0x01, 0x02, 0x04, 0x00,// `
0x20, 0x54, 0x54, 0x54, 0x78,// a
0x7F, 0x48, 0x44, 0x44, 0x38,// b
0x38, 0x44, 0x44, 0x44, 0x20,// c
0x38, 0x44, 0x44, 0x48, 0x7F,// d
0x38, 0x54, 0x54, 0x54, 0x18,// e
0x08, 0x7E, 0x09, 0x01, 0x02,// f
0x08, 0x14, 0x54, 0x54, 0x3C,// g
0x7F, 0x08, 0x04, 0x04, 0x78,// h
0x00, 0x44, 0x7D, 0x40, 0x00,// i
0x20, 0x40, 0x44, 0x3D, 0x00,// j
0x00, 0x7F, 0x10, 0x28, 0x44,// k
0x00, 0x41, 0x7F, 0x40, 0x00,// l
0x7C, 0x04, 0x18, 0x04, 0x78,// m
0x7C, 0x08, 0x04, 0x04, 0x78,// n
0x38, 0x44, 0x44, 0x44, 0x38,// o
0x7C, 0x14, 0x14, 0x14, 0x08,// p
0x08, 0x14, 0x14, 0x18, 0x7C,// q
0x7C, 0x08, 0x04, 0x04, 0x08,// r
0x48, 0x54, 0x54, 0x54, 0x20,// s
0x04, 0x3F, 0x44, 0x40, 0x20,// t
0x3C, 0x40, 0x40, 0x20, 0x7C,// u
0x1C, 0x20, 0x40, 0x20, 0x1C,// v
0x3C, 0x40, 0x30, 0x40, 0x3C,// w
0x44, 0x28, 0x10, 0x28, 0x44,// x
0x0C, 0x50, 0x50, 0x50, 0x3C,// y
0x44, 0x64, 0x54, 0x4C, 0x44,// z
0x00, 0x08, 0x36, 0x41, 0x00,// {
0x00, 0x00, 0x7F, 0x00, 0x00,// |
0x00, 0x41, 0x36, 0x08, 0x00,// }
0x08, 0x08, 0x2A, 0x1C, 0x08,// ->
0x08, 0x1C, 0x2A, 0x08, 0x08 // <-
};
/*
byte alphabets[][5] = {
{65,65,65,65,65},
{31, 36, 68, 36, 31},
{127, 73, 73, 73, 54},
{62, 65, 65, 65, 34},
{127, 65, 65, 34, 28},
{127, 73, 73, 65, 65},
{127, 72, 72, 72, 64},
{62, 65, 65, 69, 38},
{127, 8, 8, 8, 127},
{0, 65, 127, 65, 0},
{2, 1, 1, 1, 126},
{127, 8, 20, 34, 65},
{127, 1, 1, 1, 1},
{127, 32, 16, 32, 127},
{127, 32, 16, 8, 127},
{62, 65, 65, 65, 62},
{127, 72, 72, 72, 48},
{62, 65, 69, 66, 61},
{127, 72, 76, 74, 49},
{50, 73, 73, 73, 38},
{64, 64, 127, 64, 64},
{126, 1, 1, 1, 126},
{124, 2, 1, 2, 124},
{126, 1, 6, 1, 126},
{99, 20, 8, 20, 99},
{96, 16, 15, 16, 96},
{67, 69, 73, 81, 97},
};
*/

//=== S E T U P ===

void setup() {
Serial.begin(9600);
pinMode(latchPin1, OUTPUT);
pinMode(clockPin1, OUTPUT);
pinMode(dataPin1, OUTPUT);

pinMode(latchPin2, OUTPUT);
pinMode(clockPin2, OUTPUT);
pinMode(dataPin2, OUTPUT);



//-- Clear bitmap --
for (int row = 0; row > 8; row++) {
for (int zone = 0; zone <= maxZoneIndex; zone++) {
bitmap[row][zone] = 0;
}
}
}

//=== F U N C T I O N S ===
// This routine takes whatever we've setup in the bitmap array and display it on the matrix
void RefreshDisplay()
{
for (int row = 0; row < 8; row++) {
int rowbit = 1 << row;
digitalWrite(latchPin2, LOW); //Hold latchPin LOW for as long as we're transmitting data
shiftOut(dataPin2, clockPin2, MSBFIRST, rowbit); //Transmit data

//-- Start sending column bytes --
digitalWrite(latchPin1, LOW); //Hold latchPin LOW for as long as we're transmitting data

//-- Shift out to each matrix (zone is 8 columns represented by one matrix)
for (int zone = maxZoneIndex; zone >= 0; zone--) {
shiftOut(dataPin1, clockPin1, MSBFIRST, bitmap[row][zone]);
}

//-- Done sending Column bytes, flip both latches at once to eliminate flicker
digitalWrite(latchPin1, HIGH);
digitalWrite(latchPin2, HIGH);

//-- Wait a little bit to let humans see what we've pushed out onto the matrix --
delayMicroseconds(100);
//delay(1) ;
}
}

// Converts row and colum to actual bitmap bit and turn it off/on
void Plot(int col, int row, bool isOn)
{
int zone = col / 8;
int colBitIndex = x % 8;
byte colBit = 1 << colBitIndex;
if (isOn)
bitmap[row][zone] = bitmap[y][zone] | colBit;
else
bitmap[row][zone] = bitmap[y][zone] & (~colBit);
}
// Plot each character of the message one column at a time, updated the display, shift bitmap left.
void AlphabetSoup()
{
if (rr<2){

// char msg[] = "12345678901011121314151617";


for (int charIndex=0; charIndex < (sizeof(msg)-1); charIndex++)
{
int alphabetIndex = msg[charIndex] - ' ';
if (alphabetIndex < 0) alphabetIndex=0;

//-- Draw one character of the message --
for (int col = 0; col < 6; col++)
{
for (int row = 0; row < 8; row++)
{
bool isOn = 0;
if (col<5) isOn = bitRead( alphabets[alphabetIndex][col], 7-row ) == 1;
Plot( numCols-1, row, isOn);
}

//-- The more times you repeat this loop, the slower we would scroll --
for (int refreshCount=0; refreshCount < 1; refreshCount++) //change this value to vary speed
// RefreshDisplay();
//-- Shift the bitmap one column to left --
for (int row=0; row<8; row++)
{
for (int zone=0; zone < numZones; zone++)
{
bitmap[row][zone] = bitmap[row][zone] >> 1;
// Roll over lowest bit from the next zone as highest bit of this zone.
if (zone < maxZoneIndex) bitWrite(bitmap[row][zone], 7,
bitRead(bitmap[row][zone+1],0));
}
}
}
}
}
rr++; 
}

//=== L O O P ===
void loop() {




// if (rr<2){
AlphabetSoup();
// }
//rr++;
for (int r = 0; r<10; r++){
RefreshDisplay();
//delay(100);
}
}
Endret av iam99pk
Lenke til kommentar
Videoannonse
Annonse

 

...eller går det ann å få 74HC595 IC til å gi ut GND isteden for 5+V?

Nei, det går selvsagt ikke. Men du kan vel sette inn en inverter? Tipper 74HC240 kan brukes.

okay :D så den setter jeg inn mellom ic og motstanden eller etter motstanden? (har det noe å si egentlig?) og brukder jeg det på row og colum da?

Lenke til kommentar

Det kan være formuleringen som er uklar. "få en IC til å gi ut GND isteden for 5+V" låter nokså meningsløst i mine ører. 

Utgangen er en transistor som enten leder til GND (logisk lav), eller til +5V (logisk høy).* 

Det går ikke an å gjøre om dette på en IC. Men en ekstra IC gjør jobben.

 

*(ser bort fra tri-state her).

Lenke til kommentar

Det bør vel kunne ordnes enkelt i koden ved å invertere før bitene sendes til skiftregisteret, men det kommer jo an på hvor drevet TS er i C. For å bruke den eksisterende koden slik den er så er vel det enkleste å slenge på en inverter som du sier. 

Lenke til kommentar

Det kan være formuleringen som er uklar. "få en IC til å gi ut GND isteden for 5+V" låter nokså meningsløst i mine ører. 

Utgangen er en transistor som enten leder til GND (logisk lav), eller til +5V (logisk høy).* 

Det går ikke an å gjøre om dette på en IC. Men en ekstra IC gjør jobben.

 

*(ser bort fra tri-state her).

ja ser nå at det ser rart ut xD

 

 

har besstilt den IC-en så skal prøve når jeg får den! :D satser på at det funker da :)

 

 

Det bør vel kunne ordnes enkelt i koden ved å invertere før bitene sendes til skiftregisteret, men det kommer jo an på hvor drevet TS er i C. For å bruke den eksisterende koden slik den er så er vel det enkleste å slenge på en inverter som du sier. 

hadde vert greit å lært hvordan du gjør det.. for jeg har prøvd litt men får det ikke til :( men jeg kan ikke kode noe godt i det heile tatt da..

Lenke til kommentar

Jeg har ikke satt meg inn i prosjektet ditt, men for å få 0V ut fra 74HC595 i stedet 5V så kan du rett og slett invertere (snu om) på bitene du sender ved å bruke NOT-operatoren i C, ~. I funksjonen RefreshDisplay() må du da endre til følgende hvis du skal invertere rad-bitene:

shiftOut(dataPin2, clockPin2, MSBFIRST, ~rowbit); //Transmit data

eller følgende hvis du skal invertere kolonne-bitene:  

shiftOut(dataPin1, clockPin1, MSBFIRST, ~bitmap[row][zone]);

(Merk ~ foran verdien som skal sendes. Denne operatoren snur om på alle bitene; 0 blir 1 og 1 blir 0.)

 

Jeg vil også bare legge til at programmet spiser veldig mye RAM slik det er nå. Jeg vet ikke hvilke planer du har for prosjektet, men hvis du skal legge til noe annen funksjonalitet så bør du flytte alfabetet til programminnet i stedet for RAM. 

 

 

Lenke til kommentar

Jeg har ikke satt meg inn i prosjektet ditt, men for å få 0V ut fra 74HC595 i stedet 5V så kan du rett og slett invertere (snu om) på bitene du sender ved å bruke NOT-operatoren i C, ~. I funksjonen RefreshDisplay() må du da endre til følgende hvis du skal invertere rad-bitene:

shiftOut(dataPin2, clockPin2, MSBFIRST, ~rowbit); //Transmit data

eller følgende hvis du skal invertere kolonne-bitene:  

shiftOut(dataPin1, clockPin1, MSBFIRST, ~bitmap[row][zone]);

(Merk ~ foran verdien som skal sendes. Denne operatoren snur om på alle bitene; 0 blir 1 og 1 blir 0.)

 

Jeg vil også bare legge til at programmet spiser veldig mye RAM slik det er nå. Jeg vet ikke hvilke planer du har for prosjektet, men hvis du skal legge til noe annen funksjonalitet så bør du flytte alfabetet til programminnet i stedet for RAM. 

okay er det ikke "vanskeligere" enn det? :) 

 

som sagt så har jeg bare funnet kodene på nettet så har ikke gjort noe med dem.. hvis jeg får dette til så er jeg veldig gira på å lære koding selv :) men regner med disse kodene er litt for store å begynne på så må vel finne noe annet jeg kan begynne å leke litt med :)

Lenke til kommentar

 

Jeg har ikke satt meg inn i prosjektet ditt, men for å få 0V ut fra 74HC595 i stedet 5V så kan du rett og slett invertere (snu om) på bitene du sender ved å bruke NOT-operatoren i C, ~. I funksjonen RefreshDisplay() må du da endre til følgende hvis du skal invertere rad-bitene:

shiftOut(dataPin2, clockPin2, MSBFIRST, ~rowbit); //Transmit data

eller følgende hvis du skal invertere kolonne-bitene:  

shiftOut(dataPin1, clockPin1, MSBFIRST, ~bitmap[row][zone]);

(Merk ~ foran verdien som skal sendes. Denne operatoren snur om på alle bitene; 0 blir 1 og 1 blir 0.)

 

Jeg vil også bare legge til at programmet spiser veldig mye RAM slik det er nå. Jeg vet ikke hvilke planer du har for prosjektet, men hvis du skal legge til noe annen funksjonalitet så bør du flytte alfabetet til programminnet i stedet for RAM. 

okay er det ikke "vanskeligere" enn det? :)

 

som sagt så har jeg bare funnet kodene på nettet så har ikke gjort noe med dem.. hvis jeg får dette til så er jeg veldig gira på å lære koding selv :) men regner med disse kodene er litt for store å begynne på så må vel finne noe annet jeg kan begynne å leke litt med :)

 

 

Det skal ikke være noe vanskeligere enn det nei. :) Programmet vil fungere akkurat som før, med den eneste forskjellen at når dataene sendes til skiftregisterene (74HC595) så blir de snudd fra 0 til 1 og 1 til 0. 

Lenke til kommentar

Om jeg forstod deg korrekt, så lyser LEDene når du koble til strømmen, men slukker når du kobler til arduinoen?
Eller lyser det med Arduinoen og strøm tilkoblet, men stopper når du kobler arduinoen til PCen?

 

Om det er det siste, kan det være at Arduinoen går inn i bootloaderen, eller et problem med 5V til arduinoen slik at den går i reset?

Du bør prøve å skrive et enkelt test program for matrisen din som toggler et og et LED av og på. Slik kan du teste alle koblingene og se etter kortslutninger og finne ut om det er feil i koblingene. Siden LEDene lyser i utgangspunktet høres det ikke ut som om det er noen store problemer med koblingene (vell, kanskje noen små feil her og der), men det kan være vanskelig å finne feil med avanserte programmer.
 

Lenke til kommentar

Opprett en konto eller logg inn for å kommentere

Du må være et medlem for å kunne skrive en kommentar

Opprett konto

Det er enkelt å melde seg inn for å starte en ny konto!

Start en konto

Logg inn

Har du allerede en konto? Logg inn her.

Logg inn nå
  • Hvem er aktive   0 medlemmer

    • Ingen innloggede medlemmer aktive
×
×
  • Opprett ny...