Dúvida Projeto!

Olá pessoal tudo bem?

Estou desenvolvendo um projeto de TCC e preciso de ajuda.... Gostaria de saber se com o arduino é possível a detecção de 5 entradas analogicas distintas, converter estas leituras analogicas para leituras digitais, envia-las via serial para o PC em formato String para posterior manipulação no Java. É possível fazer está coleta e envio de dados para a serial de forma ciclica em um laço eterno? É necessária a construção de um modulo de MAX232 para comunicação serial ou o proprio arduino já dispensa tal circuito?

Alguem pode me disponibilizar o msn/email para contato?

Obrigado a todos!

OBS: Caso a comunicação serial seja possível, ela picota os dados lidos via serial via Baud/Cristal oscilante ou as informações chegam bem?

O arduino tem 6 entradas analógicas, por isso pode bem fazer isso, tem tambem incluido um conversor usb-serial logo não precisa de nenhum MAX232.
E o programa em si para fazer isso tambem é muito simples, mas atenção que a voltagem que pode meter nas entradas analógicas tem de ser entre 0 e 5v.

Sim,

Você programa o Arduino e seja lá o código que você coloca roda a 16Mhz, que é o clock dele.

Como o Senso disse, existem 6 portas analógicas. O conversor A/D nessas portas tem resolução de 10 bits. Única ressalva é que se for utilizar qualquer chip no protocolo I2C, é necessário alocar 2 entradas analógicas para controle do bus I2C.

A interface USB é feita através de 1 chip FTDI. Se quiser a interface puramente serial pode usar a placa Arduino Severino.

Vlw !!!

Olá amigos, obrigado pela atenção e resposta tão rápida...!

Então amigos o que desejo fazer com o arduino é o seguinte: Coletar os 5 dados analogicos e enviar de forma concatenada em uma string para a porta serial!

Eu escrevi um codigo que aparentemente é baseado no que eu pretendo fazer...

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

void loop() {
  int sensorValue = (analogRead(A0)/4); // Leitura da entrada analogica da porta A0 feita em 10bits, a divisão por 4 torna a leitura equivalente a 8 bits.
  int sensorValue2 = (analogRead(A1)/4); // Leitura da entrada analogica da porta A1.
  int sensorValue3 = (analogRead(A2)/4); // Leitura da entrada analogica da porta A2.
  int sensorValue4 = (analogRead(A3)/4); // Leitura da entrada analogica da porta A3.
  int sensorValue5 = (analogRead(A4)/4); // Leitura da entrada analogica da porta A4.
  String sv = (sensorValue, HEX); // Conversão do valor da variavel sensorValue de int para Hexadecimal.
  String sv2 = (sensorValue2, HEX); // Conversão do valor da variavel sensorValue2 de int para Hexadecimal.
  String sv3 = (sensorValue3, HEX); // Conversão do valor da variavel sensorValue3 de int para Hexadecimal.
  String sv4 = (sensorValue4, HEX); // Conversão do valor da variavel sensorValue4 de int para Hexadecimal.
  String sv5 = (sensorValue4, HEX); // Conversão do valor da variavel sensorValue5 de int para Hexadecimal.
  String porta =(sv+" "+sv2+" "+sv3+" "+sv4+" "+sv5); // Concatenação das Strings em Hex referentes as variaveis sensorValue em Hex.
  Serial.println(porta); // Envio desta String concatenada para a porta serial.

// O uso de 8 bits é visando a utilização de uma comunicação serial que possui um cordão padrão de 8 bits por envio. :D
}

Gostaria de saber se vocês podem dar uma olhadinha no codigo para detectar erros...

Ele segue o protocolo UART? O arduino só toma posse da porta para uma nova escrita quando estiver livre? Pois caso contrario enquanto eu estiver lendo no pc ele pode tentar injetar novos dados e corromper a informação... :\

Ahh, já ia me esquecendo, tem como deixar o arduino "hibernar" durante alguns milesegundos para um novo envio? Tipo um sleep durante o laço de repetição?

Obrigado a todos! :smiley:

Olá Zolrax,

O protocolo de comunicação no Atmega é o USART, o chip pode ser configurado para operar USART ou apenas UART. Creio que essa configuração de fusos é feita já na IDE do Arduino, não tenho certeza mas por padrão acho que opera em USART, independente se o circuito tem a interface FTDI ou não (Arduinos com USB), ou seja, de qualquer maneira que estiver seu código ele vai operar USART (Me corrijam se estiver errado!).

Aconselho a dar uma olhada no datasheet do Atmega http://www.atmel.com/dyn/resources/prod_documents/doc2486.pdf página 133.

