EasyVr и Шилд W5100 не работают вместе?! на UNO
- Войдите на сайт для отправки комментариев
Вс, 05/03/2017 - 12:09
Друзья стал обладателем шилда распознования голоса EasyVr я его настроил и протесторовал.
Стоило еще подключить Ethernet Shild W5100 как скеч на этапе детекта easyvr просто встает рогом и стоит.
Когда я удаляю строку - Ethernet.begin(mac, ip); скеч работает исправно, но сеть не работает.
Мне надо что бы и сеть работала и easyvr так как не имею двух ардуин что бы их разделить.
Что пробовал делать:
Так как easyvr в перемышчке SW занимает пины 13,12 я их загнул что бы W5100 их не занимал и подключил их напрямую к EasyVr но не помогло(ничего не изменилось).
еще раз отмечу что если шилд с сетью в скече убрать то все работает.
#include "Arduino.h" #if !defined(SERIAL_PORT_MONITOR) #error "Arduino version not supported. Please update your IDE to the latest version." #endif #if defined(SERIAL_PORT_USBVIRTUAL) // Shield Jumper on HW (for Leonardo and Due) #define port SERIAL_PORT_HARDWARE #define pcSerial SERIAL_PORT_USBVIRTUAL #else // Shield Jumper on SW (using pins 12/13 or 8/9 as RX/TX) #include "SoftwareSerial.h" SoftwareSerial port(12, 13); #define pcSerial SERIAL_PORT_MONITOR #endif #include "EasyVR.h" EasyVR easyvr(port); //Groups and Commands enum Groups { GROUP_1 = 1, }; enum Group1 { G1_SVET = 0, G1_P = 1, }; int8_t group, idx; //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EasyVr #include <Servo.h> Servo myservo; #include <EasyTransfer.h> EasyTransfer ET; EasyTransfer ET_2; EasyTransfer ET_3; struct SEND_DATA_STRUCTURE{ int16_t svet; int16_t pause; }; SEND_DATA_STRUCTURE mydata; struct RECEIVE_DATA_STRUCTURE { int16_t osveshenie; int16_t temperature; int16_t vlaga; int16_t datchik_dvizheniya; int16_t dom_otkrit; }; RECEIVE_DATA_STRUCTURE mydata_2; struct RECEIVE_DATA_STRUCTURE_2 { int16_t patop; //int16_t warning_voda; int16_t motor_1; }; RECEIVE_DATA_STRUCTURE_2 mydata_3; #include <SPI.h> #include <Ethernet.h> #include <WebSocket.h> //#define DEBUG //#define MAX_FRAME_LENGTH 64 EthernetClient client; EthernetClient client_2; byte mac[] = { 0x52, 0x4F, 0x43, 0x4B, 0x45, 0x54 }; byte ip[] = { 192, 168, 0 , 131 }; char server_2[] = "192.168.0.11"; WebSocketServer wsServer; void onConnect(WebSocket &socket) { //Serial.println("onConnect called"); } void onDisconnect(WebSocket &socket) { // Serial.println("onDisconnect called"); } #include <TM74HC595Display.h> int SCLK = 5; int RCLK = 3; int DIO = 8; TM74HC595Display disp(SCLK, RCLK, DIO); unsigned char LED_0F[29]; String cc; int pos = 0; #include <Thread.h> // подключение библиотеки ArduinoThread Thread potok_4led_temperature = Thread(); // создаём поток управления 4 значным индикатаром Thread potok_4led_vlaga = Thread(); void setup() { Serial.begin(9600); //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EasyVr // setup PC serial port pcSerial.begin(9600); // bridge mode? int mode = easyvr.bridgeRequested(pcSerial); switch (mode) { case EasyVR::BRIDGE_NONE: // setup EasyVR serial port port.begin(9600); // run normally pcSerial.println(F("---")); pcSerial.println(F("Bridge not started!")); break; case EasyVR::BRIDGE_NORMAL: // setup EasyVR serial port (low speed) port.begin(9600); // soft-connect the two serial ports (PC and EasyVR) easyvr.bridgeLoop(pcSerial); // resume normally if aborted pcSerial.println(F("---")); pcSerial.println(F("Bridge connection aborted!")); break; case EasyVR::BRIDGE_BOOT: // setup EasyVR serial port (high speed) port.begin(115200); // soft-connect the two serial ports (PC and EasyVR) easyvr.bridgeLoop(pcSerial); // resume normally if aborted pcSerial.println(F("---")); pcSerial.println(F("Bridge connection aborted!")); break; } while (!easyvr.detect()) { Serial.println("EasyVR not detected!"); delay(1000); } easyvr.setPinOutput(EasyVR::IO1, LOW); Serial.println("EasyVR detected!"); easyvr.setTimeout(5); easyvr.setLanguage(0); group = 1; //<-- start group (customize) //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EasyVr myservo.attach(A1); // pinMode(A1, OUTPUT); //Сенсорная кнопка желтый //digitalWrite(2, HIGH); //Порт светодиодов 8 шт potok_4led_temperature.onRun(function_4led_temperature); // назначаем потоку задачу potok_4led_temperature.setInterval(2000); // задаём интервал срабатывания, мсек potok_4led_vlaga.onRun(function_4led_vlaga); // назначаем потоку задачу potok_4led_vlaga.setInterval(5000); // задаём интервал срабатывания, мсек LED_0F[0] = 0xC0; //0 LED_0F[1] = 0xF9; //1 LED_0F[2] = 0xA4; //2 LED_0F[3] = 0xB0; //3 LED_0F[4] = 0x99; //4 LED_0F[5] = 0x92; //5 LED_0F[6] = 0x82; //6 LED_0F[7] = 0xF8; //7 LED_0F[8] = 0x80; //8 LED_0F[9] = 0x90; //9 LED_0F[10] = 0x88; //A LED_0F[11] = 0x83; //b LED_0F[12] = 0xC6; //C LED_0F[13] = 0xA1; //d LED_0F[14] = 0x86; //E LED_0F[15] = 0x8E; //F LED_0F[16] = 0xC2; //G LED_0F[17] = 0x89; //H LED_0F[18] = 0xF9; //I LED_0F[19] = 0xF1; //J LED_0F[20] = 0xC3; //L LED_0F[21] = 0xA9; //n LED_0F[22] = 0xC0; //O LED_0F[23] = 0x8C; //P LED_0F[24] = 0x98; //q LED_0F[25] = 0x92; //S LED_0F[26] = 0xC1; //U LED_0F[27] = 0x91; //Y LED_0F[28] = 0xFE; //hight - //#ifdef DEBUG // pinMode(7, OUTPUT); //#endif Ethernet.begin(mac, ip); ET.begin(details(mydata), &Serial); ET_2.begin(details(mydata_2), &Serial); ET_3.begin(details(mydata_3), &Serial); // wsServer.registerConnectCallback(&onConnect); wsServer.registerDataCallback(&onData); // wsServer.registerDisconnectCallback(&onDisconnect); wsServer.begin(); delay(100); } void action(); void loop() { //>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>> EasyVr if (easyvr.getID() < EasyVR::EASYVR3) easyvr.setPinOutput(EasyVR::IO1, HIGH); // LED on (listening) Serial.print("Say a command in Group "); Serial.println(group); easyvr.recognizeCommand(group); do { // can do some processing while waiting for a spoken command } while (!easyvr.hasFinished()); if (easyvr.getID() < EasyVR::EASYVR3) easyvr.setPinOutput(EasyVR::IO1, LOW); // LED off idx = easyvr.getWord(); if (idx >= 0) { // built-in trigger (ROBOT) // group = GROUP_X; <-- jump to another group X return; } idx = easyvr.getCommand(); if (idx >= 0) { // print debug message uint8_t train = 0; char name[32]; Serial.print("Command: "); Serial.print(idx); if (easyvr.dumpCommand(group, idx, name, train)) { Serial.print(" = "); Serial.println(name); } else Serial.println(); // beep easyvr.playSound(0, EasyVR::VOL_FULL); // perform some action action(); } else // errors or timeout { if (easyvr.isTimeout()) Serial.println("Timed out, try again..."); int16_t err = easyvr.getError(); if (err >= 0) { Serial.print("Error "); Serial.println(err, HEX); } } //<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<<< EasyVr wsServer.listen(); disp.timerIsr(); if (potok_4led_temperature.shouldRun()) { potok_4led_temperature.run(); // запускаем поток } if (potok_4led_vlaga.shouldRun()) { potok_4led_vlaga.run(); // запускаем поток } if (ET_2.receiveData()) { if (client_2.connect(server_2, 80)) { String msg = "GET /add.php?osvechenie="+String(mydata_2.osveshenie)+"&temperature="+String(mydata_2.temperature)+"&vlaga="+String(mydata_2.vlaga)+"&datchik_dvizheniya="+String(mydata_2.datchik_dvizheniya)+"&dom_otkrit="+String(mydata_2.dom_otkrit); Serial.println(msg); client_2.println(msg); client_2.println("HOST: 192.168.0.11"); client_2.println(); delay(500); client_2.stop(); //Ответ от сервера /* while (client.available() > 0) { char* c = client.read(); cc =+ c; Serial.print(cc); }*/ } } // temperature_s = dht.readTemperature(); if (ET_3.receiveData()) { myservo.write(mydata_3.motor_1); if (client.connect(server_2, 80)) { String msg1 = "GET /add_2.php?patop="+String(mydata_3.patop)/*+"&warning_voda="+String(mydata_3.warning_voda)*/; Serial.println(msg1); client.println(msg1); client.println("HOST: 192.168.0.11"); client.println(); delay(500); client.stop(); } } if (wsServer.connectionCount() > 0) { //wsServer.send("1", 6); } /*while (client.available() > 0) { Serial.println("wefwe"); int c = client.read(); Serial.println(c, DEC); //Serial.print(c); if (c == '1') { digitalWrite(7, HIGH); } if (c == '0') { digitalWrite(7, LOW); } }*/ } void function_4led_temperature() { //---------------------------------- DHT22 Датчик температуры и влажности ----------------------------------- char T = mydata_2.temperature; disp.set(LED_0F[12], 3); disp.digit2(T, 0); //---------------------------------- DHT22 Датчик температуры и влажности ----------------------------------- } void function_4led_vlaga() { //---------------------------------- DHT22 Датчик температуры и влажности ----------------------------------- char H = mydata_2.vlaga; disp.set(LED_0F[17], 3); disp.digit2(H, 0); //---------------------------------- DHT22 Датчик температуры и влажности ----------------------------------- } void onData(WebSocket &socket, char* dataString, byte frameLength) { Serial.write((unsigned char*)dataString, frameLength); //Serial.println(dataString); String c =+ dataString; //Serial.println(c); if (c == "99001") { digitalWrite(7, HIGH); mydata.svet = 1; ET.sendData(); } if (c == "99000") { digitalWrite(7, LOW); mydata.svet = 0; ET.sendData(); } // Just echo back data for fun. // socket.send(dataString, strlen(dataString)); } // Данная функция вызывается в случае успешного // распознавания фразы void action() { switch (group) { case GROUP_1: switch (idx) { case G1_SVET: Serial.println("1"); // write your action code here // group = GROUP_X; <-- or jump to another group X for composite commands break; case G1_P: Serial.println("1"); // write your action code here // group = GROUP_X; <-- or jump to another group X for composite commands break; } break; } }
Пины 12 и 13 - это, вообще-то SPI.
Чтобы найти несостыковку, просто аккуратно выпишите какие именно пины используются каждым устройством и по какому назначению.
Когда найдете пересечение, опять же, нужно будет определить, допустимо ли это назначением их использования. Например, тот же самый SPI подразумевает совместное использование трех из четырех пинов. Но "четвертые" пины у разных устройств должны быть непременно разными.
не совсем понял. Вроде в скече у меня пины 12 и 13 используются только для easyvr больше они нигде не фигурируют, а остальные устройства занимают другие пины. Поясните пожалуйста я чувствую знаний не хватает.
Еще раз: Вам нужно составить табличку, какие пины используются каждым из устройств.
Эти пины могут быть как переназначаемыми, тогда они фигурируют в качестве параметров для настройки устройства, так и постоянными. В последнем случае "снаружи" они могут быть не видны. Нужно:
1. Смотреть в теле библиотеки (как правило, достаточно заголовочного файла - обычно они там указываются).
2. Выяснить, какие используются протоколы передачи. Для аппатарной реализации протоколов, как правило, используются фиксированные номера пинов. В частности, у Вас в скетче фигурирует строка "#include SPI.h", это значит, что по крайней мере одно устройство использует протокол SPI. Соответственно, назначать пины 11, 12 и 13 ни для каких устройств нельзя.