Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Modérateur : Dehas

Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

Dans la nouvelle version de ma bibliothèque j'ai inclus la gestion de 2 nouveaux composants:
le gyroscope/magnétomètre BNO055
et le baromètre BMP180

J'ai créé avec ce gyro un mode auto pilote très robuste (horizon artificiel) pour débutant pour piloter le quadri-hélicoptère, je le publierais bientôt pour ceux qui veulent une fonction débutant ! :)

Je ferais également des tests en vol avec le baromètre pour mesurer l'altitude.

J'ai d'autres composants à inclure prochainement à la bibliothèque:
le NRF24L01P pour communiquer en 2.4Ghz ;)


Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

(toujours en pure c++)
BNO055 et BMP180 intégrés et fonctionnels :)
(j'ai fait plusieurs vols avec ce nouveau gyro)

Première communication 2.4Ghz réussie avec le NRF24L01P :)

Je vous tiendrai informés de la suite (projet de réaliser une radiocommande 2.4ghz).


Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

Exemple de radiocommande une voie avec ma bibliothèque et le composant nrf24l01p ! ^_^

Imaginons que vous voulez transmettre la valeur d'un potentiomètre à votre modèle, ça donne ceci:

Code : Tout sélectionner

#include "../module/Nrf24L01P.h"
#include "../module/AnalogRead.h"

int main()
{
	Nrf24L01P canal = Nrf24L01P (1);
	AnalogRead potar = AnalogRead (15);
	
	Nrf24L01P::start (1, 86400312, true);
	
	while (true)
	{
		potar.state();
		
		canal.transmit (potar.value);
	}
	
	return 0;
}
Et à l'autre bout, on fait bouger un servo avec la valeur du potentiomètre qu'on reçois par radio:

Code : Tout sélectionner

#include "../module/Nrf24L01P.h"
#include "../module/PwmWrite.h"

int main()
{
	Nrf24L01P canal = Nrf24L01P (1);
	PwmWrite servo = PwmWrite (1, 0, 500, 1000);
	
	Nrf24L01P::start (1, 86400312, true);
	PwmWrite::start (50);
	
	while (true)
	{
		canal.receive();
		
		servo.pulse (canal.value);
	}
	
	return 0;
}
C'est pas plus compliqué que ça, mais avec ce modeste code vous avez déjà une radiocommande 1 voie :)

A noter que "86400312" c'est un identifiant unique sur 32 bits (une clé réseau si vous voulez), que vous choisissez à votre guise pour sécuriser la communication entre les deux nrf24l01p.

Les possibilités sont vraiment grandes, vous pouvez émettre, transmettre à la suite dans n'importe quel ordre, j'ai essayé par exemple des configurations un peu délicates à savoir:
incrément d'une valeur (par exemple le temps qui passe)
transmission de cette valeur d'un module 1 à un autre module 2
réception de la valeur depuis le module 2 puis émission vers le module 1
réémission de la valeur reçue du module 1 vers le module 2
réémission de la valeur du module 2 vers le module 1
affichage de la valeur sur un afficheur à leds via le module 1

Et ça marche vraiment impec sans bugs, avec une latence de l'ordre du millième de secondes, et avec une portée d'au moins 1km bien-sûr :)

Les données utiles qui transitent sont sur 32 bits signés (+ 8 bit pour le canal ou l'adresse).

A vous de jouer :)


Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

J'ai bien avancé dans mon histoire de quadri auto-stable sur l'horizon, j'ai testé hier un nouveau code qui utilise la rapidité du mpu6050 (le mode de vol normal c'est à dire acrobaties), et la fusion gyro+magnétomètre du bno055 pour avoir un pitch/roll verrouillé (le mode de vol horizon).

On passe de l'un a l'autre avec un inter sur la radio, ça permet de voler en mode débutant (horizon), c'est vraiment très très facile à piloter pour le coup, et quand on bascule l'inter on peut faire de la voltige (le roll et le pitch ne suivent plus l'horizon et ne sont plus bloqués a des angles min/max qu'on prédéfini).
Cet inter permet aussi de sauver le modèle si jamais on est perdu dans nos manches (ca remet le quadri a plat), j'ai pas encore testé ça en vol, mettre le quadri sur le dos et basculer l'inter horizon, mais ça ne serait tarder.

J'ai fait une vidéo pour vous montrer ce mode:



Et une nouveauté sinon: à la "demande" d'un youtubeur, j'ai créé le bout de code qu'il faut pour faire fonctioner le magnétomètre Hmc5883L.
-> https://cdn-shop.adafruit.com/datasheet" onclick="window.open(this.href);return false; ... ass_IC.pdf

