Всем здрасти, вопрос в следущем можно ли 2 устройства spi подключить к меге, читал что можно, загоняешь одно устройство в лоу и тогда оно активируется потом в хай деактивируем и так же со вторым, но на деле ничего не получилось((
Код (Text): #include <DS1302.h> #include <Wire.h> #include <LiquidCrystal.h> #include <SD.h> #include <SPI.h> #include <MFRC522.h> #define SS_PIN 53 #define RST_PIN 8 MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; DS1302 rtc(22, 24, 26); // (RST, DAT, CLK) LiquidCrystal lcd(12, 11, 5, 4, 3, 2); Time t; File myFile; int podacha10bt1 = 30; int podacha1bt1 = 31; int kurokbt1 = 32; int podacha10bt2 = 33; int podacha1bt2 = 34; int kurokbt2 = 35; int podacha10bt3 = 36; int podacha1bt3 = 37; int kurokbt3 = 38; int offbt = 39; int nastrel1 = 0; int zadanie1 = 0; int magaz1 = 0; int nastrel2 = 0; int zadanie2 = 0; int magaz2 = 0; int nastrel3 = 0; int zadanie3 = 0; int magaz3 = 0; int obsh_nastrel= 0; int flag=0; int flag1=0; int flag2=0; int flag2_1=0; int flag3=0; int flag3_1=0; unsigned long math_time,old_time,real_time; unsigned long math_time2,old_time2,real_time2; unsigned long math_time3,old_time3,real_time3; static boolean output = LOW; static boolean output2 = LOW; static boolean output3 = LOW; static boolean output2_1 = LOW; static boolean output2_2 = LOW; static boolean output2_3 = LOW; static boolean output3_1 = LOW; static boolean output3_2 = LOW; static boolean output3_3 = LOW; static boolean outoffbt= LOW; void setup() { pinMode(10, OUTPUT); pinMode(SS_PIN, OUTPUT); digitalWrite(SS_PIN, HIGH); digitalWrite(10, HIGH); // rtc.halt(false); //rtc.writeProtect(false); //rtc.setDOW(MONDAY); // Set Day-of-Week to FRIDAY Monday //rtc.setTime(20, 37, 0); // Set the time to 12:00:00 (24hr format) //rtc.setDate(23, 12, 2013); // Set the date to August 6th, 2010 Serial.begin(9600); delay(100); digitalWrite(10, LOW); if (!SD.begin(10)) { Serial.println("initialization failed!"); return; } Serial.println("initialization done."); digitalWrite(10, HIGH); pinMode(podacha10bt1, INPUT); pinMode(podacha1bt1, INPUT); pinMode(kurokbt1, INPUT); pinMode(podacha10bt2, INPUT); pinMode(podacha1bt2, INPUT); pinMode(kurokbt2, INPUT); pinMode(podacha10bt3, INPUT); pinMode(podacha1bt3, INPUT); pinMode(kurokbt3, INPUT); pinMode(offbt, INPUT); lcd.begin(20, 4); delay(100); SPI.begin(); digitalWrite(SS_PIN, LOW); mfrc522.PCD_Init(); digitalWrite(SS_PIN, HIGH); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } } void loop() { t = rtc.getTime(); output = digitalRead(podacha10bt1); output2 = digitalRead(podacha1bt1); output3 = digitalRead(kurokbt1); output2_1 = digitalRead(podacha10bt2); output2_2 = digitalRead(podacha1bt2); output2_3 = digitalRead(kurokbt2); output3_1 = digitalRead(podacha10bt3); output3_2 = digitalRead(podacha1bt3); output3_3 = digitalRead(kurokbt3); outoffbt = digitalRead(offbt); delay(30); digitalWrite(SS_PIN, LOW); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } digitalWrite(SS_PIN, HIGH); Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); //.........Устройство 1............. if(digitalRead(podacha10bt1)==HIGH && output==HIGH) { math_time = 0; old_time = millis(); while(math_time < 4000 && output > LOW) { real_time = millis(); //получить реальное время math_time = real_time - old_time; //считаем длительность удержания output=digitalRead(podacha10bt1); } if(math_time > 3999 && magaz1 < 100) { magaz1 += 300; } else if(math_time > 200 && zadanie1 == 0 && magaz1 >= 10) { zadanie1 +=10; } } if(output2==LOW && magaz1 > 0 && flag1==0) { flag1=1; } if(output2==HIGH && magaz1 > 0 && flag1==1) { zadanie1 +=1; nastrel1 = nastrel1 -= 1; obsh_nastrel = obsh_nastrel -=1 ; flag1=0; } if(output3==LOW && zadanie1 > 0 && flag==0) { flag=1; } if(output3==HIGH && zadanie1 > 0 && flag==1) { zadanie1 -=1; magaz1 -= 1; nastrel1 = nastrel1 +=1 ; obsh_nastrel = obsh_nastrel +=1 ; flag=0; } //.........Устройство 2............. if(digitalRead(podacha10bt2)==HIGH && output2_1==HIGH) { math_time2 = 0; old_time2 = millis(); while(math_time2 < 4000 && output2_1 > LOW) { real_time2 = millis(); //получить реальное время math_time2 = real_time2 - old_time2; //считаем длительность удержания output2_1=digitalRead(podacha10bt2); } if(math_time2 > 3999 && magaz2 < 100) { magaz2 += 300; } else if(math_time2 > 200 && zadanie2 == 0 && magaz2 >= 10) { zadanie2 +=10; } } if(output2_2==LOW && magaz2 > 0 && flag2==0) { flag2=1; } if(output2_2==HIGH && magaz2 > 0 && flag2==1) { zadanie2 +=1; nastrel2 = nastrel2 -= 1; obsh_nastrel = obsh_nastrel -=1 ; flag2=0; } if(output2_3==LOW && zadanie2 > 0 && flag2_1==0) { flag2_1=1; } if(output2_3==HIGH && zadanie2 > 0 && flag2_1==1) { zadanie2 -=1; magaz2 -= 1; nastrel2 = nastrel2 +=1 ; obsh_nastrel = obsh_nastrel +=1 ; flag2_1=0; } //.........Устройство 3............. if(digitalRead(podacha10bt3)==HIGH && output3_1==HIGH) { math_time3 = 0; old_time3 = millis(); while(math_time3 < 4000 && output3_1 > LOW) { real_time3 = millis(); //получить реальное время math_time3 = real_time3 - old_time3; //считаем длительность удержания output3_1=digitalRead(podacha10bt3); } if(math_time3 > 3999 && magaz3 < 100) { magaz3 += 300; } else if(math_time3 > 200 && zadanie3 == 0 && magaz3 >= 10) { zadanie3 +=10; } } if(output3_2==LOW && magaz3 > 0 && flag3==0) { flag3=1; } if(output3_2==HIGH && magaz3 > 0 && flag3==1) { zadanie3 +=1; nastrel3 = nastrel3 -= 1; obsh_nastrel = obsh_nastrel -=1 ; flag3=0; } if(output3_3==LOW && zadanie3 > 0 && flag3_1==0) { flag3_1=1; } if(output3_3==HIGH && zadanie3 > 0 && flag3_1==1) { zadanie3 -=1; magaz3 -= 1; nastrel3 = nastrel3 +=1 ; obsh_nastrel = obsh_nastrel +=1 ; flag3_1=0; } lcd.setCursor(0, 0); lcd.print("No"); lcd.print(" "); lcd.print("OST"); lcd.print(" "); lcd.print("MAG"); lcd.print(" "); lcd.print("SUM-"); lcd.print(" "); lcd.print(obsh_nastrel); lcd.print(" "); lcd.setCursor(0, 1); lcd.print("1"); lcd.setCursor(3, 1); lcd.print(zadanie1); lcd.print(" "); lcd.setCursor(7, 1); lcd.print(magaz1); lcd.print(" "); lcd.setCursor(11, 1); lcd.print(nastrel1); lcd.print(" "); lcd.setCursor(17, 1); lcd.print("AIR"); lcd.setCursor(0, 2); lcd.print("2"); lcd.setCursor(3, 2); lcd.print(zadanie2); lcd.print(" "); lcd.setCursor(7, 2); lcd.print(magaz2); lcd.print(" "); lcd.setCursor(11, 2); lcd.print(nastrel2); lcd.print(" "); lcd.setCursor(16, 2); lcd.print("SOFT"); lcd.setCursor(0, 3); lcd.print("3"); lcd.setCursor(3, 3); lcd.print(zadanie3); lcd.print(" "); lcd.setCursor(7, 3); lcd.print(magaz3); lcd.print(" "); lcd.setCursor(11, 3); lcd.print(nastrel3); lcd.print(" "); lcd.setCursor(15, 3); lcd.print("ARENA"); if(outoffbt == HIGH){ digitalWrite(10, LOW); myFile = SD.open("test.txt", FILE_WRITE); if (myFile) { Serial.print("Writing to test.txt..."); myFile.print(rtc.getDateStr()); myFile.print(" "); myFile.print(rtc.getTimeStr()); myFile.print(" "); myFile.println(obsh_nastrel); myFile.close(); Serial.println("done."); } else { // if the file didn't open, print an error: Serial.println("Error writing"); } digitalWrite(10, HIGH); } }
Вопросы. 1. Не установлен ли какой-нибудь шилд, работающий с SPI? Такой шилд может соединять пины разъема ICSP с пинами 10-13 ардуино, что приводит на меге к соединению пинов 10 и 53. 2. Как подключена SD карта? Через какой-нибудь шилд или отдельным модулем к пинам 10, 50-52? Если через шилд, то, во-первых, часто для SD карты в качестве чип-селектора используется пин 4. А во-вторых, часто используется не разъем ICSP, а просто используются пины 11-13, что на меге работать не будет. Также полезна будет информация про то, что именно не работает.
подключено проводами напрямую, шилды не использую. Не работают ни рфид ни сд. По отдельности все работает. А и если одно из устройств отсоеденить и ребутнуть ардуинку то работает
Гипотезы: 1. Питание. Улучшить характеристики источника питания. 2. Проблема в одном из устройств, приводящая к тому, что оно "не обращает внимания" на пин чип-селектора, что приводит к тому, что оно все время активно. Что делать в этом случае, не знаю. 3. Библиотека RFID сканера сама работает с чип-селектором, в результате чего он переводится в LOW. Надо переводить в HIGH после завершения всех манипуляций с классом mfrc522.
Я так обесточивал одноустройство, включал другое и наоборот. Причем делал это через транзисторы, которыми управлял цифровыми пинами. Так же работал с несколькими устройствами на одном аналоговом порту, когда аналоговые порты в дифиците.
У меня как-то на SPI сидели дисплей, подключенный через сдвиговый регистр, радиомодуль NRF24L01 и SD карта. Все работало без особых плясок.
Код (Text): /** * Read a card using a mfrc522 reader on your SPI interface * Pin layout should be as follows (on Arduino Uno): * MOSI: Pin 11 / 51 ICSP-4 * MISO: Pin 12 / 50 ICSP-1 * SCK: Pin 13 / 52 ISCP-3 * SS: Pin 10 / 53 * RST: Pin 9 */ //#include <SD.h> #include <SPI.h> #include <MFRC522.h> #include <LiquidCrystal.h> #define SS_PIN 53 #define RST_PIN 9 int CS_pin = 10; MFRC522 mfrc522(SS_PIN, RST_PIN); MFRC522::MIFARE_Key key; //File myFile; void setup() { Serial.begin(9600); // Disable SD Card pinMode(CS_pin, OUTPUT); digitalWrite(CS_pin, HIGH); // Disable RFID pinMode(SS_PIN, OUTPUT); // digitalWrite(SS_PIN, LOW); digitalWrite(SS_PIN, LOW); SPI.begin(); mfrc522.PCD_Init(); for (byte i = 0; i < 6; i++) { key.keyByte[i] = 0xFF; } digitalWrite(SS_PIN, HIGH); // Serial.println("Initializing Card"); //digitalWrite(CS_pin, LOW); // if (!SD.begin(CS_pin)) { // Serial.println("Card Failed"); // return; // } // Serial.println("Card Ready"); // digitalWrite(CS_pin, HIGH); } void loop() { // Enable RFID digitalWrite(SS_PIN, LOW); if ( ! mfrc522.PICC_IsNewCardPresent() || ! mfrc522.PICC_ReadCardSerial() ) { delay(50); return; } Serial.print(F("Card UID:")); for (byte i = 0; i < mfrc522.uid.size; i++) { Serial.print(mfrc522.uid.uidByte[i] < 0x10 ? " 0" : " "); Serial.print(mfrc522.uid.uidByte[i], HEX); } Serial.println(); // Disable RFID digitalWrite(SS_PIN, HIGH); //Enable SD Card digitalWrite(CS_pin, LOW); myFile = SD.open("sensey.txt"); if (myFile) { Serial.println("sensey.txt:"); // read from the file until there's nothing else in it: while (myFile.available()) { Serial.write(myFile.read()); } // close the file: myFile.close(); } else { // if the file didn't open, print an error: Serial.println("error opening sensey.txt"); } // Disable SD Card digitalWrite(CS_pin, HIGH); //Enable RFID // digitalWrite(SS_PIN, LOW); // Halt PICC mfrc522.PICC_HaltA(); } Зматил такую штуку, если при перезагрузке оставить карточку на рфид модуле, в сериал начинает сыпать и айди карты и содержимое файла, но стоит убрать карту все прекращается, и при повторном подносе карты никак не реагирует
Интересный подход, но цифровых пинов свободных к сожалению нет, но есть аналоговые. Какие транзисторы использовали и можно ли на аналоговых сделать? Делал управление подсветкой но использовал цифровые пины использовал ШИМ
Транзисторы обычные полевые, открываются на землю при подаче сигнала. Если нет цифровых пинов, можно управлять аналоговыми. Схема такая: включили устройство, выждали несколько милисекунд (20 например), считали показание, выключили, включили следующее. Я так делал с несколькими датчиками влажности почвы, при использовании регистра можно их очень много поочередно использовать на один аналоговый вход. SPI это два аналоговых пина, работать с ними по тому же принципу. Схему нарисовать?
Спасибо большое, нет схемку не надо. А аналоговые пины тоже можно в HIGH и LOW выставлять, или цифрами 1023 и 0?
получается транзистор ставим в разрыв по питанию рфид на землю? Т.е. грубо говоря переключатель, замкнули землю считали показания разомкнули. Я вас правильно понял?
Да, по сути включаем землю, мне кажется так правильнее. Управляющие аналоговые пины не забудьте сконфигурировать в OUTPUT.