USB Host Shield 2.0 - Comment activer le DTR et RTS ?

Bonjour,

J'essaye de recevoir des données depuis un device USB (qui m'envoi des données toute les 10 secondes) pour ensuite les enregistrer dans un carte SD, pour le moment les afficher dans le Moniteur Serie suffira.
Mon problème est qu'il faut que j'active le DTR et le RTS de ma USB Host Shield 2.0, mais je n'arrive pas à comprendre comment faire.

Voici la configuration dont j'ai besoin:

Baudrate: 115200
Flow Control: Only XON
DTR and RTS on
Databit: 8
Stop Bit: 1
Capture local echo

J'utilise l'Arduino UNO avec l' USB Host Shield 2.0.

Mon code:

#include <SD.h>
#include <adk.h>
#include <cdcftdi.h>
//#include <usbhub.h>
#include "pgmstrings.h"

class FTDIAsync : public FTDIAsyncOper
{
public:
  virtual uint8_t OnInit(FTDI *pftdi);
};

uint8_t FTDIAsync::OnInit(FTDI *pftdi)
{
  uint8_t rcode = 0;

  rcode = pftdi->SetBaudRate(115200);

  if (rcode)
  {
    ErrorMessage<uint8_t>(PSTR("SetBaudRate"), rcode);
    return rcode;
  }
  rcode = pftdi->SetFlowControl(FTDI_SIO_DISABLE_FLOW_CTRL, FTDI_SIO_XON_XOFF_HS);
  if (rcode)
    ErrorMessage<uint8_t>(PSTR("SetFlowControl"), rcode);

  return rcode;
}

int led = 13;
USB Usb;
//USBHub Hub1(&Usb);
FTDIAsync        FtdiAsync;
FTDI             Ftdi(&Usb, &FtdiAsync);
uint32_t next_time;

// the setup routine runs once when you press reset:
void setup() {             
  // initialize the digital pin as an output.
  pinMode(led, OUTPUT);
  // Open serial communications and wait for port to open:
  Serial.begin(115200);
  //For usb
  if (Usb.Init() == -1) {
    Serial.println("KO: OSC did not start.");
  }
  else {
    Serial.println("OK: OSC start.");
  }

  delay( 2000 );

  next_time = millis() + 5000;
  //End for usb
}

// the loop routine runs over and over again forever:
void loop() {
  Usb.Task();
  
  if( Usb.getUsbTaskState() == USB_STATE_RUNNING )
  {
    digitalWrite(led, HIGH);
    uint8_t  rcode;
    uint8_t  buf[64];

    for (uint8_t i=0; i<64; i++)
      buf[i] = 0;

    uint16_t rcvd = 64;
    rcode = Ftdi.RcvData(&rcvd, buf);
    Serial.println(rcvd);
    if (rcode && rcode != hrNAK)
      ErrorMessage<uint8_t>(PSTR("Ret"), rcode);

    // The device reserves the first two bytes of data
    //   to contain the current values of the modem and line status registers.
    if (rcvd > 2)
      Serial.print((char*)(buf+2));

    delay(10);
    digitalWrite(led, LOW); 
  }
}

Thank you in advance.

Salut,

Je viens de mater la lib et j'ai rien trouver mis à part des #define qui font bien allusion a RTS et DTR mais qui ne sont utilisées nulle part ...

marcarduino:
...
Mon problème est qu'il faut que j'active le DTR et le RTS de ma USB Host Shield 2.0, mais je n'arrive pas à comprendre comment faire.

Voici la configuration dont j'ai besoin:

Baudrate: 115200
Flow Control: Only XON
DTR and RTS on
Databit: 8
Stop Bit: 1
Capture local echo

Bonjour
DTR et DTS sont des signaux particuliers utilisés par les liaisons RS232/V24 (et qq autres)
je suppose que ton shield host USB emule une liaison "serie" ?
il faut donc voir du coté du "driver utilisateur" si ces infos sont generiques/recuperables

Si c'est cdcftdi qui est utilisé c'est tout simplement qu'il y a un adaptateur FDTI232RL branché sur le port usb

Bonjour,

Pour être honnête, je ne suis pas sure de comprendre ce que vous me dite, ni ce que je doit entreprendre.
Je vais donc essayer de vous éclaircir:

Pour recevoir les données sur mon ordinateur en y connectant l'USB de mon device, j'utilise le logiciel Coolterm. Je pense que comme Artouste le disait, ce logiciel émule une liaison série avec mon device (qui est un datalogger).
Sur Coolterm j'ai essayé de lancer la connexion sans le DTR et RTS et je ne recevais aucune données alors que lorsque je les activaient, les données arrivaient sans problème. J'en ai donc présumé que mon problème sur l'Arduino vient de là.

