ARDUINO Куб 4х4х4 на RGB светодиодах

02.11.2018
21
8
3
#21
@ProShow, ШИМ именно это и делает. Включает и выключает что-то с большой скоростью. Для светодиода это выражается в яркости свечения, для мотора в скорости вращения, для нагревателя в температуре. А в RGB светодиоде это проявляется как разные оттенки цвета.
 
15.12.2018
9
0
1
#22
@pi1985, вот поэтому и напрашивается вопрос: Если не используете ШИМ, то каким образом делаете смешивание цветов? Или вы имели ввиду стандартные R+G, B+G и т.д.?
 
02.11.2018
21
8
3
#23
Именно об этом я и написал в сообщении #7. На сдвиговом регистре по другому не сделать без программного ШИМ.
 
15.12.2018
9
0
1
#24
Именно об этом я и написал в сообщении #7. На сдвиговом регистре по другому не сделать без программного ШИМ.
Да, но там Вы указали лишь 8 цветов. А потом вообще сказали, что никак сдвиговый регистр не поддерживает ШИМ. Что-то я запутался. Вы используете 8 цветов и не хотите больше, или только 8 и можно достичь?
 
02.11.2018
21
8
3
#25
Да, но там Вы указали лишь 8 цветов. А потом вообще сказали, что никак сдвиговый регистр не поддерживает ШИМ. Что-то я запутался. Вы используете 8 цветов и не хотите больше, или только 8 и можно достичь?
Правильно, только 8. И ШИМ сдвиговый регистр не поддерживает, да. Принцип работы куба можно представить такой схемой. Попробуйте её собрать, и все вопросы сразу пропадут.
 

Вложения

02.11.2018
21
8
3
#29
@Wan-Derer, потренироваться, конечно, можно. Но для меня куб свою задачу выполнил в таком виде, как он есть сейчас. Для меня сейчас более важно сделать покадровую анимацию, чем ШИМ.
А куб я сделал по нескольким причинам:
1. Хотелось цвета
2. Потренироваться перед созданием старшего брата.
3. Ребёнку нравится.
4. Хорошо смотрится в качестве замены гирлянде.
А чтобы был ШИМ, ко мне едут TLC5940. Программировать их будет то ещё развлечение.
 
Последнее редактирование:
15.12.2018
9
0
1
#30
@pi1985, TLC5940 это, конечно, хорошо, но есть ли его аналоги или варианты с контролем не по катодам, а по анодам?
 
15.12.2018
9
0
1
#32
@Wan-Derer, у меня светодиоды с общим анодом и мне нужен ШИМ на кристаллики R,G,B раздельно, а не все сразу. Мне не яркость нужно менять, а цвет.
 
02.11.2018
21
8
3
#34
Нарисовал нижнюю часть корпуса в OpenScad. Пробовал напечатать, из-за слабого обдува пластик потёк и ничего не получилось, так что фото потом.

box.png

Код:
//Размеры платы
board_size_x = 116.9;
board_size_y = 115.7;
board_size_z = 2;
board_pos_x = 4;
board_pos_y = 4;
board_color = "Blue";

//Отверстия в плате
board_hole_diam = 3;
board_hole1_pos_x = 2.5+board_hole_diam/2;
board_hole1_pos_y = 2+board_hole_diam/2;
board_hole2_pos_x = 2.6+board_hole_diam/2;
board_hole2_pos_y = board_size_y-2.7-board_hole_diam/2;
board_hole3_pos_x = board_size_x-2.4-board_hole_diam/2;
board_hole3_pos_y = board_size_y-2.8-board_hole_diam/2;
board_hole4_pos_x = board_size_x-2.2-board_hole_diam/2;
board_hole4_pos_y = 3.1+board_hole_diam/2;

//Размеры корпуса
box_size_x = 125;
box_size_y = 125;
box_size_z = 25;
box_thickness = 2;
box_walls_color = "Green";
box_down_color = "Red";

