Помощь, совет в подключении модулей

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Здравствуйте товарищи ардуинцы! 

Собираю и изучаю не спеша arduino Leonardo, постепенно расширяя. Встал вопрос, как лучше сделать.
Вот что имею:

 1) Arduino Leonardo
 2) HC-05
 3) Enc28j60
 4) Clock 
DS1302
 5) mp3 - wtv020m01
 6) microSD 
 7) relay 8ch
 а также :
 9) SN75hc595n
 10) SN74hc165n

Подскажите как лучше все это подключить? По искал в интернетеи на шел что Enc28j60 можно подключить через ICSP.  А будет ли корректно работать microSD и Clock DS1302, и wtv020m01 через регистры??

С Уважением, ардуиновец Sonic!

Yarik.Yar
Offline
Зарегистрирован: 07.09.2014

 

МР3 по какому протоколу работает? Точно знаю,что ENC по SPI ,а часы DS1302 по i2c,так что они друг другу мешать не будут.

Gippopotam
Gippopotam аватар
Offline
Зарегистрирован: 12.09.2014

Sonic-x пишет:

Здравствуйте товарищи ардуинцы! 

...

Подскажите как лучше все это подключить? ...

Поясните вопрос.

Чем не устраивает обычный способ подключения - проводами?

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Gippopotam пишет:

Sonic-x пишет:

Здравствуйте товарищи ардуинцы! 

...

Подскажите как лучше все это подключить? ...

Поясните вопрос.

Чем не устраивает обычный способ подключения - проводами?


Суть такова, подключить устройство так чтоб корректно работал модуль часы , модуль карта, модуль сетевая,модуль мп3. У блютуза свои два пина. И надо расширить входы выходы.

Looka
Offline
Зарегистрирован: 24.04.2012

Начните с того, что разберитесь какое устройство по какому протоколу работает (SPI, IIC, 1ware, UART .....  или свой какой нибудь). 

Посмотрите какой протокол какие пины использует,  какие протоколы привязаны к ногам МК а какие  можно менять. 

Например UART как правило на D0 и D1 (а у меги их может быть несколько).

 

А дальше все в Ваших руках, проводочками все подключаете.  Сначала подключайте по одному устройству....  ну и так далееее

А что уже не заработает -  рассказывайте как включили  и Вам  посоветывают  как бороться......

 

Удачи

Sonic-x
Offline
Зарегистрирован: 21.02.2015

День добрый!

появилась проблема( не могу найти (понять) как написать скейтч для управлению по SPI 74hc595 (4 шт.) кто подскажет?

подключение брал для 2-х регистров с сайта http://robocraft.ru/blog/arduino/519.html , а как 4 так и не понял((

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

также как и двумя. просто не два байта передавать а 4

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Тыкни пожалуйста меня носом))) как передать 4

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

По моему надо передать один байт четыре раза.  Или есть другие варианты ? ;)

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013
#include <SPI.h>

#define ss_pin 10
byte byte_1=12;
byte byte_2=56;
byte byte_3=98;
byte byte_4=212;


void setup(){
  SPI.begin();
  pinMode(ss_pin, OUTPUT);
}


void loop(){
  digitalWrite(ss_pin, LOW);
  SPI.transfer(byte_1);
  SPI.transfer(byte_2);
  SPI.transfer(byte_3);
  SPI.transfer(byte_4);
  digitalWrite(ss_pin, HIGH);

  delay(1000 / 8);
}

 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Я не уверен, но вроде  бы при таком pinMode(ss_pin,  OUTPUT) выход какое-то мизерное время- до старта лупа, 
будет сидеть в нуле так как при старте в регистре порта прописаны нули.
Я бы для страховки от этого и для полного контроля над процессом сделал:

void setup(){
     SPI.begin();
          digitalWrite(ss_pin, HIGH);   //что включило бы резистор привязки, ну и ладно, не мешает...
          pinMode(ss_pin, OUTPUT);  //а потом вот это
}

Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm, trembo - Спасибо.

