User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 5:14 pm

Pour les branchements tu connecte les cables Rouge/Noir/Jaune du moteurs aux cables Rouge/Noir/Jaune du variateurs
(Si tu veux changer le sens des moteurs, tu inverse une paire de cable)
Par exemple
ESC Moteur
rouge rouge
noir noir
jaune jaune
Fait tourner le moteur dans un sens

ESC Moteur
rouge rouge
noir jaune
jaune noir
Fait tourner le moteur dans le sens inverse, si t'as d'autres questions n'hésite pas ;)

EDIT :

Pour la connection de l'ESC à la batterie, le + avec le + et le - avec le -
la prise commande, c'est le jaune vers la prise "domino" du PCA

----


@ToOnS et Trouch :
J'ai pris peur quand j'ai vu comment manipuler le smbus avec c++, je m'en suis donc remis à la solution de facilité et qui marche très bien : L'embedding de python dans cpp, je me suis fait une petite librairie perso (assez moche pour le moment), quand elle sera propre, je la mettrais en ligne pour que tout le monde puisse s'en servir.

Pour la calibration des moteurs, ça y est, c'est fait, depuis que j'ai réussi à "porter" le code en C++, je me suis un peu amusé, et j'ai calibré les moteurs, un vrai régal de voir qu'ils tournent à la même vitesse.

Pour ce qui est des fréquences, j'ai testé a 500Hz (je suis fou ? xD) ça marche avec des 0.25 prés, mais ça "crépite", du coup je tourne a 150Hz pour éviter de tout abîmer.

Encore merci pour votre aide !

Une petite vidéo arrivera probablement lundi :)

idir
Posts: 6
Joined: Thu May 09, 2013 9:19 pm

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 6:33 pm

Hi,

Merci pour ta réponse. Mais mon problème n'est pas le branchement de l'ESC sur le moteur mais plutôt le branchement entre le raspberry et l'ESC. J'ai essayé le branchement suivant :
le fil marron de L'ESC sur le pin GROUD du raspberry (pin numéro 6)
le fil rouge sur le +5v (pin 2)
le fil jaune (qui est le signal pwm d'après ce que j'ai compris)
puis j'ai généré un signal pwm grace à la bibliothèque wiringPi https://projects.drogon.net/raspberry-pi/wiringpi/ sur ce dernier. Résultat => mon rasp a grillé :cry:

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 6:38 pm

Quand j'utilisais un seul moteur, je suivais l'exemple de Frank Buss :

https://www.youtube.com/watch?v=-jLL3wSAQG4

Tu reproduis le même cablage que sur la vidéo sauf qu'au lieu d'un servo tu branche ton variateur

idir
Posts: 6
Joined: Thu May 09, 2013 9:19 pm

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 6:53 pm

C'est ce que j'avais fait justement mais succès. Mais mon je n'utilise pas le même type de moteur
moi j'ai plutôt ça :
ESC => http://www.hobbyking.com/hobbyking/stor ... duct=25365
Moteur => http://www.hobbyking.com/hobbyking/stor ... duct=18969

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 6:59 pm

Tu as les mêmes type de moteur que moi

Sur l'exemple de Frank Buss :

Variateur + et - sur la batterie
Fiche commande comme Frank Buss sur le RPi (remplace le blanc par le jaune)

Et les 3 cables de l'ESC au moteur

Je peux t'assurer que ça fonctionne !

Fais nous des photos de ton installation

idir
Posts: 6
Joined: Thu May 09, 2013 9:19 pm

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sat May 18, 2013 7:26 pm

Je fais ça dès que possible.

Et encore merci.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 2:16 am

idir wrote:Hi,