//понставка для крепления платы к корпусу
step_size_x = 12;
step_size_y = 12;
step_size_z = 22;
step_color = "Yellow";
step1_pos_x = box_thickness;
step1_pos_y = box_thickness;
step2_pos_x = box_thickness;
step2_pos_y = box_size_y-box_thickness-step_size_y;
step3_pos_x = box_size_x-box_thickness-step_size_x;
step3_pos_y = box_size_y-box_thickness-step_size_y;
step4_pos_x = box_size_x-box_thickness-step_size_x;
step4_pos_y = box_thickness;

//Отверстия в подставках
step_hole_diam = 2;
step_hole_height = 16;
step1_hole_pos_x = board_pos_x-box_thickness+board_hole1_pos_x;
step1_hole_pos_y = board_pos_y-box_thickness+board_hole1_pos_y;
step2_hole_pos_x = board_pos_x-box_thickness+board_hole2_pos_x;
step2_hole_pos_y = board_pos_y+board_hole2_pos_y-step2_pos_y;
step3_hole_pos_x = board_pos_x+board_hole3_pos_x-step3_pos_x;
step3_hole_pos_y = board_pos_y+board_hole3_pos_y-step3_pos_y;
step4_hole_pos_x = board_pos_x+board_hole4_pos_x-step4_pos_x;
step4_hole_pos_y = board_pos_y-box_thickness+board_hole4_pos_y;
step_hole_pos_z = step_size_z-step_hole_height+1;

//Размеры и положение отверстия для провода
box_wire_hole_height = 10;
wire_hole_diam = 4;
wire_hole_height = box_thickness+2;
box_wire_hole_y_pos = box_size_y-box_thickness-1;
box_wire_hole_x_pos = 5+step_size_x;

//Размеры и положение отверстий для кнопок и крепёжных шурупов
button_size_x = 5;
button_size_y = 6;
button_size_z = 6;
button_distance = 2;
button_color = "Cyan";

button_pos_x = box_thickness+2;
button1_pos_y = step2_pos_y-button_size_y-button_distance-10;
button2_pos_y = button1_pos_y-button_size_y-button_distance;
button_pos_z = (box_size_z-button_size_z)/2;

button_hole_diam = 3.5;
button_hole_height = box_thickness+2;
box_button_hole_height = box_size_z/2;
box_button1_hole_y_pos = button1_pos_y+button_size_y/2;
box_button2_hole_y_pos = button2_pos_y+button_size_y/2;
box_button_hole_x_pos = -1;

screw_hole_diam = 2.5;
box_screw_hole1_y = button2_pos_y-5;
box_screw_hole2_y = box_screw_hole1_y + button_size_y*2+10+button_distance;

//Кнопки
button_height1 = 9;
button_height2 = 2;
button_diam1 = 3;
button_diam2 = 5;
button1_color = "Magenta";

//Планка для кнопок
plane_size_x = button_size_x*2;
plane_size_y = box_screw_hole2_y-box_screw_hole1_y+5;
plane_size_z = box_thickness;
plane_hole_diam = 2;

//Выключатель
switch_size_x = box_thickness+2;
switch_size_y = 8;
switch_size_z = 14;
switch_pos_x = -1;
switch_pos_y = box_screw_hole1_y-switch_size_y-6;
switch_pos_z = (box_size_z-switch_size_z)/2;

//Печатная плата
/*color(board_color) translate([board_pos_x, board_pos_y, step_size_z+box_thickness]){
    difference(){
       
        cube([board_size_x, board_size_y, board_size_z]);
       
        translate([board_hole1_pos_x, board_hole1_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
       
        translate([board_hole2_pos_x, board_hole2_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
       
        translate([board_hole3_pos_x, board_hole3_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
       
        translate([board_hole4_pos_x, board_hole4_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
    }
}*/

