Страница 1 из 1
[Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 10:37:37
z00lu
Всем доброго дня!
Сразу скажу, что в по программированию у меня, самый что ни на есть базовый уровень.
Для более быстрого вливания в тему прикупил себе платку Mega c большим количеством цифровых I/O
Однако размеры Меги в готовом проекте меня не устраивают.
По размерам подходят платы Micro, Mini, Nano. Но уперся в то, что у этих плат гораздо меньшее количество цифровых входов/выходов.
С выходами разобрался - их можно увеличить за счет использования сдвигового регистра.
А вот как быть с цифровыми входами? Как их можно увеличить?
В проекте:
digital INPUT - 12 шт.
digital OUTPUT - 25 шт.
В общем, буду благодарен за помощь в решении сложившемся затыке..
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 10:46:40
blackx
Есть сдвиговые регистры, работающие наоборот: параллельный вход, последовательный выход. Например 74HC165.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 10:54:06
Леонид Иванович
Еще как вариант - мультиплексоры, например, 74HC4051. Расход ног будет больше, чем для сдвиговых регистров, зато при необходимости можно опрашивать не все входы (можно даже один вход), что сделает опрос быстрее.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 16:07:38
z00lu
blackx писал(а):Есть сдвиговые регистры, работающие наоборот: параллельный вход, последовательный выход. Например 74HC165.
А где можно почитать про них?
Про сдвиговые регистры на выходах есть информация на arduino.ru а вот про использование входных что-то нигде не находил информации.

Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 16:22:22
ChipKiller
z00lu писал(а):а вот про использование входных что-то нигде не находил информации.
.. можно подключить так, а еще лучше на аппаратный SPI
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 16:48:53
z00lu
ChipKiller писал(а):z00lu писал(а):а вот про использование входных что-то нигде не находил информации.
.. можно подключить так, а еще лучше на аппаратный SPI
Как при таком подключении будет выглядеть скетч, например включения светодиода при нажатии кнопки?
Так, если просто к цифровому входу подключать, кнопку и при появлении 0 на входе зажигается светодиод все предельно понятно ,а вот с последовательным портом не разу не сталкивался.
Код: Выделить всё
//пример зажигания светодиода при 0 на цифровом входе
int led = 13;
int button = 10;
void setup()
{
pinMode(led, OUTPUT);
pinMode(button, INPUT);
}
void loop()
{
if(digitalRead(button) == LOW)
{
digitalWrite(led, HIGH);
}
else
{
digitalWrite(led, LOW);
}
}
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 17:05:11
ChipKiller
вот обработка одновременной записи/чтения
Код: Выделить всё
.equ Pin_DIn = 0
.equ Pin_DOut = 1
.equ Pin_SCK = 2
.equ Pin_STR = 3
.equ Pin_LD = 4
Soft_Spi:
push r17
ldi r17,8
clr data_in
; clk LD
cbi PORTB,Pin_LD ; LD=0
sbi PORTB,Pin_LD ; LD=1 - защелкивание входных данных в 165
spi_rw:
lsl data_in ; сдвиг
sbic PINB,Pin_DIn ; skip if Pin_DIn==0
ori data_in,1 ; data_in|=1
sbrc data_out,7
sbi PORTB,Pin_DOut ; DOut=1
sbrs data_out,7
cbi PORTB,Pin_DOut ; DOut=0
sbi PORTB,Pin_SCK ; Clk=0
lsl data_out
cbi PORTB,Pin_SCK ; Clk=1 - clk чтения/записи бита
dec r17
brne spi_rw
; clk STR
sbi PORTB,Pin_STR ; STR=1
cbi PORTB,Pin_STR ; STR=0 - защелкивание выходных данных в 595
pop r17
ret
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пт май 03, 2013 20:43:04
blackx
Про ардуино ничего не знаю. Принцип работы с таким регистром следующий. Когда нужно считать состояние со всех входов, подается сигнал "захвата" уровня (регистр сохраняет в свои ячейки текущие состояния входов). Далее подается сигнал "старт передачи", и биты начинают двигаться по ячейкам и попадают по одному на выход - все как в обычном сдвиговом регистре. Естественно при приеме подается также сигнал тактирования.
Подробнее - смотрите "Timing diagram" в даташитах на такие регистры.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Сб май 04, 2013 07:18:35
z00lu
Всем спасибо!
Пока буду ковыряться с кодом чтобы переписать на 14 цифровых выходов Arduino nano
К концу майских, думаю осилю.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Сб май 11, 2013 20:53:51
z00lu
Так и не получается заставить работать регистр так как мне надо
Как должна работать программа:
У ардуино на входах (Can1...Can6) постоянно подается высокий сигнал
Когда на всех каналах +5 - на выходах регистра 0
Когда на каком-либо канале 0 - на соответствующем выходе регистра +5
Все работает но не так как бы хотелось:
Изначально на всех каналах +5 и на выходах регистра 0 (все верно)
На первом канале падение на 0 - на соответствующем выходе регистра +5 (верно)
Но потом действует +5 на соответствующем выходе регистра не прекращается до падения на другом канале
Пробовал писать, все так же без изменений
Код: Выделить всё
else
{
digitalWrite(latchPin, LOW);
}
Что, где упустил?
[code]
int Can1 = 22;
int Can2 = 3;
int Can3 = 4;
int Can4 = 5;
int Can5 = 24;
int Can6 = 6;
//определяем выходы регистра
int latchPin = 51;
int clockPin = 49;
int dataPin = 53;
void setup()
{
//инициируем как выходы
pinMode(latchPin, OUTPUT);
pinMode(clockPin, OUTPUT);
pinMode(dataPin, OUTPUT);
//настраиваем входы каналов
pinMode(Can1, INPUT);
pinMode(Can2, INPUT);
pinMode(Can3, INPUT);
pinMode(Can4, INPUT);
pinMode(Can5, INPUT);
pinMode(Can6, INPUT);
//настраиваем начальное положение защелки
digitalWrite(latchPin, HIGH);
}
void loop()
{
//считываем LOW c каналов и в зависимости от считанного канала выводим +5V на выходе регистра
// обработка первого канала
if(digitalRead(Can1) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 128);
digitalWrite(latchPin, HIGH);
}
// обработка второго канала
if(digitalRead(Can2) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 64);
digitalWrite(latchPin, HIGH);
}
// обработка третьего канала
if(digitalRead(Can3) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 32);
digitalWrite(latchPin, HIGH);
}
// обработка четвёртого канала
if(digitalRead(Can4) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 16);
digitalWrite(latchPin, HIGH);
}
// обработка пятого канала
if(digitalRead(Can6) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 8);
digitalWrite(latchPin, HIGH);
}
// обработка шестого канала
if(digitalRead(Can9) == LOW)
{
digitalWrite(latchPin, LOW);
shiftOut(dataPin, clockPin, MSBFIRST, 4);
digitalWrite(latchPin, HIGH);
}
}
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Сб май 11, 2013 21:57:42
drakon
может вам подойдет I2C расширитель портов, такой как PCF8574/PCF8575. каждому можно задавать 3 бита адреса тремя пинами, можно на одну шину поставить 8 расширителей, у каждого 8/16 I/O. стоит 9грн.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Сб май 11, 2013 22:07:37
z00lu
Может и подойдет, но сейчас бы с регистрами разобраться
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Вс май 12, 2013 19:21:06
z00lu
Нашел таки отличную статью на Robocraft по поводу расширения вводов/ выводов Arduino
Правда народа там нет совсем
Монолог какой-то получился
http://robocraft.ru/blog/arduino/541.html#comment4035
Разобрался таки с подключением одного регистра.
1. подключаем библиотеки
Код: Выделить всё
#include <LineDriver.h>
#include <SPI.h>
#include <SPI_Bus.h>
2. Инициализируем регистр
Код: Выделить всё
SPI_Bus shift_register(_8bit, <b>номер_порта_SS_по_даташиту_платы</b>);
3. Переписываем все digitalWrite(переменая_цифрового_выхода_на_дуине, HIGH_или_LOW) следующим образом:
Код: Выделить всё
shift_register.lineWrite(номер_выхода_регистра, HIGH_или_LOW);
Теперь вот пытаюсь организовать выходы задействовав каскад из трех регистров 74HC595.
Что надо прописать при подключении трех регистров каскадом?
Как указать в скетче выходы второго и третьего регистра?
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Вс май 12, 2013 21:45:41
z00lu
С выходами разобрался
Но опять же какой-то монолог получился
Курим входы для оптимизации проекта под Arduino Nano
Можно задействовать аналоговые входы как цифровые?
Необходимо считывать с них LOW c частотой примерно 60 Hz
Буду рад если кто присоединится...

Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пн май 13, 2013 09:18:11
balmer
z00lu писал(а):Но опять же какой-то монолог получился
Просто если хочется маленькую платку - лучше таки самому сделать и вытравить платку, и не заморачиваться со всякими Adruino. Потому как для маленькой платки надо использовать SMD компоненты и SMD микросхемки. Я вот, хоть и начинающий радиолюбитель - даже прототипы делаю на вытравленных платках. Потому как вытравить плату это 1-2 часа времени максимум, но зато все крепко и надежно. А когда больше сотни элементов, то надежность уже важна.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пн май 13, 2013 11:18:46
zöner
74hc595 + 74hc597
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пн май 13, 2013 13:06:06
z00lu
zöner писал(а):74hc595 + 74hc597
с регистрами уже разобрался.
Сейчас интересует возможность использавания аналоговых входов как цифровых.
Будет ли ардуина успевать опрашивать 8 каналов на предмет падения напряжения за 20микросеаунд?
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пн май 13, 2013 17:06:20
balmer
z00lu писал(а):Будет ли ардуина успевать опрашивать 8 каналов на предмет падения напряжения за 20микросеаунд?
Нет, там максимальная скорость - 100 микросекунд на отчет примерно.
Re: [Arduino] Оптимизация затратной части проекта
Добавлено: Пн май 13, 2013 17:24:16
z00lu
Придется пользовать регистры на вход:(