Go Down

Topic: Arduino ethernet board com arduino uno FTDI - Serial JSSC (Read 372 times) previous topic - next topic

DiegoProtec

Boa tarde pessoal,

Tenho um Arduino Ethernet Board e um Arduino Uno Rev3.
Criei um programa em JAVA com a biblioteca JSSC, para configurar o Arduino Ethernet via SerialPort.

Para realizar a comunicação com o Arduino Ethernet via SerialPort, configurei o Arduino Uno como um FTDI.

Upload do Sketch está acontecendo, porém acontece dois ERROR:

1 - quando tento realizar o RESET o ARDUINO ETHERNET.
2 - o ARDUINO ETHERNET não recebe as informações via SERIALPORT(FTDI).

Dúvidas:
1 - O CAPACITOR 10uF entre o DTR e o RESET é essencial para que o RESET funcione?
2 - É possível que o Arduino Ethernet receba dados via SerialPort(Arduino as FTDI)?

Grato desde já.

bubulindo

Não percebi o primeiro erro... regra geral o reset da placa está ligado ao reset do chip W5100 (ou equivalente) será isso?

2 O problema pode ser o teu Arduino Uno uma vez que estarás (julgo eu pelo que disseste) a ligar dois chips na mesma porta série.

Dúvidas

1 - O condensador entre DTR e Reset serve para que a placa não faça reset quando tentas enviar um sketch.

2 - Não sei o que queres dizer com Arduino as FTDI...
This... is a hobby.

DiegoProtec

Estou tentando fazer com que o Arduino Uno seja uma porta serial para o meu Arduino Ethernet.

Fiz as ligações conforme o link:
https://cdn.instructables.com/FD4/343G/GHI9CHD9/FD4343GGHI9CHD9.LARGE.jpg?crop=3:2

Para fazer esse tipo de conexão, eu retirei o ATMEGA do Arduino UNO, então só temos uma placa controladora que está no Arduino Ethernet.

Eu não consigo realizar o reset no Arduino Ethernet. Quando realizo o reset tanto por uma placa ou por outra, o TX do Arduino UNO fica piscando e não consigo enviar o Sketch, nesse caso a porta COM3 fica recusando o acesso.


Quero que o Arduino Uno se comporte como este Cabo FTDI.
Segue o exemplo do que desejo ser feito:
https://gr33nonline.wordpress.com/2016/10/16/programming-the-arduino-ethernet-board/
Vai ser necessário o condensador?
Consigo enviar uma instrução para o ARDUINO ETHERNET se o ARDUINO UNO se comportar como um Cabo FTDI, ou esse cabo só serve para enviar o SKETCH?

bubulindo

Ok... pode haver várias coisas a acontecer.

Primeiro, as ligações estão feitas como? Rx -> Tx ou Rx->Rx? Eu creio que as ligações para o que pretendes fazer são Rx->Rx e não cruzado.

Depois outra questão é se fazendo reset manual consegues enviar um sketch para a placa Ethernet... pergunto isto porque poderá haver a possibilidade da placa não ter o bootloader gravado. No entanto apenas depois de perceber as ligações dos pinos é que se pode perceber isso.

O condensador não é necessário de todo, aliás, o condensador para o que pretendes fazer só vai causar problemas pois apenas é necessário se quiseres usar o Arduino como um gravador de ATmega.

Como estás a configurar a porta série no Arduino? Para o que pretendes fazer a configuração será como se estivesses a usar o Uno normalmente com o chip ainda incluído.
This... is a hobby.

DiegoProtec

Está Rx -> Rx.

Como faço o reset manual? Ligando o RESET ao GND?

Ao fazer o Arduino UNO se comportar como FTDI, achei que a placa Arduino Uno seria ignorada pois não possui o Microcontrolador.

O que está acontecendo:
Na IDE consigo selecionar a Placa: Arduino Ethernet;
Quando envio o Sketch, aparece a mensagem "Carregado";

O problema é quando tento resetar o Arduino Ethernet, não está resetando pelo botão de reset da placa. Vou tentar fazer o reset manual como você informou.

Para teste fiz um sketch que tem um OUTPUT no pin 9, que acende e apaga um LED, essa informação vem via serial. Vou tentar fazer novamente o código e posto o resultado qualquer coisa.
Se tudo der certo no projeto, vou postar o tutorial do que fiz. Obrigado mais uma vez.

bubulindo

Não tens um botão de reset nas placas? O Uno tem um e o Arduino Ethernet tem um ao lado do connector de rede. Se ligaste os pinos de reset de ambas as placas podes fazer isso.

