Работа со сдвиговым регистром 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.