Sorry, you must be logged in to use the shoutbox!

Auteur Sujet: Ajout de nouveaux exemples  (Lu 1659 fois)

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Ajout de nouveaux exemples
« le: octobre 24, 2017, 12:36:52 am »
Etant donné que c'est les vacances et que je dois me préparer pour le lancement de mon fablab au collège d'ici 15 jours, je m'amuse avec les différents projets du starter kit d'Arduino.

Du coup, je crée en même temps les exemples correspondants à chaque projet du kit sur mon site. Bien entendu je les proposerai pour une intégration à la solution complète. Au passage, ça me permet de repérer de petits défauts sur certains blocs au niveau de la génération du code. Je ferai un bilan complet avec solution possible à l'appui une fois que j'aurai fini l'ensemble des projets.

J'ajouterai également ensuite les exemples pour mon module RFID. Et il n'est pas exclu que je crée d'autres exemples encore pour les nouveaux blocs que je compte créer sous peu.

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 442
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #1 le: octobre 27, 2017, 03:58:05 pm »
Excellent ! Merci beaucoup.
Je prépare aussi un dépôt de montages en utilisant Hackpoint : https://github.com/ldleman/hackpoint

Mais pour l'instant il faut que je nettoie mes hébergements...
« Dernière modification: octobre 29, 2017, 11:52:33 pm par SebCanet »

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #2 le: octobre 31, 2017, 05:40:11 pm »
Premier bilan à la suite de la création des exemples.
Je présente ici déjà quelques modifications possibles à intégrer par la suite si cela te va Seb. Dès que tu valides un truc, je relance via github la modif à apporter derrière.

1) Pb de déclaration avec le bloc suivant :

Le bloc ne déclare pas la broche en tant que sortie dans le setup.
Code généré avant modification :
void setup() {
 
}

void loop() {
  analogWrite(1, 0);
}
Code généré après modification :
void setup() {
  pinMode(1, OUTPUT);
}

void loop() {
  analogWrite(1, 0);
}

2) Pb de déclaration avec le bloc suivant :  (faux et inutile comme expliqué plus bas)

Il y avait une erreur de vérification dans le code. Au lieu de vérifier si la broche entrée était bien une broche analogique, le code testait si c'était une broche PWM. Il était donc impossible de déclarer une broche "A0" comme je l'ai fait ci-dessus.

3) Possibilité de déclarer les sorties à l'aide d'une variable et d'une boucle dans le setup

Code généré avant modification :
void setup() {
    pinMode(i, OUTPUT);
    for (i = 1; i <= 10; i=i+1) {
    digitalWrite(i, HIGH);
  }
}
Code généré après modification :
void setup() {
    for (i = 1; i <= 10; i=i+1) {
    pinMode(i, OUTPUT);
    digitalWrite(i, HIGH);
  }
}

4) Typer une variable en l'initialisant

Il était impossible de déclarer le type d'une variable en l'initialisant et j'ai donc modifié le bloc comme tu peux le voir ci-dessus.
Code généré :
int i = 0;
5) Définition d'une broche comme entrée/sortie

Le bloc ci-dessus est disponible dans Arduino > Entrées alors qu'il est valable aussi pour les sorties. Je propose de le déplacer à la racine d'Arduino et de remplacer le texte par "Configurer la broche... en tant que...". Au niveau collège, je ne pense pas que ce bloc soit nécessaire vu qu'on le déclare en général de façon cachée à l'aide des blocs mais cela peut toujours servir à un niveau supérieur.

6) Bloc constante
Ce bloc est codé en dur et n'est donc pas disponible dans les autres langues que français. En ajoutant quelques constantes dans les fichiers lang (fr, eng), on peut facilement corriger ce souci. Je l'ai fait sur mon site.

7) Bloc pour initialiser un tableau

Code généré :
int notes[] = {262, 294, 330, 349};
8/ Bloc pour jouer un son sans préciser de durée

Dans certains cas, il n'est pas utile de préciser la durée d'un son avec la fonction tone et j'ai du coup créé ce bloc complémentaire.
Code généré :
tone(8,150);
« Dernière modification: novembre 01, 2017, 12:25:55 pm par g.reich »