C'est maintenant inclus dans ma bibliothèque: http://sylvainmahe.xyz/data/module.zip" onclick="window.open(this.href);return false;
Cela retourne les valeurs en gauss (puisque le datasheet parle de gauss j'ai mi ça dans cette unité), à noter que 1 gauss = 100 micro tesla.

Voila pour l'instant (en presque 2 ans de travail en solo) tout ce qui est créé comme classes dans ma bibliothèque:

Code : Tout sélectionner

#include "../module/GpioRead.h"
#include "../module/GpioWrite.h"
#include "../module/AnalogRead.h"
#include "../module/InterruptRead.h"
#include "../module/PwmRead.h"
#include "../module/PwmWrite.h"
#include "../module/SoundWrite.h"

#include "../module/Timer.h"
#include "../module/Delay.h"

#include "../module/Math.h"
#include "../module/Iteration.h"
#include "../module/Average.h"
#include "../module/Hysteresis.h"
#include "../module/Random.h"

#include "../module/Max7219.h"
#include "../module/Mpu6050.h"
#include "../module/Bno055.h"
#include "../module/Hmc5883L.h"
#include "../module/Bmp180.h"
#include "../module/Nrf24L01P.h"

#include "../module/Network.h"

#include "../module/Memory.h"
#include "../module/Power.h"
#include "../module/Tool.h"
Vous pouvez faire beaucoup de projets avec ça et l'atmega328p-pu.


Avatar du membre
PEPE du59
Bicopter
Messages : 24
Enregistré le : sam. 7 juin 2014 15:57
Réputation : 0

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par PEPE du59 »

Superbe travail de programmation et quelle stabilité.
Vivement que je puisse tester ce soft, ayant appris à programmer sur l'IDE Arduino, c'es pas évident...


WLToys V959, HUBSAN X4,
Quads DIY Frame X
Multiwii, APM Planner, Naza, Pixhawk 2.4.8, Mavic PRO
Chargeur WIZARD X6S
RC: Turnigy 9X flashée OpenTx, Flysky I6 flashéé 10cx, Homemade 12cx PPM
Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

Merci de ton commentaire PEPE.

Module est maintenant en version finale (testé, retesté, validé, avec depuis un certain nombre d'améliorations du code) toujours téléchargeable ici: http://sylvainmahe.xyz/


Ce projet de quadri est expliqué ici: http://sylvainmahe.xyz/projectQuadcopter.html


N'hésitez pas si vous avez besoin de plus d'infos.


Avatar du membre
PEPE du59
Bicopter
Messages : 24
Enregistré le : sam. 7 juin 2014 15:57
Réputation : 0

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par PEPE du59 »

Bonjour,

Sur ton site je lis mais sans comprendre à quels pins de l'Atméga328 correspondent ces ports:
- Port 1 sur voie des gaz (throttle)
- Port 2 sur voie de l'axe de tanguage (pitch)
- Port 3 sur voie de l'axe de rouli (roll)
- Port 4 sur voie de l'axe de lacet (yaw)
- Port 5 sur voie de l'interrupteur de coupure moteurs (throttle cut)
- Port 8 sur ESC moteur 1 (avant gauche)
- Port 9 sur ESC moteur 2 (avant droit)
- Port 10 sur ESC moteur 3 (arrière gauche)
- Port 11 sur ESC moteur 4 (arrière droit)
- Port 13 sur buzzer de signalement
- Port 19 sur gyroscope MPU6050 (SDA)
- Port 20 sur gyroscope MPU6050 (SCL)

Peux-tu préciser sur quel pin (PCINT17/D1 PCINT18/D2 PCINT19/D3 ... A1 A2 A3 A4(PCINT12/SDA) A5(PCINT13/SCL) brancher le récepteur, les ESC, etc... ?

D'après le code source je crois comprendre
- Pin D1 sur voie des gaz (throttle) : PwmRead channelThrottle = PwmRead (1, false);
- Pin D2 sur voie de l'axe de tanguage (pitch) : PwmRead channelPitch = PwmRead (2, false);
- Pin D3 sur voie de l'axe de rouli (roll) : PwmRead channelRoll = PwmRead (3, false);
- Pin D4 sur voie de l'axe de lacet (yaw) : PwmRead channelYaw = PwmRead (4, false);
- Pin D5 sur voie de l'interrupteur de coupure moteurs (throttle cut) : PwmRead channelHold = PwmRead (5, false);
- Pin D8 sur ESC moteur 1 (avant gauche) : PwmWrite motor1 = PwmWrite (8, 0, 0, 0);
- Pin D9 sur ESC moteur 2 (avant droit) : PwmWrite motor2 = PwmWrite (9, 0, 0, 0);
- Pin D10 sur ESC moteur 3 (arrière gauche) : PwmWrite motor3 = PwmWrite (10, 0, 0, 0);
- Pin D11 sur ESC moteur 4 (arrière droit) : PwmWrite motor4 = PwmWrite (11, 0, 0, 0);
- Pin D13 sur buzzer de signalement : SoundWrite::pin (13);
- Port 19 sur gyroscope MPU6050 (SDA) : JE NE COMPRENDS PAS, LE SDA ETANT LE PIN A4 SOIT 18
- Port 20 sur gyroscope MPU6050 (SCL) : JE NE COMPRENDS PAS, LE SDA ETANT LE PIN A5 SOIT 19

Merci


WLToys V959, HUBSAN X4,
Quads DIY Frame X
Multiwii, APM Planner, Naza, Pixhawk 2.4.8, Mavic PRO
Chargeur WIZARD X6S
RC: Turnigy 9X flashée OpenTx, Flysky I6 flashéé 10cx, Homemade 12cx PPM
Avatar du membre
sylvainmahe
Bicopter
Messages : 48
Enregistré le : jeu. 3 juil. 2014 18:21
Réputation : 4

Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII

Message non lu par sylvainmahe »

Désolé de la réponse tardive.

Quand j'indique port x, c'est le port de ce que j'appel l'automate, voir phrase ici:
"Connections (automate sur les différents systèmes embarqués):"
Soit ma propre carte avec l'atmega328p dessus:
http://sylvainmahe.xyz/projectAtmega328p.html

Soit:
port 1 = pd0
port 2 = pd1
port 3 = pd2
port 4 = pd3
port 5 = pd4
port 6 = pd5
port 7 = pd6
port 8 = pd7
port 9 = pb0
port 10 = pb1
port 11 = pb2
port 12 = pb3
port 13 = pb4
port 14 = pb5
port 15 = pc0
port 16 = pc1
port 17 = pc2
port 18 = pc3
port 19 = pc4
port 20 = pc5

Voir photo:
http://sylvainmahe.xyz/photo/dsc01789.jpg


Répondre

Retourner vers « Modules et Montages DIY »