Почитал в инете и понял что просто так не отделаться((( ,как я понял что управлять 74hc595 не так уж и просто, управления led, это одно а управление реле это другое!

гуглил и не нагуглил(( - как можно сделать с запоминанием, например управлять 8 реле, в теории понимаю что как то можно, но не могу  сообразить(

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Можно ли как то прочитать какая нога регистра задействона и прибавить еще ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну чтобы понятнее было

#include <SPI.h>

#define ss_pin 10
byte byte_1=B10010110;
byte byte_2=B10010100;
byte byte_3=B10101001;
byte byte_4=B10111010;


void setup(){
  SPI.begin();
  pinMode(ss_pin, OUTPUT);
}


void loop(){
  digitalWrite(ss_pin, LOW);
  SPI.transfer(byte_1);
  SPI.transfer(byte_2);
  SPI.transfer(byte_3);
  SPI.transfer(byte_4);
  digitalWrite(ss_pin, HIGH);

  delay(1000 / 8);
}

обратить внимание на 

byte byte_1=B10010110;
byte byte_2=B10010100;
byte byte_3=B10101001;
byte byte_4=B10111010;

представление в двоичной системе. каждой еденичке соответствует высокий уровень на выходе 74HC595, 0 низкий. 

Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm пишет:

ну чтобы понятнее было

#include <SPI.h>

#define ss_pin 10
byte byte_1=B10010110;
byte byte_2=B10010100;
byte byte_3=B10101001;
byte byte_4=B10111010;


void setup(){
  SPI.begin();
  pinMode(ss_pin, OUTPUT);
}


void loop(){
  digitalWrite(ss_pin, LOW);
  SPI.transfer(byte_1);
  SPI.transfer(byte_2);
  SPI.transfer(byte_3);
  SPI.transfer(byte_4);
  digitalWrite(ss_pin, HIGH);

  delay(1000 / 8);
}

обратить внимание на 

byte byte_1=B10010110;
byte byte_2=B10010100;
byte byte_3=B10101001;
byte byte_4=B10111010;

представление в двоичной системе. каждой еденичке соответствует высокий уровень на выходе 74HC595, 0 низкий. 

 

это мне хорошо понятно.  я догнать не могу  управлять 4 регистрами в каскадном режиме((( 

на пример:

 

byte byte_1=B11000000; byte byte_2=B00000000; byte byte_3=B00000000; byte byte_4=B00000000; как проверить что уже byte byte_1=B11000000 и добавить byte byte_1=B11000110

Другими словами влючил реле 1 и 2, а потом нужно включить реле 6 и 7

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

например так

byte_1= 1<<6
byte_1= 0<<6

 

Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm пишет:

например так

byte_1= 1<<6
byte_1= 0<<6

 

ммм не понял(((

покумекал и подумал, в теории можно обрабатывать массив:

 

//--//

int tests[] = {1,1,1,1,1,1,1,0};


String txtMsg =""; 
  
 for (int tt=0; tt < 8; tt++)
{ 
     long inChar = tests[tt];
    txtMsg += inChar;

}

SPI.transfer(txtMsg);



Выдает ошибку((((.

Еслиб не было ошибки, то можно в памяти держать какой массив был изменен с 0 на 1

что не так??

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

вот ты намудрил. почитай про сдвиг

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Просто массив очень много места займёт. И времени на обработку. Вам же всё равно не надо " третье состояние", а для работы с двумя достаточно одного БИТА.
И в одном байте уложатся сразу 8 штук. Да и команды (макросы) для работы с битами не такая проблемма чтобы их не использовать.

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Товарищи я в тупике(((((((((( 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Ваши 4 байта вам уже известны. Вы их сами "сделали".  Меняете нужные биты как вам надо.

byte_1= 1<<6
byte_1= 0<<6

Но заливать в регистр нужно ВСЕ ваши  4 байта, снова.  И так каждый раз. Поверьте это не так сложно.

Sonic-x
Offline
Зарегистрирован: 21.02.2015

trembo пишет:

Ваши 4 байта вам уже известны. Вы их сами "сделали".  Меняете нужные биты как вам надо.

byte_1= 1<<6
byte_1= 0<<6

Но заливать в регистр нужно ВСЕ ваши  4 байта, снова.  И так каждый раз. Поверьте это не так сложно.

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

например: 

2 регистра , 1 регистр отвечает за 8 реле , 2-ой регистр отвечает за включение выключение светодиотов.

вот я понять не могу когда я отправляю 00000000 и 00000000  , то все выкл, когда я хочу включить реле 1, то я отправляю 10000000 и 00000000, потом мне нужно включить 3 реле, по идеи я должен послать 00100000 и 00000000, но тогда отключится 1 реле, вот и вопрос как мне оставь включеным 1 реле и включить и выключать 3 реле.

 

Спасибо!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

видно не читал

byte_1= b00000000

byte_1= 1<<6

включили 7. стало

b01000000

byte_1= 1<<3

включили 4. стало

b01001000

byte_1= 0<<3

выключили 4. стало

b01000000

 
Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm - можешь ругать!!!

Читал но не втыкнул((((( хоть у бей!!!!!

ЗЫ . в долгу не останусь!!! отблагодарю!

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

ну я хз как еще объяснить. например у тебя все выключены

byte_1= b00000000

хотим включить реле на Q4

byte_1= 1<<4;

включили. теперь выключим на Q4

byte_1= 0<<4;

0 это что передать, 4 это насколько сдвинуть

при этом если какой то выставляем, остальные остаются как есть

в итоге можно управлять нужными пинами

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Это я уже понял! теперь тока вечером смогу пробывать(((  

на работе не ту ардуинки(

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

а что тогда объяснять? проверь и все

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

,

Sonic-x
Offline
Зарегистрирован: 21.02.2015

у тенбя есть icq или viber ?

 

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не дам

Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm пишет:

не дам

 

))))

Sonic-x
Offline
Зарегистрирован: 21.02.2015

jeka_tm,  подскажи из за чего у меня  когда 0 вкл, а когда 1 выкл?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

из-за relay 8ch - один производитель делает включение по HIGH, второй - по LOW ( ваш вариант модуля реле - второй )

Sonic-x
Offline
Зарегистрирован: 21.02.2015

SU-27-16, а когда на прямую подключаю к ардуино то все нормально.

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

расшифруйте.... что нормально, что ненормально ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

))))

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

jeka_tm пишет:

byte_1= 1<<3   // включили 4. стало  b01001000

byte_1= 0<<3  // выключили 4. стало  b01000000

В самом верху поставьте и забудьте обо всём:

#define  relay1_ON    byte_1= 1<<3
#define  relay1_OFF   byte_1= 0<<3

Надо поменять ON на OFF - в одном месте меняете.

Sonic-x
Offline
Зарегистрирован: 21.02.2015

Товарищи, прошу прощение, и прям реле на оборот))))))))))))))))

тестором проверил и прям себя так видет)))))))

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

это разовые команды... а как помнить какие вкл/выкл ?
всё-таки лучше массив состояний реле и светодиодов.... нет ?

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

trembo пишет:

jeka_tm пишет:

byte_1= 1<<3   // включили 4. стало  b01001000

byte_1= 0<<3  // выключили 4. стало  b01000000

В самом верху поставьте и забудьте обо всём:

#define  relay1_ON    byte_1= 1<<3
#define  relay1_OFF   byte_1= 0<<3

Надо поменять ON на OFF - в одном месте меняете.

можно. кому как удобнее

а чем байт не массив из 8 бит?

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Sonic-x пишет:

Товарищи, прошу прощение, и прям реле на оборот))))))))))))))))

