Go Down

Topic: Faire de 5 booleans une variable type 00010 (Read 3645 times) previous topic - next topic

kammo

Bonjour
Cinq capteurs en digital, cinq variables booléennes.
Comme je veux comparer toutes les combinaisons (robot line follower), je pense qu'il sera plus aisé de "combiner" ces cinq variables pour en obtenir une qui comporte cinq chiffres, de 0 à 1. Je veux une variable  faite de 1 et de 0.
Dans un switch case ca fera très joli, et question relecture, c'est top.

case 00100 > tout droit
case 00010 > tourne à droite
case 00001 > tourne à fond à droite

Vous voyez l'idée?
Comment fait-on? :D
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

RIN67630

Bonjour
Cinq capteurs en digital, cinq variables booléennes.
Comme je veux comparer toutes les combinaisons (robot line follower), je pense qu'il sera plus aisé de "combiner" ces cinq variables pour en obtenir une qui comporte cinq chiffres, de 0 à 1. Je veux une variable  faite de 1 et de 0.
Dans un switch case ca fera très joli, et question relecture, c'est top.

case 00100 > tout droit
case 00010 > tourne à droite
case 00001 > tourne à fond à droite

Vous voyez l'idée?
Comment fait-on? :D
Garçon, l'addition s'il vous plaît!

kammo

Haha ^^
et bah non, paske 1+0+0+0+0 ça fait pas 10000 mais ... la tête à tototo
Bon, et sans déconner? :D
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

jfs

Tu multiplie par l'emplacement où il va se trouver et tu additionnes.

tout à droite multiplie par 1 (pas indispensable...)
le deuxième à droite par 10
le troisième par 100
etc

Tu additionnes le tout après coup et hop....
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

kammo

Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

kammo

Du coup, c'est plus des booleans... On y servivra
Autre problème, comment je lui dis que chaque valeur compte 5 chiffres pour éviter ceci:

110
1000
11000
11000
11000
1
0
0
0
110
1000
0
0
0
1110
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

jfs

tu mets six positions avec un 1 tout à gauche et tu ne lis que les 5 autres....  :smiley-mr-green:
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

kammo

Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

kammo

Haha c'est la cata:

-3002
16960
-14112
27960
17070
16960

Code: [Select]
  VarLL = digitalRead(PinLL) * 10;
  VarLC = digitalRead(PinLC) * 100;
  VarCC = digitalRead(PinCC) * 1000;
  VarCR = digitalRead(PinCR) * 10000;
  VarRR = digitalRead(PinRR) * 100000;

  int Traj = 1000000 + VarLL + VarLC + VarCC + VarCR + VarRR;


En fait ça ne marche pas parce qu'on multiplie 0 par qch. En plus, mes valeurs relevées sur les pins ne sont plus booléennes, ça fait joli, mais c'est pas ce que je cherche à faire ....
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

jfs

#9
Apr 22, 2018, 04:47 pm Last Edit: Apr 22, 2018, 04:49 pm by jfs
Il faut convertir tes boléens avant de les multiplier

à part faire une chaine.... pas sur que ce soit possible plus propre.
Pas d'aide par MP !!!

Concernant le fonctionnement du forum tout se trouve dans les messages épinglés en tête de page.

RIN67630

#10
Apr 22, 2018, 05:45 pm Last Edit: Apr 22, 2018, 05:50 pm by RIN67630
Tu multiplie par l'emplacement où il va se trouver et tu additionnes.

tout à droite multiplie par 1 (pas indispensable...)
le deuxième à droite par 10
le troisième par 100
etc

Tu additionnes le tout après coup et hop....
Euh, un programmeur doit d'abord penser en binaire!

Si pin1, ajoute 1
Si pin2, ajoute 2
Si pin3, ajoute 4
Si pin4, ajoute 8
etc.

pour l'utilisation:
case B00100 > tout droit
case B00010 > tourne à droite
case B00001 > tourne à fond à droite

Sacrebleu!

lesept

