collapse

* Links de Robótica

* Posts Recentes

Feira de electricidade e eletrónica por artur36
[Ontem às 23:07]


Power_OK Enermax por almamater
[Ontem às 12:10]


Recomendação de um opamp para um DAC r2r por jm_araujo
[23 de Novembro de 2017, 10:48]


RN42 e TP-Link MR3020 por doiga
[22 de Novembro de 2017, 19:22]


Ajuda Projecto IR / RF por senso
[22 de Novembro de 2017, 13:15]


Ideias para construir um quadrúpede simples por dropes
[21 de Novembro de 2017, 22:43]


Ajuda com TRIAC por senso
[17 de Novembro de 2017, 18:00]


TV LG White Screen por almamater
[15 de Novembro de 2017, 08:37]


Pergunta sobre prototipagem ( Pesquisa ) por luisjustin
[14 de Novembro de 2017, 23:22]


Medir Agua que está no Poço por Njay
[14 de Novembro de 2017, 13:28]

Autor Tópico: Problema com travamento da Ethernetshield em sistema de automação.  (Lida 3350 vezes)

0 Membros e 1 Visitante estão a ver este tópico.

Offline pateta15

  • Mini Robot
  • *
  • Mensagens: 3
Estou com um problema que vem ocorrendo com certa freqüência.
Fiz a automação de uma lâmpada mais o controle da TV.  Fiz uma pagina PHP que manda o comando para o Arduino e fiz também através do TouchOSC e ambos tenho o mesmo problema.
Com os comandos do controle para acionar a TV via emissor infra não consegui gerar o problema, mas quando aciono o botão da luz as vezes o mesmo envia o comando mas não recebe a resposta e parece que trava a ethernet shield ai após esse travamento nem os botões do controle remoto funcionam mais. Só resetando na placa do arduino o mesmo volta a funcionar.
E é aleatório as vezes no primeiro click as vezes no vigésimo as vezes no segundo não há muita lógica.
Não sei se ter que por algum delay, bom alguém já teve problema similar ou sabe  o que poderia ser tentado?
Código do arduino abaixo:
//Sistema de Automacao
//Daniel Diniz Arbulu
#include <SPI.h>
#include <Ethernet.h>
#include <IRremote.h>
#include <ArdOSC.h>
//Configurações do Ethernet Shield
byte mac[] = { 0xDE, 0xAD, 0xBE, 0xEF, 0xFE, 0xED };
byte ip[] = { 192,168,0,22 }; // ip que o arduino assumirá
byte gateway[] = { 192,168,0, 1 }; // ip do roteador
byte subnet[] = { 255, 255, 255, 0 };
// String que representa o estado dos dispositivos
char Luz[7] = "0000L#";
EthernetServer server(8081); // Cria o servidor na porta 8081
IRsend irsend; //Objeto IRSend
int i = 0;
// String onde é guardada as msgs recebidas
char msg[7] = "0000L#";
//MOBILE
int serverPort = 8000; //define a porta de recepção do comando OSC
int destPort= 9000; //define a porta de envio do comando OSC
int flag=0;
int flag2=0;
OSCServer server_mobile; //inicializa o servidor OSC (serviço que trata a recepção de mensagem OSC)
OSCClient client_mobile;
void setup() {
Serial.begin(9600);
Ethernet.begin(mac, ip, gateway, subnet);
server.begin();

server_mobile.begin(8000);
server_mobile.addCallback("/ard/relePin",&func1);
server_mobile.addCallback("/ard/btnVolMais",&func2);
server_mobile.addCallback("/ard/btnVolMenos",&func3);
server_mobile.addCallback("/ard/btnVolMenos2",&func3);

pinMode(A0,OUTPUT);
pinMode(A1,OUTPUT);
pinMode(A2,OUTPUT);
pinMode(A3,OUTPUT);
// pinMode(A4,OUTPUT);
// pinMode(A5,OUTPUT);
digitalWrite(A0,LOW);
digitalWrite(A1,LOW);
digitalWrite(A2,LOW);
digitalWrite(A3,LOW);

}
void loop() {

if(server_mobile.aviableCheck()>0) {
Serial.println("Entrei no if do mobile!");
}

EthernetClient client = server.available();

// SE receber um caracter...
if (client) {

// guarda o caracter na string 'msg'
//msg[1]=msg[2]; msg[2]=msg[3]; msg[3]=msg[4]; msg[4]=msg[5]; msg[5]=msg[6];
//msg[6] = client.read();

for(int k = 1; k < 8; k++) {
msg[k] = client.read();
}

Serial.print("MSG 1:");Serial.println(msg[1]);
Serial.print("MSG 2:");Serial.println(msg[2]);
Serial.print("MSG 3:");Serial.println(msg[3]);
Serial.print("MSG 4:");Serial.println(msg[4]);
Serial.print("MSG 5:");Serial.println(msg[5]);
Serial.print("MSG 6:");Serial.println(msg[6]);
Serial.println(i++);
Serial.println("=============================");
if (msg[2]=='#') {
Serial.println("Entrei no R#");
switch(msg[1]) {
case 'R':
// Se receber o comando 'R#' envia de volta o status dos
// dispositivos. (Que é a string 'Luz')
client.write(Luz);
break;
}
} else if(msg[6]=='#') {
Serial.println("Entrei no L#");
switch(msg[5]) {
// case 'P':
// // Caso P#, aciona o pino do portão pequeno por 1s.
// digitalWrite(A4,HIGH);
// delay(1000);
// digitalWrite(A4,LOW);
// break;
// case 'G':
// // Caso G#, aciona o pino do portão pequeno por 1s.
// digitalWrite(A5,HIGH);
// delay(1000);
// digitalWrite(A5,LOW);
// break;
case 'L':
// Caso L#, ele copia os 4 bytes anteriores p/ a
// string 'Luz' e cada byte representa um
// dispositivo, onde '1'=ON e '0'=OFF
Luz[0]=msg[1];
Luz[1]=msg[2];
Luz[2]=msg[3];
Luz[3]=msg[4];
if (Luz[0]=='1') digitalWrite(A0,HIGH); else digitalWrite(A0,LOW);
if (Luz[1]=='1') digitalWrite(A1,HIGH); else digitalWrite(A1,LOW);
if (Luz[2]=='1') digitalWrite(A2,HIGH); else digitalWrite(A2,LOW);
if (Luz[3]=='1') digitalWrite(A3,HIGH); else digitalWrite(A3,LOW);
client.write(Luz);
break;

case 'C':
if (msg[4] == 'p') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF10EF, 32); //Desligar TV
delay(40);
}
}
if (msg[4] == '+') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF40BF, 32); //Subir volume
delay(40);
}
}
if (msg[4] == '-') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFC03F, 32); //Descer volume
delay(40);
}
}
if (msg[4] == '/') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF00FF, 32); //Subir canal
delay(40);
}
}
if (msg[4] == '*') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF807F, 32); //Descer canal
delay(40);
}
}
if (msg[4] == 'i') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFD02F, 32); //Input
delay(40);
}
}
if (msg[4] == 'a') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF0CF3, 32); //Av Mode
delay(40);
}
}
if (msg[4] == '6') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF609F, 32); //Direita menu
delay(40);
}
}
if (msg[4] == '4') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DFE01F, 32); //Esquerda menu
delay(40);
}
}
if (msg[4] == '8') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF02FD, 32); //Cima menu
delay(40);
}
}
if (msg[4] == '5') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF827D, 32); //Baixo menu
delay(40);
}
}
if (msg[4] == 'e') {
for (int i = 0; i < 1; i++) {
irsend.sendNEC(0x20DF22DD, 32); //Enter menu
delay(40);
}
}
client.write(Luz);
break;
}
}
}
}
void func1(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
Serial.println("Antes da atividade!");
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"
//digitalWrite(A0,value); //muda estado da porta digital 8 (ledPin2) conforme argumento OSC recebido
//delay(40);
//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/relePin"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

if(flag==1){
flag=0;
digitalWrite(A0, LOW);
delay(100);
}
else{
flag=1;
digitalWrite(A0, HIGH);
delay(100);
}

txMes.addArgInt32(flag);
Serial.println("Antes do envio da Mensagem!");
//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
Serial.println("Enviei a mensagem!");
}
void func2(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"

irsend.sendNEC(0x20DF40BF, 32); //Subir volume
delay(40);

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/btnVolMais"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID


txMes.addArgInt32(flag);

//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID
Serial.println("Enviei a mensagem!");

}
void func3(OSCMessage *_mes){ //rotina que trata comando OSC "/ard/led2" recebido do ANDROID
int value=(int)_mes->getArgFloat(0); //armazena em "value" o argumento do comando OSC "/ard/led2"

irsend.sendNEC(0x20DFC03F, 32); //Descer volume
delay(40);

//create new osc message
OSCMessage txMes; //cria uma nova menssagem OSC

//set destination ip address & port no
txMes.setAddress(_mes->getIpAddress(),9000); //define o endereço e porta do destino da mensagem OSC
txMes.beginMessage("/ard/btnVolMenos"); //define comando OSC
txMes.addArgFloat(flag); //define no estado do led 2 que será enviado no argumento OSC para ANDROID

txMes.addArgInt32(flag);

//send osc message
client_mobile.send(&txMes); //envia mensagem OSC para atualizar novo estado do led 1 no ANDROID

}

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #1 em: 06 de Agosto de 2014, 16:34 »
Aposta em falta de ram, mas não vou analisar essa wall of code..
Avr fanboy

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #2 em: 06 de Agosto de 2014, 21:31 »
Eu tambem só li a coisa por alto, mas se for falta de RAM, trocares todos os
Código: [Seleccione]
Serial.print("xxxx");
por
Código: [Seleccione]
Serial.print(F("xxxx"));
deve resolver o problema.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #3 em: 07 de Agosto de 2014, 00:33 »
Não funciona para fazer prints de variaveis, atenção a essa pequena parte.
Avr fanboy