Regra geral, para funcionar, clicas no botão para enviar programa e depois quando vês que acabou de compilar carregas no botão de reset.

Como seleccionaste a porta série na IDE? Está correcta?
This... is a hobby.

DiegoProtec

Consegui enviar o sketch e resetar. Tá tudo ok.

Porém ainda não consigo ligar e apagar o LED.

Código arduino:


#define LED 7
#define BT0 2
#define BT1 3

int dadoRecebido = 0;
int bt0Value = 0;
int bt1Value = 1;

void setup() {
  pinMode(LED, OUTPUT);
  Serial.begin(9600);
}

void loop() {

  bt0Value = digitalRead(BT0);
  bt1Value = digitalRead(BT1);

  if (Serial.available() > 0) {
    dadoRecebido = Serial.read();

    if (dadoRecebido & 0x01) {
      digitalWrite(LED, HIGH);
    } else {
      digitalWrite(LED, LOW);
    }
  }


  Serial.write(bt0Value);
  Serial.write(bt1Value);
  delay(100);
}


Código Java:

Classe, Controle Arduino
Método abre a conexão, conectaArduino

public ConnectArduino conectaArduino(String porta) throws SerialPortException {
       
        this.portaSerial = new SerialPort(porta);
        this.portaSerial.openPort();
        this.portaSerial.setParams(SerialPort.BAUDRATE_9600, SerialPort.DATABITS_8, SerialPort.STOPBITS_1, SerialPort.PARITY_NONE);
        this.portaSerial.setEventsMask(MASK_RXCHAR);
       
        this.portaSerial.addEventListener((SerialPortEvent serialPortEvent) -> {
            if (serialPortEvent.isRXCHAR()) {
                try {
                    byte[] b = this.portaSerial.readBytes();
                    int value = b[0] & 0xff;
                    String st = String.valueOf(value);

                } catch (SerialPortException ex) {
                    System.err.println("Erro ao abrir conexão.");
                }
            }
        });
       
        return new ConnectArduino(this.portaSerial);
}

Retorna uma conexão para o método que executa o comando.

Classe de interface que executa os comandos, AucarInterface
Método que executa o evento, acenderBActionPerformed

private void acenderBActionPerformed(java.awt.event.ActionEvent evt) {                                         
        if (this.acenderB.isSelected()) {
            try {
                this.conecta.escritaDigital((byte) 0x01);
                this.acenderB.setText("Acender Led");
            } catch (SerialPortException ex) {
                Logger.getLogger(AucarInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        } else {
            try {
                this.conecta.escritaDigital((byte) 0x00);
                this.acenderB.setText("Apagar Led");
            } catch (SerialPortException ex) {
                Logger.getLogger(AucarInterface.class.getName()).log(Level.SEVERE, null, ex);
            }
        }
    }

Eu vejo que pelos leds dos Arduinos, o TX e o RX estão recebendo e enviando dados mas não consigo ver o que está acontecendo. O LED não acende e nem apaga...

bubulindo

O que pretendes com isto:
Code: [Select]
if(dadoRecebido & 0x01) ??

Experimenta a comunicação sem o Java e em vez do teste que meti em cima, testa com algo do género:

Code: [Select]

if (dadoRecebido == 'L') digitalWrite(LED, 1);
if (dadoRecebido == 'D') digitalWrite(LED, 1);


Com o Serial Monitor da IDE do Arduino envia um L e um D para testar o código. Isto provará se o código está correcto no Arduino ou se é algo diferente que está a ocorrer.
This... is a hobby.

DiegoProtec

É a representação em Hexadecimal para um byte, 0x00 equivale a 0 na tabela ASCII.
Logo: (dadoRecebido & 0x01) significa se tem dado e se for 1(true) executa.

bubulindo

Tens vários conceitos errados.

0 equivale a null na tabela ASCII. A porta série e o protocolo HTTP comunicam em ASCII, logo '0' é igual a 48 na tabela ASCII. Podes ver em www.asciitable.com.

Outra coisa a ter em conta é que se não houver nada para ler, a função retorna -1. Apesar disto parecer funcionar, não é a maneira correcta de fazer as coisas. Antes de tentares ler alguma coisa, deves sempre ver se existe algo para ser lido usando o método Serial.available(). Se o resultado for maior que zero, então podes ler caracteres da porta série (ou do Ethernet client).

Outra coisa a ter em atenção é depois saber quais são os valores que a função do teu colega retorna (lembra-te, vão ser em ASCII) e testar esses valores individualmente.

Experimentaste o exemplo que coloquei para trocares o teste com &0x01 e testares pelas letras?
This... is a hobby.

Go Up