Forum des utilisateurs de Blockly(s)

Blockly@rduino => Améliorations à apporter => Discussion démarrée par: satalfa le mars 20, 2017, 09:43:28 pm

Titre: Bloc loop()
Posté par: satalfa le mars 20, 2017, 09:43:28 pm
Salut à tous,

Je trouve qu'il manque un bloc loop() correspondant à celui de base des sketch Arduino.

Bien sûr, le code qu'on place de façon libre dans l'espace des blocs, se retrouve naturellement dans cette boucle loop. Et  l'ordre dans lequel ils y arrivent semble lier à leur position, les uns par rapport aux autres.

Mais alors qu'il y a un bloc setup(), clairement lancé 1 fois au démarrage du programme, je trouve plus logique de placer les autres instructions dans un autre bloc loop().

Dans App Inventor (autre belle réalisation faite avec blockly   :D), on peut placer des blocs libres. Mais sur Android, le système permet la programmation événementielle.
C'est à dire des bouts de codes différents, placés dans des blocs, qui peuvent être exécutés dans un ordre quelconque (clic sur un bouton, choix dans une liste, etc...)

Alors que sur Arduino, on fonctionne plutôt en programmation procédurale (un code exécuté du haut, jusqu'en bas). D'où l'idée de placer ce code dans un bloc commun.
Sauf bien sûr, les procédures et fonctions, naturellement placées en dehors.

Il existe un bloc setup + loop. Mais pour le coup, je le trouve trop rigide. On se retrouve avec un seul énorme bloc...

Je ne sais pas ce que vous en pensez... et je mesure mal ce que ça implique vis à vis du code, et donc si c'est compliqué à faire...

A+
Olivier H

Titre: Re : Bloc loop()
Posté par: SebCanet le mars 20, 2017, 10:30:00 pm
Merci de ce genre de questions qui permet de se questionner sur "qu'est ce qu'on veut pour les élèves ?".
Dans l'absolu un bloc loop est rapide à faire, après c'est plus savoir si 'est intéressant pédagogiquement.
Dans le tableau des fonctions que j'ai lancé (http://blockly.technologiescollege.fr/forum/index.php/topic,81.msg398.htm (http://blockly.technologiescollege.fr/forum/index.php/topic,81.msg398.htm)), tu verrais les choses comment ?
Titre: Re : Bloc loop()
Posté par: satalfa le mars 20, 2017, 11:10:14 pm
Je ne connais pas mBot. Mais ce découpage, qui permet différents niveaux d'utilisation me parait très bien.
Cela signifierait que l'utilisateur (ou le prof qui connecte au site) choisit le niveau en chargeant la bonne catégorie de blocs ? C'est bien ça ?
Je trouve ça bien. Un moyen de s'adapter à tous les niveaux.
Et le découpage que tu propose parait juste.

Souhaiterais tu le généraliser à plus de blocs ou famille de bloc possible (grove et autre) ?
Titre: Re : Bloc loop()
Posté par: jbe le mars 21, 2017, 12:24:18 am
Un programme commence par un début, et les instructions s'enchaînent les unes derrières les autres, dans l'ordre que tu as mis tes blocs.

Ce que tu demandes s'appelle de la programmation événementielle.
Et là, ça bloque, car on  utilise une carte Arduino, et faire de la programmation événementielle avec une carte Uno n'est possible que si l'on travaille en interruption, soit sur 2 entrées.

Avec AP Inventor, le programme tourne sur un smartphone, qui est beaucoup plus puissant qu'une carte Uno. Ce programme, qui  s'exécute très rapidement, donne donc l'impression de faire de la programmation événementielle. Scratch permet aussi de faire ce genre de programmation, mais tu as une machine puissante ( un PC) qui exécute tout ceci très rapidement ...

Peut être avec une carte Arduino Mega on a plus d'interruption et on pourrait s'en approcher... mais on sera toujours limiter au nombre d'interruption disponible sur le micro contrôleur.


Titre: Re : Bloc loop()
Posté par: satalfa le mars 21, 2017, 10:36:27 am
On s'est mal compris, jbe, je pense.

Je dit la même chose que toi .

C'est bien parce que la programmation de l'Arduino est préocédurale (sauf effectivement à bidouiller avec les interruptions) que je souhaite avoir un bloc loop(), plutôt qu'une série de blocs posés dans l'interface qui donne l'impression qu'on est en programmation événementielle.
Auquel cas le programme de l'Arduino se retrouverait dans ce bloc loop(), à l'image du code réel généré pour l'Arduino.

A+
Olivier H
Titre: Re : Bloc loop()
Posté par: SebCanet le mars 21, 2017, 03:54:35 pm
C'est fait pour le choix 'TOUT' !

A tester absolument pour vérifier qu'il n'y a pas d'interférences...

Sinon pour répondre vite :
Cela signifierait que l'utilisateur (ou le prof qui connecte au site) choisit le niveau en chargeant la bonne catégorie de blocs ? C'est bien ça ?
-> c'est l'objectif de cette sélection de niveau de catégories

Je trouve ça bien. Un moyen de s'adapter à tous les niveaux.
-> que les plus petits aussi puissent s'amuser.

Et le découpage que tu propose parait juste.
Souhaiterais tu le généraliser à plus de blocs ou famille de bloc possible (grove et autre) ?
-> OUI ! Et ainsi faire un peu le tri. Le tbaleau doit être ouvert en écriture, donc tout le monde pourra y inscrire ses blocs et permettra de nettoyer les toolbox.
Titre: Re : Bloc loop()
Posté par: jbe le mars 22, 2017, 04:39:42 pm
OK, on s'est très mal compris, car ce que tu veux est un peu "hors norme", et j'avais compris autre chose. Désolé.

Mais si admin  arrive a faire ce dont on vient de parler, alors là Blockly@rduino va devenir un incontournable.


Que veut dire : " aller dans Tout", et que faut il choisir ?
Titre: Re : Bloc loop()
Posté par: fontaine.jp le mars 23, 2017, 08:56:26 am
Salut,
Est ce que c'est ça que tu veux ?
Si oui je mettrais le code.
Titre: Re : Bloc loop()
Posté par: satalfa le mars 23, 2017, 09:51:33 pm
Oui, c'est exactement ça.
Merci pour ta réaction rapide.

A+
Olivier H
Titre: Re : Bloc loop()
Posté par: fontaine.jp le mars 23, 2017, 11:51:42 pm
Ok  voici le code du bloc :
Blockly.Blocks.base_loop = {
  init: function () {
        this.setColour(Blockly.Blocks.arduino.HUE);
   this.setHelpUrl(Blockly.Msg.HELPURL);
        this.appendDummyInput().appendField("boucle");
        this.appendStatementInput('LOOP').appendField("");
        this.setTooltip("");
    }
};

et le code generators :
Blockly.Arduino['base_loop'] = function(block) {
  function statementToCodeNoTab(block, name) {
    var targetBlock = block.getInputTargetBlock(name);
    var code = Blockly.Arduino.blockToCode(targetBlock);
    if (!goog.isString(code)) {
      throw 'Expecting code from statement block "' + targetBlock.type + '".';
    }
    return code;
  }
  var loopBranch = statementToCodeNoTab(block, 'LOOP');
  return loopBranch;
};

Voila ;-)