petit tuto sur la creation d'un ecran de telemetrie perso

Modérateur : Anim'Elec

Répondre
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

petit tuto sur la creation d'un ecran de telemetrie perso

Message par thetux »

Petit tuto pour se créer un écran de télémétrie perso. J'utilise une Taranis X9D+ , sous opentx 2.1.x
Ce script est à placer dans SCRIPTS/TELEMETRY . Il sera alors vu par votre taranis, et il vous sera possible de le choisir comme un des 4 écrans de télémétrie possible.

Le script tourne en permanence. Il execute une procedure pour dessiner le fond de l'écran, et une pour l'écran lui-même. Je vais donc créer 2 fonctions, bgrnd_func et run. La dernière ligne du script explique à la taranis quelles sont les fonctions à exécuter (background et run) :

Code : Tout sélectionner

return { background=bgrnd_func, run=run }
Mon modèle a 2 chenilles, 1 relevage avant, 1 relevage arrière, 6 prises servos à l'arrière et 3 prises servos à l'avant. J'utilise un inter 3 position pour définir une vitesse max, pour simuler une boite de vitesse en sorte. J'utilise dans ce modèle un capteur télémétrique de courant de max 40A. Mon but est d'afficher la position de chacun des servos, quelles est la commande de ce servo (pas toujours évident quand on passe d'un modèle à l'autre...), la vitesse de chacune des chenilles, la position de l'inter "boite de vitesse", le voltage sur le récepteur, l'amperage max et courant demande par le modele. Je souhaite aussi place une photo du modele pour indiquer où chaque élément se trouve.

Première étape, faire une découverte des capteurs via compagnon :
telem1.png
Ouvrez ensuite votre editeur de texte préféré, et créez un fichier .lua , mt765.lua dans mon cas.

En gros, le paquage lcd contient les fonctions dont j'ai besoin. drawText dessine un texte à l'écran. On lui spécifie les position x et y, le texte et la taille de la police. drawPixmap fait pareil avec une image (bmp, 16 niveaux de gris). Si l'image ne s'affiche pas, soit vous vous êtes trompés sur le nom de fichier, soit elle n'est pas en bmp 16 niveaux de gris. drawline dessine une ligne quand on lui spécifie le point de départ et de fin. L'écran n'est pas bien grand, 212*64 pixels je pense, il faut donc bien tout serrer. On spécifie tout en pixel.

la fonction getvalue renvoie la valeur d'un canal, timer, ... Il prend en paramètre ce qu'on souhaite lire. Voici la liste de ce qu'on peut lire :
http://downloads-21.open-tx.org/firmwar ... aranis.txt

Je voudrais representer le relevage au moyen d'une jauge verticale. Il n'existe pas de fonction toute prête pour cela. Je vais donc créer ma propre fonction pour ce faire. Une jauge, ce n'est jamais qu'un rectangle plein qui représente la position, et un rectangle vide qui represente le débattement possible.

Code : Tout sélectionner

local function drawVerticalGauge(x, y, size, width, value, max)
  val = value
  if val<0 then
    val=0
  end
  if val>max then
    val=max
  end
  sz_filled = val*(size/max)
  sz_unfilled = size-sz_filled
  lcd.drawRectangle(x, y-size, width, sz_unfilled)
  lcd.drawFilledRectangle(x, y-sz_filled, width, sz_filled)
end
Pour les chenilles, je voudrai représenter les servos comme on peut les voir sur un écran de la taranis, à savoir la position neutre comme une ligne verticale au centre d'un rectangle, et quand le servo bouge, on rempli le rectangle à mesure que le servo s'éloigne. Même principe que précédement, j'écris une fonction pour ce faire:

Code : Tout sélectionner

