Go Down

Topic: Dúvida Projeto! (Read 5107 times) previous topic - next topic

Zolrakx

Dec 10, 2010, 11:59 pm Last Edit: Dec 11, 2010, 12:31 am by Carlos_Henrique_R Reason: 1
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?

Senso

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.

DanDare

#2
Dec 11, 2010, 12:57 am Last Edit: Dec 11, 2010, 12:59 am by DanDare Reason: 1
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 !!!

Zolrakx

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...
Code: [Select]
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! :D

DanDare

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: http://www.arduino.cc/en/Reference/Millis

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: http://arduino.cc/en/Serial/Print

Vlw !!!

WebTronico.com

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

Zolrakx

#6
Dec 14, 2010, 09:59 pm Last Edit: Dec 14, 2010, 09:59 pm by Carlos_Henrique_R Reason: 1
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! :D

WebTronico.com

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.

Zolrakx

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

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:
Code: [Select]
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! :|

Agora quando dá certo sai assim:

Code: [Select]
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!

WebTronico.com

Caro, tente fazer o seguinte:

String sv = String(sensorValue, HEX);

Zolrakx

@WebTronico.com

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

Puts, obrigado mesmo amigo!

WebTronico.com

Ok. Sucesso no TCC.

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

Abraço

Zolrakx

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! :D

nofxx

#13
Dec 18, 2010, 01:04 am Last Edit: Dec 18, 2010, 01:08 am by nofxx Reason: 1
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?
;)
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....

Zolrakx

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.

Go Up