Merci pour ta réponse. Mais mon problème n'est pas le branchement de l'ESC sur le moteur mais plutôt le branchement entre le raspberry et l'ESC. J'ai essayé le branchement suivant :
le fil marron de L'ESC sur le pin GROUD du raspberry (pin numéro 6)
le fil rouge sur le +5v (pin 2)
le fil jaune (qui est le signal pwm d'après ce que j'ai compris)
puis j'ai généré un signal pwm grace à la bibliothèque wiringPi https://projects.drogon.net/raspberry-pi/wiringpi/ sur ce dernier. Résultat => mon rasp a grillé :cry:
Salut , paix a son ame , en fait c'est normal , oubli le rouge (de la petite prise) donne lui un bon coup de cutter (ou si t'es pas un barbare retire le proprement) , ca sert d'alimentation car y'a un BEC dans ces ESC (donc en fait tu avais alimenté le RPI 2 fois , une fois par l'esc et une fois par la micro usb :mrgreen: ) , en plus :
BEC: Yes (Switching) [Remove middle wire to dissable] (heu ... on dit disable avec un seul S)
BEC Output: 5.5V/4A
donc tu l'as alimenté en 5.5V a la place de 5V (je suis desolé de t'apprendre que le BEC de ces ESC ne pourra pas servir a remplacer la micro usb pour alimenter ton RPI et ca c'est dommage , a part alimenter des leds je vois pas a quoi il pourrait servir , tu devras avoir une rallonge de 5 KM pour alimenter le RPI via le transfo ou alors acheter un BEC en 5V 1A (1A mini mais plus c'est pas grave) a part comme celui la : http://www.hobbyking.com/hobbyking/stor ... 3A_5v.html) , seul le jaune et le marron doivent etre banchés dans ton cas et pas le rouge [Remove middle wire to dissable] , Frank Buss branche le rouge car lui c'est l'inverse avec un servo ca fourni pas du courant ca en prend pour alimenter le servo et pour PHPower ca a pas posé de probleme car le BEC de ses ESC est en 5V 2A (pas 5.5V) et ca c'est bien car il peu alimenter le RPI juste avec ca (sans la micro usb et sans un BEC en plus , ce qui fait gagner 20 grammes et 3€ !!! :lol: ).

