Problema Seriale tra arduino e raspberry

Ciao a tutti, sono nuovo del forum e ho un problema.
Poco tempo fa ho realizzato un bot telegram che gira sul mio raspberry e fa uso della libreria python telepot, con essa semplicemente inviando da chat privata su telegram un comando ad esempio: "temperatura", il comando arriva al raspberry e poi successivamente scrive sulla seriale un numero corrispondente che gli ho assegnato (es: 2), cosi arriva all'arduino che mediante delle if lo confronta e misura la temperatura letta dal dht11. Il tutto funziona perfettamente, ora però che ho intenzione di creare una webapplication in javascript mediante socket.io credo che il raspberry abbia un qualche problema. Brevemente vi dico che tutta la parte del codice javascript è completa quindi mancherebbe solo il pezzo di codice python usato per comunicare con arduino, semplicemente ho cosi deciso di scrivere questo codice qui semplicissimo che fa la stessa cosa del bot telegram. Appena avviato il codice, subito scrive su seriale il numero 2 che corrisponde al codice arduino alla temperatura e poi lo stampa, ebbene non funziona... non mi restituisce nessun errore ma rimane una riga vuota e se faccio crtl+c esce questo errore qui:

codice python:

import serial

ser = serial.Serial('/dev/ttyUSB0',9600)
ser.write("2")
temp=ser.readline()
print temp

codice arduino:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11       
int n;
int t;

DHT dht(DHTPIN, DHTTYPE);

void setup() {
Serial.begin(9600);
dht.begin();
}

void loop() {

if (Serial.available())  {
   n =(Serial.read() - '0');
   
   if (n==2){
      t = dht.readTemperature();
      Serial.println(t);
  }
}
delay(200);
}

Se però avvio il bot telegram tranquillamente funziona tutto, Dunque ho provato anche con un altro arduino, ma è indifferente, ho provato a formattare e reinstallare tutto sul raspberry ma niente, non ne vuole sapere, il mio dubbio ora è solo questo però: ogni tanto sulla schermata del raspberry compare un messaggio dicendo che l'alimentazione è insufficente (uso un alimentatore usb da 5v 2A) sapevo gia che ne servirebbero almeno 2.5A, ma fin ora ha funzionato sempre, non vorrei che ora sia questo il problema anche se mi sembra molto strano...Boh io è da stamattina che ci sto sbattendo la faccia anche insieme a un mio amico molto bravo in programmazione, ma fin ora non abbiamo risolto il problema... Soluzioni?

>aless03: ti ricordo che in conformità al regolamento, punto 7, devi editare il tuo post qui sopra (quindi NON scrivendo un nuovo post, ma utilizzando il bottone More -> Modify che si trova in basso a destra del tuo post) e racchiudere il codice all'interno dei tag CODE (... sono quelli che in edit inserisce il bottone con icona fatta così: </>, tutto a sinistra).

In pratica, tutto il tuo codice dovrà trovarsi racchiuso tra due tag: [code] _il _tuo_ codice_ [/code] così da non venire interpretato e non dare adito alla formazione di caratteri indesiderati o cattiva formattazione del testo. Grazie.

Guglielmo

P.S.: Ti ricordo che, purtroppo, fino a quando non avrai sistemato il codice come richiesto, nessuno ti potrà rispondere, quindi ti consiglio di farlo al più presto. :wink:

Premetto che non uso Python se non saltuariamente e comunque ho a disposizione solo Windows quindi non posso provare nulla, ma intanto visto che sei su Linux, sei sicuro che non ci siano problemi di permission alla "/dev/ttyUSB0"? E sicuro che sia quella la porta di Arduino?

Prova magari a far girare uno script (ovviamente di pySerial) per elencare tutte le porte, ad esempio credo questo.

Ma lasciando stare Python, se carichi su Arduino quello sketch e poi tramite monitor seriale mandi un "2" (ovviamente devi premere anche Invio) ricevi la risposta che ti aspetti o no?
E magari fai accendere il LED 13 quando rileva correttamente il dato, così puoi verificare:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11      
int n;
int t;

DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
  if (Serial.available()) {
    digitalWrite(LED_BUILTIN, HIGH);
    n =(Serial.read() - '0'); 
    if (n==2) {
      t = dht.readTemperature();
      Serial.print("t=");
      Serial.println(t);
    }
    delay(1000)
    digitalWrite(LED_BUILTIN, LOW);
  }
  delay(200);
}

Ciao, allora si lo schetch di arduino da monitor seriale su pc funziona perfettamente, il problema dei permessi alla porta usb non credo.

Piccolo aggiornamento. Ho editato il file rc.local sul raspi e ho impostato che ogni volta all'avvio parte in automatico lo script python, una volta avviato il raspi lo script effettivamente parte ma rimane "appeso" come prima, se io però lo avvio manualmente (ricordandoci che in esecuzione c'è gia lo script avviato in automatico) con il comando: "python sensore.py", Funziona!

Mi ricordo che prima di ciò, provai per sbaglio a mandare due volte in esecuzione lo stesso script con il bot telegram, e giustamente restituiva un errore per conflitto, il mio adesso credo sia proprio un bug...

aless03:
Ciao, allora si lo schetch di arduino da monitor seriale su pc funziona perfettamente

Ok bene.

Ho editato il file rc.local sul raspi e ho impostato che ogni volta all'avvio parte in automatico lo script python, una volta avviato il raspi lo script effettivamente parte ma rimane "appeso" come prima, se io però lo avvio manualmente (ricordandoci che in esecuzione c'è gia lo script avviato in automatico) con il comando: "python sensore.py", Funziona!

Bah, "a naso" ti direi: messo nell'rc.local lo esegue come "root" mentre quando lo lanci tu lo esegue con la tua utenza. Verifica.

Ho appena provato ma niente da fare, però ho notato la fonte del problema piu o meno. Se sullo schetch di arduino tolgo questa parte in cui lui si aspetta un valore scritto dall raspberry sulla seriale, il programma funziona.

if (Serial.available()) {
    n =(Serial.read() - '0');

Dunque il problema è la scrittura su seriale che gli crea problemi, anche se ancora non mi spiego il perche dell'altro programma python che funziona invece.

Ho provato a togliere e a ottimizzare di piu ancora il codice togliendo anche il Serial.avaiable e lasciando solo il serial.read, da pc in entrambi i casi funziona ma sul raspberry non ce speranza.

Il codice trasformato risulterebbe cosi:

#include "DHT.h"
#define DHTPIN 2
#define DHTTYPE DHT11     
int n;
int t;

DHT dht(DHTPIN, DHTTYPE);

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

void loop() {
    n =(Serial.read() - '0');
    if (n==2) {
      t = dht.readTemperature();
      digitalWrite(LED_BUILTIN, HIGH);
      Serial.println(t);
    }
    digitalWrite(LED_BUILTIN,LOW);
  delay(200);
}