Bzhtitude

  • Full Member
  • ***
  • Messages: 105
  • Ad astra ...
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #3 le: octobre 31, 2017, 07:50:39 pm »
Salut, j'aime bien les modifications que tu vas apporter, je n'en doute pas ;) particulièrement la N°4

Je ne comprends pas la modification N°1 et N°2, si tu veux sortir un octet sur une sortie "analogique" c'est forcement une broche supportant le PWM? non ?

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Re : Re : Ajout de nouveaux exemples
« Réponse #4 le: octobre 31, 2017, 08:49:07 pm »
Salut, j'aime bien les modifications que tu vas apporter, je n'en doute pas ;) particulièrement la N°4

Je ne comprends pas la modification N°1 et N°2, si tu veux sortir un octet sur une sortie "analogique" c'est forcement une broche supportant le PWM? non ?

Sur le n°1, seul le code arduino généré derrière est changé, visuellement rien ne change. Regarde le code avant et après pour voir la différence.

Pour le n°2. Tu as effectivement raison. En fait, les broches analogiques A0~A5 sur l'Arduino UNO ne peuvent être utilisées qu'en entrées et du coup la fonction analogWrite qui permet d'envoyer une valeur analogique à une sortie ne fonctionne que pour les broches numériques compatibles PWM. Du coup, je m'interroge sur la pertinence de conserver "écrire sur la broche analogique" si on a des blocs "mettre la broche PWM" qui font la même chose !?
« Dernière modification: octobre 31, 2017, 09:22:29 pm par g.reich »

Bzhtitude

  • Full Member
  • ***
  • Messages: 105
  • Ad astra ...
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #5 le: octobre 31, 2017, 11:14:14 pm »
Pour le code du N°1, tu as raison, il manquait le setup de la broche mais ça lève un petit soucis qui provient du pinout des arduino.. je met le lien d'une image de ce casse-tête ( à mon avis ) ce qui fait que l'écriture de bloc comme dans la modification N°1 peut être "embêtant" car on ne va pas du tout obtenir ce que 'on souhaite. (écrire en analogique sur la broche 1 ou A1 --> bizarre)

https://www.allaboutcircuits.com/uploads/articles/Arduino_UNO_R3_Pinout.jpg

Pour les entrées A0-A5 : on peut très bien les utiliser en entrées mais seulement en digitale (0/1) ce qui relève encore une fois du pinout et de la numérotation choisis par Arduino.

Pour la pertinence d'avoir 2 blocs qui font la même chose , ça se discute selon le niveau des utilisateurs, j'utilise Blockly en première et terminale dont pour moi c'est "naturellement" les blocs avec PWM, car je vois la notion en cours. Mais si je devais l'utiliser en collège, j'utiliserai surement l'autre car pas besoin de définir la "mécanique" qui se cache derrière.
« Dernière modification: octobre 31, 2017, 11:17:06 pm par Bzhtitude »

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #6 le: novembre 01, 2017, 10:17:21 am »
Pour le n°1, je suis d'accord avec toi, on peut se retrouver avec une erreur si on tente d'écrire sur la broche 1. Mais le pb demeure même sans ma modification car il n'y a pas de vérification du numéro de broche avec ce bloc. Peut-être vaut-il mieux supprimer ce bloc pour ne conserver que le second qui lui vérifie l'entrée ?

Pour les broches A0~A5, j'imagine que tu voulais dire en sortie numérique (digital) plutôt. Effectivement on peut utiliser la numérotation 14~19 dans ce cas.

Pour la pertinence, je te rejoins sur les différents publics. Dans ce cas, il faudrait p-e faire apparaître l'un ou l'autre seulement en fonction du profil souhaité (débutant, habitué, confirmé, expert). Là, actuellement on a les 2.

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 442
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #7 le: novembre 01, 2017, 02:44:34 pm »
Bonjour tout le monde,
un grand merci pour cet excellent travail. Surtout que là tu commences à accrocher sur le fond, de ce que chaque bloc doit faire.

