Thymio lit les codes-barres

Thymio lit les codes-barres

somebarcodes.svg

Les codes-barres sont omniprésents

À tous les endroits possibles et impossibles, nous trouvons des codes-barres!

Quels sont les codes-barres? Les codes-barres représentent simplement des nombres et de texte, qui sont très facilement lisibles par des machines.

Sur tous les articles à l'épicerie, les numéros d'articles sont fixés sous forme de codes à barres. Ceux-ci sont «scannés» à la caisse, la caisse connaît le prix à ce numéro et l'article sera supprimé directement à partir du stock et peut-être même ordre encore automatiquement.

Un code-barres pour Thymio

Les codes-barres, qui Thymio peut lire doivent avoir des barres beaucoup plus larges que celles utilisées dans le commerce. Aussi, nous ne pouvons pas coder de longs textes, nous nous limitons au nombre de '0' à '7'. Ce sera notre code-barres:

barcodereader-barcode-nolang.svg

Le code-barres est constitué de quatre champs ou 'bits', ils sont soit de couleur «noir» ou «blanc». Thymio 'lit' la couleur de ces champs et calcule, en utilisant la couleur, la valeur numérique du code à barres.

Le premier champ est toujours noir, alors Thymio reconnaît qu'un nouveau code-barres commence: Ce champ sera appelé sync bit. Le bit de synchronisation est suivie par trois soi-disant bits de données, où notre valeur numerique est codée:

  • Si le premier bit est blanc, il a la valeur 1, sinon «zéro»
  • Si le deuxième bit est blanc, il a la valeur 2, sinon "zéro"
  • Si le troisième bit est blanc, il a la valeur 4, sinon «zéro»

La valeur du code-barres est maintenant la somme de ces trois valeurs. Si tous les bits sont «noir», alors le nombre requis est 0 + 0 + 0 = 0. Si tous les bits sont «blanc», alors le numéro est 1 + 2 + 4 = 7. Nous pouvons coder tous les numéros de 0 à 7.

La figure suivante montre quelques exemples. (Attention: Ces codes à barres doivent être lues à partir de «bas» à «en haut», le bit le plus bas est donc le bit de synchronisation.)

barcodereader-examples-full.png

Les codes-barres peuvent être coupées à partir du modèle et «peint» avec des marqueurs ou ils peuvent être dessinées à la main. Les codes-barres sont ensuite collés, à un distance de 20 mm, parallèlement à la piste.

running.jpg

Thymio lit les codes-barres

Un lecteur de code à barres doit avoir les capacités suivantes:

  1. Il doit suivre un chemin à une vitesse constante. Un seul capteur de fond peut être utilisé à cette fin. Sur la page Thymio suit un bord noir le suivi d'une ligne avec seulement un capteur de fond est décrit en détail.
  2. Il doit lire le code à barres: Thymio se déplace »sur le code-barres» et lit le code avec le deuxième capteur de fond. Ceci sera décrit ci-dessous.
  3. Il doit faire quelque chose avec les codes-barres. (Voir par example peinture de lumière avec code-barres.) Ici, soit on ne fait rien avec le code-barres scanné ou il est simplement affiché. L'idée est que le programme peut être utilisé comme une base pour vos propres développements et améliorations.

Le processus de lecture

Le capteurs de fonds mesure, à des intervalles de 0,1 seconde, la brillance de la surface. La vitesse de Thymio doit être ajusté, de sorte que Thymio entraîne en 0,1 secondes exactement 5 mm1. Comme un bit a 25 mm de largeur, Thymio fait 5 mesures pour chaque bit2.

Dans la figure ci-dessous chaque mesure du capteur de fond est affiché comme une ligne verticale:

barcodereader-reading.png

Si Thymio découvre «noir» pour la première fois, il a trouvé le bit de synchronisation et il commence à compter les mesures individuelles. Étant donné que cette mesure «noir» est à l'extrême gauche du bit de synchronisation, il commence à compter avec la valeur -2.

Chaque fois que le compteur est divisible par 5 (représenté par des nombres rouges), il se trouve au milieu du bit et la valeur correspondante (1, 2, ou 4) de ce bit, si la mesure en ce point résultat sous forme de «blanc», ajouté au code.

Si le compteur a atteint 20, Thymio termine le processus de lecture et commence à chercher un bit de synchronisation à nouveau.

Voici l'algorithme décrit comme programme Blockly:

barcodereader-mini-fr.png

Les premiers quatre «lignes» de ce programme sont utilisés pour suivre la ligne, le reste pour la lecture de codes-barres.

Le programme est entièrement fonctionnel, mais les codes à barres ne sont que lus et non encore traitée. Dans le sous-programme vide use_results vous pouvez (ou mieux vous devriez) insérer vos propres actions.

Cet algorithme ne se limite pas à des codes-barres à trois bits (wordlen=3): il peut lire les codes-barres de 0 à 15 bits.

Le même3 programme de lecture en tant que programme de texte.

Un exemple avec un étalonnage automatique.

Sélectionner la vitesse

Cercle_led.svg

Au démarrage de ce programme affiche la vitesse (pré-)sélectionnée sur les leds de cercle. Lorsqu'il affiche

  • 0 la vitesse est «faible». (intervall=7)
  • 1 la vitesse est «moyen». (interval=5)
  • 2 la vitesse est «élevé». (interval=3)

