Светодиодный куб на ардуино

4X4X4 Светодиодный куб набор из Китая. Шилд для Ардуино.

Всем доброго времени суток!
Сегодня хочу рассказать Вам о Kit наборе из Китая, который позволяет собрать светодиодный куб 4х4х4 светодиода.
Всем кому интересно прошу под кат.
Давно любовался в интернете видео роликами разных кубиков, красиво смотрятся, даже чем то завораживает, особенно большие, но собрать все самому с нуля руки так и не дошли. А тут все совпало, общался с продавцов по поводу покупки ардуины, а он предложил взять вот такой маленький набор посмотреть, и вот набор пред моим несменным контролером.

Плата сделана довольно качественно, металлизация всех отверстий хорошая, маска залита хорошо, забегая вперед скажу что всю плату спаял только проволочным припоем, хватило того флюса что был в припое.

Плата подробно
Набор реально может собрать даже ребенок без помощи взрослых.
Светодиодов, резисторов и контактов производитель положил в набор с запасом, так что после сборки у меня еще кое-что осталось.
Начнем сборку
После покупки продавец выслал мне ссылку на инструкцию и текстовый скетч для Ардуино. Это очень хорошо потому как в комплекте к набору никакого мануала не было.
Первое что нужно сделать, это закрепить будущие держатели для светодиодов, производитель предлагает использовать для этого вот такие зажимы.

Согласно инструкции их нужно не просто покусать по одному, но и полностью очистить от пластика. Поначалу я решил, что очистка от пластика это лишнее, и я их просто покусаю осторожно и все, но, увы, как не старался, не получилось, пластик слишком хрупкий.

Так что в итоге пришлось доламывать пластмассу и очищать все ножки от нее.

Сборку нужно начинать именно с этих разъемов, потому что два из них запаиваются под постельки для сдвиговых регистров и сделать это потом будет очень сложно.
В итоге получилась вот такая плата.

Теперь можно перевернуть плату и запаять все остальное, а осталось только две постельки для микросхем, четыре резистора и пара гребенок для соединения с Arduino Uno.
Как по мне паять гребенки лучше всего вставив весь шилд в ардуино, так гораздо проще, чем выравнивать каждую гребенку отдельно. Главное только не перегреть.

Первый этап сборки закончен, на все ушло примерно минут 30.
Вот так плата смотрится на Arduino.

Второй этап сборка куба светодиодов.
Для сборки матриц светодиодов производитель по инструкции рекомендует сначала сделать вот такой макет.

Который должен облегчить сборку. Но почему-то показалось, что это лишнее и что 64 светодиода я и так спаяю. Спаять то я спаял, но, наверное, лучше бы таки сделал макет, было бы гораздо проще.
Итак, первое, что нужно отогнуть на всех светодиодах катоды (короткая ножка) на угол 90 градусов. Ну, тут все просто тонкие плоскогубцы, зажимаем впритык к корпусу и гнем.

Теперь отогнутые ножки нужно спаять друг с другом (как на фото) получив ряд.
Для этого я решил воспользоваться уже собранной платой.

В принципе метод получился рабочий, но довольно медленный. После сборки четырех рядов их нужно спаять в одну матрицу, соединив между собой аноды (длинная ножка) светодиодов в рядах. Тут опять же можно использовать плату вставив спаянные ранее ряды в плату свободными катодами первого светодиода вертикально вверх.

В итоге должна получиться вот такая матрица.

После того как будут спаяны все 4 матрицы их необходимо собрать между собой в куб. Сделать это можно используя свободные катоды в каждом из рядов и тонкую проволоку или остатки ножек от резисторов.

В итоге должен получить куб светодиодов, аноды спаяны в столбцы по четыре штуки и вставленный в платы шилда, а катоды спаяны в один по всему уровню. С задней части платы находится дополнительный ряд контактов D16-D19 именно к ним нужно подключить катоды уровней по порядку.

Куда именно подключать первый уровень (в D16 или D19) не так важно, главное, что бы уровни были включены последовательно, например так:D16>1, D17>2, D18>3, D19>4.

Контроль готового изделия.

