Piloter un module son

Cet article va expliquer comment déclencher des sons depuis la radio sur le module Benedini/Das mikro.

Il existe de nombreux modules sons, plus ou moins chers, de qualité variable, ainsi que de prix. Pour ma part, j’utilise des modules Benedini. On peut aussi les trouver sous la dénomination Das mikro qui est une copie chinoise des module Benedini, et qui ont tué le business de Thomas Benedini. J’utiliserai le terme Benedini dans la suite de cet article pour définir indifféremment l’original ou la copie. Il existe aussi plusieurs modèles, mais qui, du point de vue de la radio, ont un fonctionnement identique.

Il est possible d’utiliser 2 modes de fonctionnements du module son. Le premier est assez simple, on choisi une voie sur la radio, et une impulsion sur ce bouton de la radio sélectionne le son 1, 2 le son 2, … et une impulsion du bouton dans l’autre sens déclenche le son. C’est facile et ne requiert aucune modif de radio, mais on se perd vite… L’autre mode consiste a modifier la radio pour remplacer un bouton par une combinaison d’un potentiomètre rotatif à 12 positions et un interrupteur. On choisi le son au moyen du bouton rotatif, et on l’envoie avec l’interrupteur.

Ce petit article va permettre d’utiliser le second mode de fonctionnement, mais sans rien modifier sur la radio. On va utiliser un des boutons rotatif de la radio pour choisir un son, et un bouton (SH est vraiment bien adapté) pour déclencher le son. De plus, on va ajouter un petit widget pour afficher le son choisi sur la radio.

Du Lua

Première étape, créer un petit widget pour afficher le son choisi. De plus, si on appuie sur le bouton pour envoyer le son, on souhaite modifier la couleur du texte. Le langage de programmation des widgets sous EdgeTX/OpenTX est le Lua. Ici, j’écris le widget pour EdgeTX. C’ est important de le noter car la gestion des couleurs est différente entre les 2 systèmes.

Un widget Lua doit implémenter 4 fonctions:
– create: appelé une fois au démarrage du widget
– update: appelé a chaque fois que l’utilisateur modifie les paramètres du widget
– background: appelé périodiquement lorsque le widget n’est PAS visible
– refresh: appelé périodiquement lorsque le widget est visible

Dans ce cas-ci, on en a besoin de 3, le background nous sera inutile.
Un widget peut aussi définir une variable locale options qui contient jusqu’à 6 paramètres, leur type, et des paramètres en fonction du type. Par exemple, Value prend comme paramètres une valeur par défaut, une valeur minimum, et une valeur maximum, alors que COLOR ne prendra qu’un seul paramètre, la couleur par défaut.

Cela donne donc:

---- #########################################################################
---- #                                                                       #
---- # Copyright (C) Nicolas Seinlet                                         #
---- #                                                                       #
---- # License GPLv2: http://www.gnu.org/licenses/gpl-2.0.html               #
---- #                                                                       #
---- # This program is free software; you can redistribute it and/or modify  #
---- # it under the terms of the GNU General Public License version 2 as     #
---- # published by the Free Software Foundation.                            #
---- #                                                                       #
---- # This program is distributed in the hope that it will be useful        #
---- # but WITHOUT ANY WARRANTY; without even the implied warranty of        #
---- # MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE.  See the         #
---- # GNU General Public License for more details.                          #
---- #                                                                       #
---- #########################################################################

local options = {
  { "soundsource", SOURCE, 1 },
  { "soundtrigger", SOURCE, 1 },
}

local function create(zone, options)
  local wgt  = { zone=zone, options=options}
  return wgt
end

local function update(wgt, options)
  wgt.options = options
end

local function background(wgt)
  return
end

