Светодиодный куб 5х5х5 на Arduino UNO+сдвиговый регистр 74HC595

yanbaev72
Offline
Зарегистрирован: 08.11.2013

Привет всем форумчанам!

Нужна ваша помощь!

После успешной реализации LED-куба 4х4х4 на Arduino UNO решил сделать куб побольше 5х5х5.

Проблема в том что для куба 4х4х4 нужно было 20 пинов (16столбов+4слоя) в UNO как раз их 20.

Для куба 5х5х5 нужно 30 входов/выходов, можно конечно реализовать данный проект на Arduino MEGA 2560 (которая едет ко мне), но побродив по просторам интернета выяснилось что можно все реализовать и на дуине с меньшим количеством входов/выходов с помощью сдвигового регистра 74HC595.

Набросал схему подключения в программе "fritzing" (прошу строго не судить, т.к. делал это впервые)

формат PDF

Вопрос заключается в том будет ли такая схема работать? Правильно ли сделанно подключение к регистрам? Может чего то не хватает или наоборот что то лишнее?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

прошлый раз вы уже все железо собрали и вам нужен скетч был. сейчас же можно использовать MAX7219. облегчите себе жизнь

куб 5*5*5 =125светодиодов.

1 MAX7219 это 64 светодиода. то есть достаточно 2 шт MAX7219 так как 64*2=128

ну это так предложение пока еще стоит выбор деталей (а может уже и нет)

maksim
Offline
Зарегистрирован: 12.02.2012

Резисторы с катодов светодиодов (слева) убрать. Пропускать ноги (Q0) регистров не рекомендую, потом будут сложности со сдвигами битов. Регистры нужно подключать не абы куда а к SPI так как только с ним вы получите нормальныю скорость индикации.

yanbaev72
Offline
Зарегистрирован: 08.11.2013

maksim пишет:

Резисторы с катодов светодиодов (слева) убрать. Пропускать ноги (Q0) регистров не рекомендую, потом будут сложности со сдвигами битов. Регистры нужно подключать не абы куда а к SPI так как только с ним вы получите нормальныю скорость индикации.

Резисторы с катодов уберу. Ногу Q0 (pin15) задействую.

А вот по поводу регистров не совсем понятно, если подключить так DS(14) - 11, SH_CP(11)-12 и ST_CP(12)-8

как показано тут , так будет работать?

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

прошлый раз вы уже все железо собрали и вам нужен скетч был. сейчас же можно использовать MAX7219. облегчите себе жизнь

куб 5*5*5 =125светодиодов.

1 MAX7219 это 64 светодиода. то есть достаточно 2 шт MAX7219 так как 64*2=128

ну это так предложение пока еще стоит выбор деталей (а может уже и нет)

А есть какой-то пример или статья на реализованный проект с использованием это микросхемы?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

yanbaev72 пишет:

jeka_tm пишет:

прошлый раз вы уже все железо собрали и вам нужен скетч был. сейчас же можно использовать MAX7219. облегчите себе жизнь

куб 5*5*5 =125светодиодов.

1 MAX7219 это 64 светодиода. то есть достаточно 2 шт MAX7219 так как 64*2=128

ну это так предложение пока еще стоит выбор деталей (а может уже и нет)

А есть какой-то пример или статья на реализованный проект с использованием это микросхемы?

проект именно куба или как с микрухой работать?

вот матрица 8*8 2 штуки на max7219

http://littleredrat.blogspot.ru/2013/12/3-matrix-88-led-max7219-module.html

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

yanbaev72 пишет:

jeka_tm пишет:

прошлый раз вы уже все железо собрали и вам нужен скетч был. сейчас же можно использовать MAX7219. облегчите себе жизнь

куб 5*5*5 =125светодиодов.

1 MAX7219 это 64 светодиода. то есть достаточно 2 шт MAX7219 так как 64*2=128

ну это так предложение пока еще стоит выбор деталей (а может уже и нет)

А есть какой-то пример или статья на реализованный проект с использованием это микросхемы?

проект именно куба или как с микрухой работать?

вот матрица 8*8 2 штуки на max7219

http://littleredrat.blogspot.ru/2013/12/3-matrix-88-led-max7219-module.html

желательно куба конечно

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