В итоге на всю сборку конструктора я потратил примерно 3-3,5 часа, думаю, что если бы сделал макет получилось бы быстрее.
Теперь немного о том как это все заставить работать.
В архиве вместе с инструкцией лежит файл arduino库.zip который представляет собой подключаемую к среде разработки Arduino библиотеку, но подключить ее просто так нельзя. Для того что бы студия смогла подключить эту библиотеку нужно удалить иероглифы из имен всех папок внутри архива и из имени самого архива. Проще всего распаковать архив в любую папку и потом отдельно запаковать в ZIP архив папку ICStation_Light_cube со всем ее содержимым, вот она уже подключится к среде Arduino.

Честно говоря, этот пример меня особо не впечатлил, поэтому поискав по интернету, я нашел еще два скетча работающих именно с этим кубом. Увы, код слишком большой и вставить в обзор его нельзя, поэтому даю ссылки на первоисточники.
Пара скетчей Sketch #2
Посмотреть в конце этой статьи
Sketch #3
Скачать можно
Небольшое видео демонстрации работы.

Небольшой вывод:
Набор мне понравился, я с удовольствием провел несколько часов с паяльником.
К плюсам в первую очередь стоит отнести его простоту, невысокую цену и возможность не только поупражняться в пайке, но и в дальнейшем потренировать мозги программированием.
К минусам пожалуй стоит отнести необходимость дополнительно покупать плату Arduino UNO и разбираться как с ней работать.
Товар предоставлен для написания обзора магазином. Обзор опубликован в соответствии с п.18 Правил сайта.

Arduino.ru

Здравствуйте, решил спаять куб 8х8х8 с Arduino Pro Mini 328 (5V 16MHz) и с подключением RTC модуля. Схемы и скетч нашел в интернете, всё спаял, проверил работу сдвиговых регистров, всё отлично, но вот скетч куба не работает как нужно, зажигаеться большая часть светодиодов и некоторые с них мерцают, если нажать на подключенной клавиатуре кнопку включения/выключения мерцать перестают, а при повторном нажатии снова мерцают, на другие кнопки не реагирует. Все библиотеки которые были подключены — установлены. При компиляции никаких ошибок не выдаёт. Не могли бы помочь слегка с кодом?

