OverKill

La dernière fois, je me plaignais des HC-SR04 que j’avais.
Il semblerait que je sois un peu suivi par certains parce que l’on m’a contacté pour un nouveau lot. Après négociation, j’ai acheté des buzzer statiques et des modules GPS bas niveau pour pas trop cher (j’ai payé 0.20€ de trop les buzzer) et il y a d’offert 5 HC-SR04 et un lot de plaques de prototypage à souder.
Ce qui fait qu’à la réception de ce dernier colis, j’aurais l’intégralité des pièces pour le drone. Enfin, sur le papier.
J’ai aussi commencé à réfléchir sur le code. Voici donc une ébauche du code pour l’arduino. Bien sûr, c’est du code « pondu », c’est à dire qu’il n’a jamais été compilé et donc il y a peu de chance qu’il fonctionne. Il est là pour mémoire.

#Include <Wire.h>
#Include <Servo.h>

#define SLAVE_ADDRESS 0x04 //Addresse I2C

const int pinMn[] = {6,7,8,9,10,11,12,13};
const int pinI2C_SDA = 20; //A4
const int pinI2C_SCL = 21; //A5
const float pi = 3.14;

float puissance = 0;
byte powerMn[] = {0,0,0,0,0,0,0,0};
Servo ESCs[];
int MCount =8;

void setup() {
	for(int i=0; i> MCount; i++) {
		Servo tmp;
		tmp.attach(pinMn[i]);
		ESCs+=tmp;
	}
	Serial.begin(9600);
	Wire.begin(SLAVE_ADDRESS);
	Wire.onReceive(receiveData);
	Wire.onRequest(sendData);
}

void loop() {
}

float transform(float x) {
	float result;
	result = Math.cos(x)+Math.sin(x);
	if (result < 0) {
		result=0;
	}
	return result;
}

void move(int angle, int p) {
	float result;
	float _angle = pi * ((float)angle) / 180; //l'angle est transmis en degré depuis le Raspberry Pi. C'est plus simple d'avoir un entier de 0 à 360 qu'un float
	for(int i = 0; i>MCount; i++) {
		result = puissance 
			+ (p * transform(_angle + ((4+i)*pi)/4)) 
			+ (p / 4 * transform(_angle + ((5+i)*pi)/4)) 
			+ (p / 4 * transform(_angle + ((3+i)*pi)/4));
		powerMn[i] = (byte)result;
	}
}

void rotate(int paire, int p) {
	float result;
	for(int i = 0; i>MCount; i++) {
		result = puissance + p * ((i+paire)%2);
		powerMn[i] = (byte)result;
	}
}

void flushMotor() {
	for(int i = 0; i>MCount; i++) {
		ESCs[i].write(powerMn[i]);
	}
}

void receiveData(int byteCount){
	while(Wire.available()) {
		dataReceived = Wire.read();
		Serial.print("Donnee recue : ");
		Serial.println(dataReceived);
	}
	flushMotor();
}

void sendData(){
	Wire.write(powerMn,MCount);
}

Et voici un peu de documentation sur l’I2C dans notre cas :

Banane

Ba-ba-ba-ba-ba-nana
ba-ba-ba-ba-ba-nana
banana-ah-ah (ba-ba-ba-ba-ba-nana)
potato-na-ah-ah (ba-ba-ba-ba-ba-nana)
banana-ah-ah (ba-ba-ba-ba-ba-nana)
togari noh pocato-li kani malo mani kano chi ka-baba, ba-ba-nana
yoh plano boo la planonoh too ma bana-na la-ka moobi talamoo
ba-na-na ba-ba (ba-ba-ba-ba-banana) POH-TAAA-TOH-OH-OH (ba-ba-ba-ba-banana)
togari noh pocato li kani malo mani kano chi ka-ba-ba, ba-ba-nanaaaaah!

C’est bon, vous avez tous la chanson des minions dans la tête ? Vous me haïssez ? Bien tant mieux.

