Show Posts
Pages: [1] 2 3 ... 7
1  International / Français / Re: [résolu] Pb écriture série avec pySerial on: April 05, 2014, 06:38:12 am
Arf, j'ai encore un petit soucis...

J'arrive à initialiser ma connexion série avec l'IDE Arduino, également avec mon script Python, mais là j'essaie avec Processing et je n'y arrive pas.

Le scénario est : Arduino envoie "READY" au PC, ce dernier, quand il a bien reçu le message, envoie "GO" à l'Arduino.

Mon code Arduino (qui fonctionne) :
Code:
void setup() {
  Serial.begin(9600);
  Serial.print("READY");
  waitUntil("GO");
}

void loop() {
  Serial.println("Ok, let's go!");
  while(true);
}

void waitUntil(char* msg) {
byte state = 0;
byte msg_length = 0;
char c;

// Calcule la longueur du message
for (; msg[msg_length] != '\0' ; msg_length++);

/* Boucle infinie */
while(state != msg_length) {
while(Serial.available() < 1); // Attend un octet
c = Serial.read(); // Lit l'octet

// Machine à états finis qui attend la chaine READY
if (c == msg[state])
state++;
else
state = 0;
}
}

Mon code Python (qui fonctionne aussi) :
Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

SERIAL_BAUDS = 9600

import serial
from serial.tools import list_ports

def waitUntil(text):
msg = ""
while msg.find(text) == -1:

while ser.inWaiting() == 0:
pass

msg = msg + ser.read()

port = list_ports.comports()[-1][0]
print 'Wait for Arduino feedback on ' + port + '.'
ser = serial.Serial(port, SERIAL_BAUDS)

waitUntil("READY")

print "Arduino is ready"
ser.write("GO");

while True:
print ser.readline(),

ser.close

Mon code Processing (qui ne fonctionne pas du tout) :
Code:
import processing.serial.*;

Serial ser; // le port série

void setup()
{
  String port = Serial.list()[0]; 
  println("*** Wait for Arduino feedback on " + port + "... ***");
  ser = new Serial(this, port, 9600);

  waitUntil("READY");
  println("Arduino is ready.");
  ser.write("GO");
}

void loop()
{
  while(true)
    print((char)ser.read());
}

void waitUntil(String text)
{
  String msg = "";
  char c;

  while(!msg.contains(text)) {
    while (ser.available() <= 0);
    c = (char)ser.read(); // Lit l'octet
    msg += c;
  }
}

Ce dernier code semble pourtant l'équivalent du code python.
Ici Processing ne cesse d'attendre le message 'READY' sans l'obtenir...

Edit : J'ai essayé avec une autre carte Arduino ET en changeant la vitesse à 57600 bauds et là ça fonctionne. Malgrès tout j'ai besoin de faire fonctionner mon code sur la 1ere carte Arduino. Je ne comprends pas pourquoi ce code ne peut fonctionner qu'avec telle carte et telle vitesse de liason série.
2  International / Français / Re: Pb écriture série avec pySerial on: April 05, 2014, 04:25:52 am
Merci pour ta réponse !
Ça fonctionne très bien avec ta méthode smiley

Comme j'essaie en général déviter la redondance de code, je me suis permi d'optimiser un peu le tien (le fonctionnement reste inchangé) :

Code:
void waitUntil(char* msg) {
byte state = 0;
byte msg_length = 0;
char c;

// Calcule la longueur du message
for (; msg[msg_length] != '\0' ; msg_length++);

/* Boucle infinie */
while(state != msg_length) {
while(Serial.available() < 1); // Attend un octet
c = Serial.read(); // Lit l'octet

// Machine à états finis qui attend la chaine READY
if (c == msg[state])
state++;
else
state = 0;
}
}