// library for RTC #include <iarduino_RTC.h> iarduino_RTC time(RTC_DS1307); // library for SD card #include <SD.h> File CubeFile; // Pin_Layer int latch_layer = 5;// layer_ST_CP int clock_layer = 6;// layer_SH_CP int data_layer = 4;// layer_DS // Pin_Column int latch_column = 8;// column_ST_CP int clock_column = 9;// column_SH_CP int data_column = 7;// column_DS // Pin SD card: SD_MOSI=D11, SD_MISO=D12, SD_SCK=13 int SD_CS = 10; // Pin RTC card: RTC_SCL=A5, RTC_SDA=A4 //initialize and clear cube byte f1={255,255,255,255,255,255,255,255}; byte f2={255,255,255,255,255,255,255,255}; byte f3={255,255,255,255,255,255,255,255}; byte f4={255,255,255,255,255,255,255,255}; byte f5={255,255,255,255,255,255,255,255}; byte f6={255,255,255,255,255,255,255,255}; byte f7={255,255,255,255,255,255,255,255}; byte f8={255,255,255,255,255,255,255,255}; bool clear_cube=false; //for button volatile char button_mode=0; volatile char button_setup=0; char button_up=0; char button_down=0; char button_change=0; char button_reset=0; char status_mode=1;// 1=time; -1=programm char status_setup=0; char status_up=0; char status_down=0; char status_change=1;// 1=hour; 2=minute; 3=day; 4=month; 5=year; 6=day of week char status_reset=0; //for time char time_hour=0; char time_minute=0; char time_day=0; char time_month=0; char time_year=0; char time_day_of_week=0; char time_seconds=0; char time_x=0; //for programm unsigned int file_position=0; String file_name=»001.bin»; char file_name_0=0; char file_name_1=0; char file_name_2=1; void setup() { //for cube pinMode(latch_layer, OUTPUT);// set pinMode OUTPUT for layer and column pinMode(clock_layer, OUTPUT); pinMode(data_layer, OUTPUT); pinMode(latch_column, OUTPUT); pinMode(clock_column, OUTPUT); pinMode(data_column, OUTPUT); //for SD pinMode(SD_CS, OUTPUT);// for correct work library SD //for button attachInterrupt(1,f_mode,RISING);//mode interrupt attachInterrupt(0,f_setup,RISING);//setup interrupt pinMode(14,INPUT);//A0=reset pinMode(15,INPUT);//A1=up pinMode(16,INPUT);//A2=down pinMode(17,INPUT);//A3=change //open serial //Serial.begin(9600); // //for time time.begin(); time.gettime(); time_hour=time.Hours; time_minute=time.minutes; time_day=time.day; time_month=time.month; time_year=time.year; time_day_of_week=time.weekday; } void loop() { if(button_mode==1) { delay(300); interrupts(); if(status_mode==-1)status_mode=1; else status_mode=-1; button_mode=0; status_reset=0; status_up=0; status_down=0; status_setup=0; } if(button_setup==1) { delay(300); interrupts(); status_setup=1; button_setup=0; button_mode=0; status_reset=0; status_up=0; status_down=0; } if(digitalRead(14)==HIGH)//button reset { status_reset=1; delay(300); } if(digitalRead(16)==HIGH)//button up { status_up=1; delay(300); } if(digitalRead(15)==HIGH)//button down { status_down=1; delay(300); } if(digitalRead(17)==HIGH)//button change { delay(300); switch(status_change){ case 1: status_change=2; break; case 2: status_change=3; break; case 3: status_change=4; break; case 4: status_change=5; break; case 5: status_change=6; break; case 6: status_change=1; break;} } if(status_mode==1) { CubeFile.close(); if(clear_cube==false) { for(char x=0; x<8; x++) { f1=255; f2=255; f3=255; f4=255; f5=255; f6=255; f7=255; f8=255; } clear_cube=true; } //time mode if(status_setup==1) { change_time(); } else { //clear cube time.gettime(); time_hour=time.Hours; time_minute=time.minutes; time_day=time.day; time_month=time.month; time_year=time.year; time_day_of_week=time.weekday; if(status_reset==1) { left_side(time.month,0); right_side(time.day); word_top(3); for(int x=0; x<500; x++) { cube(f1,f2,f3,f4,f5,f6,f7,f8); } status_reset=0; } else { if(time_seconds!=time.seconds && time_x<30) { left_side(time.Hours,1); right_side(time.minutes); day_of_week(time.weekday); cube(f1,f2,f3,f4,f5,f6,f7,f8); time_x++; if(time_x==30)time_seconds=time.seconds; } else { left_side(time.Hours,0); right_side(time.minutes); day_of_week(time.weekday); cube(f1,f2,f3,f4,f5,f6,f7,f8); time_x=0; } } } } if(status_mode==-1) { if(clear_cube==true)clear_cube=false; //programm mode if(status_setup==1) { file_name=change_programm(); file_position=0; status_setup=0; } else { SD.begin(10);//Initialization for SD CubeFile=SD.open(file_name); if(CubeFile.available()>file_position) { for(char x=0; x<8; x++) { CubeFile.seek(file_position); f1=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f2=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f3=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f4=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f5=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f6=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f7=CubeFile.peek(); file_position++; CubeFile.seek(file_position); f8=CubeFile.peek(); file_position++; } cube(f1,f2,f3,f4,f5,f6,f7,f8); } else { file_position=0; file_name=change_programm(); } CubeFile.close(); } } } void word_top(char x) { switch(x){ case 0: f1=B10111011; f1=B10111011; f1=B10000011; f1=B10111011; f1=B10111011; f1=B10111011; break;//H case 1: f1=B10111011; f1=B10010011; f1=B10101011; f1=B10111011; f1=B10111011; f1=B10111011; break;//M case 2: f1=B10111011; f1=B11010111; f1=B11101111; f1=B11101111; f1=B11101111; f1=B11101111; break;//Y case 3: f1=B10001111; f1=B10110111; f1=B10111011; f1=B10111011; f1=B10110111; f1=B10001111; break;//D case 4: f1=B10111111; f1=B10010111; f1=B10101011; f1=B10101011; f1=B10101011; f1=B10101011; break;//m case 5: f1=B11111111; f1=B10111011; f1=B10101011; f1=B10101011; f1=B10101011; f1=B11010111; break;//w case 6: f1=B10001111; f1=B10110111; f1=B10110111; f1=B10001111; f1=B10111111; f1=B10111111; break;}//P } void day_of_week(char x) { switch(x){ case 0: f1=B10011111;f1=B10101011;f1=B10010101;f1=B10010111;f1=B10100101;f1=B10011011; break;//Вс case 1: f1=B10001111;f1=B10100101;f1=B10100101;f1=B10100001;f1=B10100101;f1=B10100101; break;//Пн case 2: f1=B10011111;f1=B10100001;f1=B10011011;f1=B10011011;f1=B10101011;f1=B10011011; break;//Вт case 3: f1=B11011111;f1=B10100011;f1=B10110101;f1=B10110011;f1=B10100111;f1=B11010111; break;//Ср case 4: f1=B10101111;f1=B10100001;f1=B10101011;f1=B11001011;f1=B11101011;f1=B11101011; break;//Чт case 5: f1=B10001111;f1=B10100001;f1=B10101011;f1=B10101011;f1=B10101011;f1=B10101011; break;//Пт case 6: f1=B11011111;f1=B10100001;f1=B10110111;f1=B10110011;f1=B10100101;f1=B11010011; break;}//Сб } void right_side(char x) { char x1, x2; x1=x/10; x2=x%10; char y1, y2, y3, y_x; for(char y=0; y<2; y++) { if(y==0) { y1=1; y2=2; y3=3; y_x=x1; } else { y1=5; y2=6; y3=7; y_x=x2; } switch(y_x){ case 0: f3=254; f4=254; f5=254; f6=254; f7=254; f3=254; f4=255; f5=255; f6=255; f7=254; f3=254; f4=254; f5=254; f6=254; f7=254; break; case 1: f3=254; f4=254; f5=254; f6=254; f7=254; f3=255; f4=254; f5=255; f6=255; f7=255; f3=255; f4=255; f5=254; f6=255; f7=255; break; case 2: f3=254; f4=254; f5=254; f6=255; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=255; f5=254; f6=254; f7=254; break; case 3: f3=254; f4=254; f5=254; f6=254; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; break; case 4: f3=254; f4=254; f5=254; f6=254; f7=254; f3=255; f4=255; f5=254; f6=255; f7=255; f3=254; f4=254; f5=254; f6=255; f7=255; break; case 5: f3=254; f4=255; f5=254; f6=254; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=254; f5=254; f6=255; f7=254; break; case 6: f3=254; f4=255; f5=254; f6=254; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=254; f5=254; f6=254; f7=254; break; case 7: f3=254; f4=254; f5=255; f6=255; f7=255; f3=254; f4=255; f5=254; f6=255; f7=255; f3=254; f4=255; f5=255; f6=254; f7=254; break; case 8: f3=254; f4=254; f5=254; f6=254; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=254; f5=254; f6=254; f7=254; break; case 9: f3=254; f4=254; f5=254; f6=254; f7=254; f3=254; f4=255; f5=254; f6=255; f7=254; f3=254; f4=254; f5=254; f6=255; f7=254; break;} } } void left_side(char x, char y) { if(y==0) { switch(x){ case 0: f3=B00010001; f4=B01010101; f5=B01010101; f6=B01010101; f7=B00010001; break; case 1: f3=B00011101; f4=B01011001; f5=B01010101; f6=B01011101; f7=B00011101; break; case 2: f3=B00010001; f4=B01011101; f5=B01010001; f6=B01010111; f7=B00010001; break; case 3: f3=B00010001; f4=B01011101; f5=B01010001; f6=B01011101; f7=B00010001; break; case 4: f3=B00010101; f4=B01010101; f5=B01010001; f6=B01011101; f7=B00011101; break; case 5: f3=B00010001; f4=B01010111; f5=B01010001; f6=B01011101; f7=B00010001; break; case 6: f3=B00010001; f4=B01010111; f5=B01010001; f6=B01010101; f7=B00010001; break; case 7: f3=B00010001; f4=B01011101; f5=B01011011; f6=B01010111; f7=B00010111; break; case 8: f3=B00010001; f4=B01010101; f5=B01010001; f6=B01010101; f7=B00010001; break; case 9: f3=B00010001; f4=B01010101; f5=B01010001; f6=B01011101; f7=B00010001; break; case 10: f3=B11010001; f4=B10010101; f5=B01010101; f6=B11010101; f7=B11010001; break; case 11: f3=B11011101; f4=B10011001; f5=B01010101; f6=B11011101; f7=B11011101; break; case 12: f3=B11010001; f4=B10011101; f5=B01010001; f6=B11010111; f7=B11010001; break; case 13: f3=B11010001; f4=B10011101; f5=B01010001; f6=B11011101; f7=B11010001; break; case 14: f3=B11010101; f4=B10010101; f5=B01010001; f6=B11011101; f7=B11011101; break; case 15: f3=B11010001; f4=B10010111; f5=B01010001; f6=B11011101; f7=B11010001; break; case 16: f3=B11010001; f4=B10010111; f5=B01010001; f6=B11010101; f7=B11010001; break; case 17: f3=B11010001; f4=B10011101; f5=B01011011; f6=B11010111; f7=B11010111; break; case 18: f3=B11010001; f4=B10010101; f5=B01010001; f6=B11010101; f7=B11010001; break; case 19: f3=B11010001; f4=B10010101; f5=B01010001; f6=B11011101; f7=B11010001; break; case 20: f3=B00010001; f4=B11010101; f5=B00010101; f6=B01110101; f7=B00010001; break; case 21: f3=B00011101; f4=B11011001; f5=B00010101; f6=B01111101; f7=B00011101; break; case 22: f3=B00010001; f4=B11011101; f5=B00010001; f6=B01110111; f7=B00010001; break; case 23: f3=B00010001; f4=B11011101; f5=B00010001; f6=B01111101; f7=B00010001; break; case 24: f3=B11111111; f4=B11111111; f5=B11111111; f6=B11111111; f7=B11111111; break; case 25: f3=B10111011; f4=B10101011; f5=B10101011; f6=B10101011; f7=B11010111; break;}; } else { switch(x){ case 0: f3=B00010001; f4=B01010100; f5=B01010101; f6=B01010100; f7=B00010001; break; case 1: f3=B00011101; f4=B01011000; f5=B01010101; f6=B01011100; f7=B00011101; break; case 2: f3=B00010001; f4=B01011100; f5=B01010001; f6=B01010110; f7=B00010001; break; case 3: f3=B00010001; f4=B01011100; f5=B01010001; f6=B01011100; f7=B00010001; break; case 4: f3=B00010101; f4=B01010100; f5=B01010001; f6=B01011100; f7=B00011101; break; case 5: f3=B00010001; f4=B01010110; f5=B01010001; f6=B01011100; f7=B00010001; break; case 6: f3=B00010001; f4=B01010110; f5=B01010001; f6=B01010100; f7=B00010001; break; case 7: f3=B00010001; f4=B01011100; f5=B01011011; f6=B01010110; f7=B00010111; break; case 8: f3=B00010001; f4=B01010100; f5=B01010001; f6=B01010100; f7=B00010001; break; case 9: f3=B00010001; f4=B01010100; f5=B01010001; f6=B01011100; f7=B00010001; break; case 10: f3=B11010001; f4=B10010100; f5=B01010101; f6=B11010100; f7=B11010001; break; case 11: f3=B11011101; f4=B10011000; f5=B01010101; f6=B11011100; f7=B11011101; break; case 12: f3=B11010001; f4=B10011100; f5=B01010001; f6=B11010110; f7=B11010001; break; case 13: f3=B11010001; f4=B10011100; f5=B01010001; f6=B11011100; f7=B11010001; break; case 14: f3=B11010101; f4=B10010100; f5=B01010001; f6=B11011100; f7=B11011101; break; case 15: f3=B11010001; f4=B10010110; f5=B01010001; f6=B11011100; f7=B11010001; break; case 16: f3=B11010001; f4=B10010110; f5=B01010001; f6=B11010100; f7=B11010001; break; case 17: f3=B11010001; f4=B10011100; f5=B01011011; f6=B11010110; f7=B11010111; break; case 18: f3=B11010001; f4=B10010100; f5=B01010001; f6=B11010100; f7=B11010001; break; case 19: f3=B11010001; f4=B10010100; f5=B01010001; f6=B11011100; f7=B11010001; break; case 20: f3=B00010001; f4=B11010100; f5=B00010101; f6=B01110100; f7=B00010001; break; case 21: f3=B00011101; f4=B11011000; f5=B00010101; f6=B01111100; f7=B00011101; break; case 22: f3=B00010001; f4=B11011100; f5=B00010001; f6=B01110110; f7=B00010001; break; case 23: f3=B00010001; f4=B11011100; f5=B00010001; f6=B01111100; f7=B00010001; break;}; } } void change_time() { { if(status_change==1) { if(status_up==1) { status_up=0; time_hour++; if(time_hour==24)time_hour=0; } if(status_down==1) { status_down=0; time_hour—; if(time_hour==-1)time_hour=23; } right_side(time_hour); left_side(24,0); word_top(0); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_change==2) { if(status_up==1) { status_up=0; time_minute++; if(time_minute==60)time_minute=0; } if(status_down==1) { status_down=0; time_minute—; if(time_minute==-1)time_minute=59; } right_side(time_minute); left_side(24,0); word_top(1); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_change==3) { if(status_up==1) { status_up=0; time_day++; if(time_day==32)time_day=1; } if(status_down==1) { status_down=0; time_day—; if(time_day==0)time_day=31; } right_side(time_day); left_side(24,0); word_top(3); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_change==4) { if(status_up==1) { status_up=0; time_month++; if(time_month==13)time_month=1; } if(status_down==1) { status_down=0; time_month—; if(time_month==0)time_month=12; } right_side(time_month); left_side(24,0); word_top(4); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_change==5) { if(status_up==1) { status_up=0; time_year++; if(time_year==100)time_year=0; } if(status_down==1) { status_down=0; time_year—; if(time_year==-1)time_year=99; } right_side(time_year); left_side(20,0); word_top(2); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_change==6) { if(status_up==1) { status_up=0; time_day_of_week++; if(time_day_of_week==7)time_day_of_week=0; } if(status_down==1) { status_down=0; time_day_of_week—; if(time_day_of_week==-1)time_day_of_week=6; } day_of_week(time_day_of_week); right_side(time_day_of_week); left_side(25,0); cube(f1,f2,f3,f4,f5,f6,f7,f8); } if(status_reset==1) { status_setup=0; status_reset=0; time.settime(0, time_minute, time_hour, time_day, time_month, time_year, time_day_of_week); } } } String change_programm() { String x; bool d_0=false; bool d_1=false; d_1=change_digital(file_name_2); if(d_1==true) { d_0=change_digital(file_name_1); } if(d_0==true) { change_digital(file_name_0); } x=digital_to_word(file_name_0)+digital_to_word(file_name_1)+digital_to_word(file_name_2)+».bin»; if(!SD.exists(x)) { x=»001.bin»; file_name_0=0; file_name_1=0; file_name_2=1; } return(x); } bool change_digital(char &digital) { bool x=false; switch(digital) { case 0: digital=1; break; case 1: digital=2; break; case 2: digital=3; break; case 3: digital=4; break; case 4: digital=5; break; case 5: digital=6; break; case 6: digital=7; break; case 7: digital=8; break; case 8: digital=9; break; case 9: digital=0; x=true; break; } return (x); } String digital_to_word(char digital) { String x; switch(digital) { case 0: x=»0″; break; case 1: x=»1″; break; case 2: x=»2″; break; case 3: x=»3″; break; case 4: x=»4″; break; case 5: x=»5″; break; case 6: x=»6″; break; case 7: x=»7″; break; case 8: x=»8″; break; case 9: x=»9″; break; } return (x); } void f_mode() { button_mode=1; noInterrupts(); } void f_setup() { button_setup=1; noInterrupts(); } void cube(byte f1, byte f2, byte f3, byte f4, byte f5, byte f6, byte f7, byte f8)// функция прорисовки куба { layer_column(f1,B00000001); layer_column(f2,B00000010); layer_column(f3,B00000100); layer_column(f4,B00001000); layer_column(f5,B00010000); layer_column(f6,B00100000); layer_column(f7,B01000000); layer_column(f8,B10000000); layer_column(f5,B00000000); } void layer_column(byte lc_column, byte lc_layer)// функчия выбора слоя и выполнение функции заполения столбцов { // устанавливаем синхронизацию «защелки» на LOW digitalWrite(latch_layer, LOW); // выбираем слой shiftOut(data_layer, clock_layer, MSBFIRST, lc_layer); // выбираем столбцы column(lc_column); //»защелкиваем» регистр, тем самым устанавливая значения на выходах digitalWrite(latch_layer, HIGH); } void column(byte c_column)// функция заполнения столбцов { // устанавливаем синхронизацию «защелки» на LOW digitalWrite(latch_column, LOW); // передаем последовательно на dataPin for(byte x=0; x<8; x++) { shiftOut(data_column, clock_column, MSBFIRST, c_column); } //»защелкиваем» регистр, тем самым устанавливая значения на выходах digitalWrite(latch_column, HIGH); }