Go Down

Topic: Envoyer des données à mon Arduino depuis mon RPI (Send data to Arduino from RPI) (Read 660 times) previous topic - next topic

pito2901

Bonjour,

Je souhaite envoyer des strings à ma carte Arduino depuis mon Raspberry Pi 3 relié par USB.

Je suis à la recherche de pistes car toutes celles que je trouve sont orienté pour l'inverse (arduino > rpi).

Merci de votre lecture.

hbachetti

Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

Le foncrtionnement dans les deux sens est très facile:

processing a une version arm (j'ai joué avec sur RPi) et peut gèrer des lignes série (hackable magazine a un exemple, mais ma mémoire flanche) ;

j'ai utilisé avec profit python +  pyserial sur RPi , pour adapter [/url]https://balau82.wordpress.com/2011/03/26/capturing-an-analog-signal-with-arduino-and-python/[url] (le RPi envoye des ordres à l'arduino, qui retourne des mesures)...

pito2901

Le plus simple : echo blabla > /dev/ttyUSB0
Oui ? Ça ne fait rien, que dois-je mettre côté arduino ?

Le foncrtionnement dans les deux sens est très facile:

processing a une version arm (j'ai joué avec sur RPi) et peut gèrer des lignes série (hackable magazine a un exemple, mais ma mémoire flanche) ;

j'ai utilisé avec profit python +  pyserial sur RPi , pour adapter [/url]https://balau82.wordpress.com/2011/03/26/capturing-an-analog-signal-with-arduino-and-python/[url] (le RPi envoye des ordres à l'arduino, qui retourne des mesures)...

Merci !

Auriez-vous un projet plus "basique" pour que je puisse tester svp ?


fdufnews

Des projets basiques de com série coté Arduino???
Dans l'IDE Fichiers/Exemples/04.Communication il y en a des exemples

pito2901

Des projets basiques de com série coté Arduino???
Dans l'IDE Fichiers/Exemples/04.Communication il y en a des exemples
Mmh d'accord merci, j'ai utilisé l'exemple SerialCallResponseASCII, mais quand j'envoie quelque chose depuis ma rpi (comme: echo "blabla" > /dev/ttyACM0), le programme de l'arduino redémarre.

Code: (arduino) [Select]
#include <LiquidCrystal.h>

LiquidCrystal lcd(8, 9, 4, 5, 6, 7);

int firstSensor = 0;    // first analog sensor
int secondSensor = 0;   // second analog sensor
int thirdSensor = 0;    // digital sensor
int inByte = 0;         // incoming serial byte

void setup() {
  lcd.begin(16,2);
  lcd.clear();
  lcd.print("TEST");
  delay(200);
  lcd.clear();
  // start serial port at 9600 bps and wait for port to open:
  Serial.begin(9600);
  while (!Serial) {
    ; // wait for serial port to connect. Needed for native USB port only
  }


  pinMode(2, INPUT);   // digital sensor is on digital pin 2
  establishContact();  // send a byte to establish contact until receiver responds
}

void loop() {
  lcd.clear();
  // if we get a valid byte, read analog ins:
  if (Serial.available() > 0) {
    // get incoming byte:
    inByte = Serial.read();
    // read first analog input:
    firstSensor = analogRead(A0);
    // read second analog input:
    secondSensor = analogRead(A1);
    // read switch, map it to 0 or 255
    thirdSensor = map(digitalRead(2), 0, 1, 0, 255);
    // send sensor values:
    Serial.print(firstSensor);
    Serial.print(",");
    Serial.print(secondSensor);
    Serial.print(",");
    Serial.println(thirdSensor);

    lcd.print(firstSensor);
    lcd.setCursor(1,2);
    lcd.print(secondSensor);
  }
  delay(1000);
}

void establishContact() {
  while (Serial.available() <= 0) {
    Serial.println("0,0,0");   // send an initial string
    delay(300);
  }
}

hbachetti

Oui, le DTR est activé à l'ouverture du port et fait redémarrer la carte.

Il faudrait dessouder le condensateur de RESET de la carte.

Sinon, PYTHON + pyserial.

Il faudrait être plus précis sur ta demande :

- envoyer des strings : caractères imprimables ? ou pas ?
- longueur du câble
- besoin de fiabilité
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

