Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
Modérateur : Dehas
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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
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
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
(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).
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).
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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:
Et à l'autre bout, on fait bouger un servo avec la valeur du potentiomètre qu'on reçois par radio:
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
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;
}
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;
}
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
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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:
Vous pouvez faire beaucoup de projets avec ça et l'atmega328p-pu.
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"
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
- PEPE du59
- Bicopter
- Messages : 24
- Enregistré le : sam. 7 juin 2014 15:57
- Réputation : 0
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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...
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
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
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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.
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.
- PEPE du59
- Bicopter
- Messages : 24
- Enregistré le : sam. 7 juin 2014 15:57
- Réputation : 0
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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
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
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
- sylvainmahe
- Bicopter
- Messages : 48
- Enregistré le : jeu. 3 juil. 2014 18:21
- Réputation : 4
Re: Homemade Quadcopter/C++ Code sans ARDUINO/MULTIWII
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
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