Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« on: December 03, 2012, 07:18:43 am » |
Olá, estou fazendo um pequeno projeto, onde ligo um Arduino à um PC através de um transceiver 485 como mostrado no esquema a seguir. https://dl.dropbox.com/u/5970471/transceive_rs485.jpgA ligação já foi testada, e a comunicação está ok (recebe e envia). Minha dúvida, é quanto à programação, quer dizer, a comunicação se dá da seguinte forma: Arduino: d2, high Arduino > PC: [request_data] (ao terminar transmissão) d2, low PC > Arduino: [data] A dúvida: Como fazer o arduino alternar o enable, no momento certo entre o fim do envio, e o começo do recebimento da mensagem? Seria necessário fazer um "protocolo" com persistência? Alguém pode me ajudar?
|
|
|
|
|
Logged
|
|
|
|
|
Portugal
Offline
God Member
Karma: 9
Posts: 758
Tomorrow I will know a BIT more than yesterday
|
 |
« Reply #1 on: December 03, 2012, 07:26:45 am » |
Ola Crias uma funçao que alterne o pino de controlo, algo assim: void controlPin(uint8_t controlBusPin) { controlBusDirection = controlBusPin; pinMode(controlBusPin, OUTPUT);//Pin that Control Data Direction digitalWrite( controlBusPin,HIGH);//Enable Transmitter,Disable Receiver on default state } Depois podes criar outra funçao para "escutar" e outra para entrar no modo de envio /transmitMode set the control pin HIGH to enable the RS485 transiver void txMode() { digitalWrite(controlBusDirection,HIGH);//Enable Transmitter,Disable Receiver }
void rxMode() { digitalWrite(controlBusDirection,LOW);//Enable Transmitter,Disable Receiver } De momento estou quase a concluir uma libraria para trabalhar com um barramento RS485 Inda nao esta concluida mas assim que esteja depois posso partilhar
|
|
|
|
« Last Edit: December 03, 2012, 07:33:31 am by HugoPT »
|
Logged
|
Debian,Mint,Ubuntu Arduino Mega 2560 Arduino Nano Arduino Duemilanove MAC OS Montain Lion Raspberry PI Model B
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #2 on: December 03, 2012, 07:36:32 am » |
Amigo, obrigado pela resposta. É algo assim mesmo que tenho em mente, minha maior dúvida, é se isso irá funcionar corretamente com as temporizações da transmissão.
Por exemplo, alterno o pino ao terminar de enviar a mensagem do arduino para receber a resposta do PC, mas o Arduino ( e o transc.) será rápido o suficiente para alternar antes do PC começar a responder?
|
|
|
|
|
Logged
|
|
|
|
|
Portugal
Offline
God Member
Karma: 9
Posts: 758
Tomorrow I will know a BIT more than yesterday
|
 |
« Reply #3 on: December 03, 2012, 07:42:14 am » |
No meu caso eu estou usando VB do lado do PC e ele comunica corretamente.Se tiver problema pode sempre tentar dar um delay do lado do pc quando terminar de receber os dados antes de enviar a resposta.
|
|
|
|
|
Logged
|
Debian,Mint,Ubuntu Arduino Mega 2560 Arduino Nano Arduino Duemilanove MAC OS Montain Lion Raspberry PI Model B
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #4 on: December 03, 2012, 07:48:55 am » |
Obrigado novamente, então acho que está tudo certo aqui. Mas de qualquer forma, um delay seria interessante (melhor prevenir). Como eu faço isso? Meu software é em C#, não deve ser muito diferente
|
|
|
|
|
Logged
|
|
|
|
|
Portugal
Offline
God Member
Karma: 9
Posts: 758
Tomorrow I will know a BIT more than yesterday
|
 |
« Reply #5 on: December 03, 2012, 09:36:13 am » |
Como nao conheço bem o C# após uma breve busca no google encontrei isto: I usually use Thread.Sleep(xxxx) where XXX is in miliseconds.
you need to add "Using System.Threading" as well.
Also I usually introduce Application.DoEvents() here and there to make the GUI more responsive. adding Application.DoEvents() can also slow it down slightly.
Mesmo assim porque nao apenas testar sem qualquer delay? Penso que nao iras ter o problema no tempo de comutação do pino.O teste dirá a verdade.
|
|
|
|
« Last Edit: December 03, 2012, 10:24:12 am by HugoPT »
|
Logged
|
Debian,Mint,Ubuntu Arduino Mega 2560 Arduino Nano Arduino Duemilanove MAC OS Montain Lion Raspberry PI Model B
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #6 on: December 03, 2012, 10:57:17 am » |
Certo farei isto, por hora muito obrigado pelas respostas
|
|
|
|
|
Logged
|
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #7 on: December 04, 2012, 10:08:58 am » |
Amigo, não funcionou sem delay, da forma que você recomendou também não estava funcionando, mas era porque era preciso adicionar > using System.Threading;
Sei que deveria saber disso, mas sou autodidata em programação para PC, sei só o suficiente para interface com Arduino.
Obrigado
|
|
|
|
|
Logged
|
|
|
|
|
Portugal
Offline
God Member
Karma: 9
Posts: 758
Tomorrow I will know a BIT more than yesterday
|
 |
« Reply #8 on: December 04, 2012, 05:34:18 pm » |
Entao funciona com o delay é isso? No meu post estava la isso escrito:) you need to add "Using System.Threading" as well. Bons estudos colega
|
|
|
|
|
Logged
|
Debian,Mint,Ubuntu Arduino Mega 2560 Arduino Nano Arduino Duemilanove MAC OS Montain Lion Raspberry PI Model B
|
|
|
|
Curitiba PR, Brazil
Offline
Full Member
Karma: 0
Posts: 207
Arduino rocks
|
 |
« Reply #9 on: December 07, 2012, 12:47:54 pm » |
Nossa, nem prestei atenção que estava descrito  Na verdade no forum que encontrei esta informação não dizia, deve ser por isso que deixei passar batido agora... De qualquer forma, optei por realizar a comunicação "à 4 fios": um para de transceivers para o Tx e outro par para o Rx. Desta forma fixo o RE e DE em gnd ou vcc, em cada lado da comunicação, e não preciso alterar programação, disponibilizar mais pinos do arduino, e de certa forma aumento a confiabilidade da comunicação (sei que não vai falhar por problemas com enable). De qualquer forma obrigado amigo, é sempre bom aprender um pouco mais 
|
|
|
|
|
Logged
|
|
|
|
|
|