Offline pateta15

  • Mini Robot
  • *
  • Mensagens: 3
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #4 em: 07 de Agosto de 2014, 11:46 »
O problema ocorre sem os seriais print coloquei eles a fim de debugar para ver se estava travando em algo.

O que percebi é que a ethernet shield trava mas só ocorre no botão que desliga a luz e aleatoriamente. As vezes na primeira as vezes na trigésima vez que aperta.

Como posso ver se é a RAM mesmo há alguma forma de verificar o uso da mesma?

Alguma outra sugestão?

Offline Kristey

  • Mini Robot
  • *
  • Mensagens: 753
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #5 em: 07 de Agosto de 2014, 11:56 »
Antes de mais Ola, e devias passar ali nas apresentações, e nao chegar aqui e debitar codigo que ninguem vai ler.
Aconselho tambem a leres o que escreves antes de postar. É que eu nao percebi nada do problema que tens. Não sendo este tipo de projectos ainda a minha praia certamente que quem te poderá ajudar vai ignorar pela maneira como estas a expor o teu problema.

Offline pateta15

  • Mini Robot
  • *
  • Mensagens: 3
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #6 em: 07 de Agosto de 2014, 18:41 »
Olá Kristey meu português é do Brasil por isso talvez seja um pouco diferente do que vocês estão acostumados  :o .
Com relação ao código coloquei por que provavelmente alguém que soubesse iria querer saber sobre o código sem ele ficaria muito vago, assim penso eu.
Enfim meu problema é que quando aciono o módulo relê que acende a lâmpada por alguma razão trava a ethernet shield(mas não é sempre) de forma que eu dou outros comandos e não funciona tanto o da lâmpada como o da TV ( que fiz controle remoto e ligo desligo, troco menu etc via web).

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #7 em: 07 de Agosto de 2014, 18:48 »
Esquema?
Muito provavelmente pico inductivo gerado pela bobine do relé que está a mandar o micro abaixo.
Avr fanboy

