martes, 7 de enero de 2020

Control de 8 salidas mediante comunicación serie. Parte 2-2 arduinos-

Diseño en tinkercad (no funciona la conexión serie USB y por lo tanto los LEDS ni se encienden ni se apagan), aunque no funciona en virtual, se puede ver como se conecta. https://www.tinkercad.com/things/9lX4BaCdO4f-control-de-8-salidas-mediante-comunicacion-serie-p2

En dispositivos reales si funciona.

He intentado poner la librería que tiene el propio tinkercad (https://tinkercad.zendesk.com/hc/en-us/community/posts/115008544848-adding-library-for-arduino) pero tampoco funciona. Dejaré el tinkerad como ejemplo de montaje.

Primer Arduino (conectado a los LED):

Código:
/*
   Interface csca (Conexión Serie Con Arduino)
   va a conectarse con el arduino del USB
   utilizando la conexión serie csca
   Es similar al anterior pero cambiando Serial por csca
   enciende y apaga correctamente pero no termino
   de enviar correctamente el estado
   para empezar no se sincroniza hasta varios intentos
   después de haber cambiado
   y además:
    los 4 bits de mayor peso son 0011
    los 4 bits de menor peso se corresponden hasta el 7
    a partir de que se activa el bit del 8 comienza a fallar

   Comandos:
    s: estado ->devuelve un byte con el estado de cada led
    e:  encender  -> enciende el bit correspondiente al número
    a:  apagar  ->apaga el bit correspondiente...
   en la próxima version haré un
    aa: apagar todos
*/

/*
   Voy a escribir el estado como dos bytes hexadecimales enviando
   los caracteres corrspondientes. 1º H 2º L
*/
#include<SoftwareSerial.h>
SoftwareSerial csca(11, 2); // RX, TX csca; Comunicacion Serie Con Arduino
byte i;//la pongo global para que le asigne un espacio de memoria ya que la utilizo mucho
void setup() {
  // put your setup code here, to run once:
  csca.begin(57600);
  while (!csca);
  for (i = 0; i < 8; i++)
    pinMode(i + 3, OUTPUT);
  apagatodo();//lo voy a hacer ya para apagar todo al comienzo
}
void apagatodo() {
  for (i = 0; i < 8; i++)
    digitalWrite(i + 3, LOW);
}
void enviaestado() {
  byte estado, miniestado;
  char caracterL, caracterH;
  for (i = 0; i < 8; i++)
    bitWrite(estado, i, digitalRead(i + 3));
  csca.print("S");
  miniestado = estado & 0x0F;//solo deja los 4 bits de menor peso
  if (miniestado <= 9)
    caracterL = '0' + miniestado;
  else
    caracterL = 'A' + miniestado - 10;
  //solo puede ser de 0 a 9 ó de A a F
  estado = estado >> 4;
  miniestado = estado & 0x0F;
  if (miniestado <= 9)
    caracterH = '0' + miniestado;
  else
    caracterH = 'A' + miniestado - 10;
  csca.print(caracterH);
  csca.print(caracterL);
  
}
void loop() {
  char comando, numero;
  // put your main code here, to run repeatedly:
  while (!csca.available());
  comando = csca.read();
  if (comando == 's' || comando == 'S')
    enviaestado();
  else if (comando == 'a' || comando == 'A') {
    while (!csca.available());
    numero = csca.read();
    if (numero == 'a' || numero == 'A')
      apagatodo();
    else if (numero >= '0' && numero <= '9')
      digitalWrite(3 + numero - '0', LOW);
  }
  else if (comando == 'e' || comando == 'E') {
    while (!csca.available());
    numero = csca.read();
    if (numero >= '0' && numero <= '9')
      digitalWrite(3 + numero - '0', HIGH);
  }
}

Segundo Arduino (Conectado a USB):

Código:
/*
   Comandos:
    s: estado ->devuelve un byte con el estado de cada led
    e:  encender  -> enciende el bit correspondiente al número
    a:  apagar  ->apaga el bit correspondiente...
   en la próxima version haré un
    aa: apagar todos
*/

/*
 * Serial.flush() y csca.flush() no han funcionado
 * Aunque no falla, no he conseguido borrar el buffer de entrada
 * antes de iniciar las comunicaciones
 */

#include<SoftwareSerial.h>
SoftwareSerial csca(11, 2); // RX, TX csca; Comunicacion Serie Con Arduino
byte i;//la pongo global para que le asigne un espacio de memoria ya que la utilizo mucho
void setup() {
  // put your setup code here, to run once:
  Serial.begin(115200);
  csca.begin(57600);
  while (!Serial);
  while (!csca);
  leeestado();
}
void leeestado() {
  char comando;
  byte numero;
  csca.print("S");
  //se solicita el estado y se espera la respuesta
  comando = 0;
  while (comando != 's' && comando != 'S') {//espero a una comunicación que comience por "s"
    while (!csca.available());
    comando = csca.read();
  }
  Serial.print(comando);//solo llega aquí si comando es s o S.El siguiente es el estado en modo byte
  while (!csca.available());
  comando = csca.read();
  Serial.print (comando);
  while (!csca.available());
  comando = csca.read();
  Serial.println (comando);
}
void loop() {
  char comando, numero;
  // put your main code here, to run repeatedly:
  while (!Serial.available());
  comando = Serial.read();
  if (comando == 's' || comando == 'S')
    leeestado();
  else if (comando == 'a' || comando == 'A') {
    while (!Serial.available());
    numero = Serial.read();
    if (numero == 'a' || numero == 'A' || (numero >= '0' && numero <= '9')) {
      csca.print(comando);
      csca.println(numero);
      leeestado();
    }
  }
  else if (comando == 'e' || comando == 'E') {
    while (!Serial.available());
    numero = Serial.read();
    if (numero >= '0' && numero <= '9') {
      csca.print(comando);
      csca.println(numero);
      leeestado();
    }
  }
}

No hay comentarios:

Publicar un comentario