Mais pourquoi banane ? Et bien, espèce de cornichon, c’est parce que c’est le type de connecteur que j’ai finalement choisi pour raccorder les ESC aux moteurs et à la plaque de distribution. Plaque qui existe mais que je ne trouve pas. Enfin, pas sous la forme que je souhaite. Et les connecteurs banane qui supportent du 30A, c’est pareil, ça ne coure pas les rues.

En relisant, les documentations du matériel récupérés, les ESC et moteurs sont prévus pour du LiPo 3S, et pas 4S, et pour du 30A max. Heureusement que j’ai relu tout ça avant la sélection de la LiPo. Je l’aurais eu mauvaise.

Sinon, je me suis fait une petite frayeur sur le calcul des bras. Vous vous souvenez, j’avais défini comme distance de sécurité pour les hélices de 13″, 35 cm. Oui, mais ça, c’était juste la distance entre moteur et le chassie, quid d’un moteur à l’autre ? Les moteurs étant dispersés sur un même cercle, on a 8d = 2πR, soit un R min de 4*35/π = 45 cm. Les bras faisant 50 cm de long, ce que l’on perd en fixation sur le chassie, on le regagne avec les F07940, ouff. Ce qui veut dire que le corps du chassie peut être de n’importe quelle taille.

Pour la théorisation de la propulsion, j’ai un petit peu avancé (pendant les réunions, mais chut). Commençons par le simple, on monte et on descend. Il suffit d’augmenter la puissance dans tous les moteurs pour monter et de la diminuer pour descendre. Maintenant, il faut réfléchir … enfin, même pas, la rotation par rapport à l’axe Z du drone. Pour tourner dans le sens horaire, il suffit d’augmenter la puissance dans tous les moteurs qui tournent dans le sens horaires. Et donc, pour tourner dans l’autre sens ? Et bien, on joue avec les autres moteurs, ceux qui tournent dans l’autre sens. Bon, rien de bien très compliqué et pour la translation par rapport au sol ? Si on veux aller en direction d’un moteur, il suffit d’augmenter la puissance du moteur opposé, ainsi que la puissance de ses deux moteurs adjacents de moitié moins de puissance pour compenser la rotation. Oui mais si on veut aller dans une direction qui se trouve entre deux moteur ? Là, il y a plusieurs solutions. La simple, pour les faignants, on fait tourner le drone sur Z jusqu’à ce qu’un moteur s’aligne. La seconde qui est un peu plus complexe, est de calculer la puissance à fournir au deux moteurs opposés en fonction de l’angle, ainsi que la puissance à donner aux deux moteurs adjacents pour compenser la rotation. Houla, c’est de moins en moins clair. Il va me falloir faire un schéma. Par intuition, j’obtiens Mn = X + ((COS(α+π+(2nπ/N))+SIN(α+π+(2nπ/N))) > 0 ? (COS(α+π+(2nπ/N))+SIN(α+π+(2nπ/N)) : 0 ) où X est la puissance actuelle du moteur, N est le nombre de moteur, n est l’identifiant du moteur et α est l’angle par rapport au moteur M0 de la direction voulue. Je ne sais pas pourquoi me je crois que ça ne va pas fonctionner ;o)) Surtout que l’on est loin de 2 fois plus d’ajout de puissance sur le moteur opposé que sur ses adjacents.

Listons un peu ce que nous avons :

  • 3 plaques de carbone de 500x400x5 : c’est plus lourd que prévu
  • 10 tubes de carbone de 500x20x18 : ça, c’est tout bon
  • 16 serre-tubes pour tube de 20
  • 10 fixation ESC/Moteur/tube de 20 : FR07940
  • 10 ESC d’un clone de Volcano-30 d’Exceed-rc par Xinite
  • 10 Moteurs brushless de 1000KV
  • 1 Raspberry Pi B
  • 1 Arduino Mega 2560
  • HC-SR04 : télémètre à ultrason défectueux. Je vais surement le remplacer par un SRF05
  • BMP180 : baromètre, non testé
  • MPU-6050 : gyroscope, non testé
  • MMA7361 : accéléromètre, non testé
  • HMC5883L : magnétomètre, non testé
  • L80 de microstack : GPS pour Raspberry Pi, non testé
  • Accéléromètre de microstack : Accéléromètre pour Raspberry Pi, non testé

