See site in english Voir le site en francais
Website skin:
home  download  forum  link  contact

Welcome, Guest. Please login or register.
Did you miss your activation email?

Login with username, password and session length

Author Topic: Arduino Uno + Orbiter  (Read 118481 times)

0 Members and 3 Guests are viewing this topic.

Offline vslash

  • Jr. Member
  • **
  • Posts: 12
  • Karma: 4
Reply #75 - 18 January 2014, 20:52:01
@Mars : en fait l'interpréteur Lua (ou autre) fonctionne en gros comme ça, par ex. :
- luaPath = getenv(LUA_PATH) // (qui retourne une série de chemin de recherche possible)
- requiredLib = findFile(luaPath,'theLibFromTheScript'.dll) // (qui retourne un fichier si trouvé)
- load requiredLib // (charge la lib et la présente au script)
Dans le cas ci-dessus, theLibFromTheScript pointe sur le parm associé à 'require' (ie "luars232").
Toi tu mets un fichier à la place d'un chemin de fichier, le getenv ci-dessus renvois donc un chemin inconnu.
La syntaxe de LUA_PATH est : chemin\joker separateur avec joker=? et separateur=; ce qui donne  LUA_PATH=repertoire1\?;repertoire2\? ...

Quote
Si on paramètre le COM par l'invite de commande DOS, doit on le faire avec Lua?
tu prog. ton interface COM par où tu veux ; une fois seulement ; il faut simplement t'assurer que l'OS ne prends pas la main sur le programme, ou que le programme ne soit pas en conflit avec les autorisations de l'OS.
Le mieux est de prog. ton interface via ton script une bonne fois pour toute ; ensuite tu mets l'OS en accord si NOK (autorisation, etc...) mais ne change pas ta règle de conduite. Tu plies l'OS à ce que tu veux faire, pas le contraire.
Ce que tu peux faire, c'est brancher ton Arduino sur le com de l'ordi ; tu prog. l'Arduino pour balancer du texte en boucle ; tu config ton COM via Win (ici 9600 baud), et tu lances un pgm de lecture du port com (m'est d'avis qu'il en existe un bon paquet pour win).
Note : si t'as fait un copie/colle, il manque un ';' dans ton prog. :o)
++


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #76 - 19 January 2014, 12:15:21
Waow! C'est dense. Je dois relire tout ça lentement, prendre des notes, et essayer.

Pour le script, bé!, tu as l’œil! C'était une version sauvegardée avec Notepad++
avant compilation. La version corrigée tourne dans la Uno.  C'était pas un piège, j'vous jure, m'sieur!

En tout cas, merci!

Mars Bleu


Offline hysot

  • Full Member
  • ***
  • Posts: 120
  • Country: Canada ca
  • Karma: 8
Reply #77 - 19 January 2014, 15:16:58
J'ai continué mes investigations sur ces résistances en parallèle.
J'ai mis au point un algorithme qui calculait la résistance insérée(ou retirée)
en fonction de la variation de tension mesurée à A0. Ça marchait bien pour
3 switches différents, mais quand j'en ai mis 8, et que je les mettais tous
à 1, il y avait trop de dérive pour pouvoir faire des calculs précis. Donc, pour moi,
c'était une impasse technique.

je comprends pas ton histoire d'algorithme.
Si tu veux brancher plusieurs boutons sur une Input et pouvoir appuyer sur plusieurs boutons simultanement, voila ce que j'avais trouve:
http://forum.arduino.cc/index.php/topic,8558.0.html

hysot

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #78 - 19 January 2014, 19:39:32
Voici ce que j'ai mis dans la Uno à titre expérimental:
Code: [Select]
int Vprecedent;
int Vlue;                       /Valeur lue en A0
long Req;                     //Résistance équivalente
long R1;                      //Ancienne résistance équivalente
long R2;                      //Valeur de résistance insérée(ou désinsérée)
byte Nb_switches_on=0;         //Nombre de switches sur "ON"
byte Prev_nb_switches_on=0; //Nombre de switches sur "ON", précédent


