Застрял с программированием led куба 8x8x8

Тема в разделе "Arduino & Shields", создана пользователем Максим B, 7 июн 2015.

  1. Максим B

    Максим B Гуру

    Всем привет. Спаяли 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 - смотрел на этот блог - не понятно в коде, какие пины отвечают за транзисторы (столбцы) и строки.
     
  2. Максим B

    Максим B Гуру

    Хотел зажечь 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);

    }
     
  3. Unixon

    Unixon Оракул Модератор

    Какая у вас схема подключения куба к регистрам?
     
  4. Unixon

    Unixon Оракул Модератор

    1) Для статичной картинки массив [8][8][8] не нужен, достаточно [8][8], т.к. один байт - это уже массив из 8 бит.
    2) Почему у вас индекс массива всегда [0][0][0] ?
     
  5. Максим B

    Максим B Гуру

    1 - а как же ось Z - если зажечь допустим все светодиоды по граням куба??? 3-х мерный с задатком ))
    2 - т.к. считал, что массив начинается с 0-го элемента. По по данному вопросу в интернете смотрел - как правильно сделать пока не разобрался к сожалению. Информацию про работу с prog_uchar брал с данного форума.
     
  6. Максим B

    Максим B Гуру

    //Пин подключен к 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
    }


    }
     
  7. Unixon

    Unixon Оракул Модератор

    Один бит - один светодиод, байт (слово) - уже строка, двумерный массив байт (слов) - это трехмерный массив бит, т.е. куб (ну или параллелепипед хотя бы).

    Ну, например:
    Массив 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);
     
     
  8. Максим B

    Максим B Гуру

    Спасибо