тестором проверил и прям себя так видет)))))))

не наоборот ! прямая и обратная логика - обе равноправны....

пиво - есть ?
отсутствия пива - нет ?

....это одно и тоже :)

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

байт = массив битов, да - только коды будут разные.... как запоминать текущее состояние реле и СД - дело ТС 

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

1. Наша задача- выпихнуть 4 байта в SPI.

2. Если создать массив, то чтобы создать эти 4 байта нужно считать первый элемент массива, сравнить он "0" или "1" и запихнуть 0 или единицу  в первый бит первого байта. Потом следующий элемент массива.
Запихнув в  цикле 8 байт в 8 бит перейти ко второму байту и всё по новой. И так 4 раза. Вы этого хотели?

Два вложенных цикла, один 0-7, другой 0-3. И это надо делать каждый раз перед сливом в SPI

И от работы с битами в байте вы всё равно не избавились, только работать стали через заднее место.

А вы в этом массиве разберётесь на каком месте  и что лежит ? А если один выход это ЛЕД требующий единицу, а следуюшей- реле и ему надо ноль? А с другого даём питание на ультрасоник и с ещё одного ноль для NRF24L01.

Ню-ню.........

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

А вы в этом массиве разберётесь на каком месте  и что лежит ?

это дело ТС :)
моя про то что невозможно узнать - что там на какой ноге регистра ( но можно ), проще хранить это  в переменной ( как ? - дело ТС )

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