void setup() {
 
  Serial.begin(9600);
}


void loop() {

 Vlue = analogRead(A0);

 if ((Vlue>Vprecedent+3) && (Nb_switches_on==0))
      {                                                                 //Cas du premier switch mis sur "ON"
   Nb_switches_on=1;
   Req=((1023*98)/Vlue)-98    //Calcul de la résistance associée au switch manoeuvré. La valeur de 98 correspond à la valeur précise
   R1=Req;                    // en Ohms de la résistance se trouvant entre A0 et GND. 1023 correspond à la "définition" de A0
   R2=R1;
   Vprecedent=Vlue;
   Serial.println("Cas du premier switch mis sur ON");
   Serial.println(R1);
   Serial.println(Vlue);   
      }
 else if ((Vlue>Vprecedent+3) && (Nb_switches_on>=0))
      {                                                                          //Cas d'un switch supplémentaire mis sur "ON"
   Nb_switches_on=Nb_switches_on+1;
   Req=((1023*98)/Vlue)-98;                                    //Calcul de la résistance associée au switch manoeuvré
   R2=(R1*Req)/(R1-Req);
   R1=Req;
   Serial.println("Cas d'un switch spplémentaire mis sur ON");
   Serial.println(R2);
   Serial.println(Vlue);   
   Vprecedent=Vlue;   
      } 
 else if (Vlue<Vprecedent-3 && Nb_switches_on>1)
      {                                                            //Cas d'un switch mis sur OFF et il reste au moins 1 switch sur "ON"
   Nb_switches_on=Nb_switches_on-1;
   Req=((1023*98)/Vlue)-98;
   R2=-(R1*Req)/(R1-Req);                             //Calcul de la résistance retranchée
   R1=Req;
   Vprecedent=Vlue;
   Serial.println("Cas d'un switch spplémentaire mis sur OFF");
   Serial.println(R2);
   Serial.println(Vlue);   
      }
 else if ((Vlue<Vprecedent-3) && (Nb_switches_on==1))
      {                                                                                //Cas du dernier switch mis sur "OFF "
   Nb_switches_on=Nb_switches_on-1;
   Req=0;
   R2=R1;
   R1=0;
   Vprecedent=Vlue;
   Serial.println("Cas du premier switch mis sur OFF");
   Serial.println(R2);
   Serial.println(Vlue);   
      }
 if (Prev_nb_switches_on != Nb_switches_on)    //Ici, début de la scrutation afin de connaître la valeur de résistance insérée ou retranchée
      {
        if ((R2>220) &&(R2<230))
      {
          Serial.println("Envoyer 3° commut");    //Par exemple, 3° commut, qui aurait eu un keyboard.pressKey(key)
      }   
   Serial.println("Mouvement de swich");
   Prev_nb_switches_on=Nb_switches_on;   
      }
delay(100);
   }
