Arduino + Douchette PS/2

Prog

L'auteur de ce sujet a trouvé une solution à son problème.
Auteur du sujet

Bonjours a tous, je suis actuellement en BTS Systèmes Electronique et j'ai un projet a réaliser a la fin.

Le but de mon projet est de scanner un nombre X de code barre, a l'aide d'une douchette, pour pouvoir voir ce scan sur un écran lcd, les classer par catégorie et pouvoir récupérer ce classement sur mon PC.

J'ai du mal a réaliser ce programme c'est pour cela que je viens vers vous, je suis une bille en langage arduino et n'arrive pas a réaliser les fonctions : pour scanner, pour classer, et pour récupérer ces infos, une grosse partie du programme quoi.... Est ce quelqu'un a une idée de comment puis-je procéder ?

Merci d'avance pour vos aides

Édité par Coyote

+0 -0
Auteur du sujet

Salut Spitrou

Oui je suis beaucoup en retard même, mais je n'ai pas de tuteur, fin il est inexistant…

En faite c'est pas vraiment une question, sa serai plus, pour y voir clair et savoir ou aller, parce que là c'est le néant total, je n'ai aucun code.. :(

j'ai ma maquette qui fonctionne avec ma carte arduino relier a une douchette en ps/2 mais il me manque le plus gros, le programme..

j'arrive avec la b*** et le couteau je sais désolé.. tu peux me taper sur les doigts..

Mr l'EDIT : Je n'avais pas de réponse, sachant que le site a l'air bien actif avec des gens réactif, du coup je me suis dit que c’était pas la bonne catégorie…

+0 -0

Au lieu de voir le programme en un gros projet, sépare le en plusieurs fonctions! Je m'y connais pas trop pour les douchettes mais le reste est pas trop pire.

mais pour ton point de départ tu es mieux d'essayer de scanner les codes barres et ensuite faire un autre fonction. vas-y petit par petit car sinon ton projet va te faire peur par toi même ;)

EDIT: http://www.circuitsathome.com/mcu/connecting-barcode-scanner-arduino-usb-host-shield

regarde ça le concept à l'air simple ;)

Édité par MadaQC

La culture, c'est comme la confiture, moins on en a, plus on l'étale. -Françoise Sagan

+1 -0

c'est le néant total, je n'ai aucun code.. :(

j'ai ma maquette qui fonctionne avec ma carte arduino relier a une douchette en ps/2 mais il me manque le plus gros, le programme..

Comment peux tu dire que la maquette fonctionne (d’ailleurs on ne sait pas ce que tu entend par « maquette ») si il n’y a aucun programme qui tourne dessus ?

j'arrive avec la b*** et le couteau je sais désolé..

Deux attributs qui ne te serons d’aucune utilité pour ce projet j’en ai peur. Alors commençons par le commencement, décrit mieux ton projet. De ce que j’ai compris il y a 4 choses principalement :

  • un lecteur de code-barre (douchette)
  • un arduino
  • un écran LCD
  • un PC

L’arduino est au centre de tout ce beau monde. C’est à lui que le lecteur envoi les informations du code-barre (comment ? quel protocole ?). C’est lui encore qui traite et classe ces informations (comment ? selon quels critères ?). C’est l’arduino toujours qui pilote l’écran LCD (sais-tu le faire ? j’immagine qu’il y a des drivers pour ça). C’est l’arduino enfin qui donne au PC les informations collectés et traités (commment? quel protocole ?).

Tu devrais commencer par bien spécifier ces tâches (ça servira pour ton compte rendu aussi) et faire celle qui me semble prioritaire, la communication avec le PC. Cela pour au moins deux bonnes raisons :

  1. C’est probablement le plus simple
  2. Ça te permettra de deboguer les autres tâches plus tard.

Une fois ceci fait, reviens nous voir avec d’autres questions.

Édité par simbilou

La répétition est la base de l’enseignement. — ☮ ♡

+1 -0
Auteur du sujet

Salut MadaQC Oui tu as raison, mais ces plusieurs fonction, je n'arrive même pas a les réaliser, même pas une ligne…

Le lien que tu m'a envoyer, je l'ai déjà visité et j'ai contacté l'auteur pour qu'il m'en dise un peu plus, il m'a rediriger vers un collègue a lui et il m'a conseillé une douchette avec sortie PS/2, le shield lui semblais un peu compliqué.. et mes profs m'ont dit la même chose.. du coup je suis en ps/2, je vois bien le signal du code barre a l'oscillo mais le reste 0.. comment récupérer ce code binaire pour le convertir ? Comment le trier dans une catégorie ? Comment extraire les catégories vers un pc ? Niet..

+0 -0

Simbilou a raison! on a pas assez information pour t'aider mais c'est des choses qui ne sont pas trop compliqué quand tu fais une étape à la fois. Pour les catégories je te lance sur ce site : http://eandata.com/

La culture, c'est comme la confiture, moins on en a, plus on l'étale. -Françoise Sagan

+0 -0
Auteur du sujet

Bonjours Simbilou

C'est vrai le mot "fonctionne" est peut être un peu excessif mais mon lecteur transmet bien le signal du code jusqu’à cette fameuse connexion ps/2 (femelle du coté de la douchette et mâle du coté de l'arduino) En faite c'est le câblage qui me semble correcte, l'arduino alimente bien ma scannette, alimente bien mon écran, tout a l'air de s’emboîter correctement.

  • LECTEUR : Envoi le code barre sur l'arduino (liaison série)
  • ARDUINO : Trie les codes barres, et les classes selon les 4 premiers chiffres du code barre
  • LCD : Affiche le code pour vérifier
  • PC : Récupère le classement pour l'envoi a CANAL+ mais je ne sais pas comment..