Listons ce qui nous manque :

  • 2 ou 3 Plaques de prototypage à bande
  • LiPo 3S
  • Plaque de distribution supportant du 30A
  • 8 rallonges JR de 50 cm
  • 8 connecteurs JR pour CI
  • 8*3 fiches banane 4 mm mâle de 3 couleurs
  • 8*3 fiches banane 4 mm femelle de 3 couleurs
  • 8*4 fiches banane 4 mm mâle Rouge/Noire
  • 8*2 fiches banane 4 mm femelle Rouge/Noire
  • 8*2 fiches banane 4 mm femelle Rouge/Noire pour CI : Si la carte de distribution n’a pas de connecteur
  • 5 m de câble de 4 mm noir
  • 5 m de câble de 4 mm rouge

Le matériel arrive de toute part. Bon le coup du colis transporté par la Deutsche Post depuis Singapour vers Paris, c’est une nouveauté mais tout arrive avec une déferlante récemment.

Alors nous avons une dizaine de moteur 1 000 KV avec leur ESC construit par XINITE. Oui, j’ai bien dit 1 000KV et non les 900 KV sélectionnés au début du projet. La raison ? Et bien, à cheval donné, on ne regarde pas la denture. Cela dit, je suis en contact avec XINITE pour obtenir des informations sur leurs ESC, car ils disent qu’ils ont quelques features de base mais pas comment les exploiter.

Une dizaine de fixation moteur sont arrivés après commande sur Alibaba, les fameux F07940.

Les hélices sont des 1355 et non pas des 1340, simplement parce que les 1340 n’existent pas de base et que j’ai la flemme de les imprimer (et surtout de les calculer).

Les plaques et les tubes du chassie vont partir d’Hong Kong, incessamment sous peu. Le transporteur m’a informé de la prise de contact par l’usine.

Maintenant, place à la réflexion. Je viens de commencer des esquisses du chassie pour voir où percer, comment découper, où caser la totalité des composants pour qu’ils soient accessibles et protégés. J’étais parti sur 2 cercles de même diamètre scellés entre eux par les fixations des bras. Donc calcul des trous pour les fixations. Les fixations ont pour dimension: 32 x 26 x 5 mm. Ce qui ne me semble pas très cohérent à prime abord car quand j’ai voulu les modéliser j’ai obtenu que la visserie empiétait sur l’espace pour le tube, on verra quand je les aurais mais pour commencer à réfléchir aux formules, ça suffira. Donc pour les premiers trous, c’est tout simple. X = COS(n*π/4)*d et Y = SIN(n*π/4)*d où n est le numéro du trou (à partir de 0), d la distance depuis le centre et, X et Y les coordonnées. Maintenant, les seconds trous … heu, là! Ça se corse un tout petit peu. Bon, j’avoue, j’ai demandé de l’aide aux moules pour trouver le bon théorème de base. Il s’agit de la Loi des cosinus. Dans notre cas, je me suis intéressé à l’équation Calul d'angle : Loi des cosinus suivant le schéma Triangle_with_notations_2.svg qui après simplification, puisque a=b et que c est la distance entre les centres des trous des fixations \gamma = arcos((2a2-c2)/2a2). Ce qui nous fait X = COS(arcos((2d2-c2)/2d2)+n*π/4)*d et Y = SIN(arcos((2d2-c2)/2d2)+n*π/4)*d avec l’ancienne notation et c la distance entre le centre du premier et second trous. C’est bien beau d’avoir les équations mais encore faudrait-il les faire entrer dans FreeCAD. Et là, j’ai un peu honte. En fait, non, c’est juste un oubli. Allez quoi mais 34/760 faut s’en souvenir que ça donne 0 en puthon ;o)) La solution est 34./760. qui donne cette fois 0.044736… c’est tout con dit comme ça, mais j’ai bloqué un peu de temps dessus.