Mais quand j'ai fait des essais avec huit switches, en les mettant chacun leur tour sur "ON", j'ai eu ceci:
Valeur théorique          75      150     225      300     375     450    525    600
1 switch sur "ON"        73      149     224      302     380     456    533    609
2 switches sur "ON"     73      149     223      307     371     459    519    593  (le 1° sur "ON, puis chacun leur tour pour les 6 autres)
3 switches sur "ON"     73      149    217       294     351     431    551    630  (les deux 1° sur "ON, puis chacun leur tour pour les 5 autres)
4 switches sur "ON"     72      147    224       296     373     454    536    598  (les trois 1° sur "ON, puis chacun leur tour pour les 4 autres)

Ca va encore à peu près, mais quand on mettait les 8 switches sur "ON", alors les valeurs n'avaient plus rien à voir avec ce que j'attendais.

C'est pas grave, les SN74HC165N arrivent demain. Là, je pourrai mettre autant de switches que je voudrai, par paquets de huit.

Là où je bute, c'est dans les paths dans Lua (pardon, vslash, je fais mon possible) Lua est assez exotique par bien des aspects pour moi. Je continue les investigations.


Offline vslash

  • Jr. Member
  • **
  • Posts: 12
  • Karma: 4
Reply #79 - 19 January 2014, 20:41:04
Quote
Là où je bute, c'est dans les paths dans Lua (pardon, vslash, je fais mon possible) Lua est assez exotique par bien des aspects pour moi.
Je te rassure, c'est vraiment pas compliqué :
- LUA_PATH : liste de répertoires, séparé par des ';' où Lua recherchera où se trouve ses .dll. (ou autre)
- repertoire\? : ts les rep/fichiers derrière 'répertoire' (le ? sert à traduire : "tout ce qui se trouve derrière 'repertoire'"). Tu peux écrire par exemple : repertoire\xy? : tout ce qui se trouve derrière 'repertoire' et qui commence par 'xy'.

Ton LUA_PATH sert à expliquer à Lua où il se trouve lui même, où chercher ses librairies.
Lorsque tu indiqueras à Lua d'utiliser 'maLib', Lua recherchera le fichier 'maLib.dll' dans la liste des répertoires de LUA_PATH. Got it ? :o)
++


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #80 - 19 January 2014, 22:46:54
Je crois que je commence à comprendre.
De plus, j'ai pu exécuter un "require" avec succès en mettant "luars232.dll"
dans le répertoire "Orbiter 2010". =>Maintenant, je vais pouvoir faire des
comparaisons, en suivant tes prescriptions.
Encore merci!


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #81 - 20 January 2014, 21:12:36
J'ai pu obtenir une communication entre un script Lua lancé par un scn d'Orbiter et un registre à décalage commandé par la Uno.
8 LED sont branchées sur les sorties Q0 à Q7 du registre 74HC595.

Voici le script Lua, directement tiré de celui de Widdernix "talking to serial devices":
Code: [Select]
note = oapi.create_annotation()
note:set_pos (0.35,0.1,0.8,0.95)
note:set_colour ({r=0.9,g=0.5,b=0.2})


intro = "Essai de luars232"

note:set_text(intro)                            --Affichage à l'écran
proc.wait_sysdt(1.0)

rs232=require("luars232")                        --le fameux "require"
local port_name="COM4"                           --Port sur lequel la Uno est branchée
local e,p=rs232.open(port_name)                  --Ouverture du port COM4
if e ~= rs232.RS232_ERR_NOERROR then
term.out('',string.format("can't open serial port '%s', error: '%s'\n", port_name, rs232.error_tostring(e)))
    return
end
-- set port settings
assert(p:set_baud_rate(rs232.RS232_BAUD_9600) == rs232.RS232_ERR_NOERROR)
assert(p:set_data_bits(rs232.RS232_DATA_8) == rs232.RS232_ERR_NOERROR)
assert(p:set_parity(rs232.RS232_PARITY_NONE) == rs232.RS232_ERR_NOERROR)
assert(p:set_stop_bits(rs232.RS232_STOP_1) == rs232.RS232_ERR_NOERROR)
assert(p:set_flow_control(rs232.RS232_FLOW_OFF)  == rs232.RS232_ERR_NOERROR)

err, len_written = p:write("U")                 --écrire "U", soit chr$(85),vers la Uno. 85 en binaire, c'est 01010101. C'est le coeur du script.

note:set_text('Longueur Ècrite='..len_written)
proc.wait_sysdt(1)

assert(p:close() == rs232.RS232_ERR_NOERROR)  -- this closes the COM

note:set_text('End of program')
proc.wait_sysdt(1)
note:set_text('  ')
proc.wait_sysdt(1)

Dans le même temps, tourne sur la Uno le sketch suivant:
Code: [Select]
int dataPin=2;                                          //Pin 2 branché sur la patte 14 (DS)
int latchPin=3;                                                   //Pin 3 branché sur la patte 12 (ST_CP) c'est le LATCH
int clockPin=4;                                                   //Pin 4 branché sur la patte 11 (SH_CP)=>CLK
int i=0;
int data=255;                                                    // Avec data=255, allumage des 8 LED.




void setup()
  {
    pinMode (dataPin,OUTPUT);
    pinMode (latchPin,OUTPUT);
    pinMode (clockPin,OUTPUT);
    Serial.begin(9600);
  }
 
void loop()
{
    for (i=0 ; i<=13 ; i++)                      //Cette boucle est un vestige du sketch utilisé pour faire celui-ci
   {
    if (Serial.available()>0)                      //Si quelque chose arrive sur le port....
    {
    data=Serial.read();                            //Lire ce quelque chose
    }
    digitalWrite(latchPin,LOW);                          //Registre en remplissage
    shiftOut(dataPin, clockPin, LSBFIRST, data);  //Remplir registre avec data (8 bits)
    digitalWrite(latchPin, HIGH);                         //Registre en affichage=>LED allumées en fonction de la valeur data


   delay(150);
   }

}
Nota: Lancer le sketch Arduino avant le script Lua.


Comme le Script Lua a envoyé "U", soit 01010101, les LED vont s'éteindre pour les bits à 0 et rester allumées
pour les bits à 1 (Avec 255 au début, les 8 LED étaient allumées)

Bon, les registres 74HC165 sont arrivés aujourd'hui. J'ai plein d'expériences à faire!


Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #82 - 23 January 2014, 16:43:59
Bonjour les copains,
Je viens faire un petit tour pour vous commenter mes dernières expériences sur Arduino.
Je me suis "attaqué" à un module pas facile à maitriser : Un petit afficheur graphique couleur avec écran tactile. Bien que je n’en avais aucun besoin vraiment exprimé, et malgré sont coût, (Presque 50€) j’ai craqué, car j’avais vraiment envie de voir ce que ça donne. Après diverses expériences en me guidant avec des exemples trouvés sur Internet, je me suis lancé dans une vraie petite application : Un petit cadre photo numérique interactif.
L’idée consiste à placer une kyrielle de photographies dans une petite carte mémoire SD, le lecteur étant déjà implanté sur le SHEILD. Par exemple des images telles que celle qui est ci-dessous.



Puis, quand on caresse l’écran, faire apparaitre un clavier virtuel tel que celui-ci :



Ce clavier peut être ce que vous voulez, puisque c’est un simple dessin que j’ai réalisé sous PAINT.
Quand on touche du doigt sur les zones des touches, on déclenche une action sur le système. (Forcer le mode PAUSE. Toute action sur l’écran fait passer à l’image suivante. Imposer le mode affichage aléatoire, changer la durée d’attente entre chaque image …)
Naturellement, mis à part l’avoir à bord du Arrow pour agrémenter les longs vols interplanétaires vous ne voyez pas vraiment l’intérêts pour Orbiter.

Ben si ! Comme on peut se faire une palanquée d’images sous PAINT, on pourrait imaginer un premier clavier virtuel dont les touches vectoriseraient vers RCS, MAIN, MFD etc. Puis, cliquant sur la touche "RCS" ou ouvrirait un autre clavier virtuel spécialisé. Ce que je trouve agréable dans une telle approche, c’est que l’on peut donner aux touches virtuelles des formes, des couleurs quelconques. Ceci dit, mon application fonctionne bien, mais il reste encore des pistes à débroussailler.

>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>>><<<<<<<<<<<<<<<<<<<<<<<<<<

Ce qui suit n’a rien à voir avec l’application précédente, mais peut donner des idées à certains.
Chaque fois que sur Arduino on désire utiliser un afficheur quelconque, par exemple un petit écran LCD alphanumérique, on désirerait l’avoir bien positionné et bien orienté pour voir l’écran confortablement quand on programme. Si la carte Arduino est simplement posée, on a les pires difficultés à la caler à la bonne orientation. Comme j’en avais assez de placer les objets les plus hétéroclites pour stabiliser mon Arduino, j’ai réservé une petite journée à me réaliser le petit support ci-dessous :



Sur cette image le support est vu par l’arrière. L’écrou papillon que vous voyez à droite permet d’orienter à convenance le support du module Arduino entre la verticale et l’horizontale, donc sans limitation par rapport à l’usage. Sur cette image le SHEILD écran tactile est inséré sur Arduino.
Ci-dessous, une autre vue dans laquelle le support à été posé "basculé" pour bien voir son architecture en chape.



On distingue la platine Arduino proche de la plaque blanche, et sur celle-ci le module écran tactile. Notez que j’ai "coincé" la liaison USB entre Arduino et la plaque support sur laquelle il est immobilisé. D’une part ça évite de "triturer" la prise quand on le déplace, et surtout ça la dirige du coté qui sur mon bureau est plus facilement dégagé, compte tenu de la position qu’occupe mon dispositif.
Pour clore ce petit descriptif, une autre image du support, le module SHIELD a été enlevé.



Amicalement : Nulentout.

La sagesse est un trésor ... tellement bien caché.

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #83 - 23 January 2014, 19:24:35
 Superbe application pour une Arduino!! J'en suis  :bave:
C'est vraiment génial. Bra-vo!!
Comme tu l'as dit, l'application pour Orbiter est un simpit pour l'Arrow.
Ca pourrait être bô...


Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #84 - 23 January 2014, 21:50:00
Simpit ... ? quoi ça veut dire ça ? :)

La sagesse est un trésor ... tellement bien caché.

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #85 - 24 January 2014, 08:20:03
C'est vrai que je suis un peu dans mon délire...
C'est un raccourci de simucockpit, un cockpit associé à un simulateur.

Dans http://orbiter-forum.com/showthread.php?t=30057, ao7g
est en train de monter son installation. C'est pas mal du tout.


Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #86 - 24 January 2014, 10:38:52
Simpit ... mais c'est asta !

La sagesse est un trésor ... tellement bien caché.

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #87 - 25 January 2014, 14:15:15
Alors, là, c'est à moi de demander: c'est quoi, asta?

American Spice Trade Association?
Association Sportive des Toujours Actifs?
American Society of Travel Agents?


Offline antoo

  • Legend
  • ******
  • Posts: 3660
  • Country: France fr
  • Karma: 179
  • MSFS ❤️
Reply #88 - 25 January 2014, 19:16:15
Ah là là ce Nulentout alors! Dès qu'il a un truc dans les mains, il en fait une merveille :)

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961

Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #89 - 26 January 2014, 09:48:21
Alors, là, c'est à moi de demander: c'est quoi, asta?

American Spice Trade Association?
Association Sportive des Toujours Actifs?
American Society of Travel Agents?

Haaaa, c'est mon coté un peu espiègle. :)
ASTA, c'est une expression qu'utilisait la jeunesse il y a pas mal d'années qui résulte de la contraction :
C'EST A SE TAPPER LE CUL PAR TERRE ! :)

La sagesse est un trésor ... tellement bien caché.

Offline antoo

  • Legend
  • ******
  • Posts: 3660
  • Country: France fr
  • Karma: 179
  • MSFS ❤️
Reply #90 - 26 January 2014, 12:43:18
Moi ze connaît cette expression :) et z'ai 18 ans

---------------------------------------------------------------------------------------------------
"ET C´EST PARTI!!" Youri Gagarine au lancement de vostok 1 le 12 avril 1961

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #91 - 26 January 2014, 13:05:26
Quote
De Nulentout:
C'EST A SE TAPER LE CUL PAR TERRE ! :)
Ah, ben toâtoâ, alors! 


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #92 - 28 January 2014, 21:20:15
Pour afficher des valeurs par l'intermédiaire de displays 7 segments, j'ai idée de prendre
une donnée au moyen du script Lua. Par exemple: alt=v:get_altitude().
Ensuite, le script Lua séparera les milliers des centaines, dizaines  et unités (digits).
Chaque digit est transformé en un 1/2 octet (4 bits), concaténé, et envoyé dans
la Uno qui va placer tout ça dans des registres à décalage connectés à des circuits BCD
eux-mêmes connectés à des afficheurs 7 segments.
"It's a long way from home...."

Pour l'altitude ou le nombre de Mach, ça va, mais je voudrais aussi afficher le cap, ainsi
que le nombre de G encaissés. Là, je n'ai pas vu grand chose.
J'ai bien essayé:
                       hp=oapi.get_objhandle('Earth')
                       pos=oapi.get_relativepos(hp), et j'ai baladé mon vaisseau partout à la
surface du globe terrestre afin de relever les trois coordonnées contenues dans pos.
Mais les valeurs relevées ne me donnent pas de clé pour établir une position LaLo...
Avec LaLo, je peux obtenir des vitesses et donc des accélérations.
Je vois bien que sur le MFD Surface, il y a plein d'infos qui seraient utiles, mais comment
les sortir de là? :wonder:

Si quelqu'un a une idée ou connaît quelque chose là dessus, je suis tout ouïe!


Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #93 - 08 February 2014, 20:26:57
Salut, tout le monde.
J'ai continué mes investigations sur des afficheurs numériques commandés par
Orbiter.
J'ai choisi d'afficher le nombre de Machs sur 2 displays dans une gamme de 0 à 9,9.
Pour l'instant, deux displays, c'est déjà assez touffu comme ça.

Le script LUA est le suivant:

Code: [Select]
-- A giant leap for a man, a small step for mankind!!
note = oapi.create_annotation()
note:set_pos (0.35,0.1,0.8,0.95)
note:set_colour ({r=0.9,g=0.5,b=0.2})


intro = "Machmètre sur 2 displays 7 segments"

note:set_text(intro)
proc.wait_sysdt(1.0)
v=vessel.get_interface('XR2-01')
rs232=require("luars232")
local port_name="COM4"
local e,p=rs232.open(port_name)
if e ~= rs232.RS232_ERR_NOERROR then
term.out('',string.format("can't open serial port '%s', error: '%s'\n", port_name, rs232.error_tostring(e)))
    return
end
-- set port settings
assert(p:set_baud_rate(rs232.RS232_BAUD_9600) == rs232.RS232_ERR_NOERROR)
assert(p:set_data_bits(rs232.RS232_DATA_8) == rs232.RS232_ERR_NOERROR)
assert(p:set_parity(rs232.RS232_PARITY_NONE) == rs232.RS232_ERR_NOERROR)
assert(p:set_stop_bits(rs232.RS232_STOP_1) == rs232.RS232_ERR_NOERROR)
assert(p:set_flow_control(rs232.RS232_FLOW_OFF)  == rs232.RS232_ERR_NOERROR)


repeat
  alt=oapi.get_altitude()
  mach = v:get_machnumber()
  mach_display=math.floor(10*mach)
  hundred=math.floor(mach_display/100)
  mach_display=mach_display-100*hundred
  ten=math.floor(mach_display/10)
  mach_display=mach_display-10*ten
  unit=mach_display
  byte1=unit+16*ten
  byte2=hundred
  note:set_text(byte2.."  "..byte1.."  "..hundred..ten..unit)
  if unit~=old_unit then
    err, len_written = p:write(string.char(byte2)..string.char(byte1))
  end
  old_unit=unit
  proc.skip()
until alt>10000                     --On sort si l'altitude >10000 mètres. Il faut sortir "proprement", sinon
                                           --plus moyen d'utiliser le port COM4 à moins de faire un arrêt-redémarrage
                                           --de l'ordinateur
note:set_text('Longueur Ecrite='..len_written)
proc.wait_sysdt(1)

assert(p:close() == rs232.RS232_ERR_NOERROR)-- this closes the COM

note:set_text('End of program')
proc.wait_sysdt(1)
note:set_text('  ')
proc.wait_sysdt(1)

Le sketch suivant tourne dans la Uno :

Code: [Select]
int dataPin=2;
int latchPin=3;
int clockPin=4;
int data=255;
byte octet1;
byte octet2;



void setup()
  {
    pinMode (dataPin,OUTPUT);
    pinMode (latchPin,OUTPUT);
    pinMode (clockPin,OUTPUT);
    Serial.begin(9600);
  }
 
void loop()
{

    if (Serial.available()>0)
    {
    octet1=Serial.read();
    octet2=Serial.read();
    digitalWrite(latchPin,LOW);
    shiftOut(dataPin, clockPin, LSBFIRST, octet1);
    shiftOut(dataPin, clockPin, LSBFIRST, octet2);
    digitalWrite(latchPin, HIGH);

    }

   delay(150);
}


Au décollage, on voit les chiffres de la vitesse en 1/10 de Mach et les Machs défiler
sur les deux displays.


La photo du montage. C'est touffu...



La breadboard du haut contient 2 registres à décalage et les LED matérialisant leur état.
Celle du bas supporte les deux afficheurs 7 segments et leur 4543 respectifs.


J'ai des difficultés de bien sortir de la boucle du script Lua. Si on ne sort pas
proprement, le port COM4 utilisé par la Uno n'est plus accessible car non fermé. Pour récupérer
sa disponibilité, il faut faire un arrêt-redémarrage de l'ordinateur. Peut-être existe-t-il
une autre façon de récupérer cette dispo?

Pour extraire le cap dans un script Lua, j'ai trouvé dans la doc: c'est yaw=v:get_yaw en
Radians. Pour avoir les degrés, multiplier par 360/(2*pi).

Les investigations continuent!!

Mars Bleu


« Last Edit: 09 February 2014, 09:59:01 by Mars Bleu »

Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #94 - 11 February 2014, 16:25:40
Coucou les copains,
Bon, ce n'est pas directement lié à Orbiter, mais j'ai un petit problème de logique que je n'arrive pas à régler !

Toujours dans le but d’expérimenter avec Arduino je me suis engagé dans un petit projet « amusant » qui comme trop souvent semble élémentaire au début et finit par vous ruiner le moral : Réaliser une maquette de bateau et le barrer automatiquement. C’est un projet relativement élémentaire qui dans sa structure de base comporte :
1) Un compas magnétique dont je sais lire l’orientation magnétique entre 0 et 360°.
2) Un Servomoteur dont je sais positionner le palonnier à ma convenance.
3) Un potentiomètre avec un bouton flèche que je peux orienter sur une échelle circulaire comprise entre 0 et 360° et qui définit à Arduino le CAP DÉSIRÉ.