color(box_down_color) cube([box_size_x, box_size_y, box_thickness]);
translate([0, 0, box_thickness]){
    color(box_walls_color){
        difference(){
            cube([box_thickness, box_size_x, box_size_z]);
   
            //Отверстия под кнопки
            translate([box_button_hole_x_pos, box_button1_hole_y_pos, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = button_hole_diam, $fn = 100);
           
            translate([box_button_hole_x_pos, box_button2_hole_y_pos, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = button_hole_diam, $fn = 100);

            //отверстия под винты
            translate([box_button_hole_x_pos, box_screw_hole1_y, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = screw_hole_diam, $fn = 100);

            translate([box_button_hole_x_pos, box_screw_hole2_y, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = screw_hole_diam, $fn = 100);

            //Отверстие под кнопку включения
            translate([switch_pos_x, switch_pos_y, switch_pos_z])
                cube([switch_size_x, switch_size_y, switch_size_z]);
        }
       
        difference(){
            translate([0, box_size_y-box_thickness, 0]) cube([box_size_x, box_thickness, box_size_z]);
           
            translate([box_wire_hole_x_pos, box_wire_hole_y_pos, box_wire_hole_height])
                rotate([-90, 0, 0])
                cylinder(h = wire_hole_height, d = wire_hole_diam, $fn = 100);
        }
       
        cube([box_size_x, box_thickness, box_size_z]);
        translate([box_size_x-box_thickness, 0, 0]) cube([box_thickness, box_size_y, box_size_z]);
    }

    //Кнопки
    /*color(button_color){
        translate([button_pos_x, button1_pos_y, button_pos_z]) cube([button_size_x, button_size_y, button_size_z]);
       
        translate([button_pos_x, button2_pos_y, button_pos_z]) cube([button_size_x, button_size_y, button_size_z]);
    }*/
    //Отверстие под кнопку включения
   
}

//Подставки под плату с отверстиями под винты
color(step_color){
    translate([step1_pos_x, step1_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step1_hole_pos_x, step1_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
       

    translate([step2_pos_x, step2_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step2_hole_pos_x, step2_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }

    translate([step3_pos_x, step3_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step3_hole_pos_x, step3_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
       
    translate([step4_pos_x, step4_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step4_hole_pos_x, step4_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
}

//Кнопки
color(button1_color){
    translate([130, 10, 0]){
        cylinder(h = button_height1, d = button_diam1, $fn = 100);
        cylinder(h = button_height2, d = button_diam2, $fn = 100);
    }
   
    translate([130, 16, 0]){
        cylinder(h = button_height1, d = button_diam1, $fn = 100);
        cylinder(h = button_height2, d = button_diam2, $fn = 100);
    }
   
    translate([130, 20, 0])
        difference(){
            cube([plane_size_x, plane_size_y, plane_size_z]);
           
            translate([plane_size_x/2, 2.5, -1])
                cylinder(h = box_thickness+2, d = plane_hole_diam, $fn = 100);
            translate([plane_size_x/2, box_screw_hole2_y-box_screw_hole1_y+2.5, -1])
                cylinder(h = box_thickness+2, d = plane_hole_diam, $fn = 100);
        }
       
}
 
02.11.2018
21
8
3
#37
Немного доработал корпус.
Размеры: 130,9*129,7*44 мм. Толщина стенок 4 мм.

Код:
//Толщина стенок корпуса
box_thickness = 4;

//Размеры платы
board_size_x = 116.9;
board_size_y = 115.7;
board_size_z = 2;
board_abs_pos_x = box_thickness + 3;
board_abs_pos_y = box_thickness + 3;
board_pos_x = 3;
board_pos_y = 3;
board_color = "Blue";

//Размеры корпуса
box_size_x = board_size_x + box_thickness*2 + board_pos_x*2;
box_size_y = board_size_y + box_thickness*2 + board_pos_y*2;
box_size_z = 40;
box_walls_color = "Green";
box_down_color = "Red";

//Отверстия в плате
board_hole_diam = 3;
board_hole1_pos_x = 2.5+board_hole_diam/2;
board_hole1_pos_y = 2+board_hole_diam/2;
board_hole2_pos_x = 2.6+board_hole_diam/2;
board_hole2_pos_y = board_size_y-2.7-board_hole_diam/2;
board_hole3_pos_x = board_size_x-2.4-board_hole_diam/2;
board_hole3_pos_y = board_size_y-2.8-board_hole_diam/2;
board_hole4_pos_x = board_size_x-2.2-board_hole_diam/2;
board_hole4_pos_y = 3.1+board_hole_diam/2;

//подставка для крепления платы к корпусу
step_size_x = 12;
step_size_y = 12;
step_size_z = 35;
step_color = "Yellow";
step1_pos_x = box_thickness;
step1_pos_y = box_thickness;
step2_pos_x = box_thickness;
step2_pos_y = box_size_y-box_thickness-step_size_y;
step3_pos_x = box_size_x-box_thickness-step_size_x;
step3_pos_y = box_size_y-box_thickness-step_size_y;
step4_pos_x = box_size_x-box_thickness-step_size_x;
step4_pos_y = box_thickness;

//Отверстия в подставках
step_hole_diam = 2;
step_hole_height = 16;
step1_hole_pos_x = board_abs_pos_x-box_thickness+board_hole1_pos_x;
step1_hole_pos_y = board_abs_pos_y-box_thickness+board_hole1_pos_y;
step2_hole_pos_x = board_abs_pos_x-box_thickness+board_hole2_pos_x;
step2_hole_pos_y = board_abs_pos_y+board_hole2_pos_y-step2_pos_y;
step3_hole_pos_x = board_abs_pos_x+board_hole3_pos_x-step3_pos_x;
step3_hole_pos_y = board_abs_pos_y+board_hole3_pos_y-step3_pos_y;
step4_hole_pos_x = board_abs_pos_x+board_hole4_pos_x-step4_pos_x;
step4_hole_pos_y = board_abs_pos_y-box_thickness+board_hole4_pos_y;
step_hole_pos_z = step_size_z-step_hole_height+1;

//Размеры и положение отверстия для провода
box_wire_hole_height = 10;
wire_hole_diam = 4;
wire_hole_height = box_thickness+2;
box_wire_hole_y_pos = box_size_y-box_thickness-1;
box_wire_hole_x_pos = 10+step_size_x;

//Размеры и положение отверстий для кнопок и крепёжных шурупов
button_size_x = 5;
button_size_y = 6;
button_size_z = 6;
button_distance = 2;
button_color = "Cyan";

button_pos_x = box_thickness+2;
button1_pos_y = step2_pos_y-button_size_y-button_distance-10;
button2_pos_y = button1_pos_y-button_size_y-button_distance;
button_pos_z = (box_size_z-button_size_z)/2;

button_hole_diam = 3.5;
button_hole_height = box_thickness+2;
box_button_hole_height = box_size_z/2;
box_button1_hole_y_pos = button1_pos_y+button_size_y/2;
box_button2_hole_y_pos = button2_pos_y+button_size_y/2;
box_button_hole_x_pos = -1;

screw_hole_diam = 2.5;
box_screw_hole1_y = button2_pos_y-5;
box_screw_hole2_y = box_screw_hole1_y + button_size_y*2+10+button_distance;

//Кнопки
button_height1 = 9;
button_height2 = 2;
button_diam1 = 3;
button_diam2 = 5;
button1_color = "Magenta";

//Планка для кнопок
plane_size_x = button_size_x*2;
plane_size_y = box_screw_hole2_y-box_screw_hole1_y+5;
plane_size_z = 2;
plane_hole_diam = 2;

//Выключатель
switch_size_x = box_thickness+2;
switch_size_y = 8;
switch_size_z = 14;
switch_pos_x = -1;
switch_pos_y = box_screw_hole1_y-switch_size_y-6;
switch_pos_z = (box_size_z-switch_size_z)/2;

//Печатная плата
/*color(board_color) translate([board_abs_pos_x, board_abs_pos_y, step_size_z+box_thickness]){
    difference(){
        
        cube([board_size_x, board_size_y, board_size_z]);
        
        translate([board_hole1_pos_x, board_hole1_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
        
        translate([board_hole2_pos_x, board_hole2_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
        
        translate([board_hole3_pos_x, board_hole3_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
        
        translate([board_hole4_pos_x, board_hole4_pos_y, -1])
            cylinder(h = board_size_z+2, d = board_hole_diam, $fn = 100);
    }
}*/

color(box_down_color) cube([box_size_x, box_size_y, box_thickness]);
translate([0, 0, box_thickness]){
    color(box_walls_color){
        difference(){
            cube([box_thickness, box_size_y, box_size_z]);
    
            //Отверстия под кнопки
            translate([box_button_hole_x_pos, box_button1_hole_y_pos, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = button_hole_diam, $fn = 100);
            
            translate([box_button_hole_x_pos, box_button2_hole_y_pos, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = button_hole_diam, $fn = 100);

            //отверстия под винты
            translate([box_button_hole_x_pos, box_screw_hole1_y, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = screw_hole_diam, $fn = 100);

            translate([box_button_hole_x_pos, box_screw_hole2_y, box_button_hole_height])
                rotate([0, 90, 0])
                cylinder(h = button_hole_height, d = screw_hole_diam, $fn = 100);

            //Отверстие под кнопку включения
            translate([switch_pos_x, switch_pos_y, switch_pos_z])
                cube([switch_size_x, switch_size_y, switch_size_z]);
        }
        
        difference(){
            translate([0, box_size_y-box_thickness, 0]) cube([box_size_x, box_thickness, box_size_z]);
            
            translate([box_wire_hole_x_pos, box_wire_hole_y_pos, box_wire_hole_height])
                rotate([-90, 0, 0])
                cylinder(h = wire_hole_height, d = wire_hole_diam, $fn = 100);
        }
        
        cube([box_size_x, box_thickness, box_size_z]);
        translate([box_size_x-box_thickness, 0, 0]) cube([box_thickness, box_size_y, box_size_z]);
    }
}

//Подставки под плату с отверстиями под винты
color(step_color){
    translate([step1_pos_x, step1_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step1_hole_pos_x, step1_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
        

    translate([step2_pos_x, step2_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step2_hole_pos_x, step2_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }

    translate([step3_pos_x, step3_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step3_hole_pos_x, step3_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
        
    translate([step4_pos_x, step4_pos_y, box_thickness])
        difference(){
            cube([step_size_x, step_size_y, step_size_z]);

            translate([step4_hole_pos_x, step4_hole_pos_y, step_hole_pos_z])
                cylinder(h = step_hole_height, d = step_hole_diam, $fn = 100);
        }
}

//Кнопки
color(button1_color){
    translate([140, 10, 0]){
        cylinder(h = button_height1, d = button_diam1, $fn = 100);
        cylinder(h = button_height2, d = button_diam2, $fn = 100);
    }
    
    translate([140, 16, 0]){
        cylinder(h = button_height1, d = button_diam1, $fn = 100);
        cylinder(h = button_height2, d = button_diam2, $fn = 100);
    }
    
    translate([140, 20, 0])
        difference(){
            cube([plane_size_x, plane_size_y, plane_size_z]);
            
            translate([plane_size_x/2, 2.5, -1])
                cylinder(h = box_thickness+2, d = plane_hole_diam, $fn = 100);
            translate([plane_size_x/2, box_screw_hole2_y-box_screw_hole1_y+2.5, -1])
                cylinder(h = box_thickness+2, d = plane_hole_diam, $fn = 100);
        }
        
}

Можно попросить корпус в STL выложить?
На здоровье.
 

Вложения