Go Down

Topic: [résolu] Communication difficile avec Processing (Read 2032 times) previous topic - next topic

mathieu137

Sep 28, 2011, 06:35 pm Last Edit: Oct 16, 2011, 02:09 pm by mathieu137 Reason: 1
Bonjour à tous !

Le logiciel Processing communique via l'USB avec la carte
Quand Processing reçoit des données de la carte il ne reconnait pas le port série directement.
Pour que ça fonctionne (sous Ubuntu) j'ai créé un lien symbolique :
Code: [Select]
sudo ln -s /dev/ttyACM0 /dev/ttyS8
le problème c'est qu'à chaque démarrage de l'ordi ou déconnexion USB de la carte Arduino il faut relancer la commande...

Comment faire pour que la reconnaissance du port soit automatique et invisible pour un simple utilisateur ?

Une petite copie d'écran pour une vue d'ensemble (une thermistance permet d'afficher en temps réel la température à l'écran de l'ordi)

Merci !

mat - Arduino Uno /  Ubuntu 10.04 / Processing 1.2.1

skywodd

Bonjour,

C'est bizarre que via le lien symbolique le port série marche et pas via le /dev directement :smiley-eek:
String portname = "/dev/ttyACM0"; marche pas du tout !?
Je vois que tu as processing 1.2.1 tente de passer en 1.5.1 et regarde si il n'y aurai pas de màj de la librairie RXTX par hasard.
Des news, des tutos et plein de bonnes choses sur http://skyduino.wordpress.com !

mathieu137

#2
Sep 29, 2011, 12:35 pm Last Edit: Sep 29, 2011, 12:39 pm by mathieu137 Reason: 1
Processing 1.2.1

avec :
Code: [Select]
String portname = "/dev/ttyACM0";
ça ne marche pas et réponse :
Code: [Select]

Stable Library
=========================================
Native lib Version = RXTX-2.1-7
Java lib Version   = RXTX-2.1-7


avec :
Code: [Select]
String portname = "/dev/ttyS8";
et le lien symbolique, ça marche impeccable et toujours la même réponse.


Processing 1.5.1 et 0195

avec :
Code: [Select]
String portname = "/dev/ttyACM0";
ça ne marche pas.

avec :
Code: [Select]
String portname = "/dev/ttyS8";
et le lien symbolique, ça marche.

et pour ces versions toujours la même réponse :
Code: [Select]

WARNING:  RXTX Version mismatch
Jar version = RXTX-2.2pre1
native lib Version = RXTX-2.2pre2


Voilà ! Après pour moi c'est important que ça marche automatiquement, car j'aimerais faire des ateliers avec des étudiants et il n'est pas possible que j'intervienne en permanence sur leur ordi pour rentrer la ligne de commande en tant qu'administrateur...

Encore merci en espérant qu'on trouve la solution !

joelectronic

Salut,

il faut que tu rajoute dans le fichier ".bashrc" qui se trouve à la racine de ton répertoire personnel ton alias
Code: [Select]
ln -s /dev/ttyACM0 /dev/ttyS8, il y a un emplacement prévu à cet effet vers le milieu du fichier.
Attention c'est un fichier caché, ctrl+H pour le faire apparaitre ou alors en ligne de commande
Code: [Select]
vi .bascrc.

Bonne soirée.

arduimat

Salut,

Moi je vais pas t'aider, cependant j'aimerai bien voir ton code en entier sur Processing, notamment comment fais-tu pour "rafraichir" le texte sans l'écraser ? Merci.

mathieu137

#5
Sep 29, 2011, 11:12 pm Last Edit: Sep 29, 2011, 11:16 pm by mathieu137 Reason: 1
Voilà :
Code: [Select]
import processing.serial.*;

Serial port;   
String portname = "/dev/ttyS8"; 
int value;
int b7; int b8;
int c=0;
int T=30;
int T1;
int d=3;
float Th=30;

float Thermometre(int RawADC) {
float Temp=10;
if (RawADC != 0) {Temp = log(((10240000/RawADC) - 10000));}
Temp = 1 / (0.001129148 + (0.000234125 + (0.0000000876741 * Temp * Temp ))* Temp );
Temp = Temp - 273.15;       
return Temp;
}

void setup() 
{
size(180, 240);
  port = new Serial(this, portname, 57600);
  PFont police;
  police = loadFont("FreeSerif-48.vlw");
  textFont(police,48);
  smooth();

}

void draw()
{
 
  if (0 < port.available()) {
    value = port.read();
    if (c==2) {b8 = value; c=0;}
    if (c==1) {b7 = value; c=2;}
    if (value>1) {T1 = value; c=1;}
    }
   
  Th=Thermometre(T1+256*b7+512*b8);
  T=int(Th);
  d=int(Th*10)-10*int(Th);
  fill(int(80+5*Th),0,int(255-5*Th));
  rect(0,0,180,240);
  fill(255,128,255);
  translate(25, int(420-10*Th));
  text(T+","+d+"°C",0,0);

}

et le code Arduino correspondant :
Code: [Select]
int duree = 100;
int T;
int T1;
int T2;
int b7;
int b8;

void setup() {               
  Serial.begin(57600);
  pinMode(13, OUTPUT);   
}

void loop() {
  T=analogRead(0);
  b8=int(T/512);
  b7=int((T-512*b8)/256);
  T1=T-512*b8-256*b7;
 
Serial.write(T1);
delay(50);
Serial.write(b7);
  delay(50);
Serial.write(b8);
digitalWrite(13, HIGH);
delay(duree/2);
digitalWrite(13, LOW); 
delay(duree/2); 
}


heureux si ça peu t'être utile !

mathieu137

#6
Oct 16, 2011, 02:08 pm Last Edit: Oct 16, 2011, 02:20 pm by mathieu137 Reason: 1
RÉSOLU, merci à vous tous, à oyster_twiter sur CodeLab , à Timothée (au cours d'une journée du libre à Bourges, étudiant en informatique à l'ENSIB) :

Ajouter, en root, au fichier /etc/rc.local, la ligne :
Code: [Select]
ln -s /dev/ttyACM0 /dev/ttyS8
le fichier devient alors :
Code: [Select]
#!/bin/sh -e
#
# rc.local
#
# This script is executed at the end of each multiuser runlevel.
# Make sure that the script will "exit 0" on success or any other
# value on error.
#
# In order to enable or disable this script just change the execution
# bits.
#
# By default this script does nothing.
ln -s /dev/ttyACM0 /dev/ttyS8
exit 0

Et ç'est automatique et transparent pour un simple utilisateur !

Ça s'effectue en root automatiquement, et quelque soit les droits de l'utilisateur, le lien symbolique est créé au démarrage, et reste même si la carte Arduino est débranchée et rebranchée.
Bref tout se passe comme si vu de l'extérieur ttyACM0 était ttyS8, un port série standard et reconnu par les logiciels, comme Processing.

Vive la communauté du libre et merci à tous !

Mat

PS : joelectronic, concernant ta proposition de créé un alias, je l'ai fait, mais je n'ai pas vu en quoi ça résolvait le problème, ça me permettais simplement de rentrer la commande en root plus rapidement, mais toujours manuellement... mais merci de toute façon, je ne savais pas qu'on pouvait ainsi créer des alias des commandes.

Go Up