L’idée de base est élémentaire, du moins si c’est un bateau à moteur et non un voilier qui peut se « planter face au vent ». Donc pour simplifier, je donne une consigne de CAP sur le bouton, par exemple 33°. La procédure qui utilise la boussole retourne 225°. Il suffit de faire tourner mon bateau jusqu’à ce que la route soit égale au CAP consigné. (En fait j’introduis une zone neutre pour ne pas que le moteur ne passe son temps à surcompenser, mais oublions)
MON PROBLÈME : Il m’est extrêmement facile d’imposer à la barre une déviation qui va en diminuant au fur et à mesure que l’écart de route s’amenuise.
MAIS … La logique la plus immédiate impose de faire tourner mon « navire » du coté angulaire le plus faible. JE N’ARRIVE PAS A TROUVER UN ALGORITHME qui déduit le sens de rotation (A bâbord ou à tribord) en fonction de la consigne de CAP et la ROUTE actuelle.
ATTENTION : Surtout ne répondez pas trop rapidement. Le problème semble élémentaire, mais ça fait plusieurs heures que je triture mes méninges sans parvenir à une solution … qui fonctionne dans tous les cas vous l’avez deviné.
Quékun aurait-il une idée ?
Exemples CAP 300, ROUTE 25 : Barrer à gauche.
CAP 186, ROUTE 20 : Barrer à droite etc.
Et ça doit fonctionner pour toutes les combinaisons possibles.
P.S : Si mon bateau est un voilier, pour les virements face au vent et les instabilités de route au vent arrière je me débrouillerai. 