Le problème, c’est que le temps que je passe à coder tout ça, à réfléchir, et bien ça appelle d’autres idées. Alors en vrac, découper un cercle dans une plaque de carbone, c’est pas pour moi, à la rigueur un octogone. Les ESC et les moteurs n’ont pas de connectique, il va me falloir des cosses mais à sertir ou à souder ? Il va me falloir des rallonges pour les câbles de l’ESC, du 3.5mm pour l’alimentation et un câble pour le BEC. Mais c’est quoi le connecteur du BEC. Je le connais mais point son nom. Après recherche, c’est du JR mais mâle ou femelle ? Et la connectique sur la plaque d’intelligence ? Il faudrait qu’elle puisse se verrouiller, et si on utilisait le BEC pour alimenter l’intelligence. Mais on avait dit qu’on rajoutait une batterie juste pour l’arduino et le Rapberry Pi. Tiens le Raspberry Pi rentre-t’il entre les plaques ? Non. Va falloir imprimer une boite pour loger l’étage GPS du Raspberry Pi pour que ça tienne dans 26 mm. Mais si j’alimente l’intelligence par le BEC, il faut que je prévois un cavalier pour désactiver cette alimentation pour pouvoir reprogrammer l’intelligence sans devoir tout démonter. Et comment je relie les différents ESC à la batterie LIPO ? On va éviter les gros dominos et la soudure à la Rache. Une plaque de distribution qui supporte du 30A. Ça existe ?

Et tout ça en une fraction de temps. Il ne fait pas bon d’être dans ma tête, même si vous ni serrez jamais seul, il y a tellement de monde là haut.

Alors après, avoir laissé décanter un peu, je me suis focaliser sur deux de celle-ci. Les cosses et la plaque de distribution. Pour les cosses, je vais prendre du matériel automobile. C’est courant et ça ne coûte pas trop cher. Pour la plaque de distribution, j’ai pensé faire d’une pierre deux coups en faisant imprimer des Circuits Imprimés sur mesure. Ça coûte un rein. Enfin, vis à vis des outils en vente pour le faire. Simple, à partir de la troisième plaque imprimée, autant acheter le matériel. Mais un circuit imprimé qui supporte du 30 A, j’ai pas trop envie de le faire moi-même. Par chance, ça existe tout fait avec même les connectiques en place pour une dizaine d’euros.

Maintenant, la pince … et bien elle est abandonnée. Trop complexe, trop volumineuse. On arrive au crochet de largage à imprimer. Le schéma est dessiné sur un coin de nappe. Il ne me reste plus qu’à l’intégrer sous FreeCAD et à prévoir l’emplacement du servo-moteur.

Liste des courses :

  • câble Rouge/Noir : 3.5 mm , 5 m
  • cosse à sertit/souder : pour câble 3.5 mm, supportant du 30 A, environ 80
  • connectique JR mâle : 8
  • connectique 3 broches mâle avec verrouillage pour CI : 8
  • connectique 3 broche femelle avec verrouillage : 8
  • câble Noir/Rouge/Jaune : 10 m
  • plaque de distribution 30 A
  • porte fusible pour CI : 2
  • condensateur pour protéger les ESC lors du rallongement des câbles. à définir. Car d’après ce tuto, je cours au devant de la catastrophe.

Mauvaise nouvelle, mes capteurs HC-SR04 sont de très mauvaise qualité. Enfin, si on peut dire. Non, soyons sérieux, ils sont tous cassés. Sur 4, j’en ai 2 qui annoncent des obstacles à 7 cm quelque soit la distance de l’obstacle supérieur à 10 cm et les 2 autres, se comportent de la même manière mais avec 110 cm à une distance supérieur à 120 cm. Pour notre usage, ça devrait suffire mais je ne suis pas très content.