local function drawServo(x, y, size, width, value, max)
  val = value
  if val<((-1)*max) then
    val=(-1)*max
  end
  if val>max then
    val=max
  end
  lcd.drawRectangle(x, y, size*2, width)
  if val>0 then
    sz_filled = val*(size/max)
    lcd.drawFilledRectangle(x+size-sz_filled, y, sz_filled, width)
  else
    if val<0 then
      sz_filled = (-1)*val*(size/max)
      lcd.drawFilledRectangle(x+size, y, sz_filled, width)
    else
      lcd.drawLine(x+size, y, x+size, y+width-1, SOLID, FORCE)
    end
  end
end
Il existe 3 chronos sur la Taranis (2 en standard, +1 en option) Pour les représenter à l'écran, il faut convertir leur valeur en un texte formaté:

Code : Tout sélectionner

local function SecondsToClock(seconds)
  local seconds = tonumber(seconds)

  if seconds <= 0 then
    return "00:00:00";
  else
    hours = string.format("%02.f", math.floor(seconds/3600));
    mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
    secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60));
    return hours..":"..mins..":"..secs
  end
end
Maintenant j'ai tout ce dont j'ai besoin, j'écris la fonction de background, qui se borne à effacer l'écran:

Code : Tout sélectionner

local function bgrnd_func()
  lcd.clear()
end
La fonction run est un peu plus longue. Par exemple, pour les 3 servos avant, je dessine les 3 jauges, et les 3 commandes à utiliser

Code : Tout sélectionner

lcd.drawText(2, 1, "SA", SMLSIZE)
lcd.drawGauge(15, 1, 20, 6, 100+(getValue('ch3')/10), 200)
lcd.drawText(2, 8, "SB", SMLSIZE)
lcd.drawGauge(15, 8, 20, 6, 100+(getValue('ch5')/10), 200)
lcd.drawText(2, 15, "S1", SMLSIZE)
lcd.drawGauge(15, 15, 20, 6, 100+(getValue('ch6')/10), 200)
Pour le courant, je dessine le courant actuel en grand et le max en + petit:

Code : Tout sélectionner

lcd.drawChannel(72, 0, "Curr", DBLSIZE)
lcd.drawChannel(62, 16, "Curr+", SMLSIZE)
On met le tout bout à bout:

Code : Tout sélectionner

local function drawVerticalGauge(x, y, size, width, value, max)
  val = value
  if val<0 then
    val=0
  end
  if val>max then
    val=max
  end
  sz_filled = val*(size/max)
  sz_unfilled = size-sz_filled
  lcd.drawRectangle(x, y-size, width, sz_unfilled)
  lcd.drawFilledRectangle(x, y-sz_filled, width, sz_filled)
end

local function drawServo(x, y, size, width, value, max)
  val = value
  if val<((-1)*max) then
    val=(-1)*max
  end
  if val>max then
    val=max
  end
  lcd.drawRectangle(x, y, size*2, width)
  if val>0 then
    sz_filled = val*(size/max)
    lcd.drawFilledRectangle(x+size-sz_filled, y, sz_filled, width)
  else
    if val<0 then
      sz_filled = (-1)*val*(size/max)
      lcd.drawFilledRectangle(x+size, y, sz_filled, width)
    else
      lcd.drawLine(x+size, y, x+size, y+width-1, SOLID, FORCE)
    end
  end
end

local function SecondsToClock(seconds)
  local seconds = tonumber(seconds)

  if seconds <= 0 then
    return "00:00:00";
  else
    hours = string.format("%02.f", math.floor(seconds/3600));
    mins = string.format("%02.f", math.floor(seconds/60 - (hours*60)));
    secs = string.format("%02.f", math.floor(seconds - hours*3600 - mins *60));
    return hours..":"..mins..":"..secs
  end
end

local function bgrnd_func()
  lcd.clear()

end