1. je l'avais corrigé apparemment, sur mon poste c'est déjà corrigé
2. voilà le pb du vocabulaire soulevé...et donc de quel bloc garder pour quel niveau. J'avais exprès mis les 2 pour permettre d'expliquer ou pas, au choix du prof. Tout comme la déclaration automatique du setup ou pas. En regardant le niveau 4 du mBot vous verrez mieux.
3. super, bien vu
4. exact, je n'avais pas fini  mon travail là-dessus, je voulais rendre le typage dynamique pour éviter de devoir typer la variable comme pour le bloc de constante. Si je n'y arrive pas je resterai sur ce principe, tant pis.
5. il y a aussi dedans le pull_up, c'est pour ça que j'étais que sur les entrées.Mais tu as raison pour le remonter d'un cran. Et ce que tu dis sur le niveau collège c'est le pb de n'avoir jamais trouvé le temps de trier l'existant en fonction des niveaux 1, 2, 3 et 4...
6. encore un truc que j'ai fait à l'arrache...merci de rectifier. Mais il en reste encore d'autres...
7. merci pour le nouveau bloc, super utile.
8. merci

Pour les broches numériques 14 à 19 j'avais complètement oublié ce cas de figure ! Nom de Zeus quel bordel pour les petits...
Je remplacerais bien la photo actuelle de l'Arduino Uno par celle que propose Bzhtitude, qu'en pensez vous ?
Ensuite il faudra vraiment que je me penche sur l'idée des niveaux mais j'avais besoin d'aide pour ça : https://framacalc.org/=Blocklyrduino

A terme, l'idée serait de créer une moulinette automatique quand on créé un bloc afin qu'il n'apparaisse que dans le niveau choisi par le créateur du bloc. Mais ça sera dans un bout de temps car là il y a trop de boulot...

Merci encore à g.reichpour tout ce travail de fourmi. N'hésite pas à envoyer sur Github !!!

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Re : Re : Ajout de nouveaux exemples
« Réponse #8 le: novembre 01, 2017, 05:38:19 pm »
Merci encore à g.reichpour tout ce travail de fourmi. N'hésite pas à envoyer sur Github !!!

je te soumets tout ça en pull request ? Si je dis pas de bêtise, mon 3 répond à une issue (#25) encore ouverte.

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 442
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #9 le: novembre 02, 2017, 01:33:35 pm »
Oui, merci.

fontaine.jp

  • Full Member
  • ***
  • Messages: 103
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #10 le: novembre 03, 2017, 12:02:13 am »
Salut,
g.reich a fait du bon travail et ça m'a donné une idée pour le n°7
qu'en pensez-vous ?

SebCanet

  • Administrator
  • Sr. Member
  • *****
  • Messages: 442
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #11 le: novembre 03, 2017, 12:34:48 am »
Excellent !!!
Merci. Ca va bien compléter cette catégorie.

g.reich

  • Newbie
  • *
  • Messages: 33
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #12 le: novembre 03, 2017, 09:40:31 am »
joli fontaine.jp.
Le coup du choix entre le contenant ou le nombre d'éléments est bien pensé.

Pour un niveau 2, c'est parfait. Le mien pourra servir aux niveaux supérieurs.

Questions :
- Cela gère comment le nom du tableau dans ton cas ? Cela crée une variable ?
- Et le bloc pour la liste, c'est un existant ou un nouveau aussi ? Je demande car au final c'est la même chose que le bloc existant utilisé dans mon exemple non ?

fontaine.jp

  • Full Member
  • ***
  • Messages: 103
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #13 le: novembre 03, 2017, 10:40:20 pm »
Salut,
 - le nom du tableau est géré par une variable
 - l'autre bloc est identique je l'ai juste remanié
bloc :
Blockly.Blocks["creer_tableau"]={init: function(){
this.appendDummyInput()
.appendField(Blockly.Msg.ARRAY_create)
.appendField(new Blockly.FieldVariable("liste"), 'VAR');
this.appendDummyInput()
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(Blockly.Msg.VARIABLES_AS)
.appendField(new Blockly.FieldDropdown(Blockly.Types.getValidTypeArray()), "type");
this.appendValueInput("contenu")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.ARRAY_taille,"c1"],[Blockly.Msg.ARRAY_contenu,"c2"]]), "choix");
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour("#804000");
this.setTooltip(Blockly.Msg.ARRAY_GETINDEX_TOOLTIP2);
this.setHelpUrl(Blockly.Msg.HELPURL);}
};
generator :
Blockly.Arduino['creer_tableau'] = function(block) {
    var argument0 = Blockly.Arduino.valueToCode(block, 'contenu', Blockly.Arduino.ORDER_ASSIGNMENT) ;
var varName = Blockly.Arduino.variableDB_.getName(block.getFieldValue('VAR'), Blockly.Variables.NAME_TYPE);
var typeBlock = Blockly.Arduino.getArduinoType_(Blockly.Types[block.getFieldValue('type')]);
var menu = block.getFieldValue("choix");
switch (menu) {
        case "c1":
            Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '['+argument0+'] ;';
break;
        case "c2":
            Blockly.Arduino.variables_[varName] = typeBlock + ' ' + varName + '[] = '+argument0+' ;';
break;
}
return '';
};
lang :
Blockly.Msg.ARRAY_CREATE_EMPTY_TITLE='vide !';
Blockly.Msg.VARIABLES_AS="de type";
Blockly.Msg.ARRAY_CREATE_WITH="constituée de";
Blockly.Msg.ARRAY_taille="de taille";
Blockly.Msg.ARRAY_contenu="qui contient";
Blockly.Msg.ARRAY_CREATE_WITH_CONTAINER_TITLE_ADD="liste ou tableau";
Blockly.Msg.ARRAY_CREATE_WITH_CONTAINER_TOOLTIP="Ajouter, supprimer, ou réordonner";
Blockly.Msg.ARRAY_CREATE_WITH_INPUT_WITH="ensemble d'éléments";
Blockly.Msg.ARRAY_CREATE_WITH_ITEM_TITLE="élément";
Blockly.Msg.ARRAY_CREATE_WITH_TOOLTIP="retoune une liste avec un certain nombre d'éléments";
Blockly.Msg.ARRAY_GETINDEX_AT1="l'élément de rang";
Blockly.Msg.ARRAY_GETINDEX_AT2="rang";
Blockly.Msg.ARRAY_GETINDEX_ITEM="du tableau";
Blockly.Msg.ARRAY_GETINDEX_TOOLTIP1="retourne la valeur stockée dans la liste ou tableau";
Blockly.Msg.ARRAY_GETINDEX_TOOLTIP2="créé une liste ou tableau du type sélectionné";
Blockly.Msg.ARRAY_GETINDEX_TOOLTIP3="fixe un (ou plusieurs) élément(s) de la liste ou tableau à la (aux) valeur(s) indiquée(s)";
Blockly.Msg.ARRAY_create="définir le tableau";
Blockly.Msg.ARRAY_fixe="mettre l'élément de rang";
A+

