Работа со сдвиговым регистром 74HC595/74HC165 и библиотекой SPI для управления ЭМЗ.
- Войдите на сайт для отправки комментариев
Название темы, конечно, многообещающие, но ... Стуация такая: хочу сделать на базе ардуино систему управления электро-механическими замками. В наличии ардуино уно. Так как количество цифровых выходов ограничено, решил использовать сдвиговый регистр 74HC595 и 165. 595 подключил к выходам: DS(14)->11(MOSI); 11(SHCP)->13(SCK); 12(STCP)->12(SS)(http://www.nxp.com/documents/data_sheet/74HC_HCT595.pdf); остальные выходы как в туториале (http://robocraft.ru/blog/arduino/519.html). Написал на пробу простую программу, в которой инициализировал 11, 12, 13 пины для шины SPI как OUTPUT и 7 для кнопки как INPUT. Запись битов в сдвиговый регистр делал встроенной полудуплексной командой shiftOut (11, 12, MSBFIRST, LED_ON). byte LED_ON = B00000001 (подаёт +5В на Q1 регистра). Запись происходит при нажатии кнопки на 7 пине ардуино. Когда кнопка отпущена записывается byte LED_OFF = B00000000. Весь код скетча:
#define SS_PIN 12
#define SCK_PIN 13
#define MOSI_PIN 11
#define BUTTON_PIN 7
byte LED_ON = B00000001;
byte LED_OFF = B00000000;
void setup()
{
pinMode(BUTTON_PIN, INPUT);
pinMode(SS_PIN, OUTPUT);
pinMode(SCK_PIN, OUTPUT);
pinMode(MOSI_PIN, OUTPUT);
Serial.begin(9600);
}
void loop()
{
if (digitalRead(BUTTON_PIN)== HIGH)
{
Serial.println(1);
delay(200);
}
else
{
Serial.println(0);
delay(200);
}
if (digitalRead(BUTTON_PIN) == HIGH)
{
digitalWrite(SS_PIN, LOW);
shiftOut(MOSI_PIN, SCK_PIN, MSBFIRST, LED_ON);
digitalWrite(SS_PIN, HIGH);
}
else
{
digitalWrite(SS_PIN, LOW);
shiftOut(MOSI_PIN, SCK_PIN, MSBFIRST, LED_OFF);
digitalWrite(SS_PIN, HIGH);
}
}
Всё работает отлично. Но существует другое решение, более гибкое (особенно при подключении входного сдвигового регистра) - это использование библиотеки SPI. Хорошо, решил попробовать с ней: убрал инициализацию пинов, кроме кнопки (7) и SS (12), сделал #include <SPI.h>, в setup SPI.begin() и SPI.setBitOrder(MSBFIRST), shiftOut заменил на SPI.transfer(LED_ON), залил скетч, но ничего не заработало. Более того всключидись 3, 4, 5, 6 пины регистра. Попробовал сделать в setup
digitalWrite(SS_PIN, LOW); SPI.transfer(0); digitalWrite(SS_PIN, HIGH);
не помогло. Стандартный вопрос - что я делаю не так, почему shiftOut работает, а SPI.transfer нет.
P.S. Кнопка подключена как во втором уроке Джереми Блюма http://wiki.amperka.ru/%D0%B2%D0%B8%D0%B4%D0%B5%D0%BE%D1%83%D1%80%D0%BE%D0%BA%D0%B8:2-%D0%BA%D0%BD%D0%BE%D0%BF%D0%BA%D0%B8-pwm-%D1%84%D1%83%D0%BD%D0%BA%D1%86%D0%B8%D0%B8.