куб я к сожалению не нашел. но в чем смысл MAX7219:

1. динамическая индикация уже встроена

2. управление похоже на 74HC595

3. не надо кучу резисторов

4. регулировка тока одним резистором (насколько помню)

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

куб я к сожалению не нашел. но в чем смысл MAX7219:

1. динамическая индикация уже встроена

2. управление похоже на 74HC595

3. не надо кучу резисторов

4. регулировка тока одним резистором (насколько помню)

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

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

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

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

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

А можно как то подругому?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да как угодно можно. но так наверно оптимальнее

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

да как угодно можно. но так наверно оптимальнее

Можно вопрос отдаленный от темы?!

вы давно с ардуинами работаете, играете или балуетесь не знаю как лучше?)))

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

скоро год будет а что?

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

скоро год будет а что?

я бы лично взял 2 MAX7219. передавать надо будет 125 бит. причем собрать так что первые 25 бит - первая строка стоит вначале, и так далее. сделал бы массив и передавал его уже. получилось бы по сути тоже самое что и у вас, но не нужно делать самому динамическую индикацию, резисторы транзисторы и тп.

Хотел помощи попросить...но не по лед кубу...хотя от помощи в реализации подключенияпо вашейсхеме тоже бы не отказался))) но сейчас не об этом...

Мне сегодня пришли датчики 

подключил их к Arduino UNO вместе с motor shield, поставил все на двухколесную платформу

залил скетч из этой статьи

// Моторы подключаются к клеммам M1+,M1-,M2+,M2-  
// Motor shield использует четыре контакта 6,5,7,4 для управления моторами 
#define SPEED_LEFT       6
#define SPEED_RIGHT      5 
#define DIR_LEFT         7
#define DIR_RIGHT        4
#define LEFT_SENSOR_PIN  8
#define RIGHT_SENSOR_PIN 9
 
// Скорость, с которой мы движемся вперёд (0-255)
#define SPEED            35
 
// Коэффициент, задающий во сколько раз нужно затормозить
// одно из колёс для поворота
#define BRAKE_K          4
 
#define STATE_FORWARD    0
#define STATE_RIGHT      1
#define STATE_LEFT       2
 
int state = STATE_FORWARD;
 