Avec les boutons «gauche» et «droite», vous pouvez choisir une autre vitesse.

Calibrer la vitesse

Il est extrêmement important que la vitesse est précisément adaptée à la longueur des bits. Cela peut être fait, un peu laborieusement, empiriquement ou mieux automatiquement.

Pour étalonner la vitesse d'un «code-barres» spécial est utilisé: Ce code-barres est constitué de huit bits 'noir' et il a donc exactement un longuer de 20 cm.

Thymio est placé en face de ce code-barres, puis le bouton «marche arrière» est touché; Thymio se déplace sur le code-barres et arrête, lorsque la calibration est terminée.

calibration.jpg

Quand une carte SD est insérée, le calibrage est stocké en permanence sur la carte et lues automatiquement à chaque redémarrage.

Lire les codes-barres

Cercle_led.svg

En touchant sur le bouton «avant» l'opération de lecture est lancé: Thymio suit le chemin et lit tous les codes à barres reconnus. Les valeurs des codes à barres (0..7) sont affichés sur les leds de cercle.

Avec le bouton 'centre' Thymio peut être arrêté.

Ce programme comme programme de texte .aesl ou comme programme Blockly .aesl.

Tous les fichiers comme zip-file.

Défi: Créer et lire des codes-barres avec plusiers niveaux de gris

Les codes à barres utilisés précédemment ont deux valeurs, elles sont donc appelés codes binaires. Il est également possible de coder plusieurs niveaux de gris.

Pour imprimer les codes-barres plus facilement, une séquence de barres blanches et noires est utilisé. Comme le capteur de fond mesure dans un champ d'environ 6 mm de taille, il mesure le niveau moyen de gris de ce domaine. Voici les chiffres représentant '0' à '9' comme "niveau de gris":

werte0-9.png

La mesure doit être beaucoup plus précis que dans le cas binaire, par conséquent, le type de code-barres est peu adaptée: Suite au champ de synchronisation, qui est également utilisé pour étalonner la valeur «noire», il y a un champ blanc afin de étalonner la valeur blanche. Comme example, un code-barres avec une valeur '834':

834.png

Le programme de lecture est basé sur la version "binaire" précédent. Cependant, il a été complété par une calibration de niveaux noirs et blancs et la capacité de décoder plusieurs niveaux de gris. Voici le code:

#onevent startup
    interval = 5        
    system = 4        
    wordlen = 2        
    grey=512
    call sd.open(1000,status)
    if status == 0 then
        call sd.read(product,status)
        call sd.open(-1,status)
    else
        product=733        # a guess for product
    end
    speed=product/interval

sub use_result
    # put your action here
    emit spy result

sub follow_the_track
    p1 = prox.ground.delta[1]
    preg = (p1 - grey) / 4
    ireg += preg / 3
    steer = preg + ireg
    motor.left.target = speed + steer 
    motor.right.target = speed - steer 

onevent prox
    callsub follow_the_track
    p0 = prox.ground.delta[0]    
    if state == S_WAIT_SYNC then
        if p0 < grey then
            state = S_READING
            counter = -interval / 2 
            digit = BLACK
            digival = 1
            code = 0
        end
    else
        counter++
        if counter % interval == 0 then
            if digit == BLACK then
                black = p0    
            elseif digit == WHITE then
                white = p0
                diff = white - black
                grey= (white + black) / 2
            elseif  digit < wordlen then
                valeur = ((system - 1) * (p0 - black) + diff / 2) / diff
                code += valeur * digival
                digival *= system
            else
                state = S_WAIT_SYNC
                result = code
                callsub use_result
            end
            digit++
        end
    end

Voici le programme à télècharger.

Perspective

Impression et lecture de codes à barres avec beaucoup de niveaux de gris est un défi majeur. Jusqu'à présent, il était seulement possible de lire des codes à barres avec 5 niveaux de gris. On a certainement besoin de quelques autres expériences pour lire les codes à barres avec dix niveaux de gris.

Un générateur de codes-barres

Le générateur de codes-barres produit des codes-barres avec un nombre quelconque de champs et un nombre quelconque de "chiffres" par champ. Voilà comment cela se fait4:

stotz.basil@amxa:~$ ./gen_barcodes.sh 

usage: ./gen_barcodes.sh numbase wordlength val_1 val_2 val_3 .... val_N

numbase est le nombre de valeurs par champ (2..~10). wordlength est le nombre de champs de données (0..~8) et val_1, val_2 etc., sont les nombres à coder. Le programme génère une source de LaTeX, qui est ensuite traduit par pdflatex dans un PDF.

La commande

stotz.basil@amxa:~$ ./gen_barcodes.sh 6 3 192 13 24 101 | pdflatex

génère un fichier PDF avec 4 codes-barres pour les valeurs 192, 13, 24 et 101, utilisant la base 6 et 3 champs de données.

texput.png

Le fichier généré texput.pdf peut être imprimé directement.

Le champ d'étalonner la valeur «blanche» n'est pas imprimée dans les codes-barres binaires (numbase=2).

Unless otherwise stated, the content of this page is licensed under Creative Commons Attribution-ShareAlike 3.0 License