Всем привет. Спаяли led куб 8x8x8 - как праивльно им управлять?? Написали такой код - //Пин подключен к ST_CP входу 74HC595 int latchPin = 3; //Пин подключен к SH_CP входу 74HC595 int clockPin = 2; //Пин подключен к DS входу 74HC595 int dataPin = 4; int led6=6; int led7=7; int led8=8; int led9=9; int led10=10; int led11=11; int led12=12; int led13=13; byte myInts[64]; void setup() { Serial.begin(9600); //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); pinMode(led6, OUTPUT); pinMode(led7, OUTPUT); pinMode(led8, OUTPUT); pinMode(led9, OUTPUT); pinMode(led10, OUTPUT); pinMode(led11, OUTPUT); pinMode(led12, OUTPUT); pinMode(led13, OUTPUT); } void cube(int led) { digitalWrite(led, HIGH); // turn the LED on (HIGH is the voltage level) delay(1000); digitalWrite(led, LOW); // turn the LED on (HIGH is the voltage level) delay(1000); } void loop() { // отсчитываем от 0 до 255 и отображаем значение на светодиоде // for (int numberToDisplay = 0; numberToDisplay < 256; numberToDisplay++) { byte numberToDisplay=B11111111; led6=0; led7=0; led8=0; led9=0; led10=0; led11=0; led13=0; digitalWrite(led6, LOW); digitalWrite(led7, LOW); digitalWrite(led8, LOW); digitalWrite(led9, LOW); digitalWrite(led10, LOW); digitalWrite(led11, LOW); digitalWrite(led13, LOW); // устанавливаем синхронизацию "защелки" на LOW digitalWrite(latchPin, LOW); // передаем последовательно на dataPin for (byte i=0; i<8; i++){ myInts=random(256); Serial.println(myInts); shiftOut(dataPin, clockPin, MSBFIRST, myInts); cube(13-i); } digitalWrite(latchPin, HIGH); // пауза перед следующей итерацией // delay(500); } Код работает. Теперь хочу сделать другие эффекты, но не знаю как ((( Может есть какие-либо идеи?? http://ctimas.blogspot.ru/2012/07/blog-post_08.html#more - смотрел на этот блог - не понятно в коде, какие пины отвечают за транзисторы (столбцы) и строки.
Хотел зажечь 1 светодиод - тоже не загорается, что не так с кодом?? #define __PROG_TYPES_COMPAT__ #include <avr/pgmspace.h> //Пин подключен к ST_CP входу 74HC595 int latchPin = 3; //Пин подключен к SH_CP входу 74HC595 int clockPin = 2; //Пин подключен к DS входу 74HC595 int dataPin = 4; int myPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //массив пинов - выходы для строк prog_uchar MyMassive[8][8][8] PROGMEM = {B00000001,B10000000,B10000000}; //массив диодов int i,j,x,y,z; void setup() { Serial.begin(9600); //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); for (i = 0; i <=8; i = i + 1) { pinMode(myPins,OUTPUT); Serial.println(myPins); } } void loop() { // отсчитываем от 0 до 255 и отображаем значение на светодиоде // for(x=0; x<8; x++){ pgm_read_byte_near(&MyMassive[0][0][0]); // } // byte numberToDisplay=B10101010; // устанавливаем синхронизацию "защелки" на LOW digitalWrite(latchPin, LOW); // передаем последовательно на dataPin shiftOut(dataPin, clockPin, MSBFIRST, pgm_read_byte_near(&MyMassive[0][0][0])); for(j=0; j<=8; j++){ digitalWrite(pgm_read_byte_near(&MyMassive[0][0][0]), HIGH); Serial.println(myPins[j]); // turn the LED on (HIGH is the voltage level) delay(100); // wait for a second digitalWrite(pgm_read_byte_near(&MyMassive[0][0][0]), LOW); // turn the LED off by making the voltage LOW delay(10); } //"защелкиваем" регистр, тем самым устанавливая значения на выходах digitalWrite(latchPin, HIGH); // пауза перед следующей итерацией delay(500); }
1) Для статичной картинки массив [8][8][8] не нужен, достаточно [8][8], т.к. один байт - это уже массив из 8 бит. 2) Почему у вас индекс массива всегда [0][0][0] ?
1 - а как же ось Z - если зажечь допустим все светодиоды по граням куба??? 3-х мерный с задатком )) 2 - т.к. считал, что массив начинается с 0-го элемента. По по данному вопросу в интернете смотрел - как правильно сделать пока не разобрался к сожалению. Информацию про работу с prog_uchar брал с данного форума.
//Пин подключен к ST_CP входу 74HC595 int latchPin = 3; //Пин подключен к SH_CP входу 74HC595 int clockPin = 2; //Пин подключен к DS входу 74HC595 int dataPin = 4; int myPins[] = {6, 7, 8, 9, 10, 11, 12, 13}; //массив пинов - выходы для строк byte MyMassive[64]; //массив диодов int i,j,x,y,z; void setup() { // Serial.begin(9600); //устанавливаем режим OUTPUT pinMode(latchPin, OUTPUT); pinMode(clockPin, OUTPUT); pinMode(dataPin, OUTPUT); for (i = 0; i <=7; i++) { //столбы pinMode(myPins,OUTPUT); //Serial.println(myPins); digitalWrite(latchPin, LOW); // передаем последовательно на dataPin } for (x=0; x<=64; x++){ MyMassive[x]=129; if ( ((x>=0) && (x<=7)) || (x==8) || (x==15) || (x==16) || (x==23) || (x==24) || (x==31) || (x==32)|| (x==39)|| (x==40)|| (x==47)|| (x==48)|| (x==55)|| ((x>=56)&& (x<=63))) { MyMassive[x]=255; } // Serial.println( MyMassive[x]); } } void loop() { myMultiplyFunction(); } byte myMultiplyFunction(){ // устанавливаем синхронизацию "защелки" на LOW for(j=0; j<=7; j++) { //этаж for(z=0; z<=7; z++) { shiftOut(dataPin, clockPin, MSBFIRST, MyMassive[z+(j*8)]); // Serial.println (MyMassive[z+(j*8)]); //"защелкиваем" регистр, тем самым устанавливая значения на выходах } digitalWrite(latchPin, HIGH); // пауза перед следующей итерацией // delay(500); digitalWrite(latchPin, LOW); // передаем последовательно на dataPin digitalWrite(myPins[j], HIGH); delay(2); // wait for a second digitalWrite(myPins[j], LOW); // turn the LED off by making the voltage LOW } }
Один бит - один светодиод, байт (слово) - уже строка, двумерный массив байт (слов) - это трехмерный массив бит, т.е. куб (ну или параллелепипед хотя бы). Ну, например: Массив uint8_t a[8][8] достаточен для хранения данных куба 8x8x8. Массив uint16_t a[16][16] достаточен для хранения данных куба 16x16x16. Массив uint32_t a[32][32] достаточен для хранения данных куба 32x32x32. Можно записать короче: Код (Text): #define BitArray3D(name,type) type name[8*sizeof(type)][8*sizeof(type)] BitArray3D(a,uint8_t); BitArray3D(b,uint16_t); BitArray3D(c,uint32_t);