(j'imagine que c'est un quad a partir de maintenant)
Il est possible de commander 4 sorties (meme 8) du RPI en PWM (au moins avec la lib GPIO python 0.5.2a) donc la carte adafruit devient useless (oupsss ca fait un peu hors sujet) a moins de vouloir commander + de 8 moteurs (bon apres c'est sur que c'est plus securisant d'avoir la carte qui va juste gerer les moteurs) par exemple comme ca :
http://toonsmil.chez-alice.fr/RPI4ESC.png (les servo c'est en fait des ESC , c'est ce que j'ai trouvé de plus ressemblant)
(code pas testé j'ai pas d'ESC de dispo , ATTENTION a essayer sans helices)

Code: Select all

# Using PWM with RPi.GPIO - requires RPi.GPIO 0.5.2a or higher

import RPi.GPIO as GPIO 		# always needed with RPi.GPIO
from time import sleep  		# pull in the sleep function from time module

GPIO.setmode(GPIO.BCM)  		# choose BCM or BOARD numbering schemes. I use BCM

GPIO.setup(22, GPIO.OUT)		# set GPIO 22 as output for Motor 1
GPIO.setup(23, GPIO.OUT)		# set GPIO 23 as output for Motor 2
GPIO.setup(24, GPIO.OUT)		# set GPIO 24 as output for Motor 3
GPIO.setup(25, GPIO.OUT)		# set GPIO 25 as output for Motor 4

Frequency = 50 				# Hz
Percent_Duty_Cycle_Mini = Frequency/10 	# 1ms (Speed = 0%)
 
Motor1 = GPIO.PWM(22, Frequency)	# create object Motor1 for PWM on port 22 at "Frequency" Hertz
Motor2 = GPIO.PWM(23, Frequency)	# create object Motor2 for PWM on port 23 at "Frequency" Hertz
Motor3 = GPIO.PWM(24, Frequency)	# create object Motor3 for PWM on port 24 at "Frequency" Hertz
Motor4 = GPIO.PWM(25, Frequency)	# create object Motor4 for PWM on port 25 at "Frequency" Hertz

Motor1.start(Percent_Duty_Cycle_Mini)   # start at 0% Speed
Motor2.start(Percent_Duty_Cycle_Mini)   # start at 0% Speed
Motor3.start(Percent_Duty_Cycle_Mini)   # start at 0% Speed
Motor4.start(Percent_Duty_Cycle_Mini)   # start at 0% Speed
sleep(1)				# wait 1s for Motors arming

def MotorSpeed( arg1, arg2 ): 		# arg1 is Motor number , arg2 is Speed percent
	Speed = Percent_Duty_Cycle_Mini + arg2 * Percent_Duty_Cycle_Mini / 100
	print "Motor %d at %d % (%f % of Duty Cycle , %f ms)" % (arg1, arg2 , Speed , Speed * 1/Frequency/100)
	if arg1 == 1:
		Motor1.ChangeDutyCycle(Speed)
	if arg1 == 2:
		Motor2.ChangeDutyCycle(Speed)
	if arg1 == 3:
		Motor3.ChangeDutyCycle(Speed)
	if arg1 == 4:
		Motor4.ChangeDutyCycle(Speed)
	return;

MotorSpeed( 1 , 5) 			# Motor 1 at 5% of Speed
MotorSpeed( 2 , 10) 			# Motor 2 at 10% of Speed
MotorSpeed( 3 , 20) 			# Motor 3 at 20% of Speed
MotorSpeed( 4 , 30) 			# Motor 3 at 30% of Speed

# now the fun starts, we'll vary the Speed to Motors

try:
    while True:
        for i in range(1,5):      	# Motor1 to Motor4
	    for j in range (0,101):  	# Speed 0% to 100%
                MotorSpeed( i , j)
                sleep(0.5)
            break
            MotorSpeed( i , 0) 		# Motor at 0%

except KeyboardInterrupt:
    Motor1.stop()            		# stop the Motor1 PWM output
    Motor2.stop()              		# stop the Motor2 PWM output
    Motor3.stop()            		# stop the Motor3 PWM output
    Motor4.stop()              		# stop the Motor4 PWM output

    GPIO.cleanup()          		# clean up GPIO on CTRL+C exit
Pour les moteurs il faut 2 qui tournent dans un sens et 2 dans l'autre sens : http://linko-fr.com/Quad/quad3.jpg
PHPower wrote:
@ToOnS et Trouch :
J'ai pris peur quand j'ai vu comment manipuler le smbus avec c++, je m'en suis donc remis à la solution de facilité et qui marche très bien : L'embedding de python dans cpp, je me suis fait une petite librairie perso (assez moche pour le moment), quand elle sera propre, je la mettrais en ligne pour que tout le monde puisse s'en servir.

Pour la calibration des moteurs, ça y est, c'est fait, depuis que j'ai réussi à "porter" le code en C++, je me suis un peu amusé, et j'ai calibré les moteurs, un vrai régal de voir qu'ils tournent à la même vitesse.

Pour ce qui est des fréquences, j'ai testé a 500Hz (je suis fou ? xD) ça marche avec des 0.25 prés, mais ça "crépite", du coup je tourne a 150Hz pour éviter de tout abîmer.

Encore merci pour votre aide !

Une petite vidéo arrivera probablement lundi :)
ah , toi aussi ca te fait peur , je me sens moins seul :oops:
Cool , pressé de voir ca en video , pour 500 Hz oui c'est trop car ca laisse pile poile 2ms de cycle , quand c'est a 100% comme toujours on a 2 ms pour le temps haut et reste 0 ms pour le temps bas (donc pas de temps bas , si pas de temps bas alors pas de frequence) , je pense que 450 Hz doit etre vraiment le seuil critique ca donne 2.2 ms de cycle donc a 100% comme toujours 2 ms et ca laisse une toute petite fenetre de 0.2 ms pour le temps bas , 333 Hz doit passer sans probleme ca laisse 1ms de temps bas mais ca apres ca depend surtout des esc , j'ai vu que ceux de idir Support 480Hz+ high refresh rates (up to 499hz) (c'est meme etonnant , je vous laisse calculer le temps bas restant a ce cycle) mais pour les tiens c'est pas precisé