void runForward() 
{
    state = STATE_FORWARD;
 
    // Для регулировки скорости `SPEED` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, SPEED);
    analogWrite(SPEED_RIGHT, SPEED);
 
    // Если в DIR_LEFT или DIR_RIGHT пишем HIGH, мотор будет двигать соответствующее колесо
    // вперёд, если LOW - назад.
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerRight() 
{
    state = STATE_RIGHT;
 
    // Замедляем правое колесо относительно левого,
    // чтобы начать поворот
    analogWrite(SPEED_RIGHT, SPEED / BRAKE_K);
    analogWrite(SPEED_LEFT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
void steerLeft() 
{
    state = STATE_LEFT;
 
    analogWrite(SPEED_LEFT, SPEED / BRAKE_K);
    analogWrite(SPEED_RIGHT, SPEED);
 
    digitalWrite(DIR_LEFT, HIGH);
    digitalWrite(DIR_RIGHT, HIGH);
}
 
 
void setup() 
{
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов 
    for(int i = 4; i <= 7; i++)
        pinMode(i, OUTPUT);
 
    // Сразу едем вперёд
    runForward();
} 
 
void loop() 
{ 
    // Наш робот ездит по белому полю с чёрным треком. В обратном случае не нужно
    // инвертировать значения с датчиков
    boolean left = !digitalRead(LEFT_SENSOR_PIN);
    boolean right = !digitalRead(RIGHT_SENSOR_PIN);
 
    // В какое состояние нужно перейти?
    int targetState;
 
    if (left == right) {
        // под сенсорами всё белое или всё чёрное
        // едем вперёд
        targetState = STATE_FORWARD;
    } else if (left) {
        // левый сенсор упёрся в трек
        // поворачиваем налево
        targetState = STATE_LEFT;
    } else {
        targetState = STATE_RIGHT;
    }
 
    if (state == targetState) {
        // мы уже делаём всё что нужно,
        // делаем измерения заново
        return;
    }
 
    switch (targetState) {
        case STATE_FORWARD:
            runForward();
            break;
 
        case STATE_RIGHT:
            steerRight();
            break;
 
        case STATE_LEFT:
            steerLeft();
            break;
    }
 
    // не позволяем сильно вилять на прямой
    delay(50);
}

в итоге ни чего не работает. не могу понять в чем может быть проблема

вот этот скетч

// Моторы подключаются к клеммам M1+,M1-,M2+,M2-  
// Motor shield использует четыре контакта 6,5,7,4 для управления моторами 
 
#define SPEED_LEFT      6
#define SPEED_RIGHT     5 
#define DIR_LEFT        7
#define DIR_RIGHT       4
 
void go(int speed, bool reverseLeft, bool reverseRight, int duration)
{
    // Для регулировки скорости `speed` может принимать значения от 0 до 255,
    // чем болше, тем быстрее. 
    analogWrite(SPEED_LEFT, speed);
    analogWrite(SPEED_RIGHT, speed);
    digitalWrite(DIR_LEFT, reverseLeft ? LOW : HIGH); 
    digitalWrite(DIR_RIGHT, reverseRight ? LOW : HIGH); 
    delay(duration); 
}
 
void setup() 
{
    // Настраивает выводы платы 4,5,6,7 на вывод сигналов 
    for(int i = 5; i <= 8; i++)     
        pinMode(i, OUTPUT);  
} 
 
void loop() 
{ 
    // Задержка 5 секунд после включения питания 
    delay(5000); 
 
    // Cекуда с небольшим вперёд 
    go(150, false, false, 1100);
 
    // Разворот на 180 градусов  
    go(125, true, false, 1350);
 
    // Две секуды с небольшим вперёд 
    go(150, false, false, 2200);
 
    // Разворот на 180 градусов в другую сторону 
    go(125, false, true, 1300);
 
    // Cекуда с небольшим вперёд 
    go(150, false, false, 1200);
 
    // Поворот на 90 градусов 
    go(125, true, false, 680);
 
    // Медленно назад полторы секунды 
    go(100, true, true, 1500);
 
    // Остановка до ресета или выключения питания 
    go(0, false, false, 0);
 
    // Всё, приехали
    while (true)
        ; 
}

работает

У вас был опыт с роботами следящими за линиями?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

я там напутал. но править лень было. 32 бита отправлять насколько помню

со следящими не занимался но принцип насколько представляю там достаточно простой. стол темный и белая линия или наоборот. если на датчике произошло изменение значит надо повернуть в сторону датчика

если скетч работает что вас не устраивает? хотите и чтобы первый работал?

знаете мне часто проще набросать свой код чем разбираться в чужом, задачу тут несложная как на первый взгляд. если завтра сможете оперативно тестировать в железе отладим программу

но только завтра. голова болит

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

я там напутал. но править лень было. 32 бита отправлять насколько помню

со следящими не занимался но принцип насколько представляю там достаточно простой. стол темный и белая линия или наоборот. если на датчике произошло изменение значит надо повернуть в сторону датчика

если скетч работает что вас не устраивает? хотите и чтобы первый работал?

знаете мне часто проще набросать свой код чем разбираться в чужом, задачу тут несложная

но только завтра. голова болит

второй скетч это без датчиков просто вперед-назад, вправо-влево, а вот в первом добавлены датчики....но почему то не хочет ни чего крутится...

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

если завтра сможете оперативно тестировать в железе отладим программу

от вас фото вашего робота со стороны датчиков, а также лист А3 например и черный круг на нем шириной около сантиметра

а также какие драйвер и моторы на всякий случай

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

если завтра сможете оперативно тестировать в железе отладим программу

от вас фото вашего робота со стороны датчиков, а также лист А3 например и черный круг на нем шириной около сантиметра

а также какие драйвер и моторы на всякий случай

 

все будет! скажите только во сколько вы здесь будете? 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

завтра часов с 9 утра

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

завтра часов с 9 утра

Я  завтра с 9 до 17 на работе(((( А вечером будете?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

да, через 5-30 минут буду отвечать. плату завтра еще одну буду собирать

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

да, через 5-30 минут буду отвечать. плату завтра еще одну буду собирать

Добрый вечер!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

добрый. давайте то что я просил. фото и названия

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

создайте тему чтоли. а то тема про одно а пишем про другое

вот первональчальный код

//думаю здесь прерывания это лишнее
#define pwm_1 2                 //левый мотор
#define dir_1 3
#define pwm_2 4                 //правый мотор
#define dir_2 5

#define led_1 6                 //левый датчик
#define led_2 7                 //правый датчик

#define sped 100                //зададим максимум скорости
#define turn 50                 //зададим скорость на повороте колеса тормозящего
#define pausa 200               //пауза между опросами датчиков
boolean sens_L = 0;             //переменные для хранения состояния датчиков
boolean sens_R = 0;

void setup(){
  pinMode(pwm_1, OUTPUT);       //настраиваем порты на выход
  pinMode(dir_1, OUTPUT);
  pinMode(pwm_2, OUTPUT);
  pinMode(dir_2, OUTPUT);
  pinMode(led_1, INPUT);
  pinMode(led_2, INPUT);
  
  digitalWrite(dir_1, HIGH);    //включаем езду вперед, назад врядли пока нужно
  digitalWrite(dir_1, HIGH);
}
void loop(){
  sens_L = digitalRead(led_1);
  sens_L = digitalRead(led_2);

  if(sens_L==1 & sens_R==1){    //если все норм едем вдоль линии
    go(sped, sped);
  }
   if(sens_L==1 & sens_R==0){   //справа наехали на линию
    go(sped, turn);
  }
  if(sens_L==0 & sens_R==1){    //слева наехали на линию
    go(turn, sped);
  }
  if(sens_L==0 & sens_R==0){    //мы на чем то но не на белой бумаге. встаем
    stop();
  }
  delay(pausa);
}


void go(int speed_L, int speed_R){  //подпрограмма езды
  analogWrite(pwm_1, speed_L);
  analogWrite(pwm_2, speed_R);
} 
void stop(){                        //подпрограмма остановки
  analogWrite(pwm_1, 0);           
  analogWrite(pwm_2, 0);
} 

 

yanbaev72
Offline
Зарегистрирован: 08.11.2013

jeka_tm пишет:

создайте тему чтоли. а то тема про одно а пишем про другое

вот первональчальный код

//думаю здесь прерывания это лишнее
#define pwm_1 2                 //левый мотор
#define dir_1 3
#define pwm_2 4                 //правый мотор
#define dir_2 5

#define led_1 6                 //левый датчик
#define led_2 7                 //правый датчик

#define sped 100                //зададим максимум скорости
#define turn 50                 //зададим скорость на повороте колеса тормозящего
#define pausa 200               //пауза между опросами датчиков
boolean sens_L = 0;             //переменные для хранения состояния датчиков
boolean sens_R = 0;

void setup(){
  pinMode(pwm_1, OUTPUT);       //настраиваем порты на выход
  pinMode(dir_1, OUTPUT);
  pinMode(pwm_2, OUTPUT);
  pinMode(dir_2, OUTPUT);
  pinMode(led_1, INPUT);
  pinMode(led_2, INPUT);
  
  digitalWrite(dir_1, HIGH);    //включаем езду вперед, назад врядли пока нужно
  digitalWrite(dir_1, HIGH);
}
void loop(){
  sens_L = digitalRead(led_1);
  sens_L = digitalRead(led_2);

  if(sens_L==1 & sens_R==1){    //если все норм едем вдоль линии
    go(sped, sped);
  }
   if(sens_L==1 & sens_R==0){   //справа наехали на линию
    go(sped, turn);
  }
  if(sens_L==0 & sens_R==1){    //слева наехали на линию
    go(turn, sped);
  }
  if(sens_L==0 & sens_R==0){    //мы на чем то но не на белой бумаге. встаем
    stop();
  }
  delay(pausa);
}


void go(int speed_L, int speed_R){  //подпрограмма езды
  analogWrite(pwm_1, speed_L);
  analogWrite(pwm_2, speed_R);
} 
void stop(){                        //подпрограмма остановки
  analogWrite(pwm_1, 0);           
  analogWrite(pwm_2, 0);
} 

 

Может в ВК? там проще и быстрее будет с фотками, ну если вы не против конечно?

 

Вот создал тему

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

нет давайте все здесь. фото форум поддерживает