Buenas tardes. Necesito ayuda desesperadamente ya que presento mi Trabajo Fin de Grado esta semana y esto me está trayendo de cabeza...
El proyecto consiste en comunicar la RasPi y el Arduino por el puerto serie, hasta ahí la cosa bien.
En el momento en el que la RasPi le envía el SlaveID al Arduino, éste lo lee bien con la salvedad de que incluye un "-1" que no se de donde narices sale justo después del 49 (que se corresponde con el ASCII del 1). He intentado TODO (darle el valor del -1 a una variable auxiliar, cambiar el nombre de la variable, pero siempre me sale ese -1 que me pisa el resto de variables).
Entiendo que el fallo está en el Sketch, ya que he probado a ver qué es lo que sale del python de la RasPi mediante un conector FTID directamente al PC y sale exactamente lo que tu le mandes sacar por teclado.
Os adjunto los códigos, tanto el sketch Arduino como el python de la RasPi, así como una imagen donde recojo por terminal serie el problema, a ver si alguien consigue solucionarme esto, porque de verdad que estoy desesperado.
Muchas gracias de antemano.
Saludos.
#include <SoftwareSerial.h>
#define pin_sensor1 A5
#define pin_sensor2 A4
#define pin_sensor3 A3
float tempC; // Variable para almacenar el valor obtenido del sensor (0 a 1023)
int pinLM35 = 0; // Variable del pin de entrada del sensor (A0)
int led = 7;
int motor = 8;
int algo = 4;
int SlaveID=49; //ASCII del 2
int datoEsclavo=0;
int datoFunc=0;
int array1[3];//aquí se aloja el estado de los dispositivos digitales controlados
int valor;
int registro[]={0, 0, 0};
int regtemp[30];
float adc1, adc2, adc3;
float tension1, tension2, tension3;
float var1, var2, var3;
float rel_tens_var1, rel_tens_var2, rel_tens_var3 = 100.00;
long tiempoReg=10000; //Envío datos de los sensores cada 10 segundos.
void setup() {
Serial.begin(19200);
pinMode(algo, OUTPUT);
pinMode(motor, OUTPUT);
pinMode(led, OUTPUT);
}
void loop() {
if (Serial.available() > 0){
datoEsclavo=Serial.read();
Serial.print(datoEsclavo); //depurar
if (datoEsclavo==SlaveID){
if(Serial.available() >0){
datoFunc=Serial.read();
Serial.print(datoFunc);
}
}
switch (datoFunc) {
case 51: //Read Holding Registers(3, 51 en ascii)
adc1 = analogRead(pin_sensor1);
Serial.print("Valor adc sensor 1: ");
Serial.println(adc1);
adc2 = analogRead(pin_sensor2);
Serial.print("Valor adc sensor 2: ");
Serial.println(adc2);
adc3 = analogRead(pin_sensor3);
Serial.print("Valor adc sensor 3: ");
Serial.println(adc3);
tension1 = adc1 * 5 /1023;
Serial.print("Valor tension sensor 1: ");
Serial.println(adc1);
tension2 = adc2 * 5 /1023;
Serial.print("Valor tension sensor 2: ");
Serial.println(adc2);
tension3 = adc3 * 5 /1023;
Serial.print("Valor tension sensor 3: ");
Serial.println(adc3);
var1 = tension1 * rel_tens_var1;
Serial.print("El valor de la variable es: ");
Serial.println(var1);
var2 = tension2 * rel_tens_var2;
Serial.print("El valor de la variable es: ");
Serial.println(var2);
var3 = tension3 * rel_tens_var3;
Serial.print("El valor de la variable es: ");
Serial.println(var3);
//Recoger datos sensores y guardarlos en el vector registro
registro[0]=var1;
registro[1]=var2;
registro[2]=var3;
Serial.write((byte*)registro, 3 * sizeof(registro[0]));
break;
case 54: //Preset Single Register (6, 54 en ascii)
//Cambiar el valor de los elementos digitales y
// mandar vector con estado de los mismos de vuelta
for( int i=0; i<=3; i++){
if (Serial.available() > 0){
valor=Serial.read();
array1[i]=valor;
}
}
if (array1[0] == 49){
digitalWrite(algo, HIGH);
Serial.print("Cosa encendida.\n");
}
else{
digitalWrite(algo, LOW);
Serial.print("Cosa apagada.\n");
}
if (array1[1] == 49){
digitalWrite(led, HIGH);
Serial.print("Led encendido.\n");
}
else{
digitalWrite(led, LOW);
Serial.print("Led apagado.\n");
}
if (array1[2] == 49){
digitalWrite(motor, HIGH);
Serial.print("Motor encendido.\n");
}
else{
digitalWrite(motor, LOW);
Serial.print("Motor apagado.\n");
}
break;
case 0:
break;
}
}
unsigned long currentMillis = millis();
if( millis() - currentMillis > tiempoReg){
adc1 = analogRead(pin_sensor1);
adc2 = analogRead(pin_sensor2);
adc3 = analogRead(pin_sensor3);
tension1 = adc1 * 5 /1023;
tension2 = adc2 * 5 /1023;
tension3 = adc3 * 5 /1023;
var1 = tension1 * rel_tens_var1;
var2 = tension2 * rel_tens_var2;
var3 = tension3 * rel_tens_var3;
int i = 0;
int k = 0;
for (i=0; i<=3; i++)
regtemp[k]=var1;
regtemp[k+1]=var2;
regtemp[k+2]=var3;
k=k+3;
if (k==30){
k=0; //Reseteamos los registros iniciales
}
}
//si la longitud del registro se excede, reiniciarlo.
}
Código Phyton RaspBerry:
import serial, time
vec = 3
VECTOR=[None] * vec
arduino = serial.Serial('/dev/ttyAMA0', 19200)
print("Comienzo")
slaveID = raw_input('Introduce el ID del esclavo: ')
arduino.write(slaveID)
time.sleep(5)
func = raw_input('Introduce el codigo de funcion: ')
if (func == 3):
arduino.write(func)
registro = arduino.readline()
print("El registro tiene alojados los siguientes valores: ")
print(registro)
elif (func == 6):
for i in range(0,vec):
elem = raw_input
arduino.write(elem)
i=i+1
time.sleep(5)
arduino.close()
ConfiguracionFinal.ino (4.4 KB)
controladorFinal.txt (558 Bytes)
