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