Sinceramente não sei como é feito o controle de fluxo na comunicação serial, mas tenho a impressão de que o que você falou é correto.... o Arduino continua enviando os dados independente de qualquer checagem. Digo isto pois com qualquer sketch normal enviando dados na serial, desconectando o cabo serial ele continua processando e enviando as informações o que me parece correto pois não se pode prejudicar o andamento do código, naquele ciclo, por conta de um serial.println sem resposta. Apesar de existir buffer de dados no chip, sua função é apenas garantir um fluxo contínuo, do datasheet: "The Transmitter consists of a single write buffer, a serial
Shift Register, Parity Generator and control logic for handling different serial frame formats. The
write buffer allows a continuous transfer of data without any delay between frames"

Sim você pode usar a função "delay(500);" para pausar o código (500 milisegundos no caso do exemplo), porém, com a função delay todo o código é pausado, isto significa que não serão lidos sensores ou botões ou qualquer instrução no código enquanto o delay estiver em ação. Para coordenar pausas sem prejudicar o restante do código o ideal é usar a função millis(), exemplo: millis() - Arduino Reference

Não tenho certeza qual seria a melhor forma de ativar um controle de dados, talvez implementar no código um algaritmo de checagem, sincronizado com o programa no PC ou simplesmente enviar receber uma string código de confirmação dos dados.

Difícil dizer se existem erros no seu sketch sem rodar o programa (pelo menos pra mim). Das vezes que precisei concatenar valores usei strcat antes de enviar pra porta http://www.cplusplus.com/reference/clibrary/cstring/strcat/
De qualquer forma desconfio que apenas fazer "valor" + "valor" no seu caso não irá funcionar, pois está lidando con números em Hexa, a não ser que transforme em string primeiro... só chutando

De qualquer forma dá uma olhada sobre a formatação na saída serial: Serial.print() - Arduino Reference

Vlw !!!

Na verdade você não precisa dividir por 4 pois você vai transmitir como string... A biblioteca SERIAL cuida disso para você.

Eu fiz um projeto parecido (mas com apenas uma porta analogica sendo usada) e a transmissão para o computador era via bluetooth.

Abraço
Juliano

Olá amigos, fico grato com toda atenção que estão tendo comigo!

Então pelo que parece ele usa realmente uma comunicação UART ao enviar pelos pinos TX e RX da placa (01) e (02) eu acho...

Mal posso esperar pois amanhã chega meu Arduino e desejo colocar em pratica o que pretendo fazer! =]

@WebTronico

Amigo, você encontrou muitas dificuldades para fazer este tipo de projeto? Eu pretendo fazer inicialmente a coleta de 5 entradas em forma de String através de serial via cabo para o PC, posteriormente pretendo usar um zigbee para enviar as informações caso tudo já esteja dando certo... Para "wirilizar" o projeto hehe...

Novamente galera agradeço pelo apoio e atenção...

Tentarei atualizar o topico a medido que for conseguindo evoluir no projeto! :smiley:

Zolrakx, pode ficar tranquilo que é bem simples.

O projeto que eu fiz era para um aluno de pos-graduação que não tinha conhecimento em eletrônica. Daí eu fiz a parte do Arduino e ele fez o software do computador que recebia os dados pela USB.

Olá galera, estou aprendendo aqui com meu tatuino! :smiley:

Bom, gostaria de saber se alguem pode me ajudar aqui com um problema... :\

Bom o que acontece é o seguinte, para converter os dados lidos em INT para HEX eu já tenho que usar o Serial.print(intvalue,HEX) e isso já printa na serial, bom até aí tudo bem se eu quizesse apenas mandar um dado HEX, no entanto eu quero mandar 5 dados HEX diferentes.... O que eu gostaria de fazer é criar uma string com os 5 dados já convertidos em HEX e aí sim mandar para a Serial, no entanto quando eu faço String = (intvalue,HEX) sempre me retorna 16 independente do valor... Ou seja eu só estou conseguindo fazer a conversão quando eu faço o Serial.print, e consequentemente isto está fragmentando todos os dados e dificultando a leitura via java...

Como disse anteriormente o que eu pretendia realizar é o envio de 1 string já contendo tudo para que assim o java consiga pegar o pacote todo de uma vez e não grão por grão (o que danifica e dificulta muito a obtenção da informação).

O que eu esperava que funcionasse era isso:

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