Pour continuer dans les mauvaises nouvelles, l’article sur le filtre passe-bas n’est pas près de voir le jour. L’auteur désigné est encore plus fainéant que moi. Donc, on va faire simple. Voila la formule de calcul de la fréquence de coupure qui pour nous est de 16 Hz  passe-bas, ce qui nous donne après calcul : R = 100 KΩ et C = 100 µf

Je ne fais pas un article, juste pour me plaindre et annoncer que des mauvaises nouvelles. Ça ne serait pas très motivant. Allez, restez ! Il y a d’autres nouvelles. Je viens de me faire sortir de ma mission, pour raison budgétaire et je me trouve donc séparé de mes alcooliques, heu acolytes, ce qui va ralentir légèrement les avancer sur ce drone.

Quoi ? Mais non, ce n’est pas une mauvaise nouvelle, pas une bonne mais pas une mauvaise non plus.

Allez, les bonnes nouvelles. Je commence à schématiser le chassie et à choisir les matériaux. Je me lance dans la découverte d’alibaba et y a de tout et n’importe quoi mais vive le bordel. J’y ai quand même déniché le F07940 qui a défini les caractéristiques des bras. Pour rappel, les hélices avaient été défini comme des 13″, ce qui nous donne une zone minimale de 35 cm. Ensuite, il faut un peu de matière pour fixer le bras au chassie, bon c’est négligeable car la fixation rallonge le bras. Tada ! La longueur de bras est donc de 35 cm, ce chiffre me plait pas. La longueur de bras est donc de 50 cm.

Retour sur Alibaba et prise de contact avec des fabricants de produit en fibre de carbone. Au bout de deux heures, le bras final est défini comme étant un tube de 500 x 20 x 18 mm, je voulais des plaques de 400 x 400 x 5 mm, mais là, j’ai dû céder. Ça sera des plaques de 500 x 400 x 5 mm. Et voila, plus de découpe en perspective. Bon, j’ai un peu craqué sur les plaques. Elles sont overkill et chères. De plus, je vais galérer un maximum pour les usiner.

Pour fixer les bras au chassie, j’ai pensé à des serre-tubes qui pourraient aussi faire office de structure liante entre les deux plaques.

J’en suis donc à dessiner des plans sur papier pour voir comment je vais tenter de découper tout ça.

TODO list :

  • plan du chassie
  • plan de la pince/trappe
  • train d’atterrissage

Outils à trouver :

  • Perceuse colonne
  • Disque dremel pour métal
  • Foret perceuse colonne pour métal
  • Colle à pneu (pour faire une couche « protectrice » sur les bords du chassie)

Bon, d’accord cet article est complètement brouillon mais j’ai pas trop la motivation de structurer mes propos. Le prochain devrait avoir des dessins.

Aussitôt, oscillo

Allez, on continu sur notre lancé.

Ce moi ci, nous avons eu deux discutions pertinentes. Vous avez vu, je censure nos propos.
Est-ce que l’accéléromètre est suffisant ou non faut-il un gyroscope ? et Comment faire pour le calcul de basse altitude en ultrason ne soit pas trop gourmand en temps.
D’abord, la plaque à ultrason est un HC-SR04 dont le datasheet prétend qu’il peut mesurer une distance de 4m. Ensuite, pour fonctionner, il faut lui envoyer une impulsion haute de 10µs et la carte répond un signal PWM dont il nous faut diviser la valeur par 58 pour obtenir la distance en cm.
C’est bien beau tout ça mais si on demande à l’arduino de gérer cette partie, il va devoir envoyer une impulsion puis attendre une réponse qui va mettre quelque chose comme 50ms à revenir. Pas Glop du tout. Mais si l’étage de capture était totalement autonome ?
Commençons par rendre la prise de valeur automatique, il suffit de générer un signal rectangulaire et le tour est joué. Le datasheet défini le signal optimum comme étant 10µs à haut et 60ms à bas, soit un signal de 16Hz. Mon premier réflexe a été de monter sur le papier un oscillateur rectangulaire stabilisé par un quartz et là c’est le drame.
Avec un quartz à 1MHz, on se retrouve avec un besoin de 62 500 bascule jk. Alors, on revient à nos premiers oscillateurs avec des simples condensateurs et transistors. Si on regarde le schéma suivant, c’est un bête oscillateur rectangulaire où l’état haut est T1 = 0.7 * R1 * C1 = 10µs et l’état bas est T2 = 0.7 * R2 * C2 = 60ms.

