Tablette serial to arduino.

Bonsoir tout le monde voila, j'ai petit projet et je galere un peu, j'ai une tablette graphique en serial ( c'est une topaz modelt-w751), je connais le protocol (19200 8n1) en 5 bytes, le premier bytes donne le statuts du stylet (non present, detecté, appuyé) et les 4 bytes suivants permette de calculer la position du stylet sur la tablette si celui est detecté ou appuyé.
J'ai plusieurs probleme, le premier, j'ai l'impression que mon arduino ne recoit absolument rien, de la tablette, j'ai testé la tablette avec un teensy configurer en virtual serial usb, et aucun soucis je recois les packet dans hyperterminal. Par contre quand je passe par l'arduino rien du tout, a priori ca devrait venir de mon sketch, voici une ébauche, il n'est pas encore fini bien sur :

la tablette est connecté a RX0, c'est du ttl 5v, l'arduino et la tablette sont groundé ensemble.

/* Topaz Tablet drawing app
This a program that reads the five bytes protocol from a Serial Topaz Tablet and then
converting them in three variables : Statut, x,y and draw the result if the statuts is set to "draw" and print value of the statut,x, and y.
*/

// CONSTANTS 
//
#define TOPAZ_PACKET	 5
int ledpin = 13;


// VARIABLES

int buffer[5];
int buflen =0;  // how far is buffer filled 
int statuts = 0;
int subcol = 0;
int numcol = 0;
int subline = 0;
int numline = 0;
int x = 0;
int y = 0;
/////////////////////////////////////////
//
// CODE STARTS HERE
//
void setup() 
{
  Serial.begin (19200);
  Serial.println("Hello !");
  
}


void loop () 
{
  // COLLECT PACKET 
  while ( Serial.available() > 0 && buflen < TOPAZ_PACKET )    
  { 
    
 
    buffer[buflen ] = Serial.read();
    buflen++;
    
    
  }

  // PROCESS PACKET
  if ( buflen == TOPAZ_PACKET )  // do we have a full buffer?
  {
    // reset buflen so next packet can be collected
    
    buflen = 0;
    
    statuts = buffer[0];
    subcol = buffer [1];
    numcol = buffer [2];
    subline = buffer [3];
    numline = buffer [4];
   
  }
    
    if ( statuts == 176 || statuts == 240 || statuts == 241 ) // checking first byte for valid statuts
    {
    // if statuts confirmed, calculate x and y.
      x = ((((numcol*128)+subcol)/4)-37);
    
      if ( x > 128 )
      {
        x = 128;
      }
      y = ((((numline*128)+subline)/5)-10);
     
  }
    
  else{
  return;
  }
}
  int drawingBoard (int statuts, int x, int y)
  {
  // code about drawing
  }

Comme vous pouvez le voir, je suis un gros debutant.
Dans un premier temps j'aimerais juste un retour sur le terminal du statuts, de la position x et y. Plus tard j enverrais les 3 variables dans un programme processing pour dessiner.

merci pour toute aide.

Contrairement au Teensy pour lequel l'interface USB est physiquement distinte du port série les µcontroleurs centraux des cartes Arduino utilsent le port série0 (ou le port unique) pour la liaison série virtuelle par USB. Ce port série n'est donc pas vraiment disponible !!
->Sur un Arduino Mega il serait intéressant de tester une liason de la tablette à l'un des autres ports série.
utiliser par exemple RXD1 eventuellement TXD1 avec serial1.begin, serial1.available; serial1.read.....
La sortie vers le PC et Hyperterminal (à travers le Mega8u2 et l'USB se faisant par serial.begin, serial.print
(voir l'exemple MultiSerialMega)

-> Autre solution : 'monter' un port série soft (SoftSerial)

Bonjour,

C'est trés bizarre cette histoire de broche RX pas vraiment utilisable !
J'ai une teensy et une board arduino, et je n'est jamais vu un serial fonctionné que sur la teensy !
Causes possibles :
Est ce que la vitesses du port série est la bonne ?
Si oui y a t'il vraiment connexion entre le TX de la tablette et le RX de l'arduino (pas de micro coupure, mauvais contact, etc) ?
Est ce que le RX/TX marche en faisant un echo via un adaptateur usb/série (est ce que ce qui est envoyé via l'adaptateur usb/série s'affiche sur la console série arduino ?)
Je pense vraiment pas que la puce FTDI ou ATmega8U2 soit en cause dans ton probléme.

C'est trés bizarre cette histoire de broche RX pas vraiment utilisable !

Je me suis exprimé un peu trop vite. J'aurai du écrire "pas toujours utilisable" vu ce que j'avais en tête.
Je voulais en fait dire que, vu le schéma de la carte, l'entrée Rx peut, dans certains cas de pas fonctionner.
J'avais en vue la laison permanente de l'entrée Rx du Mega328 avec la sortie Tx du composant assurant l'interface UART/USB (à travers une résistance de 1kOhm). Cela peut à priori poser probleme si l'on raccorde sur l'entrée RX un dispositif dans lequel par mesure de précaution (limitation de courant) le constructeur a inséré une résistance de quelques centaines d'ohms ou a limité par un autre moyen le courant de sortie.
Au final les niveaux logiques sur la pin Rx peuvent dans ce cas ne pas franchir les 2,5V.
Nouveau dans le monde Arduino je garde à l'esprit que la pin RX de la carte a une 'résistance d'entrée' de 1KOhms et que ça peut jouer des tours... surtout qu'on trouve de plus en plus de bidules qui sortent en "TTL" 3,3V..... une petite chute de tension au passage et le Mega328 alimenté en 5V ne voit plus les franchissements de niveaux logiques
Dans un cas de ce type le pb disparait dès qu'on se connecte à une entrée RX totalement 'libre'(résistance d'entrée très élevée) port Rx de teensy ou Ports1, 3 ou 3 d'une Mega
Les concepteurs de la tablette de luxeomni n'ont peut etre pas prévu que leur Tx débite sur 1kOhm

Hello,
merci pour les réponses.
Je me suis peut etre mal exprimé aussi sur mon premier post, ce qu'il faut savoir c'est que sur le teensy ce n'est pas le meme "sketch", sur le teensy j ai uploader le sketch disponible sur le site de teensy qui permet de transformer le teensy en port serial com usb, ce qui me permet de faire du monitoring sur la tablette grace a hyperterminal, la tablette fonctionne, hyperterminal recoit bien les packets n 19200 8n1.
Sur l'arduino j'utilise le sketch que j'essaye de developpé, j'ai un Serial.begin a 19200 et j'ai ajuste aussi sur 19200 sur le serial terminal de l'ide arduino. j'ai beau mettre des serial.print apres du serial.available ou du serial.read dans mon sketch pour essayer de monitorer s'il du data rentre dans l'arduino mais rien. Pardois une multitude de 0 qui ne se fini jamais, mais pas un signe de mes packets.

Ce qui est assez frustrant car je peux pas avancer dans mon code, si je peux meme pas voir si du data rentre. Je vais tenter en creant une entree serial soft, ou ptet en uploadant mon sketch sur le teensy...

A l'heure actuelle, je sais meme pas si c 'est un probleme hardware ou dans mon code.bref je suis paumé haha, et en plus je suis un gros debutant.

Bonjour
En restant sur le même port série et pour valider le hardware pourquoi ne pas tenter d'abord un simple sketch d'écho série du genre :

void setup()
{
  Serial.begin(19200);
}

void loop()
{
  while (Serial.available() > 0) {
    Serial.write(Serial.read());
  }
}

Tablette --------
---> Rx -> Mega328 -> Tx -> USB -> PC
PC -> USB -> 1k /

Bonsoir,
J'ai utilisé ton code sur mon arduino duemilanove, j ai juste rajouté un petit serial.println("hello"); dans le void setup, donc dans le terminal j'ai bien le hello qui s'affiche, mais rien d'autre, la tablette est branchée comme indiquée sur ton diagramme, mais je recois absolument aucune donnée...

Bonjour
Je continue de privilégier l'hypothèse d'un signal tablette atténué par la branche venant du 'Tx' du FTDI (1kOhm). A défaut d'oscilloscope pour vérifier l'amplitude du signal réel en pin 0 je propose d'envoyer le signal tablette vers un second port série, 'software', dont l'entrée RX serait par exemple en pin 2.

Non testé de mon côté, basé sur des simples lectures donc 'sous réserves ' !!

Pour cela il faut que la librairie NewSoftSerial soit installée.(SoftSerial ne semble pas fontionner au delà de 9600 bauds)
http://arduiniana.org/NewSoftSerial/NewSoftSerial10c.zip
http://arduiniana.org/libraries/newsoftserial/

Le petit sketche suivant devrait permettre d'envoyer en écho vers le PC le signal tablette reçu sur la pin 2 'Rx port software'

// faire echo sur TX (pin1) des octets reçus sur le 'RX software' créé en pin 2

#include <NewSoftSerial.h>

// installe un Port série software avec 'softRx' en pin 2, 'softTx' en pin 3
NewSoftSerial tabletteSerial(2, 3); 

void setup()  
{
  Serial.begin(9600);       // le débit n'est pas nécessairement celui de la tablette !
  Serial.println("Bonjour");

  tabletteSerial.begin(19200);
}

void loop()                     
{
  if (tabletteSerial.available()) {
      Serial.print((char)tabletteSerial.read());
  }
}

Hello, Hello !

Juste pour dire que ton dernier sketch marche !!!
Donc tu avais raison :wink:
j'ai un retour de transmission dans le serial monitor. Bon maintenant faut que je trouve une solution pour le 19200 bauds... peut etre utiliser le teensy au lieu de l'arduino vu que l'usb n'est pas lié.
Il va falloir aussi maintenant que je developpe mon sketch pour qu'il marche correctement avec la tablette et de ce que je veux en faire.

Bonjour
Content d'avoir pu aider !!
Quel est le probleme à résoudre à propos du 19600 bauds ?
Dans le sketch proposé j'ai mis Serial.begin(9600) pour montrer qu'il nest pas indispensable que le débit entrant et le débit sortant soient égaux ... ce qui nempêche pas de les mettre tous les 2 à 19200 bauds :
Serial.Begin(19200) et tablette.Serial.begin(19200)

Bah la tablette sort en 19200 bauds, mais je crois que le softserial ne va pas au dessus de 9600...c'est donc peut etre un probleme pour le bon fonctionnement de la reception des données de la tablette ?

mais je crois que le softserial ne va pas au dessus de 9600

Pour cette raison j'ai choisi de donner le lien de NewSoftSerial qui ne présente plus cette limitation !

'NewSoftSerial' va d'ailleurs s'appeler SoftSerial dans Arduino 1... en prenant la place de l'ancien.

oooh ok ! je savais pas. Génial merci.
Derniere petite question vu que pour l'instant tu m'a eclairé sur tout, sur la tablette d'apres une source exterieur je suis censé recuperé une valeur de 241 pour le premier byte lorsque le stylo est pressé sur la tablette par contre sur mes lecture sur le terminal je recois un HEX de 87 comme premier byte,j ai beau convertir ce 87 dans tous les sens cela ne semble pas concorder avec le 241 que je suis censé retrouver.
Une idée ?

pas d'idée valable, désolé !
Avec 8F pour 241 j'en aurais eu une , pas avec 87 !

1111 0001 en binaire pour 241
1000 1111 en binaire pour 8F (nombre précédent en miroir)
1000 0111 en binaire pour 87 .
Ce n'est donc pas un probleme d'ordre des bits transmis (bit de poids fort en premier contre bit de poids faible en premier)

bon apperement ca serait entre les conversion rs232 ttl que mes datas seraient perturbé, mais j'y comprend rien donc je suis pas plus avancé.

Une explication possible

Les drivers de ligne RS232 sont inverseurs. 241 => 0xF1 inversé 0x0E
A cause de l'inversion, le bit de start n'est donc pas vu, l'ensemble se décale d'un bit (le LSB à zéro est vu comme le start) donc 0x0E devient 0x07, et du fait du décalage le bit de stop est pris pour le MSB 0x87

ohhhh ca a l'air d'avoir du sens ! J'ai pas encore tout saisi mais je vais creuser par là, donc du coup je fais comment pour contourner ce probleme ?

intéresante ton explication, fdufnews et assez facile à valider avec NewSoftSerial.
Parmi les fonctionalités nouvelles de NewSoftSerial :

(New with version 10). It supports software signal inversion

on a la possibilité d'indiquer l'inversion logique des signaux dans le constructeur !

Signal Inversion

“Normal” TTL serial signaling defines a start bit as a transition from “high” to “low” logic. Logical 1 is “high”, 0 is “low”. But some serial devices turn this logic upside down, using what we call “inverted signaling”. As of version 10, NewSoftSerial supports these devices natively with a third parameter in the constructor.

NewSoftSerial myInvertedConn(7, 5, true); // this device uses inverted signaling
NewSoftSerial myGPS(3, 2); // this one doesn't

oui j'ai testé, du coup j'ai pleins d'autres valeurs, mais toujours aucun signe de 241, d ailleurs j'ai aussi beaucoup d'alerte de "break" et d"error" dans mon terminal quand j'utilise la fonction invert.

Au temps pour moi, mettre les deux serial le soft et l'arduino en 19200 ont resolu le probleme des erreurs et des breaks...et surtout en inversant les données je trouve F1 (240) !!! ;), les premier bytes d'accorche correspondent a ce que je cherche, 241 quand le stylet appuie et 240 quand le stylo se leve ( c 'est une tablette graphique ). Par contre apres j'ai uen serie de 5 bytes en plus de celui d'accroche ( je suppose qu'il y a un bit de separation ) et ceux la ne correspondent pas a ce que j'attend... les valeurs sont trop haute ( CF mon premier post ).