Port serie arduino et scripting.

Bonjour à tous,

Voila j'ai depuis peut un arduino mega 2560, je souhaite m'en servir pour controler des relais avec mon PC...bref plutot basic à priori.

J'ai acheté une carte 8 relais et je l'ai connectée, elle fonctionne bien, ensuite j'ai mis sur l'arduino un bout de code pour les controler en serie (trouvé ici Envoyer/Interpréter des commandes par Port Série - MCHobby - Le Blog)

 Créé le July 21, 2010, par Mark Aosawa. mark.aosawa@yahoo.com
 Modifié en profondeur April 7, 2012 par MC Hobby, info@mchobby.be    
 
 */

//String buffer/mémoire tampon
String cmd = String("");

// Initialiser la LED de la pin 13 comme sortie (OUTPUT)
int ledPin = 34;
int ledPin2 = 36;

void setup() {
  // Initialise la communication série (et baud rate à 9600):
  Serial.begin(9600);

  pinMode(ledPin, OUTPUT);
  pinMode(ledPin2, OUTPUT);
  // Affiche un message quand le port série est ouvert.
  // Permet de vérifier que le programme est bien en court de fonctionnement
  //Serial.println("OK");
}

void loop() {

  // Vérifier si des caractères sont reçu sur le port série
  if (Serial.available() > 0) {

    // Variable temporaire pour copier le caractère lu
    char SerialInByte;
    // Lire un caractère (un Byte)
    SerialInByte = Serial.read();

    // Si c'est  --> traiter la commande
    if(SerialInByte==13){ 
      ProcessCmd();
    }
    else{
      // sinon, ajouter le caractère à la mémoire tampon (cmd)
      cmd += String(SerialInByte);

      //et afficher un message de déboggage
      Serial.print( "SerialInByte: " );
      Serial.print( SerialInByte, DEC );
      Serial.print( ", Buffer " );
      Serial.println( cmd );
    }
  }
}

// Renvoyer la commande (contenu du buffer) sur le port série
void printCmd(){
  Serial.println(cmd);
}

// Réinitialiser le buffer (et vider le port série)
void clearCmd(){
  cmd="";
  Serial.flush();
}

// Interpréter la commande reçue
//
void ProcessCmd() {
  // Un petit message de débogage. La commande est entourée avec [] pour clairement
  // identifier chacun des caractères qui la compose (même les espaces).
  Serial.print( "ProcessCmd for [" );
  Serial.print( cmd );
  Serial.println( "]" );

  if(cmd.equals("chauffageoff")){
    printCmd();
    digitalWrite(ledPin, HIGH);
    clearCmd();
  }
  else if(cmd.equals("chauffageon")){
    printCmd();
    digitalWrite(ledPin, LOW);
    clearCmd();
  }
  else if(cmd.equals("pompeoff")){
    printCmd();
    digitalWrite(ledPin2, HIGH);
    clearCmd();
  }
  else if(cmd.equals("pompeon")){
    printCmd();
    digitalWrite(ledPin2, LOW);
    clearCmd();
  }
  else{
    // toutes les autres commandes sont ignorées.
    Serial.println("unknown command!");
    clearCmd();
  }
}

J'usque la tout va bien je lance screen ":~$ screen /dev/ttyACM0 9600" je tape pompeoff il eteint ma pompe pompeon il allume ma pompe...Géniale.

MAIS je voudrais faire de même avec un script afin de pour le mettre dans mon crond.

J'ai testé plusieurs choses,

  • echo "pompeoff\n" >/dev/ttyACM0

  • echo "pompeoff" >/dev/ttyACM0

en python ..

#!/usr/bin/python -O
import serial

ser = serial.Serial('/dev/ttyACM0', 9600)
ser.write('pompeoff')

Avec screen..

screen -mdS session /dev/ttyACM0 9600

Puis 

screen session pompeoff

Mais rien n'y fait quand je tente d'envoyer pompeoff les relais clignotes (comme quand je me connect en serie) mais rien de plus...

Pouvez-vous m'aider sur ce sujet SVP??

Merci par avance!

Essaie aussi avec \r

Pas mieux, testé dans le echo et dans le script python.

Bon j'ai trouvé une solution, mais je ne la trouve par trés propre..

#!/usr/bin/expect -f
  spawn screen /dev/ttyACM0 9600
  sleep 10
  send "chauffageoff\r"
  expect eof

Avez-vous d'autre idées?

Peux on eviter le reset auto de la carte à chaque connexion serie ?

Yep!

Pour ton souci d'auto-reset et si tu oeuvres bien sous linux,

Essaye la commande qui suit :

stty --file=/dev/ttyACM0 crtscts -hupcl

En résumé, l'activation du crtscts permet l'écriture des paramètres de contrôle des données, et on désactive le hupcl afin de ne plus envoyer le bit d'initialisation du péripherique.

@+

Zoroastre.

404_crazy:

  • echo "pompeoff\n" >/dev/ttyACM0

  • echo "pompeoff" >/dev/ttyACM0

Tu mets pas le Baud rate là ?