Envoyer des données à mon Arduino depuis mon RPI (Send data to Arduino from RPI)

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.

Le plus simple : echo blabla > /dev/ttyUSB0

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]Capturing an analog signal with Arduino and python | Freedom Embedded (le RPi envoye des ordres à l'arduino, qui retourne des mesures)...

hbachetti:
Le plus simple : echo blabla > /dev/ttyUSB0

Oui ? Ça ne fait rien, que dois-je mettre côté arduino ?

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]Capturing an analog signal with Arduino and python | Freedom Embedded (le RPi envoye des ordres à l'arduino, qui retourne des mesures)...

[/quote]

Merci !

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

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

fdufnews:
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.

#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);
  }
}

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é

python + pyserial est très simple:
une version minimaliste est la suivante (extraite de Capturing an analog signal with Arduino and python | Freedom Embedded
est

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

donne un exemple de communication commenté en français (avec code cote pc/RPi et côte arduino)

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é

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 :

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

Vers :

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.

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

Oui mais encore ?

Tu ne dis rien à propos du projet ...

hbachetti:
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...

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.

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... -

hbachetti:
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 ?

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... -

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

Pour demain ? :confused:

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.

J'ai pris la peine de grasseyer deux fonctions qui peuvent vous être utiles -il ne faut pas 10 (/aujourd'hui/+24 /(demain)/ 34 heures pour les comprendre-.
Te av baxtalo.

Quand je vois ça:

texte1:{
id: 1,
text1:question1,
text2:reponse1_1,
text3:reponse1_2
},

je pense plus à des structures qu'à des strings.