Altimètre pour Hub port Frsky sur ATtiny45 et capteur de pression bmp280

Altimetre
Dernière modification
dim 24/05/2020 - 22:05

L'histoire :

J’utilise dans un motoplaneur un récepteur 8 voie RX-F802 compatible Frsky que j’ai reflashé avec le dernier firmware dispo sur rcgroups pour avoir un failsafe programmable et également le hub port telemetry.

Adepte des projets open source, j’ai cherché comment créer un altimètre très léger (3gr) avec d'une part, les projets open source qui existaient ( openXsensor, …) et d'autre part, ce que j’avais de dispo en platine électronique à la maison.

Adruino mega et uno, on oublie car trop lourd …. L’arduino Nano fait quand même 4gr à lui tout seul sans aucune connectique donc encore trop lourd !!! Il me reste des platines estampillées attiny85 qui vont se révéler être en réalité des Attiny45 !!! ( Là, je me suis fait avoir .... ). Impeccable au niveau du poids, même dimension et brochage que l’attiny85 mais 4 kilo de code au lieu de 8 ….

Du coup avec ça, j’oublie openXsensor car le fichier compilé est trop important.

Après plusieurs essais avec l’environnement Arduino, j’ai abandonné cette voie car ce n’est vraiment pas optimisé au niveau de la taille du code.

Nouvelle série d’essais cette fois ci en assembleur, impeccable au niveau de la taille du code mais la complexité des calculs à réaliser avec des variables de 32 bit dans un microcontrôleur 8bit m’a fait renoncer ! Là, mon statu d’autodidacte dans la programmation m’a rattrapé …. 😉

Dernier essai en C cette fois ci en optimisant toutes les bibliothèques et les calculs au maximum … Banco !! Je fini avec un code occupant 99.7% de la taille du micro !!!! Et ça marche !!!!
Pour cela, j’ai du sacrifier les fonctions vario, altitude max, altitude min et l’altimètre est valable entre 0 et 2500m max.

Voici le graphique d'un vol sur la Taranis  :


Le code source :

Voici le code source sur Github :


https://github.com/aeroelectrolight/Altimeter_VarioTiny

j'ai utilisé également différentes biliothèques C afin de ne pas "réinveter la roue" :

https://github.com/cyosp/AsmTinySerial qui me permet de réaliser une liason série nécessaire pour le protocole Frsky Hub.
https://github.com/Yenya/avr-bmp280 qui me permet de communiquer avec le capteur de pression BMP280

J'ai du modifié le code de ces bibliothèque pour les adapter à ce que j'avais à réaliser. Voici un détails de ces modifications :

  • Dans la bibliothèque AsmTinySerial :

j'ai ajouté la fonction "SerialTx" qui me permet d'envoyer un octet de donnée à la place d'un tableau de caractère.

// Function used to transmit a string
//  - str: A pointer to a character array

void SerialTxChar( const char * str )
{
   while( *str ) SerialAsmTx( *str++ , TX_DELAY );
}


void SerialTx( int val)
{
   SerialAsmTx( val , TX_DELAY );
}

j'ai également modifié le niveau logique de la liason grace au instruction sbi et cbi, car le protocole utilise une liason série "inverted"

TxLoop_3:
        brcc Tx1_3
        sbi UART_PORT, PB3
Tx1_3:
        brcs TxDone_3
        cbi UART_PORT, PB3
  •  Dans la bibliothèque BMP 280 :

J'ai remplacé la fonction getaltitude d'origine par celle ci récuperé dans le code d'openXsensor. Je l'ai adapté afin de limiter les calcluls mais elle est seulement valable jusqu'à 2500m

float bmp280_getaltitude(){
	float alt;
	if ( _bmp280_pres > 95461) {
		alt = ( 101325 - _bmp280_pres ) * 0.08526603 ; // = 500 / (101325 - 95461)  // returned value 1234567 means 123,4567 m (temp is fixed to 15 degree celcius)
		} else if ( _bmp280_pres > 89876) {
		alt = 500 + ( 95461 - _bmp280_pres ) * 0.089525515  ;
		} else if ( _bmp280_pres > 84598) {
		alt = 1000 + ( 89876 - _bmp280_pres ) * 0.094732853  ;
		} else if ( _bmp280_pres > 79498) {
		alt = 1500 + ( 84598 - _bmp280_pres ) *  0.098039216 ;
		} else { //if ( _bmp280_pres > 746860000) {
		alt = 2000 + ( 79498 - _bmp280_pres ) *  0.103906899 ;
	}
	return alt*100;
}

Ce sont ces calcluls qui prennent beaucoup de place en mémoire !

  • Dans le fichier i2cmaster.S

j'ai modifié ces lignes pour les adapter à l'Attiny45

;******----- Adapt these SCA and SCL port and pin definition to your target !!
;
#define SDA             0           // SDA Port D, Pin 4   
#define SCL             2           // SCL Port D, Pin 5
#define SDA_PORT        PORTB       // SDA Port D
#define SCL_PORT        PORTB       // SCL Port D       
  • Le fichier main.c :

J'ai travaillé comme en assembleur avec un registre de "flags" que j'ai défini sur le registre R16. Cela me permet de gerer facilement certain evenements

volatile register uint8_t flags asm("r16");
/********************************* Event REGistry *******************************/
#define _MIF_		0 // Timer Measure Interval Flag
#define _BMPEF_		1 // BMP error flag

j'initialise le capteur puis grace à l'interruption sur le timer0 overflow, je déclenche la fonction "serialOut" toutes les 500 ms avec l'aide du flag "_MIF_"

void serialOut()
{
	bmp280_measure();
	uint16_t centimeter = (uint16_t)(abs(bmp280_getaltitude())%100);
	int32_t meter;
	if (bmp280_getaltitude()>0){
		meter = bmp280_getaltitude()-centimeter;
		}else{
		meter = -1*(abs(bmp280_getaltitude())+centimeter);
	}
	meter = meter/100;
	SendValue(FRSKY_USERDATA_BARO_ALT_B,(int16_t)meter);
	SendValue(FRSKY_USERDATA_BARO_ALT_A, centimeter);
	SerialTx(0x5E);// End of Frame
	blink();
}

je récupère les données de pression et de température du capteur avec "bmp280_measure() " puisjen travaille ces donneés pour récupèrer l'altitude avec "bmp280_getaltitude()".
Enfin, je traite cette valeur pour avoir les mètres dans une variable et les centimètres dans une autre. Et j'envoie le tout vers le récepteur à travers le protocole hub.


Le Montage :

Voici le schéma de câblage du capteur :

 Le fichier Hex : Altimetre_VarioTinyC.hex

J'ai utilisé pour la programmation l'environnment Atmel studio7 avec comme outils de programmation un AvrDragon.

Programmation du micro obligatoire en ISP car il n'y a pas de place pour un bootloader.
J'ai utilisé l'horloge interne du microcontrôleur à 8MHz.

La programmation des bits fusibles :

Extended : 0xFE
High : 0xDD
Low : 0xD2


Todo list :

améliorer la consommation du capteur en changeant le mode de travail du capteur de pression et le mode de travail du microcontroleur ....

Étiquettes

Ajouter un commentaire