И от работы с битами в байте вы всё равно не избавились, только работать стали через заднее место.

с битами всё равно придётся работать.... через переднее или через заднее - смотря как организовать...

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

Два вложенных цикла, один 0-7, другой 0-3. И это надо делать каждый раз перед сливом в SPI

ну, да.... не преобразуешь - не передашь.... :) правильно не передашь....
...всё об одном и том же :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

SU-27-16 пишет:

... что там на какой ноге регистра......   проще хранить это  в переменной

Хранить то, что никогда не меняется  в переменной ????????

Ню-ню.......

SU-27-16
SU-27-16 аватар
Offline
Зарегистрирован: 13.08.2012

состояние 8-ми реле и 8-ми СД - никогда не меняются ? зачем тогда эти два регистра ?
ню-ню... это из CPP ? или я где-то просмотрел #define ? вы их классно применяете :) , завидую даже :)

trembo
trembo аватар
Offline
Зарегистрирован: 08.04.2011

Это единственное что я умею делать- применять по-человечески названные дэфайны.
В связи с плохой памятью на то где и какой бит из тридцати двух в четырёх байтах располагается-  как раз всегда и применяю.

#define  relay1_ON    byte_1= 1<<3
#define  relay1_OFF   byte_1= 0<<3

и так далее.....

У меня есть знакомый, так вот он при мне простой драйвер для ДОСа на ассэмблере писал в ХЕКС редакторе.
Говорит: дольше набирать add(  ) - это 5 нажатий, а в ХЕКСе только 2......

jeka_tm
jeka_tm аватар
Offline
Зарегистрирован: 19.05.2013

не пойму почему продолжается спор. вроде уже все выяснили

 

Sonic-x
Offline
Зарегистрирован: 21.02.2015
#include <SPI.h>

enum { REG = 8 };


byte byte_1=B00000000; 
byte byte_2=B00000000; 
byte byte_3=B00000000; 
byte byte_4=B00000000; 


void regVal(int ss_pin, byte value_1,byte value_2,byte value_3,byte value_4)
{
  digitalWrite(ss_pin, LOW);
  
  SPI.transfer(value_1);
  SPI.transfer(value_2);
  SPI.transfer(value_3);
  SPI.transfer(value_4);
  
  digitalWrite(ss_pin, HIGH);
}


void setup()
{
  SPI.begin();
  Serial.begin(9600);

  pinMode(REG, OUTPUT);
  regVal(REG, byte_1,byte_2,byte_3,byte_4);
}




void loop()
{

  if (Serial.available() > 0) {
    // get incoming byte:
  int  inb = Serial.read()-48;
    
if (inb == 2){  
Serial.println(byte_1);

byte_1= 1<<6;
regVal(REG, byte_1,byte_2,byte_3,byte_4);
Serial.println(byte_1);
}  

if (inb == 3){  
Serial.println(byte_1);

  byte_1= 0<<6;
regVal(REG, byte_1,byte_2,byte_3,byte_4);
Serial.println(byte_1);
}  

if (inb == 4){  
Serial.println(byte_1);

  byte_1= 0<<3;
regVal(REG, byte_1,byte_2,byte_3,byte_4);
Serial.println(byte_1);
}  

if (inb == 5){  
Serial.println(byte_1);

byte_1 = 1<<3;
regVal(REG, byte_1,byte_2,byte_3,byte_4);
Serial.println(byte_1);
}

  }
  delay(1000 / 8);
}

Товарищи!

Подскажите что не так, что упустил, посылаю через монитор "2" включается реле, посылаю "5" отключается реле 2 и включается реле 5.

Что не так делаю?(((