la prochaine etape sera ? accelero ? giro ? magneto ? baro ? gps ? les 5 ? ou peu etre un recepteur ca peu servir aussi ;) (quoique ... ca depend de l'utilisation du drone)

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 1:45 pm

Prochaine étape, les gyroscopes, accelerometre, et compas.

La vidéo, pas avant un moment ! Mauvaise expérience à 120Hz ce matin, tout a déconné, les moteurs étaient à fond, le drone s'est envolé dans la pièce, je me le suis pris dessus : 2 doigts violets en débranchant la batterie :/

Je note tout de même la résistance des hélices en carbone, elles ont frappés une porte pendant 10 bonne secondes, et fait quelques centaines de tour dessus, aucune n'as cédée, les moteurs et ESC marchent toujours, seul un moteur fait un cliqueti quand il tourne.

Maintenant, je met plus les hélices pour les test, trop dangeureux, et je me contenterais du 50Hz pour le moment :/

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 2:02 pm

ca commence a etre dangereux tout ca , 1 RPI HS et 2 doigts qui ont faillis sauter :shock:

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 3:25 pm

Oui dangeureux, mais c'est parce que j'ai pas pris mes précautions !
Donc un conseil, toujours s'assurer qu'il n'y a pas de danger avant de faire mumuse avec les moteurs !

Sinon pour la vidéo, je met celle de hier soir (mode portrait téléphone sorry :/) :
http://www.youtube.com/watch?feature=pl ... tYgjlNYUBI

Je met aussi à disposition mon code :
http://www.dcylabs.com/D2-DCY_Fly.html

Pour finir, je peux plus recalibrer mes ESCs :/
Ils ont été calibrés avec du 50Hz, je me demande ce que ça donne si on les calibre avec du 100Hz ou du 200Hz.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 4:27 pm

en fait les calibrer a 100 ou 200 hz ca change rien du tout , le calibrage sert juste a lui faire apprendre les temps de temps haut pour la vitesse maxi (2 ms dans tout les cas meme si certains vicieux poussent a 2.1 ms et certains recepteur que 1.8 ms) et de temps haut pour la vitesse mini (1ms dans tout les cas , les memes vicieux descendent a 0.9ms et les memes récepteurs a 1.2 ms , donc au final ces vicieux gagne 10% de finesse mais certains esc le veulent pas en tenir compte , pour eux la regle 2ms et 1ms , dans ce cas a quoi ca sert de les calibrer :lol: ) , augmenter la frequence sert juste a 2 choses :
1) ce que ca soit plus reactif (plus on envoie souvent les temps haut et mieux il est stable mais ca tu le verras mieux avec les capteurs car la en changeant les valeurs a la vitesse d'un humain a moins de pouvoir changer 500 fois par secondes on peu pas s'en rendre compte)
2) et comme tu utilises la carte adafruit ca permet d'avoir plus de valeurs entre 1 ms et 2 ms car y'a 4096 bit mais partagés sur toute la plage de temps de la frequence :
50 hz => 20 ms on utilise les 4096 sur les 20 ms mais on se sert que la plage de 1ms a 2ms (on utilise reelement que 5% des 4096 bits , car on utilise entre 1 et 2ms donc 1ms c'est 5% des 20ms)
100 hz => 10 ms on utilise les 4096 sur les 10 ms mais on se sert toujours que de la plage de 1ms a 2ms (on utilise reelement 10% des 4096 bits , 1ms c'est 10% des 10ms donc on peu regler 2 fois plus finement la vitesse comme ca nous laisse le double de bits utilisables)
200 hz => 5 ms on utilise les 4096 sur les 5 ms mais on se sert toujours que de la plage de 1ms a 2ms (on utilise alors reelement 20% des 4096 bits ... on double encore finesse de reglage de la vitesse)

c'est etonnant que tu n'arrives plus a les calibrer , tu es bien sur d'envoyer 2ms sur le bon canal avant de brancher l'esc ?
Last edited by ToOnS on Sun May 19, 2013 4:45 pm, edited 1 time in total.

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 4:43 pm

Yep, j'avais bien compris le role des fréquence.
Pour le calibrage, j'éssaie de recalibrer comme la première fois, et ça marche pas :/
Tu me fais d'ailleurs pensé au fait qu'il faudrait que je modifie mon code (tu l'as regardé ?)
Au lieu de jouer avec des %, je pense que ça serait mieux de faire varier une valeur.

50Hz :
1ms = 205
2ms = 410

J'aurais une plage de 205 utilisable pour de vrai, c'est sur que si on utilise les décimal avec le pourcentages, on a accès à ces valeurs, mais c'est moins précis.
Ou du moins, je prend un pas de 100/205. Mais avec les divisions et les arrondies pour trouver la valeur a envoyer au PCA, je pense qu'on saute quelques valeurs.



Petites questions HS avec le PCA9685

Première question, est-il possible de communiquer avec la Pi par module Radio (et SSH) ? Ça permettrait une super portée.

Deuxieme question, je prévoie de prendre le gyro pololu : http://www.pololu.com/catalog/product/1268 . Je vois pas trop comment je vais le branché sur mon Pi sachant que j'ai déjà mon PCA9685 branché sur le GPIO.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 5:03 pm

ah cool ce gyro , je connaissais pas , ca fait 3 en 1 , gyro + accelero + magneto (et l'altimu qui fait les 3 et en plus baro , du 4 en 1) , tu peux le brancher sans probleme c'est de l'i2c avec une autre adresse (enfin plutôt 3 autres adresses comme c'est 3 en 1) sur les memes GPIO que le servodriver (par contre attention VDD sur le +3.3v , pas Vin de branché)

j'ai regardé rapidement ton code mais son vraiment chercher a comprendre , oui envoyer les bits a la place d'un % ca serait meilleur

pour la communication entre l'ordi et le RPI par radio ca doit etre possible par la prise ecolage de la radio (ca faut creuser un peu je connais pas du tout ce protocole) mais que dans le sens ordi => rpi
en fait tu voudrais que le recepteur de radio sert a recevoir les données que la radiocommande lui envoie (qui elle meme serai branchée a l'ordi) donc faire un genre de code morse c'est bien ca ?

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 5:35 pm

T'aurais un tuto pour les branchements ? et l'adressage ? (j'utilise la lib I2C d'Adafruit, ça va pas foutre le bordel ?)

Je vais modifier mon code pour utiliser les bits au lieu des pourcentage.

Pour la radio, ce serait pas vraiment du morse, j'aimerais pouvoir controler le Pi via SSH, mais peut être qu'une clé 3G+ suffirais ?

EDIT :
Pour utiliser la plage d'une manière idéale, il faudrait que je tourne à 125Hz :
1ms : 512
2ms : 1024
On a une plage de 512 valeurs, c'est correcte je pense.
De plus, je peux jouer avec du pourcentage car : 1bit = 0.1953125% je dépasse pas la capacité d'un double (ni même d'un float) et aucune valeur n'est sautée lors des arrondies

On peut même pousser à 250Hz :
1ms : 1024
2ms : 2048
On a une plage de 1024 valeurs, c'est génial :D
Et le pourcentage est toujours utilisable : 1 bit = 0.09765625%, là pareil, on dépasse pas la capacité d'un double (d'un float, je ne sais pas :/) et toujours aucune valeur sautée :) aprés, à voir si mes variateurs encaisse le 250Hz

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 6:16 pm

pour les branchement c'est simple , SDA SCL et GND aux memes endroits que le servodriver et Vin sur le +3.3v ou VDD sur le +5 mais pas les 2 en meme temps , soit Vin ou soit VDD la lib adafruit doit tres bien faire le taffe c'est juste les adresses qui changent et de la lecture a la place de l'ecriture mais ca elle le fait déjà tres bien
ici par exemple : https://github.com/adafruit/Adafruit-Ra ... uit_BMP085 pour lire l'altitude d'un baro
juste les adressses a changer et ca va rouler , je regarderais les PDF du capteur polulu pour adapter ca mais rien de bien sorcier

pour communiquer en ssh via la radio je le sent pas trop car faut un retour

User avatar
PHPower
Posts: 84
Joined: Tue Jan 01, 2013 7:48 pm
Location: PACA
Contact: Website

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Sun May 19, 2013 6:25 pm

Okay, je met en place mon système de client serveur, mon interface Qt, la gestion de la manette (oui je veux le piloter avec une manette de pléstécheune :p) et je commande l'AltIMU :)

idir
Posts: 6
Joined: Thu May 09, 2013 9:19 pm

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Thu May 23, 2013 10:18 pm

Bonsoir,

De retour avec un nouveau Rasp :)
@ToOnS : Merci pour tes explications. J'ai potasser un peu ton code et ça fonctionne. Néanmoins, je n'ai toujours pas bien saisi le comment du pourquoi et surtout réécrire tout ça en c++ avec wiringPi.