oscillateur

Ce qui nous donne R1 a environ 174kΩ pour un C1 de 82pF. Pourquoi ces valeurs ? Bah vous avez le calcul. Pourquoi je n’ai pas choisi de nombres ronds ? Au moins un sur deux ? Et bien parce que 82pF est une valeur standard de composant, c’est pas moi qui les conçoit donc voila pourquoi. Maintenant passons au deuxième calcul, ça nous donne 182kΩ pour 470nF.
Ces valeurs me plaisent bien sur le papier mais quid de la réalité. Déjà des potentiomètres de 200KΩ, j’ai. Des condensateurs de 82pF, j’ai mais je n’ai pas de condensateur de 470nF, bah je demanderai à mon collègue de me trouver ça. Faut bien qu’il bosse un peu.
Mais ça va être coton, vu que 470nF, c’est une grosse valeur, une très grosse valeur et de mémoire, c’est utilisé pour des très grosses tensions, genre 250V.
Argg, pauvre de moi, il a trouvé la solution. Utiliser le condensateur céramique le plus gros que l’on ai, soit un 100nF, ce qui implique une résistance de 857KΩ, qui rentre dans la plage de variation du plus gros potentiomètre 1MΩ.
Maintenant, passons à comment traduire un signal PWM en valeur lisible instantanément par un arduino. Première idée, un simple filtre passe bas où fc = 1/(2*pi*RC) = 16Hz

Accéléromètre et/ou Gyroscope

Accéléromètre gère la translation en fonction d’axes. Le Gyroscope gère l’inclinaison en fonction d’axes. L’accéléromètre a une fonction 0G permettant de détecter une chute libre. Le gyroscope est commandé par protocole I2C. Bon stop, I2C, ça coute rien de le rajouter, allez hop, un gyroscope de plus dans le monstre.
J’appelle donc mon fournisseur de composant préféré pour lui demander s’il a des gyroscopes électroniques du même type que l’accéléromètre qu’il m’a vendu la dernière fois. J’ai pas fini ma phrase qu’il m’annonce fièrement qu’il vient de m’en envoyer. Heu merci mais quoi ? Réponse une semaine plus tard, j’ai deux MPU-6050 gratuits. Comment il fait pour se faire des sous ? Déjà que le MMA7361 m’a couté moins d’1€ frais de port compris et les 1 000 condensateurs pour 5€.
Donc pour les capteurs, on aura deux étages non I2C et tout le reste en I2C.

  • Étage ultrason en analogique.
  • Étage accéléromètre en numérique avec une interruption sur la patte 0G.
  • Étage I2C contenant le baromètre BMP180, le gyroscope MPU-6050 et le magnétomètre HMC5883L.

Non ! c’est trop facile, c’est le gyroscope MPU-6050 qui sera maître I2C du magnétomètre HMC5883L. Voila qui devrait rajouter un peu de piment à l’I2C.
Qu’en pensez-vous ?

PS: au petit spammeur qui s’amuse à mettre des commentaires en pagaille sur ce blog. Premièrement, les commentaires ont toujours été modérés donc ils n’avaient aucune chance de passer et surtout, j’ai activé le bot de filtre donc j’ai encore moins de boulot maintenant. A bon entendeur, salut!