+0 -0

En faite c'est le câblage qui me semble correcte, l'arduino alimente bien ma scannette, alimente bien mon écran, tout a l'air de s’emboîter correctement.

Si le hardware t’es déjà fournis tout cuit c’est tant mieux, ça fait moins de boulot. :p

  • LECTEUR : Envoi le code barre sur l'arduino (liaison série)

En supposant que la ligne des données arrives sur une pinoche GPIO, le plus simple sera de bitbanger le protocole. Tu en as un exemple ici.

  • ARDUINO : Trie les codes barres, et les classes selon les 4 premiers chiffres du code barre

Bon ben c’est un pauvre tableau et un algorithme de tri, ça ne devrait pas être au dessus de tes forces. Pour rendre les choses plus simple, tu peux juste entrer les codes au fur et à mesure qu’ils arrivent, tu réfléchira au tri plus tard.

  • LCD : Affiche le code pour vérifier

Piloter un LCD je suis sur que tu as fais un TP là dessus en cours d’année vas récupérer le code !

  • PC : Récupère le classement pour l'envoi a CANAL+ mais je ne sais pas comment..

Je ne comprend pas. En attendant que tu éclaircisse ce point je dirais que tu n’a qu’à afficher le tableau de code à coup de print dans la console. Tu sais comment faire des prints de l’arduino sur la console de l’IDE sur le PC n’est-ce pas ?

La répétition est la base de l’enseignement. — ☮ ♡

+1 -0
Auteur du sujet

Simbilou

En faite c'est codes-barres appartiennent a canal+, ce sont des boîtiers qui servent pour la télé, une fois hs ou besoin de maintenance on les réceptionnent pour les renvoyer mais on attend d'avoir un stock conséquent pour (ptite histoire) L 'arduino classe et trie, mais est ce que le pc peux récupérer ce tableau sous forme de fichier texte ?

+0 -0

mais est ce que le pc peux récupérer ce tableau sous forme de fichier texte ?

Turu

Lorsque tu fais un print avec l’arduino et que cela s’affiche dans la console de l’IDE sur le PC, c’est bien qu’il y a eu un transfert de texte de l’arduino vers le PC non ? Un programme à toi peux récupérer ce flux de texte pour en faire ce qu’il veut. La façon de lire ce flux de texte dépend de l’OS, sous linux il suffit de lire "/dev/ttyUSB0", pour Windows c’est plus pénible comme d’habitude. Si tu utilise Python coté PC il y a le module pyserial qui te simplifiera la vie.

La répétition est la base de l’enseignement. — ☮ ♡

+0 -0
Auteur du sujet

Rebonjour messieurs,

J'ai utilisé un programme pour faire fonctionner mon lecteur, il est censé afficher le CB, faire une incrémentation tous les scans, le CB ne s'affiche pas entièrement, il affiche que le premier caractères sur toute la ligne du lcd. et aucune incrémentation apparaît Je ne comprend pas tout, je vous met le complet a la fin mais quelqu'un peut m'expliquer ces quelques lignes :

-byte scanCodes[10] = {0x45,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46};

