Сдвиговый регистр

alexeykalin
Offline
Зарегистрирован: 05.06.2013

Всем привет! Недавно столкнулся с проблемой, когда не хватает пинов на ардуино. Нашёл в нете статью про сдвиговые регистры http://arduino.ru/Tutorial/registr_74HC595. Я собрал первую схему на 8 светодиодах и залил первый пример скетча. Всё работает. А можно ли просто зажечь допустим 5 или 8 светодиод через регистр? Помогите со скетчем, пожалуйста.

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

Научитесь пользоваться поиском по сайту. А большенство ответов тут.

#define DS   11 //Пин подключен к DS входу 74HC595
#define SHCP 12 //Пин подключен к SH_CP входу 74HC595
#define STCP 10 //Пин подключен к ST_CP входу 74HC595

void setup() 
{
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT); 
}

void loop() 
{
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, MSBFIRST, B00001001);
  digitalWrite(STCP, HIGH);
  delay(1000);
}

 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

А не подскажешь как сделать такое же только вот  с таким сдвиговым регистром   m74hc595b1 ??? 

mkvmaks
Offline
Зарегистрирован: 07.07.2013

Все разобрался

 

rozhkovets
Offline
Зарегистрирован: 26.08.2013

Привет всем! Помогите разобраться. Собрал схему управления 8-ю светодиодами на nc74hc595n и скетча из ответа выше. При попытке вывести, например, "00001001", получаю "11110110". т.е инвертированный выход. Может быть это изза того, что регистр немного другой марки?

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

Вы могли не верно подключить светодиоды.

rozhkovets
Offline
Зарегистрирован: 26.08.2013

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

Omigovolt
Offline
Зарегистрирован: 22.08.2013

Здравствуйте, вопрос когда работаешь со сдвиговым регистром, то на его выходах (Q1, Q2 и т. д. ) появляется +5 вольт, а мне нужно, что бы там появлялось -5 вольт?  Пытался переделать при помощи оптрона РС817, не получилось. Может подскажете как это можно сделать? Может это какя то разновидность сдвигового регистра, где на выходах появляется -5 вольт, или какими транзисторами я это могу сделать, работаю только с 5-ю вольтами. Что бы вы поняли зачем это?  Я хочу управлять магнитолой по Блю тус, на ардуине не хватает выходов, а на магните идет управление по минусу через сопротивление

 

axill
Offline
Зарегистрирован: 05.09.2011

управление у вас все таки не минус 5 вольт, а на GND - это весьма другое

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

Если делать без реле, то вполне может правильно работать вариант с pc817 - на выход 74hc595 через резисторы подключаете диоды сборок, транзисторы сборок эмитером на GND, коллектором на кнопки.

Еще вариант - после 74hc595 подключить что-то с открытым коллектором - либо отдельные биполярные транзисторы либо что просто проще в сборке - ULN2003 или ULN2008

Еще вариант - вместо биполярных транзисторов mosfet с N каналом

Omigovolt
Offline
Зарегистрирован: 22.08.2013

мы можем это бсудить по скайпу?

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

сегодня проверил с мосфетами работает но не так мосфеты взял следующие BS170

и IRFU420

они пропускают не все 5 вольт а где то 4.3 магнитола в этом случае начинает вести себя не одыкватно она постоянно ищет станции значит нужно что то что меняет напряжение с 0 до 5 ?

и если напрямую оптрон не работает вижу единственный вариант это сделать все это через ULN2003A !

вот схема работы переключателя именно на пионер 

axill
Offline
Зарегистрирован: 05.09.2011

мосфеты должны работать даже лучше чем биполярники (в uln2003 стоят биполярники) но не суть

судя по схеме вашего пульта вам надо вместо каждой кнопки ставить или n-p-n биполярник или N-mosfet

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

Omigovolt
Offline
Зарегистрирован: 22.08.2013

все я понял тогда поставлю простые маленькие 5-и вольтовых реле 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

поднял напряжение до 6 вольт и все заработало (оптрон мосфет) транзистор пока не заработает.

Omigovolt
Offline
Зарегистрирован: 22.08.2013

появился еще один вопрос при первом включениии на выходах сдвигового регистра могут появится произвольные значения что очень плохо как этого избежать???

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

Omigovolt пишет:

...как этого избежать???

master reset - /MR - 10 вывод

Или "подтянуть" вывод /MR к земле и подключить на какой-нибудь вывод и управлять сбросом программно.

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

вот так 

 

 pinMode(MR, OUTPUT);
    digitalWrite(MR, LOW);
    
    digitalWrite(STCP, HIGH);
shiftOut(DS, SHCP, MSBFIRST, B00000000);
 digitalWrite(STCP, LOW);
  digitalWrite(MR, HIGH);

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

еще вопрос а как заливать еденицы если у меня два сдвиговых регистра и соответственно 16 выходов???

axill
Offline
Зарегистрирован: 05.09.2011

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

т.е. чтобы на всех 16 выходах выставить 1 надо затолкать один за другим два байта 0xff при этом если не хотите, чтобы на выходах появлялись промежуточные значения, надо защелку регистра включать уже после проталкивания обоих байтов