Bonne soirée.

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Thu May 23, 2013 11:51 pm

Salut , merci pour le retour :D , avec wiringpi d'apres Gordon c'est impossible de commander un esc ou un servo (bon normal les 2 se commandent de la meme facon) , il explique pourquoi ici dans les commentaires : https://projects.drogon.net/raspberry-p ... m-library/

pour le comment du pourquoi du code en fait il faut generer un signal de 1000 microsecondes (pour mettre le moteur a 0% de sa vitesse) a 2000 microsecondes (pour le mettre a 100% de sa vitesse) avec une certaine frequence.
on fixe la frequence (dans l'exemple a 50hz mais ca peu etre autre chose)
on connait la frequence donc on connait le temps qu'elle met pour faire un cycle T=1/F (donc 1/50 ce qui donne T=0.02 secondes)
dans ces 20 millisecondes il faut tenir le pin a 3.3v pendant 1000 a 2000 microsecondes (selon la vitesse voulue) et le reste du temps a 0v.

CrashDrives
Posts: 21
Joined: Sat Mar 09, 2013 12:11 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Thu Jul 18, 2013 2:05 pm

Bonjour,

pour la radio regarde du coté des xbees, ils peuvent avoir une porté de plus d'1 km.

CrashDrives
Posts: 21
Joined: Sat Mar 09, 2013 12:11 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Wed Sep 04, 2013 10:10 am

quelqu'un a réussi à comprendre la librairie d'adafruit pour la gestion de l'i2c et pwm pour la carte pwm servo driver ? (respectivement Adafruit_I2C.py et Adafruit_PWM_Servo_Driver.py)

Car j'ai beau éplucher le web pour comprendre et je suis pommé sur les données à envoyer à la carte (et de plus le code n'est pas très bien documenté).
Du coup je n'avance pas dans mon projet :/

