Spoil Star Wars

Bonnes fêtes de fin d’année à tous.

Ici, c’est pas trop la fête mais bon, c’est à moi de surmonter tout ça et me connaissant, ça devrait le faire.

Allez plus joyeux, ma liste au père noël est plutôt courte, comme ça je suis sûr d’avoir ce que je veux. Un MakeBlock Robot « Ultimate Kit – Blue » et un BB-8, télécommandé. Je cherche toujours un Tachikoma motorisé, mais le seul que je connais est un modèle unique non proposé à la vente.

Bon, les projets Boîte à culture et OverKill sont en stand by pour quelques temps. Pour des raisons d’organisation, le projet Boîte à culture va commencer avant qu’OverKill ne soit terminé. Ce qui n’est pas une bonne chose. Ça augmente le risque que le projet ne se termine pas mais là, j’ai pas trop le choix.

Bon, maintenant pour le spoil, alors 1h47 du film Star Wars, Le réveil de la Force, et bien Alfred, le tyrannosaure, meurt écrasé par zobby la mouche.

J’en ai marre ! Je n’y arrive pas. Rien à faire, je peine à découper les plaques de carbone pour le projet OverKill. Il va me falloir me rabattre sur la solution « impression ».

Le problème, c’est que l’imprimante n’est toujours pas fonctionnelle. Il lui manque peu de chose mais quand même.

De plus, j’ai un autre projet en tête. Une boite de culture. Kézako ? C’est un placard d’horticulture automatique, ou peu s’en faut. J’ai déjà quasiment tout pour le faire mais je me refuse à commencer ce projet tant qu’OverKill n’aura pas volé, et ça me stresse.

Bon définissons le projet « boite de culture » :

  • hauteur : 90cm (ne peut pas trop dépasser cette taille)
  • largeur : 100cm (le maximum est de 110cm mais j’aimerai garder un peu d’espace pour l’aération)
  • profondeur : 50cm minimum (je pense plutôt pour 60cm)
  • Un bac à eau :
    • hauteur: 10cm
    • largeur: 20cm
    • longueur: 5cm de moins que la profondeur
  • 2 moteurs de pompe à eau (je compte faire deux cultures) et les tubes qui vont avec
  • 2 sonde d’humidité de sol
  • 1 sonde de niveau d’eau non mécanique
  • 1 capteur d’humidité de l’air (et comme il fait aussi température)
  • 1 capteur de pression atmosphérique
  • une ampoule fluocompacte (pas la peine de prendre des lampes d’horticulture, je ne compte pas faire pousser du cannabis) et ses fixations
  • des ventilateurs de PC pour faire circuler l’air
  • 1 Pi Cam
  • 1 Raspberry Pi
  • 1 carte de relais
  • 1 transformateur 220V AC => 12V DC
  • 1 convertisseur 12V DC => 5V DC
  • de l’aluminium (pour le revêtement des murs de la boite)

La partie « logique », le raspberry pi gérera :

  • si le niveau de la réserve d’eau descend en dessous d’un seuil, envoi de mail
  • si l’humidité du sol descend en dessous d’un seuil défini par culture, déclenchement de la pompe à eau associée
  • envoi des informations des capteurs toutes les X minutes au serveur de stockage
  • prise de photo des cultures, toutes les X minutes en période jour
  • minuterie de l’éclaire de période jour variable en fonction de la période de l’année
  • gestion de la puissance de ventilation en fonction des périodes jour/nuit : juste pour le confort auditif de ma personne ;o)

Donc, cette fois la partie mécanique est simple, un vulgaire placard avec un peu de système d’aquarium, mais la seconde partie qui ait de représenter les différentes valeurs des capteurs est loin d’être simple. J’ai pour le moment 6 sources de valeurs avec 3 ou 4 (je manque d’information pour certains capteur) unités de valeur différentes, donc pas de représentation avec une simple courbe /o\

Pourquoi ce projet ? J’ai envie de faire mumuse avec D3JS et que ça soit un peu plus utile qu’une simple station météo (oui, c’était l’idée d’origine du projet)

Voila, un peu de nouvelles de mes projets que je ne finis pas.

Ça aurait été trop beau, si je ne vous faisais pas poireauter un petit peu. Alors, pour le drone, tout d’abord. Je pense qu’il ne me manque qu’une unique pièce. Un connecteur Bean pour relier la plaque de distribution à la LiPo. Je compte découper bientôt le chassie et souder le GROS oeuvre. Après, il me faudra imprimer les pièces manquantes (pieds, crochet, boite de fixation pour les étages) et donc finir de configurer mon imprimante.

Mais ! Et oui, il y a mais. Ça ne sera pas pour tout de suite. Le week-end prochaine, il y a l’avant-première de la nouvelle édition de Magic. Ce qui veut dire pour moi, 6 mini-tournois sur 2 jour, plus une FNM. En français ? Je joue aux cartes de Vendredi 19h à Dimanche 19h avec une longue pause de 6h entre Samedi et Dimanche. Heureusement que Lundi est un jour de pont, y aura personne pour m’embêter au boulot.

Sinon, en tant que MJ, je commence à me ré-équiper sérieusement. On m’a filé l’écran de MJ pour Naheulbeuk et je viens de recevoir celui de ShadowRun 5 en français. Maintenant, il me faudrait des joueurs un tant soit peu motivés car la dernière partie de Naheulbeuk, j’ai quasiment produit l’intégralité des efforts.

Voila, un billet court. Finalement, le projet OverKill va se terminer et dans les temps.

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