Archives

All posts for the month juin, 2015

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