Offline tarquinio

  • Mini Robot
  • *
  • Mensagens: 529
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #8 em: 07 de Agosto de 2014, 19:04 »
Neste tipo de coisas a primeira coisa a tentar detectar logo é se a falha é de software ou hardware. Se não tens muita experiencia com este tipo de coisas, habitua-te a tentar separar os problemas. Por exemplo, aqui podes testar o programa todo usando um LED em vez de todo o circuito necessário para ligar a lampada. Se falharà mesma com o LED, então o código tem mesmo problemas. Se funcionar perfeito com o LED, mas falhar com a lampada, então a o problema é de hardware, e não de software.

Offline Tiobel

  • Mini Robot
  • *
  • Mensagens: 27
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #9 em: 08 de Agosto de 2014, 08:39 »
Também aposto ou na RAM ou na alimentação.

Para a RAM, se compilares com uma das versões 1.5.X, o IDE diz a no final a memoria disponível.

Para a alimentação, só vendo o circuito.

Offline senso

  • Global Moderator
  • Mini Robot
  • *****
  • Mensagens: 9.402
  • Helpdesk do sitio
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #10 em: 08 de Agosto de 2014, 13:34 »
É só carregar no shift quando carregam no botão para compilar, ou isso só diz a pasta onde mete os ficheiros?
Avr fanboy

Offline Tiobel

  • Mini Robot
  • *
  • Mensagens: 27
Re: Problema com travamento da Ethernetshield em sistema de automação.
« Responder #11 em: 08 de Agosto de 2014, 14:51 »
Senso,

Essa pergunta era para mim?
Não entendi.

HG