void loop() {
  int sensorValue = (analogRead(A0)); // Leitura da entrada analogica da porta A0 feita em 10bits, a divisão por 4 torna a leitura equivalente a 8 bits.
  int sensorValue2 = (analogRead(A1)); // Leitura da entrada analogica da porta A1.
  int sensorValue3 = (analogRead(A2)); // Leitura da entrada analogica da porta A2.
  int sensorValue4 = (analogRead(A3)); // Leitura da entrada analogica da porta A3.
  int sensorValue5 = (analogRead(A4)); // Leitura da entrada analogica da porta A4.
  String sv = (sensorValue, HEX); // Conversão do valor da variavel sensorValue de int para Hexadecimal.
  String sv2 = (sensorValue2, HEX); // Conversão do valor da variavel sensorValue2 de int para Hexadecimal.
  String sv3 = (sensorValue3, HEX); // Conversão do valor da variavel sensorValue3 de int para Hexadecimal.
  String sv4 = (sensorValue4, HEX); // Conversão do valor da variavel sensorValue4 de int para Hexadecimal.
  String sv5 = (sensorValue4, HEX); // Conversão do valor da variavel sensorValue5 de int para Hexadecimal.
  String porta =(sv+" "+sv2+" "+sv3+" "+sv4+" "+sv5); // Concatenação das Strings em Hex referentes as variaveis sensorValue em Hex.
  Serial.println(porta); // Envio desta String concatenada para a porta serial.

O problema é que esta conversão sempre me retorna 16! :expressionless:

Agora quando dá certo sai assim:

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

void loop() {
  int sensorValue =  analogRead(A0); // Leitura da entrada analogica da porta A0 feita em 10bits, a divisão por 4 torna a leitura equivalente a 8 bits.
  delay(100);
  int sensorValue2 = analogRead(A1); // Leitura da entrada analogica da porta A1.
  delay(100);
  int sensorValue3 = analogRead(A2); // Leitura da entrada analogica da porta A2.
  delay(100);
  int sensorValue4 = analogRead(A3); // Leitura da entrada analogica da porta A3.
  delay(100);
  int sensorValue5 = analogRead(A4); // Leitura da entrada analogica da porta A4.
  Serial.print("o");
  Serial.print(sensorValue,HEX);
  Serial.print(" "); 
  Serial.print("p");   
  Serial.print(sensorValue2,HEX);
  Serial.print(" "); 
  Serial.print("q");  
  Serial.print(sensorValue3,HEX);
  Serial.print(" ");
  Serial.print("r");   
  Serial.print(sensorValue4,HEX);
  Serial.print(" ");
  Serial.print("s");   
  Serial.print(sensorValue5,HEX);
  Serial.print("\n");
  delay(200);

  //OBS Esses O, P, Q, R, S foram tentativas de sincronizar o codigo java, o que não deu certo também! :\
  
}

Mas como eu disse, o java fica louquinho e torna-se praticamente impossivel de detectar o cordão de informação certo :, em outras palavras ele acaba lendo tudo picotado :[

Alguma alma bondosa poderia me ajudar?

Valeu galera!

Caro, tente fazer o seguinte:

String sv = String(sensorValue, HEX);

@WebTronico.com

Valeu pela resposta tão rápida! Acabei de testar e funcionou!!!

Puts, obrigado mesmo amigo!

Ok. Sucesso no TCC.

Se for usar wireless de curto alcance (até 10 metros), sugiro o bluetooth. É bem facil de fazer.

Abraço

Então amigo, estava pensando em fazer wireless sim, no entanto estava pensando em usar o tatuino em conjunto com um Zigbee, aparentemente parece mais fácil de se usar.... Eu iria usar alguns modulos da rogercom:

Adaptador PROTO-BEE ROGERCOM

PLACA CON-USBBEE ROGERCOM

Alguem aí já trabalhou com zigbee? É facil de configurar assim como eu estou pensando?

Háa esqueci de perguntar, alguem sabe qual o tipo de tensão que sai dos pinos rx e tx (0 e 1 de output) do Tatuino? É 3,3v, 5v, ou Rs232 12v?

Então webtronico, valeu pela dica mas eu não faço ideia de como fazer via bluetooth hehhehe....

Valeu pela ajuda pessoal! :smiley:

Bluetooth da na mesma, um trem usb (5 conto) e um transmissor ...
Aqueles q sao tao pequenos q parece uma tampa p/ usb hehe...
Mas menos alcance. Bom eh o receptor q acha em qql pc store.

Deve ser 5v, pq eh o spec do atmel.

Pq o tatuino? Tu achou q viria com a morena da foto junto?
:wink:
Pelo preço dá a entender! HA!

PS.: Por ~130 reais, eu peguei o blackwidow do seeedstudio, é um duin com WIFI embutida... nada melhor, qql AP/Ad-hoc (celular por ex) e tu ta comunicando....

Galera em qual loja vocês costumam comprar esses modulos? Eu sinceramente não sei onde comprar esses Bluetooth / Zigbee....

Pessoal, alguem poderia me disponibilizar algum msn para tirar algumas duvidas e dar dicas?

Valeu!

@nofxx

Hahahha o Tatuino eu comprei pela comodidade, fica perto de casa o escritorio, e algumas medidas que estou fazendo é como sensor deles importado da maxbotix.

Na www.webtronico.com (loja brasileira) tem módulos bluetooth... mas igual eu falei, é para até 10 metros.

Abraço