La sagesse est un trésor ... tellement bien caché.

Offline hysot

  • Full Member
  • ***
  • Posts: 120
  • Country: Canada ca
  • Karma: 8
Reply #95 - 11 February 2014, 18:53:30
Salut les gars! Vraiment pas le temps en ce moment :/
J'ai pas tout lu mais je vois que mon sujet est toujours en vie et que vous l'enrichissez de merveilleuses données!! continuez la communauté en a grand besoin!! Un grand merci a vous.
Hysot!

hysot

Offline Mars Bleu

  • Hero Member
  • *****
  • Posts: 638
  • Karma: 33
Reply #96 - 12 February 2014, 18:27:02
@ Nulentout:J'ai vu ton post pour un pilote auto de la barre de direction.
Après y avoir pensé toute la journée, hé bé, j'ai vu que, au
final, ça n'était pas si évident que ça.... Pour moi, la difficulté
serait lorsqu'on est dans une config où l'avant du bateau doit
passer par le Nord. Dès que j'ai une piste, je t'en fais part.

@hysot: patience, patience!

Sinon, j'ai fait quelques modifs dans mon script: ouverture du
port COM4 uniquement lorsqu'on doit envoyer quelque chose
dans les registres à décalage. Il est fermé le reste du temps, ce
qui permet de sortir proprement de Orbiter.