fontaine.jp

  • Full Member
  • ***
  • Messages: 103
    • Voir le profil
Re : Ajout de nouveaux exemples
« Réponse #14 le: novembre 05, 2017, 10:36:21 pm »
Salut,
j'ai apporté des améliorations (clic droit pour ajouter le bloc d'affectation, renommage de la variable automatique à chaque glissé/déposé et le bloc tient sur 2 lignes au lieu de 3).
Blockly.Blocks["creer_tableau"]={init: function(){
this.appendDummyInput()
.appendField(Blockly.Msg.ARRAY_create)
.appendField(new Blockly.FieldVariable(Blockly.Msg.VARIABLES_GET_ITEM), 'VAR')
.appendField(Blockly.Msg.VARIABLES_AS)
.appendField(new Blockly.FieldDropdown(Blockly.Types.getValidTypeArray()), "type");
this.appendValueInput("contenu")
.setAlign(Blockly.ALIGN_RIGHT)
.appendField(new Blockly.FieldDropdown([[Blockly.Msg.ARRAY_taille,"c1"],[Blockly.Msg.ARRAY_contenu,"c2"]]), "choix");
this.setInputsInline(false);
this.setPreviousStatement(true, null);
this.setNextStatement(true, null);
this.setColour("#804000");
this.setTooltip(Blockly.Msg.ARRAY_GETINDEX_TOOLTIP2);
this.setHelpUrl(Blockly.Msg.HELPURL)
this.contextMenuMsg_=Blockly.Msg.tab_create_fix},
contextMenuType_:"fixer_tableau",
customContextMenu:Blockly.Blocks["variables_get"].customContextMenu,
getVarType:function(varName){return Blockly.Types.getChildBlockType(this)},
    renameVar: function(oldName, newName){if (Blockly.Names.equals(oldName, this.getFieldValue("VAR"))) this.setFieldValue(newName, "VAR")}
};