Si quelqu'un peut m'éclairer je lui en serait très reconnaissant :)

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Wed Sep 04, 2013 1:23 pm

Bonjour , dis nous en un peu plus sur ce que tu veux faire , ce que tu arrives a faire , ce que tu as essayé qui marche et qui marche pas ,ce qu'il y'a de branché sur la carte et on va essayer de regler ca ;)

CrashDrives
Posts: 21
Joined: Sat Mar 09, 2013 12:11 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Wed Sep 04, 2013 10:00 pm

Bonsoir, j'ai réaliser une base autonome avec un chassis de voiture télécommandé, qui comporte un esc pour la propulsion et un servo pour la direction.
Le tout est controlé par un tupperware (^^) qui contient un raspberry model B, un gps relié par uart http://www.adafruit.com/products/746, une webcam monté sur servo pan and tilt et le fameux controleur pwm d'adafruit.

Pour le controle des servos je me suis bien entendu penché sur la librairie d'adafruit, j'ai utiliser le code de test et tout fonctionne mais je trouve sa un peut lourd d'avoir 2 programme pour controler l'i2c et le pwm et je souhaiterais donc fusionner les 2 et supprimer les parties inutiles.
Pour l'instant je suis bloqué sur la partie qui envoi les chaines de caractères, plus exactement celle là :

Code: Select all

  def setPWM(self, channel, on, off):
    "Sets a single PWM channel"
    self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF)
    self.i2c.write8(self.__LED0_ON_H+4*channel, on >> 8)
    self.i2c.write8(self.__LED0_OFF_L+4*channel, off & 0xFF)
    self.i2c.write8(self.__LED0_OFF_H+4*channel, off >> 8)

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Wed Sep 04, 2013 11:26 pm

bonsoir ,
si j'ai compris il y'a 1 esc sur la carte adafruit et 3 servos (celui de la direction et les 2 de la cam , on peu resumer ca a 4 servo) puis un gps en uart donc seulement la carte adafruit en i2c , dans ce cas pas besoin d'un 2 ieme programme pour gerer l'i2c , ca la librairie du pwm s'en occupe toute seule.

un seul programme qui doit tourner pour commander l'i2c ET du coup le PWM , le Servo_Example.py , les 2 autres fichiers Adafruit_PWM_Servo_Driver.py et Adafruit_I2C.py servent seulement de sous programmes , ils ne doivent pas etre lancés (juste la pour servir de bibliotheque)

pour ca :
self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF)
self.i2c.write8(self.__LED0_ON_H+4*channel, on >> 8)
self.i2c.write8(self.__LED0_OFF_L+4*channel, off & 0xFF)
self.i2c.write8(self.__LED0_OFF_H+4*channel, off >> 8)