-char characters[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

-int SCAN_ENTER = 0x5a;

-int SCAN_BREAK = 0xf0;

 1
 2
 3
 4
 5
 6
 7
 8
 9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
```#include <LiquidCrystal.h> 
LiquidCrystal  lcd(12, 11, 5, 4, 3, 2);

int SCAN_ENTER = 0x5a; 

int SCAN_BREAK = 0xf0;

int breakActive = 0;

int clockPin = 7;  

int dataPin = 6; 

int ledPin = 13,GND;  

int clockValue = 0; 

byte dataValue;

byte scanCodes[10] = {0x45,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46};

char characters[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

int quantityCodes = 10;

char buffer[64] = {};   

int bufferPos = 0; 

int bufferLength = 64;

int i;

void setup() {
    lcd.begin(16, 2);
        pinMode(dataPin, INPUT);                                               
    pinMode(clockPin, INPUT);                                              
    pinMode(ledPin, OUTPUT);                                               
    Serial.begin(9600);                                                    
}

void loop() {
    dataValue = dataRead();                                                                       
    if (dataValue == SCAN_BREAK) {                                         
        breakActive = 1;                                                     
    }                    
    for (int i = 0; i < quantityCodes; i++) {                              
        byte temp = scanCodes[i];                                            
        if(temp == dataValue){                                               
            if(!breakActive == 1){                                             
                buffer[bufferPos] = characters[i];                               
                bufferPos++;                                                     
            }                                                                  
        }                                                                    
    }                                                                                            
    if(dataValue == SCAN_ENTER){                                           
        Serial.print("\nbuffer: ");                                          
        // Read the buffer                                                   
        int i=0;                                                                                                 
        if (buffer[i] != 0) {                                                
            while(buffer[i] != 0) {                                            
                Serial.print( buffer[i] );                                       
                buffer[i] = 0;                                                   
                i++;                                                             
            }                                                                  
        }                                                                    
        Serial.println(" [Enter]");                                          
        bufferPos = 0;                                                                                                             
        digitalWrite(ledPin, HIGH);                                          
        delay(300);                                                          
        digitalWrite(ledPin, LOW);                                           
    }                                                                                  
    if(dataValue != SCAN_BREAK){                                           
        breakActive = 0;                                                     
    }                                                                      
    dataValue = 0;  
        lcd.print( buffer[i] );
}

int dataRead() {
    byte val = 0;                                                          

while (digitalRead(clockPin));.                       

while (!digitalRead(clockPin));                      
while (digitalRead(clockPin));                        
for (int offset = 0; offset < 8; offset++) {                           
while (digitalRead(clockPin));                      
val |= digitalRead(dataPin) << offset;                 
while (!digitalRead(clockPin));                      
    }                                                                      
// Skipping parity and stop bits down here.                            
    while (digitalRead(clockPin));                        
    while (!digitalRead(clockPin));                      
    while (digitalRead(clockPin));                         
    while (!digitalRead(clockPin));                      
    return val;                                                            
}

Édité par Turu

+0 -0

Cette réponse a aidé l'auteur du sujet

J'ai utilisé un programme pour faire fonctionner mon lecteur, il est censé afficher le CB, faire une incrémentation tous les scans, le CB ne s'affiche pas entièrement, il affiche que le premier caractères sur toute la ligne du lcd. et aucune incrémentation apparaît

Tu devrais voir coté PC que le code-bar est entièrement transmis, si ce n’est pas le cas sur le LCD c’est parce que tu lui demande explicitement de n’afficher qu’un seul caractère (buffer[i] est de type char).

Je ne comprend pas tout, je vous met le complet a la fin mais quelqu'un peut m'expliquer ces quelques lignes :

-byte scanCodes[10] = {0x45,0x16,0x1e,0x26,0x25,0x2e,0x36,0x3d,0x3e,0x46};

-char characters[10] = {'0', '1', '2', '3', '4', '5', '6', '7', '8', '9'};

-int SCAN_ENTER = 0x5a;

-int SCAN_BREAK = 0xf0;

Il faut bien comprendre que la douchette se comporte comme un clavier, c’est à dire que lorsqu’elle lit un code-barre, elle envoie le scancode de chaque caractère lu, exactement comme si quelqu’un entrait les lettres une à une au clavier. À la fin du code-barre, le scancode correspondant à la touche Enter est envoyé, et enfin un caractère spécial appelé BREAK.

Le code de chacun de ces caractères n’est pas l’ASCII, mais un protocol ad hoc. Dans le lien que je t’ai donné, le type pointe sur un site qui donne ces informations, voici en particulier la page qui liste les scancodes. On peut y voir notamment que le 0 correspond à 0x45, 1 à 0x16, etc..

Revenons en au code. La fonction dataRead() récupère les scancodes qui sont envoyé, le programme principal lui récupère ces scancodes et en fait la correspondance avec les caractères à l’aide des deux tableaux scanCodes et characters. Il stocke les caractères convertis dans buffer jusqu’à recevoir un BREAK, auquel cas il affiche les caractère reçu et fait clignoter la led.

Édité par simbilou

La répétition est la base de l’enseignement. — ☮ ♡

+0 -0
Vous devez être connecté pour pouvoir poster un message.
Connexion

Pas encore inscrit ?

Créez un compte en une minute pour profiter pleinement de toutes les fonctionnalités de Zeste de Savoir. Ici, tout est gratuit et sans publicité.
Créer un compte