python + pyserial est très simple:
une version minimaliste est la suivante (extraite de   https://balau82.wordpress.com/2011/03/26/capturing-an-analog-signal-with-arduino-and-python/
est
Code: [Select]

import serial
import time

ser = serial.Serial(
 port = '/dev/ttyACM0', # choix du numero de port
 baudrate = 115200,   # vitesse aisée à configurer; differe du cat
 )
 
time.sleep(1.5) #temps pour se remettre du reset arduino
ser.flush()
ser.write('2') # envoye '2' à l'arduino


https://www.jujens.eu/posts/2014/Jan/11/communication-serie-facile-python/
donne un exemple de communication commenté en français (avec code cote pc/RPi et côte arduino)

pito2901

Oui, le DTR est activé à l'ouverture du port et fait redémarrer la carte.

Il faudrait dessouder le condensateur de RESET de la carte.

Sinon, PYTHON + pyserial.

Il faudrait être plus précis sur ta demande :

- envoyer des strings : caractères imprimables ? ou pas ?
- longueur du câble
- besoin de fiabilité

Oh je vais pas m'embêter à dessouder des choses. Python et pyserial est la solution que je souhaite utiliser.

string : J'aimerai envoyer des arrays sous forme de string (ASCII) du genre :

Code: [Select]
texte1:{
id: 1,
text1:question1,
text2:reponse1_1,
text3:reponse1_2
},
texte2:{
id: 1,
text2:question2,
text2:reponse2_1,
text3:reponse2_2
}


Vers :

Code: [Select]
string = "texte1:{id: 1,text1:question1,text2:reponse1_1,text3:reponse1_2},texte2:{id: 1,text2:question2,text2:reponse2_1,text3:reponse2_2}"

câbles : J'ai deux câbles un de 1m et l'autre de 1m50

besoin de fiabilité : bah plutôt ouai ! ^^

ET dbrion06, c'est exactement le code que j'ai pour tester, j'obtiens des nombres aléatoires sur mon lcd.

hbachetti

Quote
besoin de fiabilité : bah plutôt ouai ! ^^
Oui mais encore ?

Tu ne dis rien à propos du projet ...
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

pito2901

Oui mais encore ?

Tu ne dis rien à propos du projet ...

Le projet est d'envoyer des arrays de textes comme je l'ai stipulé, ce que je n'arrive pas à faire, puis de recevoir des réponses via un capteur mais cette partie là fonctionne bien...

hbachetti

Quote
Le projet est d'envoyer des arrays de textes comme je l'ai stipulé
Je l'avais bien compris. Le besoin de fiabilité dépend de ce que l'on fait des données. Si c'est simplement un affichage, on peut tolérer une erreur de temps en temps.
Si les données sont stockées en vue de faire des calculs ou pour commander des organes mécaniques en fonction des valeurs c'est autre chose.

Si tu as besoin de fiabilité en transmission, avec des câbles longs, susceptibles de subir des perturbations, mieux vaudrait un protocole, avec un CRC.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

dbrion06

J'ai un programme python qui envoie le contenu d'un fichier txt du RPi vers l'arduino, et don pendant arduino qui recoit la ligne (par readStringUntil , signale qu'il est pret pour une autre ligne (sauf si la fin de fichier est specifiée, IIRC). Je pourrai vous le transmettre -j'ai mon RPi le week end - vendredi ou samedi, ainsi que sa contrepartie Arduino, '(je vois le post de HBachetti : Arduino calcule une checksomme, maos ne l'exploite pas)  bien sûr...
Déjà, vous pourriez essayer de transmettre depuis python une chaine fixe (évite de saisir, ce qui est fastidieux) terminée par \n, en bouclant à l'infini, avec un delai de 1 seconde... : le LCD devrait afficher la chaîne, mais pas le \n -qui est non affichable sur lcd... : trim nettoye des caractères non affichables, pour info... -

pito2901

Je l'avais bien compris. Le besoin de fiabilité dépend de ce que l'on fait des données. Si c'est simplement un affichage, on peut tolérer une erreur de temps en temps.
Si les données sont stockées en vue de faire des calculs ou pour commander des organes mécaniques en fonction des valeurs c'est autre chose.

Si tu as besoin de fiabilité en transmission, avec des câbles longs, susceptibles de subir des perturbations, mieux vaudrait un protocole, avec un CRC.

Oui, donc je le répète, j'ai besoin de fiabilité... De toutes façons, c'est toujours le but.

Peux tu m'en dire davantage sur ce protocole ?

J'ai un programme python qui envoie le contenu d'un fichier txt du RPi vers l'arduino, et don pendant arduino qui recoit la ligne (par readStringUntil , signale qu'il est pret pour une autre ligne (sauf si la fin de fichier est specifiée, IIRC). Je pourrai vous le transmettre -j'ai mon RPi le week end - vendredi ou samedi, ainsi que sa contrepartie Arduino, '(je vois le post de HBachetti : Arduino calcule une checksomme, maos ne l'exploite pas)  bien sûr...
Déjà, vous pourriez essayer de transmettre depuis python une chaine fixe (évite de saisir, ce qui est fastidieux) terminée par \n, en bouclant à l'infini, avec un delai de 1 seconde... : le LCD devrait afficher la chaîne, mais pas le \n -qui est non affichable sur lcd... : trim nettoye des caractères non affichables, pour info... -

Heu j'ai pas tout saisi là. Quoiqu'il en soit, mon projet est à rendre demain donc c'est pas la peine...

hbachetti

Pour demain ?  :smiley-confuse:

Je veux bien t'éclairer un peu mais cela risque de prendre du temps rien que pour comprendre.

arduino-un-protocole-serie

Mais pour intégrer ça avant demain, n'y compte pas.
Linux is like a wigwam: no Windows, no Gates, and an Apache inside ...

Go Up