Offline dal

  • Jr. Member
  • **
  • Posts: 30
  • Karma: 0
Reply #97 - 16 February 2014, 15:13:43
Nulentout,
Apres réflexion sur ton problème, voila ce a quoi je parviens :
si (route+180) > cap => vire a droite
si (route+180) < cap => vire a gauche.
En espérant que cette solution te convienne.


Offline Fox-Terrier

  • League of
  • Legend
  • ******
  • Posts: 1426
  • Country: Switzerland ch
  • Karma: 28
  • :D
Reply #98 - 16 February 2014, 22:11:06
zut ! Dommage d'avoir raté ton message Nulentout ! :damn:
Je confirme, c'est bien la réponse précédente, sans oublier l'opération % qui donne le reste de la division :

Code: [Select]
si (route+180)%360 > cap :
    vire à droite
sinon :
    vire à gauche

La première chose à laquelle j'avais pensé était un poil différente ^^

Code: [Select]
si (route - dest)%360 > 180 :
     vire à droite
sinon :
     vire à gauche

si les modulos n'existent pas sur l'arduino :

Code: [Select]
si route - dest < 0 :
    si route - dest + 360 > 180 :
         vire à droite
    sinon : vire à gauche
sinon :
    si route - dest > 180 :
        vire à droite
    sinon : vire à gauche

J'espère ne pas m'être embrouillé dans les signes et de t'avoir aidé ;) amuse toi bien !


Offline nulentout

  • Legend
  • ******
  • Posts: 3360
  • Country: France fr
  • Karma: 246
Reply #99 - 17 February 2014, 10:40:12
Coucou les copains,
Avec Modulo, je n'ai pas réussi, il y a toujours des cas "hostiles".
J'ai une solution lourde qui fonctionne. Je teste 12 combinaisons par quadrants. Elle fonctionne, mais c'est un peu laborieux comme listage.
Sur le Forum Arduino en Français on m'a donné plusieurs pistes. L'une d'elles semble fonctionner, mais il faut encore que je la teste dans ses derniers retranchements.
Donc pour le moment j'ai une solution, ne vous prenez pas la tête avec ça, d'autant plus que pour moi ce n'est pas un vrai projet, c'est juste un amusement de programmeur ... pour ne pas perdre la main.
Encore merci pour y avoir réfléchi.
Amicalement : Nulentout.

La sagesse est un trésor ... tellement bien caché.