Edit : Je me suis aperçu que le pb ne venait pas tellement de là...
Apparement il faut simplement envoyer un message d'init depuis l'Arduino vers le PC (et pas l'inverse). On peut ensuite faire la même chose dans l'autre sens mais je ne pense pas que ce soit nécessaire.

Roipou
3  Using Arduino / Interfacing w/ Software on the Computer / Re: [python] can't initialize PC<->Arduino connection on: March 28, 2014, 04:46:07 pm
Ok, maybe I could parse the available serial ports list to find the good one.

Thanks for your help,

Roipou
4  Using Arduino / Interfacing w/ Software on the Computer / Re: [python] can't initialize PC<->Arduino connection on: March 27, 2014, 06:01:07 pm
Thanks a lot for this explanation!
I have loaded the Robin2 demo and now I can recieve my START message!

However there is an another problem: when I unplug and plug again the Arduino, the script don't gets nothing.
Strangely, it works again when I load the program on the board, or when I start/close a serial communication on the Arduino IDE.

Roipou
5  Using Arduino / Interfacing w/ Software on the Computer / [python] can't initialize PC<->Arduino connection on: March 25, 2014, 05:14:55 pm
Hi all!

I can't initialize a PC<->Arduino communication with my Python script (using pySerial library).
The goal is to send a 'START' message to the Arduino, and when it recieved it, the Arduino send back 'START_INIT'. Very simple smiley

On the Arduino side, I have this :
Code:
void setup() {
  Serial.begin(9600);
  String line = "";
  while (line != "START") {
    line = readLine();
  }
  Serial.println("START_INIT");
}

void loop() {

}

String readLine() {
String message = "";

while (Serial.available()) {
delay(3);
if (Serial.available() > 0) {
char c = Serial.read();
message += c;
if (c == '\n') {
break;
}
}
}
delay(50);
return message;
}

I tested this program, sending 'START' with the Arduino GUI and it works, so no problem here I think.

To the Python side, I have this :

Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

SERIAL_BAUDS = 9600

import serial
from serial.tools import list_ports

port = list_ports.comports()[-1][0]
print 'Begining serial connexion using port ' + port + '.'
ser = serial.Serial(port, SERIAL_BAUDS)
ser.write('START\n')

while True:
print '> ' + ser.readline()

ser.close()

Then, when I run the script I don't get the 'START_INIT' message.
Some idea ?
Thanks!
6  International / Français / Initialisation d'une connection série on: March 25, 2014, 12:41:17 pm
Bonsoir !

J'ai un petit soucis, je n'arrive pas a initialiser une communication PC<->Arduino avec un script Python (en utilisant la lib. pySerial).
Le but est d'envoyer à l'arduino le message 'START', lorsqu'il a reçu celui-ci renvoie 'START_INIT'.

Coté Arduino, en réduisant au nécessaire j'ai ceci :
Code:
void setup() {
  Serial.begin(9600);
  String line = "";
  while (line != "START") {
    line = readLine();
  }
  Serial.println("START_INIT");
}

void loop() {

}

String readLine() {
String message = "";

while (Serial.available()) {
delay(3);
if (Serial.available() > 0) {
char c = Serial.read();
message += c;
if (c == '\n') {
break;
}
}
}
delay(50);
return message;
}

J'ai le programme en envoyant le 'START' à l'aide de l'IDE Arduino et ça fonctionne. Aucun souci de ce coté là à priori.

Au niveau du script Python j'ai ceci :

Code:
#!/usr/bin/python
# -*- coding: utf-8 -*-

SERIAL_BAUDS = 9600

import serial
from serial.tools import list_ports

port = list_ports.comports()[-1][0]
print 'Begining serial connexion using port ' + port + '.'
ser = serial.Serial(port, SERIAL_BAUDS)
ser.write('START\n')

while True:
print '> ' + ser.readline()

ser.close()

Et là rien ne se passe sur la console : je suis toujours en attente du message d'init...
Une idée ?
7  International / Le bar / Re: Non mais c'est quoi votre trip avec les canards ?? on: September 10, 2013, 08:29:51 pm
Merci ! Je comprends mieux maintenant.
J'avais vu le projet mais j'avais pas fait le rapprochement :p.

Et bien longue vie aux canards alors smiley-grin
8  International / Français / Re: moteur pas à pas qui chauffe on: September 07, 2013, 10:21:06 pm
Inverse 2 fils de ton moteur, il est peut-être mal cablé.
9  International / Français / Re: Question sur les moteurs pas à pas on: September 07, 2013, 10:14:09 pm
Pour ma part j'utilise les pololus, par exemple : http://www.pololu.com/catalog/product/2131
Sur celui-ci comme sur beaucoup d'autres, il y a une entrée pour les pas du moteur (une impulsion = le moteur fait 1 pas), la vitesse quoi
Une autre entrée pour la direction du moteur

Sinon, si tu peux te faire un driver toi-même à base de L298 mais il te faudra délivrer la bonne séquence d’impulsions (voir fonctionnement : http://fr.wikipedia.org/wiki/Moteur_pas_%C3%A0_pas), tu peux utiliser une librairie arduino pour ça.
10  International / Le bar / Non mais c'est quoi votre trip avec les canards ?? on: September 07, 2013, 09:49:40 pm
Tout est dans le titre, je feuillette un peu les posts de cette section et je tombe souvent sur cette référence...

Et puis les coings aussi :p
11  International / Le bar / Re: on aura tout vu dans les MP on: September 07, 2013, 09:45:42 pm
Quote
aide moi j'ai vraiment besoins de toi , sans toi je raterai mon bac.

J'adore smiley-razz
12  International / Le bar / Re: Gravure PCB en France ? on: September 07, 2013, 08:43:36 pm
Allez je m'y met aussi smiley
PCBPool : http://www.pcb-pool.com/ppfr/order_productconfiguration_js.html

Et là ils peuvent te faire jusqu'à 6 faces, sérigraphie double face, vernis, etc. et les prix sont pas excessifs (enfin faut commander quand même au moins 1 dizaine pour que ce soit intéressant).

Et surtout, il y a un formulaire pour faire le devis en ligne, vraiment pratique smiley.
13  International / Français / Re: [Résolu et utile] Une pause avec une interruption on: September 07, 2013, 05:36:33 pm
Yeaaah !
Ça marche du feu de dieu ! Merci pour ce dernier message !
Un topic, 2 solutions smiley

Ça me donne de plus en plus envie de coder en avr pur sans passer par arduino, on comprends bien mieux ce qu'on fait smiley

J'ai réécris en Arduino-like pour que ça compile avec l'IDE, je me permet de poster ce code pour que les prochains qui cherchent a faire un truc identique s'y retrouvent.

Edit : Il y a un moyen de mettre ce topic en évidence ou de le recenser quelque part ? Je trouve ce code très utile, je ne dois pas être le seul à avoir ce besoin.

Code:
#include <stdio.h>
#include <avr/io.h>
#include <avr/interrupt.h>

void setup()
{
  SREG |= 128 ; // INTERRUPTIONS GLOBALES OK
  EIMSK   = 1 ; // INT0 OK
  EICRA   = 3 ; // FRONT MONTANT INT0
  // POUR UN FRONT DESCENDANT : EICRA = 2 ;
 
  Serial.begin(9600);
  digitalWrite(2, HIGH); // set internal pullup
}

void loop()
{
  // Compteur pour vérifier l’exécution du programme
  for(int i=0; i<100; i++) {
    Serial.println(i);
    delay(500);
  }
}

// ROUTINE D'INTERRUPTION
ISR (INT0_vect)
{
  EIMSK = 0 ; // BLOQUER INT0

  while ( PIND & 4 ) { } ; // ON ATTEND TANT QUE LA BROCHE EST À '1'
  while ( ! ( PIND & 4 ) ) { } ; // ON ATTEND TANT QUE LA BROCHE EST À '0'
  // POUR UN FRONT DESCENDANT IL FAUT INVERSER CES 2 LIGNES

  EIMSK = 1 ; // RÉAUTORISER INT0
  EIFR = 1 ; // ET REMETTRE SON FLAG À '0'
};
14  International / Français / Re: Une pause avec une interruption on: September 07, 2013, 07:02:48 am
I did it !!!
Merci à fdufnews pour sa solution avec la librairie Sleep_n0m1.

En fait le pb était que à l'appel de sleep.sleepInterrupt(0, RISING); la librairie désactive l'interruption. J'ai donc fait un nouvel appel de attachInterrupt() pour la réactiver.

Voici le code :

Code:
#include <Sleep_n0m1.h>
Sleep sleep;

void setup()
{
  Serial.begin(9600);
  pinMode(13, OUTPUT);
  attachInterrupt(0, onRelease, RISING); // Lance onRelease() lorsque on relache le bouton
  digitalWrite(2, HIGH); // set internal pullup
  digitalWrite(13, LOW);
}

void loop()
{
  for(int i=0; i<100; i++) { // Programme simple pour vérifier l’exécution du programme principal
    Serial.println(i);
    delay(500);
  }
}

void onRelease()
{
  digitalWrite(13, HIGH);
  sleep.pwrDownMode(); //set sleep mode
  sleep.sleepInterrupt(0, RISING);  // sleep until interrupt
  attachInterrupt(0, onRelease, RISING); // Lance onRelease() lorsque on relache le bouton
  digitalWrite(13, LOW);
}

Il doit y avoir plus propre, mais bon ça marche, c'est déjà ça smiley
15  International / Français / Re: Une pause avec une interruption on: September 07, 2013, 06:41:21 am
J'ai réalisé ceci :
Code:
void onRelease()
{
  EIMSK = 0;
  state = !state;
  digitalWrite(13, state);
  Serial.println("début 1er while");
  while(digitalRead(buttonPin) == 1)
  { // On attend le nouvel appui sur le bouton
    Serial.print(".");
  }
  Serial.println("fin 1er while");
  while(digitalRead(buttonPin) == 0)
  { // On attend le relachement
    Serial.print("-");
  }
  Serial.println("fin 2eme while");
  EIMSK = 1;
}

C'est étrange, Dès que j'appuie/relâche le BP, le programme est bloqué et il n'y a aucune des phrases ci-dessus qui s'affichent.
Pages: [1] 2 3 ... 7