MagPI 8 Page 16

De Le French MagPi
Aller à : Navigation, rechercher
def print_position(chart_num):
 chart_pos = (chip.readU8(8 + chart_num * 4)
+(chip.readU8(9 + chart_num * 4) << 8))
 print chart_pos

Dans le tableau 3 de la fiche technique du PCA9685, il est possible de voir que les positions sont conservées tous les 4me et 5me registres à partir des registres 12 et 13. Pour obtenir la position d'un servo, il faudra ajouter ensemble les contenus des deux registres. Pourtant, en les ajoutant ainsi le résultat obtenu sera faux ! Pourquoi ? Deux registres 8 bits sont "collés" ensemble pour faire un registre de 16 bits. Cela est appelé concaténation. Autrement dit, le premier registre contient les bits 0-7 et le second les bits 8-15. Pour les ajouter correctement il faudra décaler tous les bits du second registre de 8 bits vers la gauche (>>8). Ensuite, il sera possible de les additionner pour obtenir un nombre de 16 bits. Ce qui est pratique avec les registres, c'est que l'électronique ne se préoccupe pas de ce qu'il y a dedans. C'est à vous, programmeur, qu'il appartient totalement d'en interpréter le contenu.

Utilisation des servos

Le projet entier tourne autour de la manipulation des servomoteurs. Les lignes de code suivantes sont sans doute les plus critiques. Nous avons défini une fonction appelée move_servos(). Celle-ci prend deux paramètres : sur quel numéro de graphique voulez-vous agir et où voulez-vous le positionner. pwm.setPWM() est fournie par la bibliothèque Adafruit.

def move_servos(chart_num, chart_pos):
 pwm.setPWM(chart_num,0,chart_pos)
 time.sleep(0.1)

chart_pos est un nombre compris entre 170 et 608 mais peut varier un petit peu d'un servo à l'autre. Ces nombres se réfèrent à la durée en largeur d'impulsion (rechercher contrôle de servo si vous êtes intéressé). Pour rendre le logiciel plus intuitif, nous avons utilisé une fonction de transfert pour avoir des nombres de 0 à 100, puis nous sommes allés un peu plus loin. Comme les servos ne sont pas strictement linéaires, nous avons pris quelques points de données, nommés servo_data, et codé une régression linéaire (un mot pompeux pour dire droite de meilleur ajustement) pour compenser les non-linéarités des servos. La fonction de régression linéaire retourne les variables xfer_m et xfer_b qui seront utilisées plus bas.

def transfer(chart_percent):

return int(xfer_m * chart_percent + xfer_b)

def inverse_transfer(chart_pos):

return int(round((chart_pos - xfer_b) / xfer_m))

Test logiciel

Nous sommes de fervents convaincus de la méthode de développement logiciel Agile et de l'innovation incrémentale. Nous n'avons pas déployer l'utilisation de Scrum ni de suivi pour ce petit projet mais nous avons fait quelques tests unitaires légers ; ils sont disponibles dans le dépôt si vous vous sentez d'humeur curieuse.


Remerciements

Des remerciements particuliers à Scott Ehlers pour m'avoir patiemment apporté de nouvelles compétences UNIX et PHP et à Tanda Headrick pour la construction de l'affichage mécanique. Un grand merci à National Technical Systems (NTS) pour avoir commandité le projet en nous accordant une petite récréation pour construire un projet d'affichage d'état. Suivez les liens vers NTS pour plus d'informations sur ce que nous faisons quand nous ne sommes pas en train de jouer avec un Raspberry Pi.

Article de Ben Schaefer


Commandité par National Technical Systems
Albuquerque Engineering Services
http://www.nts.com/locations/albuquerque


Outils personnels
Espaces de noms

Variantes
Actions
Navigation
Boîte à outils