function refresh(wgt)
   local val = getValue(wgt.options.soundsource);
   -- #100/88/76/64/52/40/28/16/0
   local TEXT_COLOR = COLOR_THEME_PRIMARY2
   if getValue(wgt.options.soundtrigger) > 0 then
      TEXT_COLOR = COLOR_THEME_FOCUS
   end
    if val < -900 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "Start", TEXT_COLOR+BOLD)
    elseif val < -820 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "Horn", TEXT_COLOR+BOLD)
    elseif val < -700 then
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+1, "Open", TEXT_COLOR+BOLD)
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+15, "door", TEXT_COLOR+BOLD)
    elseif val < -580 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+1, "Close", TEXT_COLOR+BOLD)
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+15, "door", TEXT_COLOR+BOLD)
    elseif val < -460 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "Roof", TEXT_COLOR+BOLD)
    elseif val < -340 then
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+1, "Start", TEXT_COLOR+BOLD)
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+15, "GPS", TEXT_COLOR+BOLD)
    elseif val < -220 then
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+1, "Align", TEXT_COLOR+BOLD)
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+15, "GPS", TEXT_COLOR+BOLD)
    elseif val < -100 then
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+1, "Stop", TEXT_COLOR+BOLD)
        lcd.drawText(wgt.zone.x+5, wgt.zone.y+15, "GPS", TEXT_COLOR+BOLD)
    elseif val > 900 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "V +", TEXT_COLOR+BOLD)
    elseif val > 820 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "V -", TEXT_COLOR+BOLD)
    elseif val > 700 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "Inter", TEXT_COLOR+BOLD)
    elseif val > 580 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "S12", TEXT_COLOR+BOLD)
    elseif val > 460 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "S11", TEXT_COLOR+BOLD)
    elseif val > 340 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "S10", TEXT_COLOR+BOLD)
    elseif val > 220 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "S09", TEXT_COLOR+BOLD)
    elseif val > 100 then
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "S08", TEXT_COLOR+BOLD)
    else
       lcd.drawText(wgt.zone.x+5, wgt.zone.y+5, "", BLACK+BOLD)
    end
end

return { name="Benedini", options=options, create=create, update=update, refresh=refresh, background=background }

Il se place dans le répertoire WIDGETS de la radio

De la configuration

Pour envoyer la commande au module son, un script Lua sera utilisé comme source de mixage. Il faut que la radio permette cette option, ce qui se fait simplement en cochant une case dans la configuration de la radio.

Cocher cette option ajoutera une page de configuration dans le modèle, permettant de choisir des scripts Lua comme source de mixage.

Et encore du Lua

Afficher le son choisi, c’est bien, mais il faut aussi envoyer la commande sur la voie ad-hoc. Si le module son est connecte a la voie 6 du récepteur, on choisira notre script comme source, et on ajoutera une condition, que cela ne s’exécute que si le bouton est presse. Ainsi on envoie le son que si on appuie sur SH par exemple.

Le script en lui-même est relativement simple. On définit des plages de valeurs, et en fonction de la plage dans laquelle on se trouve, on envoie la valeur exacte pour le son choisi.

local P={}

P.input =
	{
		{ "sound-in", SOURCE,},
	}

P.output =
  {"to-play",
  }

-- periodically called function
P.run=function(sound)

    if sound < -900 then
       return -1024
    elseif sound < -820 then
       return -901
    elseif sound < -700 then
       return -778
    elseif sound < -580 then
       return -655
    elseif sound < -460 then
       return -532
    elseif sound < -340 then
       return -410
    elseif sound < -220 then
       return -287
    elseif sound < -100 then
       return -164
    elseif sound > 900 then
       return 1024
    elseif sound > 820 then
       return 901
    elseif sound > 700 then
       return 778
    elseif sound > 580 then
       return 655
    elseif sound > 460 then
       return 532
    elseif sound > 340 then
       return 410
    elseif sound > 220 then
       return 287
    elseif sound > 100 then
       return 164
    else
       return 0
    end
end

return P

Il se place dans le répertoire SCRIPTS/MIXES de la radio

La combinaison de ces 2 scripts permet de commander a distance le module son Benedini.

Laisser un commentaire

Votre adresse e-mail ne sera pas publiée. Les champs obligatoires sont indiqués avec *

Ce site utilise Akismet pour réduire les indésirables. En savoir plus sur comment les données de vos commentaires sont utilisées.