Pourriez vous plus m'orienter svp ?

Merci pour votre aide.

Oula ... Je suis plus sûr de comprendre.

Si je reformule : ton datalogger est à l'origine relié au pc via USB et tu y accéder sur le PC via coolterm ? Et maintenant tu essayes de communiquer avec ce datalogger au travers de l'Arduino ?

Si j'ai bien reformulé, tu n'as pas saisi que la lib cdcftdi.h n'est pas générique, elle sert à utiliser un adaptateur série-USB FT232RL (anciennement présent sur les Arduino Duemilanove). Si ton datalogger n'a pas de FT232RL ça ne marchera pas

Merci pour ta réaction rapide, je vais me renseigner concernant mon datalogger, voir si il dispose du FT232RL.
Je reviens vers vous sous peu.

Encore merci.

marcarduino:
Merci pour ta réaction rapide, je vais me renseigner concernant mon datalogger, voir si il dispose du FT232RL.
Je reviens vers vous sous peu.

Encore merci.

+/- les memes interrogations que B@tto
ton "USB HOST SHIELD ARDUINO" , il y a quoi de connecté dessus ?
le programme de l'arduino c'est quoi ?

J'ai les informations, mon datalogger qui est connecté à mon USB Host Shield 2.0 dispose d'une puce FT232RL USB-SRL 28-SSO.

Je vous fait un résumé, que vous compreniez mieux:

-J'utilise une carte Arduino UNO R3 sur laquelle une USB Host Shield 2.0 est connectée.
-Je dispose d'un Datalogger qui envoi des données via USB toutes les 10 secondes.

-Je souhaite branché l'USB de mon datalogger sur mon USB Host Shield, afin de récupérer et stocker les données que mon datalogger envoi sur une future carte SD qu'aura mon Arduino. Donc pour le moment l'objectif serait juste d'arriver à recevoir les données reçues par l'USB et de les afficher dans le moniteur du logiciel (l'IDE) arduino.

-Actuellement, si je veux voir les données envoyées par le datalogger directement sur mon ordinateur, il faut que je le connecte à mon ordinateur (via le même câble USB) puis que je lance Coolterm avec la configuration que je vous ai donnée au dessus. J'en ai donc déduis qu'il fallait que je configure ma Shield USB Host 2 de la même manière que Coolterm.

-Pour le moment, avec le code que je vous ai fourni (sans la configuration particulière donc), l'arduino attend bien en mode "USB_DETACHED_SUBSTATE_WAIT_FOR_DEVICE" jusqu'à ce que je connecte mon datalogger, après quoi il passe bien en mode "USB_STATE_RUNNING" et y reste, mais je n'arrive cependant pas à recevoir les données (la variable "rcvd" est jamais supérieure à 2).

Voila j'espère vous avoir éclairci.

Merci.

Ok donc en fait on en revient à ma première réponse : ce que tu veux faire ne semble pas présent dans la lib (ils l'ont prévu dans les #define semble-t-il mais rien n'a été codé pour le reste).

Ce qui laisse deux options :

  • soit coder le reste de la lib (pas forcement complexe vu que tout le reste est oppérationnel, suffit d'étudier le chip et d'envoyer le bon ordre)
  • soit regarder sur ton datalogger : je pense qu'il attend un signal DTR pour envoyer la sauce, ce qui est un simple signal logique. Donc soit c'est prévu physiquement (un jumper par exemple), soit c'est pas prévu et du soude un fil, soit c'est prévu logiciellement et tu le desactives

Merci pour cette réponse.
Après avoir contacté le constructeur, il ne sera pas possible d'intervenir directement sur le datalogger.
J'en présume donc que je vais devoir me charger de compléter cette partie de la lib USB Host shield 2.

Si vous avez une idée de par ou commencer, elle sera la bienvenue ^^.

J'ai peut-être une soluce pour toi : branche ton datalogger sur ton pc et télécharge FTPROG. C'est un soft qui va te permettre de configurer le FT232RL. Cherche alors pour inverser les signaux DTR et RTS, comme ça ils seront par défaut au bon état pour lancer le streaming de data et ça marchera "as it" :wink:

Haha nice merci je vais essayer je te tiens au courant !

Cela semble fonctionner XD ! Un très grand merci B@tto, je n'y serait pas parvenu sans toi.
Je peux donc poursuivre mon projet =) Enfin !