Hallo liebes Forum,
nach langer Zeit des vielen lesen und lernen habe ich mich jetzt auch Angemeldet da ich dieses Problem leider nicht ohne Eure Hilfe lösen kann.
Habe vor einiger Zeit den Arduino entdeckt und habe angefangen damit ein wenig herum zu experimentieren.
Da ich mit Programmierung noch nie etwas zu tun hatte funktioniert doch schon einiges und kleine Sketche sind auch kaum ein Problem mehr - Dank ledstyles.de.
Es wurden ja schon sehr viele Themen bahndelt und konnte mir soweit immer selber sehr gut helfen aber diesmal seid Ihr gefragt
Hoffe das mir hier geholfen wird und ich genauso meinen Erfolg und Freude daran habe =)
folgendes habe ich Aufgebaut:
externen Netzteil von einem PC - 5V, 22A
WS2801 mit 142 RGB`s
Arduino 2560 Mega über USB am PC angeschlossen
Arduino Sketch von der Solderlab - http://www.solderlab.de/index.…s2801-sketch-arduino-mega
//Arduino Mega Sketch to drive strands and matrices of WS2801 pixels with Glediator.
//(c)2012 by R. Heller
//wwww.solderlab.de
//Set Baudrate in Glediator to 1MBit !!!
//Change this to YOUR matrix size!!
#define Num_Pixels 142
//Serial Data Output (Arduino-Mega Pin 6)
#define SDO_Port PORTH
#define SDO_DDR DDRH
#define SDO_Pin 2
//Serial Data Clock (Arduino-Mega Pin 7)
#define CLK_Port PORTH
#define CLK_DDR DDRH
#define CLK_Pin 3
//############################################################################################################################################################
// Don't change anything upon here! #
//############################################################################################################################################################
#define Set_CLK_Low CLK_Port &= ~(1 << CLK_Pin)
#define Set_CLK_High CLK_Port |= (1 << CLK_Pin)
#define Set_CLK_Output CLK_DDR |= (1 << CLK_Pin)
#define Set_SDO_Low SDO_Port &= ~(1 << SDO_Pin)
#define Set_SDO_High SDO_Port |= (1 << SDO_Pin)
#define Set_SDO_Output SDO_DDR |= (1 << SDO_Pin)
#define CMD_NEW_DATA 1
unsigned char display_buffer[Num_Pixels * 3];
static unsigned char *ptr;
static unsigned int pos = 0;
volatile unsigned char go = 0;
void setup()
{
Set_SDO_Output;
Set_CLK_Output;
//Disable global interrupts
cli();
//UART Initialisation
UCSR0A |= (1<<U2X0);
UCSR0B |= (1<<RXEN0) | (1<<TXEN0) | (1<<RXCIE0);
UCSR0C |= (1<<UCSZ01) | (1<<UCSZ00) ;
UBRR0H = 0;
UBRR0L = 1; //Baud Rate 1 MBit
ptr=display_buffer;
//Enable global interrupts
sei();
}
void loop()
{
if (go==1) {shift_out_data(); go=0;}
}
// USART-Interrupt-Prozedur (called every time one byte is compeltely received) #
ISR(USART0_RX_vect)
{
unsigned char b;
b=UDR0;
if (b == CMD_NEW_DATA) {pos=0; ptr=display_buffer; return;}
if (pos == (Num_Pixels*3)) {} else {*ptr=b; ptr++; pos++;}
if (pos == ((Num_Pixels*3)-1)) {go=1;}
}
// Shift out Data #
void shift_out_data()
{
for (int i=0; i<Num_Pixels; i++)
{
byte r = display_buffer[i*3+0];
byte g = display_buffer[i*3+1];
byte b = display_buffer[i*3+2];
for (byte j=0; j<8; j++)
{
Set_CLK_Low;
if (r & (1<<(7-j))) {Set_SDO_High;} else {Set_SDO_Low;}
Set_CLK_High;
}
for (byte j=0; j<8; j++)
{
Set_CLK_Low;
if (g & (1<<(7-j))) {Set_SDO_High;} else {Set_SDO_Low;}
Set_CLK_High;
}
for (byte j=0; j<8; j++)
{
Set_CLK_Low;
if (b & (byte)(1<<(7-j))) {Set_SDO_High;} else {Set_SDO_Low;}
Set_CLK_High;
}
}
Set_CLK_Low;
delayMicroseconds(800); //Latch Data
}
Alles anzeigen
zum Glediator Programm - OUTPUT:
Glediator_Protocol
Single_PixelsCOM Port: COM3
Baud-Rate: B_1000000
vorab will ich noch sagen das der Strip hervorragend schon funktioniert mit der Library von AdafruitWS2801 - Strandtest
#include "Adafruit_WS2801.h"
#include "SPI.h" // Comment out this line if using Trinket or Gemma
#ifdef __AVR_ATtiny85__
#include <avr/power.h>
#endif
/*****************************************************************************
Example sketch for driving Adafruit WS2801 pixels!
Designed specifically to work with the Adafruit RGB Pixels!
12mm Bullet shape ----> https://www.adafruit.com/products/322
12mm Flat shape ----> https://www.adafruit.com/products/738
36mm Square shape ----> https://www.adafruit.com/products/683
These pixels use SPI to transmit the color data, and have built in
high speed PWM drivers for 24 bit color per pixel
2 pins are required to interface
Adafruit invests time and resources providing this open source code,
please support Adafruit and open-source hardware by purchasing
products from Adafruit!
Written by Limor Fried/Ladyada for Adafruit Industries.
BSD license, all text above must be included in any redistribution
*****************************************************************************/
// Choose which 2 pins you will use for output.
// Can be any valid output pins.
// The colors of the wires may be totally different so
// BE SURE TO CHECK YOUR PIXELS TO SEE WHICH WIRES TO USE!
uint8_t dataPin = 2; // Yellow wire on Adafruit Pixels
uint8_t clockPin = 3; // Green wire on Adafruit Pixels
// Don't forget to connect the ground wire to Arduino ground,
// and the +5V wire to a +5V supply
// Set the first variable to the NUMBER of pixels. 25 = 25 pixels in a row
Adafruit_WS2801 strip = Adafruit_WS2801(142, dataPin, clockPin);
// Optional: leave off pin numbers to use hardware SPI
// (pinout is then specific to each board and can't be changed)
//Adafruit_WS2801 strip = Adafruit_WS2801(25);
// For 36mm LED pixels: these pixels internally represent color in a
// different format. Either of the above constructors can accept an
// optional extra parameter: WS2801_RGB is 'conventional' RGB order
// WS2801_GRB is the GRB order required by the 36mm pixels. Other
// than this parameter, your code does not need to do anything different;
// the library will handle the format change. Examples:
//Adafruit_WS2801 strip = Adafruit_WS2801(25, dataPin, clockPin, WS2801_GRB);
//Adafruit_WS2801 strip = Adafruit_WS2801(25, WS2801_GRB);
void setup() {
#if defined(__AVR_ATtiny85__) && (F_CPU == 16000000L)
clock_prescale_set(clock_div_1); // Enable 16 MHz on Trinket
#endif
strip.begin();
// Update LED contents, to start they are all 'off'
strip.show();
}
void loop() {
// Some example procedures showing how to display to the pixels
colorWipe(Color(255, 0, 0), 50);
colorWipe(Color(0, 255, 0), 50);
colorWipe(Color(0, 0, 255), 50);
rainbow(20);
rainbowCycle(20);
}
void rainbow(uint8_t wait) {
int i, j;
for (j=0; j < 256; j++) { // 3 cycles of all 256 colors in the wheel
for (i=0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, Wheel( (i + j) % 255));
}
strip.show(); // write all the pixels out
delay(wait);
}
}
// Slightly different, this one makes the rainbow wheel equally distributed
// along the chain
void rainbowCycle(uint8_t wait) {
int i, j;
for (j=0; j < 256 * 5; j++) { // 5 cycles of all 25 colors in the wheel
for (i=0; i < strip.numPixels(); i++) {
// tricky math! we use each pixel as a fraction of the full 96-color wheel
// (thats the i / strip.numPixels() part)
// Then add in j which makes the colors go around per pixel
// the % 96 is to make the wheel cycle around
strip.setPixelColor(i, Wheel( ((i * 256 / strip.numPixels()) + j) % 256) );
}
strip.show(); // write all the pixels out
delay(wait);
}
}
// fill the dots one after the other with said color
// good for testing purposes
void colorWipe(uint32_t c, uint8_t wait) {
int i;
for (i=0; i < strip.numPixels(); i++) {
strip.setPixelColor(i, c);
strip.show();
delay(wait);
}
}
/* Helper functions */
// Create a 24 bit color value from R,G,B
uint32_t Color(byte r, byte g, byte b)
{
uint32_t c;
c = r;
c <<= 8;
c |= g;
c <<= 8;
c |= b;
return c;
}
//Input a value 0 to 255 to get a color value.
//The colours are a transition r - g -b - back to r
uint32_t Wheel(byte WheelPos)
{
if (WheelPos < 85) {
return Color(WheelPos * 3, 255 - WheelPos * 3, 0);
} else if (WheelPos < 170) {
WheelPos -= 85;
return Color(255 - WheelPos * 3, 0, WheelPos * 3);
} else {
WheelPos -= 170;
return Color(0, WheelPos * 3, 255 - WheelPos * 3);
}
}
Alles anzeigen
Jetzt zu meinem Problem:
Der Glediator Sketch ist hochgeladen auf den Arduino, Glediator wie oben beschrieben eingestellt.
Ich gehe davon aus wenn die TX led auf dem Board "schnell" am "Dauerblinken" ist, besteht die USB Verbindung von PC zu dem Arduino?!
Den Strip möchte ich NUR in der länge verwenden. D.h. X=142 Y=1 - würde dies überhaupt funktionieren?
Ausprobiert habe ich es auch mit X=71 Y=2, anderster ist es nicht machbar um das ich genau auf die 142 Pixel komme.
Zerschneiden oder abschneiden will ich erst einmal vermeiden wobei eine Matrix doch auch nur in Reihe geschaltet ist oder?
Das USB Kabel ist auch nur 1 Meter lang.
Weiteres kann ich leider nicht ausschließen.
Woran kann es liegen das der Strip nichts anzeigt?
Habe ich irgend etwas übersehen?
Danke vorab für alle kommenden Beiträge.
Gruß RmK