local function run(event)
  bgrnd_func()
  lcd.drawPixmap(60, 0, "/SCRIPTS/BMP/765.bmp")

  -- Front outputs
  lcd.drawText(2, 1, "SA", SMLSIZE)
  lcd.drawGauge(15, 1, 20, 6, 100+(getValue('ch3')/10), 200)
  lcd.drawText(2, 8, "SB", SMLSIZE)
  lcd.drawGauge(15, 8, 20, 6, 100+(getValue('ch5')/10), 200)
  lcd.drawText(2, 15, "S1", SMLSIZE)
  lcd.drawGauge(15, 15, 20, 6, 100+(getValue('ch6')/10), 200)

  -- Front lift
  lcd.drawText(2, 38, "SF", SMLSIZE)
  lcd.drawText(5, 45, "+", SMLSIZE)
  lcd.drawText(2, 52, "LS", SMLSIZE)
  drawVerticalGauge(15, 63, 40, 6, 100+(getValue('ch7')/10), 200)

  -- Rear outputs
  lcd.drawText(200, 1, "SC", SMLSIZE)
  lcd.drawGauge(176, 1, 20, 6, 100+(getValue('ch11')/10), 200)
  lcd.drawText(200, 8, "SD", SMLSIZE)
  lcd.drawGauge(176, 8, 20, 6, 100+(getValue('ch12')/10), 200)
  lcd.drawText(200, 15, "Vit", SMLSIZE)
  drawServo(176, 15, 10, 6, getValue('ch13')/10, 100)
  lcd.drawText(141, 1, "S2", SMLSIZE)
  lcd.drawGauge(154, 1, 20, 6, 100+(getValue('ch14')/10), 200)
  lcd.drawText(141, 8, "YDr", SMLSIZE)
  lcd.drawGauge(154, 8, 20, 6, 100+(getValue('ch15')/10), 200)
  lcd.drawText(141, 15, "SH", SMLSIZE)
  lcd.drawGauge(154, 15, 20, 6, 100+(getValue('ch16')/10), 200)

  -- Rear lift
  lcd.drawText(200, 38, "SE", SMLSIZE)
  lcd.drawText(202, 45, "+", SMLSIZE)
  lcd.drawText(200, 52, "RS", SMLSIZE)
  drawVerticalGauge(191, 63, 40, 6, 100+(getValue('ch9')/10), 200)

  -- Power
  lcd.drawChannel(72, 0, "Curr", DBLSIZE)
  lcd.drawChannel(62, 16, "Curr+", SMLSIZE)
  lcd.drawChannel(65, 43, "VFAS", DBLSIZE)
  lcd.drawChannel(65, 58, "BtRx", SMLSIZE)
  lcd.drawChannel(50, 58, "tx-voltage", SMLSIZE)

  -- Speed
  drawServo(76, 44, 28, 6, getValue('ch2')/10, 100)
  drawServo(76, 51, 28, 6, getValue('ch1')/10, 100)
  lcd.drawText(90, 58, "SG + YGa", SMLSIZE)
  drawVerticalGauge(134, 63, 20, 6, 100+(getValue('sg')/10), 200)

  -- Various
  lcd.drawText(141, 42,"To", SMLSIZE)
  lcd.drawText(141, 49,"Av", SMLSIZE)
  lcd.drawText(141, 56,"Ar", SMLSIZE)
  lcd.drawText(152, 42,SecondsToClock(getValue('timer1')), SMLSIZE)
  lcd.drawText(152, 49,SecondsToClock(getValue('timer2')), SMLSIZE)
  lcd.drawText(152, 56,SecondsToClock(getValue('timer3')), SMLSIZE)

  -- linking lines
  -- (for servos)
  lcd.drawLine(24, 21, 24, 31, SOLID, FORCE)
  lcd.drawLine(24, 31, 58, 31, SOLID, FORCE)
  lcd.drawLine(24, 34, 58, 34, SOLID, FORCE)
  lcd.drawLine(164, 22, 164, 28, SOLID, FORCE)
  lcd.drawLine(164, 28, 140, 28, SOLID, FORCE)
  lcd.drawLine(188, 22, 188, 31, SOLID, FORCE)
  lcd.drawLine(188, 31, 140, 31, SOLID, FORCE)
  lcd.drawLine(188, 34, 140, 34, SOLID, FORCE)
  -- (for power)
  lcd.drawLine(72, 8, 78, 8, SOLID, FORCE)
  lcd.drawLine(78, 8, 78, 14, SOLID, FORCE)
  lcd.drawLine(65, 51, 74, 51, SOLID, FORCE)
  lcd.drawLine(74, 51, 74, 40, SOLID, FORCE)
