Thymio lit les codes-barres
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:
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.)
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.
Thymio lit les codes-barres
Un lecteur de code à barres doit avoir les capacités suivantes:
- 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.
- 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.
- 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:
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:
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
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.
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
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":
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':
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.
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).