maksim
Offline
Зарегистрирован: 12.02.2012
#define DS   11 //Пин подключен к DS входу 74HC595
#define SHCP 12 //Пин подключен к SH_CP входу 74HC595
#define STCP 10 //Пин подключен к ST_CP входу 74HC595

void setup() 
{
  pinMode(DS, OUTPUT);
  pinMode(SHCP, OUTPUT);
  pinMode(STCP, OUTPUT); 
}

void loop() 
{
  digitalWrite(STCP, LOW);
  shiftOut(DS, SHCP, MSBFIRST, B00001001);
  shiftOut(DS, SHCP, MSBFIRST, B11101001);
  digitalWrite(STCP, HIGH);
  delay(1000);
}

 

Omigovolt
Offline
Зарегистрирован: 22.08.2013

идея)

 

Draghkon
Offline
Зарегистрирован: 17.09.2013

Чтобы не плодить темы спрошу тут: Можно ли через сдвиговый регистр управлять шаговыми движками и просто DC моторами?

Нужно подключить 3 шаговика и 3-4  DC мотора на 12V общей мощностью около 2А. Драйвера для моторов есть, но уж очень много жрут пинов... А мне нужны они для датчиков и для релюшек и для кучи всего остального.. можно ли на сдв. регистр повесить?

axill
Offline
Зарегистрирован: 05.09.2011

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

Omigovolt
Offline
Зарегистрирован: 22.08.2013

сегодня работал с 16 выходами 2-х сдвиговых регистров и при вот таком коде

 shiftOut(DS, SHCP, MSBFIRST, B00000000);
  shiftOut(DS, SHCP, MSBFIRST, B10000000);

он у меня зажгет 7 светодиод первого сдвигового регистра объясните почему?

ustas
Offline
Зарегистрирован: 12.03.2012

зажигает 7 светодиод первого сдвигового регистра именно потому, что B10000000 пропихивается в последнюю очередь.

поменяйте строчки местами - загорится 7 светодиод второго свдигового регистра

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

Седьмой если считать от нуля или от единицы?

Omigovolt
Offline
Зарегистрирован: 22.08.2013

спасибо исправил теперь как надо)))

 

raicor
Offline
Зарегистрирован: 31.07.2013
Всем привет,
присоединюсь к теме.
Kак можно сделать следующий код чтобы он работал с 74hc595n
и случаи когда нажимаются две кнопки одновременно загораются 2 светодиода 
всем спасибо
 
 

const int buttonPin = 2; 
const int buttonPin1 = 3; 
const int buttonPin2 =4; 
const int buttonPin3 =5;     
const int ledPin =  13;      
const int ledPin1 =  12;     
const int ledPin2 =  11;  ;     
const int ledPin3 =  10;  
       

void setup() {

  pinMode(ledPin, OUTPUT);
  pinMode(ledPin1, OUTPUT);   
  pinMode(ledPin2, OUTPUT);   
 pinMode(ledPin3, OUTPUT);         

  pinMode(buttonPin, INPUT); 
  pinMode(buttonPin1, INPUT);  
  pinMode(buttonPin2, INPUT);  
  pinMode(buttonPin3, INPUT);      
}

void loop(){


 if(digitalRead(buttonPin)==HIGH);
 { 
 digitalWrite(ledPin,HIGH);
 } 
 else
 { 
 digitalWrite(ledPin,LOW); 
 }


 
 if(digitalRead(buttonPin1)==HIGH);
 { 
 digitalWrite(ledPin1,HIGH);
 } 
 else
 { 
 digitalWrite(ledPin1,LOW);
 }



 if(digitalRead(buttonPin2)==HIGH);
 { 
 digitalWrite(ledPin2,HIGH);
 } 
 else
 { 
 digitalWrite(ledPin2,LOW);
 }



 if(digitalRead(buttonPin3)==HIGH);
 { 
 digitalWrite(ledPin3,HIGH);
 } 
 else
 { 
 digitalWrite(ledPin3,LOW);
 }
}

 

 

MaksMS
Offline
Зарегистрирован: 11.03.2013

Вот пример http://homes-smart.ru/index.php/oborudovanie/prochee/rasshiryaem-porty работы с регистром подобно как digitalWrite: registerWrite(номер_порта_регистра, 1_или_0)

Можно использовать аппаратный SPI ,но если он уже используется..иначе MOSI будет занят и вывод использовать нельзя..

Omigovolt
Offline
Зарегистрирован: 22.08.2013

А ардуино может обрабатывать несколько TX и RX  ???? в моем случае пин 1, 2 заняты модулем обработки голоса еще при помощи библиотеки ардуино обрабатывает сигналы на 8 и 9 пине (модуль  БТ) а мне нужно еще обрабатывать  рх и тх с другой ардуины.

картинка для наглядности)

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

Вопрос:

Omigovolt пишет:

А ардуино может обрабатывать несколько TX и RX  ????

Ответ:

Omigovolt пишет:

еще при помощи библиотеки ардуино обрабатывает сигналы на 8 и 9 пине (модуль  БТ)

Omigovolt
Offline
Зарегистрирован: 22.08.2013

ок понял )