Здравствуйте, Пытаюсь подключить несколько термопар с MAX6675 к одной плате ардуино уно. Когда подключаю два, без мультиплексора, все работает. Проблема в том, что нужно подключить минимум 9 штук, соответственно пинов не хватает. Пытаюсь подключать через цифровой мультиплексор 74HC151, при этом SCK и SO выходы MAX6675-ого подключаю к ардуине, с расчетом, что объединю все SCK и все SO вместе, а CS буду подключать ко входам мультиплексора. И с выхода мультиплексора буду снимать сигнал. Но даже с одним MAX6675 не получается получить ничего. Ардуино пишет ноль. Библиотеку для использую https://github.com/adafruit/MAX6675-library. Вопросы: 1. Мультиплексор работает как некий хаб? Пускает сигнал от выхода ко входам, от входов к выходам? 2. Судя по библиотеке для MAX6675, от мультиплексора лишь нужно, чтобы он пустил digitalWrite(cs, LOW); и digitalWrite(cs, HIGH); от выхода ко входу. 3. Это вообще возможно? Спасибо что дочитали
Он входной. Для SPI достаточно всего одного входа - MISO. Разберитесь как работает spi, как работают микрухи, а потом уже пытайтесь что-то собрать. Иначе будете обречены на ходьбу по граблям.
Это от того, что неправильно подключаете. Все SCK соединяете вместе, все MISO тоже (можно через резистор 1кОм), все CS отдельно. Итого 11 пинов. Для этого у Uno пинов хватает без всякого мультиплексора. Если хочется еще сэкономить и вместо 9 разных CS использовать 4 пина для указания номера - берете дешифратор 74HC42 или 74HC154.
Получается по-простому, 74hc595 - для того, чтобы установить какой-то один выход в HIGH, а эти: 74HC42 или 74HC154 - один в LOW?
Нет. 74HC595 - 8-битный регистр сдвига с последовательной загрузкой и параллельным выходом, 74HC42 - дешифратор 4-к-10, 74HC154 - дешифратор 4-к-16. На любом из этих чипов можно сэкономить пины на CS.
Можно расширители типа PCF8574T на I2C шину повесить для CS пинов, тогда можно будет с пол сотни датчиков зацепить.
Да тут на самом деле дешифраторы то уже перебор, регистр сдвига самый экономичный, всего 3 сигнала на любое количество датчиков.
Со сдвиговым регистром с двумя датчиками у меня получилось, что делая shiftOut(); я могу подавать HIGH на CS на какой-то из датчиков, но считываю я с того, у которого на CS LOW. В библиотеке так и происходит: 1. Сначала digitalWrite(cs, LOW); 2. Потом считывание с SCK.
Это нужно все перебрать по очереди или есть что-то специальное? Сейчас я делаю так с 74hc595: Код (C++): void registerWriteHigh(int whichPin) { // инициализируем и обнуляем байт byte bitsToSend = 0; //Отключаем вывод на регистре digitalWrite(latchPin, LOW); // устанавливаем HIGH в соответствующем бите bitWrite(bitsToSend, whichPin, HIGH); // проталкиваем байт в регистр shiftOut(dataPin, clockPin, MSBFIRST, bitsToSend); // "защелкиваем" регистр, чтобы байт появился на его выходах digitalWrite(latchPin, HIGH); }
Поскольку у вас SCK и MISO общие для всех датчиков, в один момент времени вы можете общаться только с одним их них. Этот датчик вы выбираете, устанавливая ему CS=0, все остальные должны быть в это время отключены т.е., для остальных CS=1. Нельзя одновременно нескольким датчикам выдавать CS=0, вы так у них можете просто выходы спалить, если они запараллелены напрямую, без сопротивлений. В каком порядке опрашивать датчики - это сами решайте.