#11
Apr 22, 2018, 05:51 pm Last Edit: Apr 22, 2018, 05:53 pm by lesept
Pour multiplier par 2, il y a l'instruction "<<1", par 4 "<<2" etc.
Donc tu peux faire un truc comme

Code: [Select]
(B5 << 5) + (B4 << 4) + (B3 << 3) + (B2 << 2) + (B1 << 1) + B0

où B0 à B5 sont les 6 bits à regrouper : cool non ?

Donc :
Code: [Select]
Traj= digitalRead(PinLL)+ digitalRead(PinLC) <<1  +digitalRead(PinCC)<<2 + digitalRead(PinCR) <<3 + digitalRead(PinRR) <<4;
A force d'essayer on finit par réussir... Donc, plus ça rate, plus on a de chances que ça marche (proverbe Sharduinok).

RIN67630

#12
Apr 22, 2018, 06:26 pm Last Edit: Apr 22, 2018, 06:47 pm by RIN67630
Pour multiplier par 2, il y a l'instruction "<<1", par 4 "<<2" etc.
Donc tu peux faire un truc comme

Code: [Select]
(B5 << 5) + (B4 << 4) + (B3 << 3) + (B2 << 2) + (B1 << 1) + B0

où B0 à B5 sont les 6 bits à regrouper : cool non ?

Donc :
Code: [Select]
Traj= digitalRead(PinLL)+ digitalRead(PinLC) <<1  +digitalRead(PinCC)<<2 + digitalRead(PinCR) <<3 + digitalRead(PinRR) <<4;
Non!

On ne doit pas faire d'arithmetique avec des booleans!
Si "False" est toujours 0, "True" peut être tout sauf zero.
Suivant le compilateur et le processeur ca peut être 1 ou 255 ou 65535 ou...

On commence avec
Code: [Select]
Traj=0;
if (digitalRead(PinLL)) Traj++;
Traj = Traj << 1;
if (digitalRead(PinLC)) Traj++;
Traj = Traj << 1;

etc...

Bon, un vrai programmeur Arduino lira le registre en une fois, basta*!
Avec par exemple les entrées de D8 à D13

Code: [Select]
DDRB = 0;    //mettre les entrées en mode digital input
Traj = PINB & B0011111;  // lire les 8 entrées et masquer les 2 inutiles.


Fini!

*au prix de la compatibilité de son code

kammo

Punaise
Je sais pas si c'est l'heure ou l'apéro, mais là, je suis dépassé.
Par contre c'est super intéressant.
Pour les << je connaissais pas, je me fais des exercices demain pour que ça rentre, merci lesept.
Par contre le PINA je vois pas d'où il sort.
J'avance dans mes projets, mais en code comme en électronique, je découvre encore plein de bases que je n'ai pas, j'apprends sur le tas. Pour dire, les && et trucs avec des !! j'ai du mal à les lire, mais ça va venir.

Merci pour vos contributions, reste à déchiffrer tout ça et à comprendre pourquoi vous n'êtes pas d'accord ^^

Bon apéro, bon appétit !
Make it, or make it burn.
carte des membres:
https://drive.google.com/open?id=1QmXJT44QyZHM3SIgDaMo7MGUbBSKAaVD&usp=sharing

RIN67630

Punaise
Je sais pas si c'est l'heure ou l'apéro, mais là, je suis dépassé.
Par contre c'est super intéressant.
Pour les << je connaissais pas, je me fais des exercices demain pour que ça rentre, merci lesept.
Par contre le PINA je vois pas d'où il sort.
J'avance dans mes projets, mais en code comme en électronique, je découvre encore plein de bases que je n'ai pas, j'apprends sur le tas. Pour dire, les && et trucs avec des !! j'ai du mal à les lire, mais ça va venir.

Merci pour vos contributions, reste à déchiffrer tout ça et à comprendre pourquoi vous n'êtes pas d'accord ^^

Bon apéro, bon appétit !
A lire absolument!
pour PINA-iller:
Bidouiller avec les registres

Go Up