end

return { background=bgrnd_func, run=run }
ce qui donne:
telem2.png
Vous n’avez pas les permissions nécessaires pour voir les fichiers joints à ce message.
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

Re: petit tuto sur la creation d'un ecran de telemetrie perso

Message par thetux »

Merci pour les remerciements, c'est un plaisir :D :up:
Avatar du membre
Kris_77
Chauffeur confirmé
Chauffeur confirmé
Messages : 747
Enregistré le : 02 janv. 2014, 10:38
Numéro de département : 77
Pays : F
Localisation : Bussy (77)
A remercié : 41 fois
A été remercié : 34 fois

Re: petit tuto sur la creation d'un ecran de telemetrie perso

Message par Kris_77 »

Euh..... Tu viens boire un café à la maison et je te prête ma taranis pour que tu me fasse la même chose lol
Cest trop top comme écran perso. Franchement waouuuuu quoi.


__________
Kris.
Kris.
--------
Mon dernier-> https://youtu.be/mROz1lhhvBU
Tuto kit pistenking-> https://youtu.be/uW1G1GM_nUc
Avatar du membre
cc38150
Conducteur retraité ou la belle vie
Conducteur retraité ou la belle vie
Messages : 3384
Enregistré le : 15 août 2008, 15:45
Numéro de département : 38
Pays : F
Localisation : Vernioz (Isère 38)
A remercié : 55 fois
A été remercié : 237 fois

Re: petit tuto sur la creation d'un ecran de telemetrie perso

Message par cc38150 »

Kris_77 a écrit :Euh..... Tu viens boire un café à la maison et je te prête ma taranis pour que tu me fasse la même chose lol
Cest trop top comme écran perso. Franchement waouuuuu quoi.
+1
Quand je pense que moi, je galère à mettre une photo du modèle. Là ça laisse rêveur.
Avatar du membre
Kris_77
Chauffeur confirmé
Chauffeur confirmé
Messages : 747
Enregistré le : 02 janv. 2014, 10:38
Numéro de département : 77
Pays : F
Localisation : Bussy (77)
A remercié : 41 fois
A été remercié : 34 fois

Re: petit tuto sur la creation d'un ecran de telemetrie perso

Message par Kris_77 »

Sans spécialement faire un truc ultra complexe comme le tien.
D'après toi, serait il possible de réunir les informations d'un flvss sur un des écrans en page 1 ou 2 ?
Car en suivant un petit tuto sur ce module, je me retrouve avec les valeurs télé métriques de mon accu sur une page complètement à part. Une idée ?

Et pour l'exemple que tu donne plus haut, il doit te falloir des capteurs divers dans ton engin, non ?
__________
Kris.
Kris.
--------
Mon dernier-> https://youtu.be/mROz1lhhvBU
Tuto kit pistenking-> https://youtu.be/uW1G1GM_nUc
Avatar du membre
thetux
Chauffeur sympa
Chauffeur sympa
Messages : 491
Enregistré le : 24 juil. 2012, 21:25
Pays : B
Localisation : Andenne
A remercié : 7 fois
A été remercié : 41 fois

Re: petit tuto sur la creation d'un ecran de telemetrie perso

Message par thetux »

Dans ce modele, j'ai un capteur de courant, il me donne le courant et la tension totale, le recepteur me donne la tension du bec. J'ai un autre modele avec un flvss, je vous file les infos a mon retour de vacances.
Répondre

Retourner vers « FR sky, TAranis et autres radio de la marque »