en fait il y'a 4096 valeurs (ou pas ou vitesse ou angle , comme tu veux) de possibles pour ON (qui porte mal son nom qui est le debut du temps haut) et 4096 pour OFF (qui est la fin du temps haut) dans la frequence totale
pour envoyer une des 4096 valeurs de ON il faut envoyer 2 fois 8 bits (=2 fois 1 byte , ou 2 fois un caractere mais en realité c'est pas un caractere meme si caractere est aussi codé sur 1 byte) dans les 2 registres de ON (en rouge c'est l'adresse des 2 registres) :
self.i2c.write8(self.__LED0_ON_L+4*channel, on & 0xFF) # on filtre la valeur de "on" pour prendre que ses 8 derniers bits
self.i2c.write8(self.__LED0_ON_H+4*channel, on >> 8) # on filtre la valeur de "on" pour prendre que ses 8 premiers bits

et encore envoyer 2 fois 8 bits pour OFF :
self.i2c.write8(self.__LED0_OFF_L+4*channel, off & 0xFF)
self.i2c.write8(self.__LED0_OFF_H+4*channel, off >> 8)

comme on a vu que ON est le debut du temps haut et OFF la fin on peu alors laisser ON toujours a 0 dans ses 2 registres comme ca ca debutera toujours pile au debut de la frequence et juste s'occuper de OFF pour indiquer le temps du temps haut (la je crois que j'ai perdu du monde ?)
donc en fait on va dire que la frequence a ete reglée a 50hz (pour les servo c'est mieux) ce qui fait un temps total de la frequence de 20 ms , on peu decouper ces 20 ms par 4096 valeurs (ca tombe bien parceque de toute facon il faut entre 1 ms et 2 ms de temps haut pour controler un servo , heureusement qu'on peu decouper)

imaginons qu'on veut mettre un servo au centre (1.5ms entre ON et OFF) si on laisse ON toujours a 0 , il faut s'arranger pour trouver une des 4096 decoupes de 20ms pour OFF pour que ca dure 1.5ms => 307 fois une decoupe de 20/4096 ms
ca c'est mieux expliqué vers la fin de la 1ere page de ce topic

au final il faut envoyer 307 dans les 2 registres (chaque registre fait 8 bits donc va que jusque 256 , heureusement que y'en a 2) de OFF pour avoir le servo centré

voila ca c'est la partie qui fait mal a la tete
--------------------------------------------------------------------
OU il y'a une autre solution , ne pas utiliser la carte adafruit et utiliser le PWM software de python comme ici http://www.raspberrypi.org/phpBB3/viewt ... 28#p352028 , c'est en un seul fichier , y'a pas d'i2c et peu etre que ca fait moins mal a la tete :
pour centrer le servo
MotorSpeed(1 , 50) # Motor 1 a 50% d'angle (moteur 1 est sur GPIO 22)

(ne pas brancher les files rouges de l'esc ou servo au raspberry que les fils jaunes et noirs , tu me diras "sans brancher les files rouges des servo ils seront pas alimentés" et je te repondrais "pour ca debrouille toi avec l'alim de la carte adafruit ou utilise l'esc si il a un bec" mais surtout pas le cable rouge de l'esc sur le raspberry sauf si tu sais ce que tu fais , ca veut dire que tu sais que ton esc a un bec de 5v , pas plus pas moins)

CrashDrives
Posts: 21
Joined: Sat Mar 09, 2013 12:11 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Thu Sep 05, 2013 8:40 am

Merci pour toute ces précisions, je n'avais pas réussi à trouver ce que ces symboles "&" et ">>" faisais et je comprend mieux les on et off :D
_______________

La gestion par pwm software est vraiment simple mais es-ce aussi efficace que la carte adafruit ?
Je veut dire, si le processeur est chargé, les timings seront plus lent, non ? Du coup le ou les servo(s) n'aura(ont) pas le même angle :/

ToOnS
Posts: 492
Joined: Sat Mar 23, 2013 10:29 am

Re: Utilisation du ServoDriver 16 Voies de chez Adafruit

Thu Sep 05, 2013 1:47 pm

si le cpu est chargé ca ne joue pas sur les timing , juste que le programme aura plus de mal a aller a la ligne qui dit "change de timing" mais avec la carte adafruit c'est le meme probleme , il aura plus de mal a aller a la ligne qui dit "envoit ca a la carte" (et toutes les lignes qui servent a ca) , dans les 2 cas les servo va bouger en retard mais en attendant il gardera bien la position precedente.
de toute maniere avec juste un GPS y'a pas de raison que le cpu soit chargé

Return to “Français”