Librairie Robopoly pour PRisme 2

La librairie de Robopoly comporte quelques fonctions propres au kit: la commande des moteurs pour les roues, la commande du servomoteur, un agenda qui permet de faire du pseudo-multitâche en utilisant très peu de ressources et des fonctions de communication pour l’échange des données entre le PRisme et l’ordinateur.

Pour utiliser ces fonctions il faut ajouter #include « robopoly.h » au début du programme, ou bien séléctionner Sketch->Import Library->Robopoly dans le menu.

En plus de la librairie Robopoly il y a aussi la librairie pour la caméra linéaire TSL3301. Pour l’utiliser il faut l’inclure avec Sketch->Import Library->LinearCamera dans le menu.

Fonctions générales

Définit le direction du pin, le port peut être PORTA, PORTB, PORTC ou PORTD et le pin de 0 à 7, le mode est 0 pour une entrée (par défaut) ou 1 pour la sortie. Attention de ne pas mettre un pin en sortie et au niveau logique 0 en faire entrer du 5V, ceci peut détruire le microcontrôleur.

 pin_mode(port, pin, mode)

 

Définit la valeur du pin en sortie, la valeur peut être 0 ou 1.

 digital_write(port, pin, value)

 

Lit la valeur de n’importe quel pin qui est défini en entrée par pin_mode(), retourne 0 ou 1.

 digital_read(port, pin)

 

Lit une valeur analogique du port A, c’est le seul port qui est capable de lire des valeurs analogiques. Retourne une valeur entre 0 et 255 selon la tension appliqué sur le pin. Par exemple si le microcontrôleur est alimenté en 5V et 2.5V est appliqué sur le pin alors cette fonction retourne 127.

 unsigned char analogReadPortA(unsigned char bit)

Tous les exemples de la librairie utilisent ces fonctions pour interagir avec les pins.

Fonctions de gestion de moteur

Cette fonction définit la vitesse de rotation des moteurs gauche et droite en porcent. Cette valeur représente la vitesse en pourcent de la vitesse maximale des moteurs: 0 le moteur est arrêté, 100 le moteur est à pleine vitesse dans le sens de rotation positif et ‐100 le moteur est à pleine vitesse dans le sens de rotation négatif.

Les moteurs doivent être branchés sur les pins PD4 à PD7 (voir schéma de connexion du kit). Il n’y a pas de danger en connectant les moteurs dans le mauvais sens (sur le PRisme ou sur le pont-H), mais il peuvent tourner dans le mauvais sens ou la vitesse gauche peut commander la roue droite.

 void setSpeed(int leftMotor, int rightMotor)

Voir l’exemple dans File->Examples->Robopoly->Motors.

 

Cette fonction permet de commander séparément 10 servomoteurs branchés sur le cerveau selon le tableau de connexion ci dessous. Le numéro du servomoteur doit être compris entre 0 et 9 et la valeur de consigne entre 0 et 180 correspondant à l’angle désiré. Cette fonction utilise le TIMER2.

 void setServo(unsigned char id, char angle)

Voir l’exemple dans File->Examples->Robopoly->ServoMotor.

Fonctions de timing avancées

Cette fonction réalise une tâche équivalente à un agenda et permet de définir une fonction à appeler périodiquement. La fonction appelée ne doit retourner aucune valeur et n’avoir aucun argument.

Il faut définir l’intervalle de temps entre chaque appel de la fonction en millisecondes et le nombre de fois que l’on veut que cette fonction soit appelée (0 signifieque la fonction est appelée sans limite du nombre d’exécution) le nombre maximum d’exécutions limitées que l’on peut fixer est de 255. Le temps absolu maximum pour l’utilisation de cette fonction après initialisation est environ 50 jours (2^32*1ms) et l’intervalle maximum entre appel est de 65s (2^16*1ms).

On peut définir au maximum 8 fonctions à appeler dans la liste de l’agenda. La fonction setCallback retourne un numéro correspondant à la place occupée par la fonction dans l’agenda et ‐1 en cas d’erreur (par exemple lorsqu’il n’y a plus de place disponible). Lorsqu’une fonction a été appelée le nombre maximum de fois défini, elle est automatiquement retirée de la liste de l’agenda et on peut placer une autre fonction à sa place en utilisant la fonction setCallback à nouveau. Attention, l’exécution de la fonction appelée est prioritaire et bloque l’entier du cerveau. Il faut donc veiller à ne jamais rester bloqué dans une boucle d’attente à cet endroit par exemple.

unsigned char setCallback(void (*newCallbackAddr)(void), unsigned int interval, unsigned char executionNumber)

 

Permet de forcer l’arrêt d’une fonction de l’agenda. Pour pouvoir utiliser cette fonction, il faut avoir récupéré le numéro identifiant la fonction lors de sa mise dans l’agenda.

 void clearCallback(unsigned char callbackId)

Les deux fonctions pour l’agenda utilisent le TIMER0.

Voir l’exemple dans File->Examples->Robopoly->Callback.

Fonctions de communication

Prépare la communication sérielle entre le PRisme et l’ordinateur, par defaut à 9600 baud. Doit être appelé une fois au début du programme.

 void serialSetup(void)

 

Envoie des caractères à l’ordinateur.

 void serialWrite(const char*)

 

Envoie des chiffres à l’ordinateur.

 void serialPrint(int)

 

Envoie des données sans formatage à l’ordinateur.

 void serialRaw(unsigned char)

 

Vérifie s’il y a quelque chose dans le buffer d’entrée, c’est à dire qu’il vérifie si l’ordinateur a envoyé quelque chose vers le PRisme, retourne 0 s’il n’y a rien et 1 s’il y a quelque chose.

 unsigned char serialAvailable(void)

 

Lit ce qu’il y a dans le buffer d’entrée en l’effaçant du buffer d’entrée.

 char serialRead(void)

Voir l’exemple dans File->Examples->Robopoly->SerialEcho.

Caméra linéaire

Prépare la caméra linéaire en envoyant la séquence d’initialisation.

 void lcam_setup(void)

 

Remet la caméra linéaire dans l’état de base.

 void lcam_reset(void)

 

Prend une image, l’argument est le temps d’exposition de la caméra en microsecondes de 0 à 65535, 100us fonctionne très bien.

 void lcam_integrate(unsigned int microseconds)

 

Retourne l’adresse du début de la liste des 102 pixels dans la mémoire. Utile si on veut travailler directement avec les données lus de la caméra.

 unsigned char* lcam_getdata(void)

 

Lit l’intensité des pixels de la caméra et fait une moyenne sur 4 pixels, à utiliser avec lcam_getpic().

 void lcam_read(void)

 

Retourne l’index de la liste des 25 pixels généré par lcam_read() où l’intensité est la plus haute, donc un chiffire entre 0 et 24 où 12 indique que la lumière est droit devant.

 unsigned char lcam_getpic(void)

Voir l’exemple dans File->Examples->LinearCamera->LinearCameraDemo.

Note: d’autres fonctions sont disponibles, mais pas documentés ici, voir le code source de la librairie de la caméra linéaire.