Aller au contenu


Photo
- - - - -

console de controle robot

BCN2D moveo arduino UNO keypad

  • Veuillez vous connecter pour répondre
16 réponses à ce sujet

#1 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 18 août 2018 - 02:56

bonjour à tous,

je travaille depuis déjà quelques temps sur ça : http://www.robot-maker.com/forum/topic/12212-bcn3d-firmware/

pour tout controler, j'ai eu l'idée de faire une console de controle.

en faite, c'est un keypad et plusieurs boutons et potentiomètre reliés a une arduino UNO. Celles ci elle meme reliés a une rumba qui controle le tout. 

mon objectif avec la UNO, c'est de faire comme un CD4051, comme ca, je ne perds pas de pins sur ma rumba ( ou tres peu). Quelqu'un aurait deja fait ca ? 

pour le moment, je travaille sur le keypad, il permettra de dire au robot de combien de degrés il doit bouger et dans quel sens. j'ai trouvé quelques tuto (assez rare sure ce sujet) qui parlent d'utiliser plusieurs carte en maitre esclave via un port analogique et les pins scl et sda des cartes. 

je vous joint mon debut de code pour la console ( je galere pas mal, mais ca m'apprend a programmer :) )

Fichier(s) joint(s)



#2 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 18 août 2018 - 03:30

Comment sont reliés rumba et arduino ?  I2C ? UART ? SPI ? Autre ? 

Sur le principe ça se fait bien mais il faut un peu plus de détails pour t'aider.


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#3 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 18 août 2018 - 04:15

Je pensais utiliser un pin analogique et trois pins digitaux. Je ne connais rien du tout sur tout ça en faite :/
I2c, ça me dit quelque chose mais sans plus. Je vais me renseigner un peu mieux alors

#4 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 18 août 2018 - 06:46

j'ai rajouté un peu de code, le message qui est sensé s'afficher s'affiche bien. quand j'appuie sur un chiffre, l'ecran ne s'efface pas. 

en appuyant sur D, la simulation de mouvement se fait bien. Vous avez une idée de comment faire pour :

au demarrage: afficher un message proposant deux choix, ensuite, attendre qu'une valeure soit entrée et ensuite attendre l'appui sur valider ou correction.

parce que la, en appuyant sur n'importe quel bouton, ca donne des resultats que j'arrive pas a interpreter.

Fichier(s) joint(s)



#5 Mike118

Mike118

    Staff Robot Maker

  • Administrateur
  • PipPipPipPipPip
  • 9 963 messages
  • Gender:Male
  • Location:Anglet

Posté 19 août 2018 - 12:29

Pour afficher un message au départ, met le dans le set up. 
avant d'entrer dans loop. 

Ensuite j'ai pas bien compris ce que tu cherches à faire... 

Déjà est ce que l'appuis sur chacune de tes touches fonctionne comme tu veux ? Genre tu détecte bien chacune des touches ? 
Si c'est bien le cas tu cherches uniquement à savoir comment gérer l'appuis sur plusieurs touches à la suite pour taper par exemple 123 en appuyant sur 1 puis 2 puis 3 puis valider ? 


Si mon commentaire vous a plus laissez nous un avis  !  :thank_you:

Nouveau sur Robot Maker ? 

Jetez un oeil aux blogs, aux tutoriels, aux ouvrages, au robotscope  aux articles,  à la boutique  et aux différents services disponible !
En attendant qu'une bibliothèque de fichiers 3D soit mise en place n'hésitez pas à demander si vous avez besoin du fichier 3D d'un des produits de la boutique... On l'a peut être ! 
Si vous souhaitez un robot pilotable par internet n'hésitez pas à visiter www.vigibot.com et à lire le sous forum dédié à vigibot!

 

Les réalisations de Mike118  

 

 

 


#6 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 19 août 2018 - 01:28

Je pense qu'une p'tite boucle "while" pourrait t'aider : 

 

#include <Wire.h> 
#include <LiquidCrystal_I2C.h>
#include <Keypad.h>

const byte ROWS = 4;
const byte COLS = 4;
int Value = 0;
int valeur = 0;
int continuer = 0;
int supprimer = 0;
int rien1 = 0;
int rien2 = 0;
int sens_rotation = 0;
char hexaKeys[ROWS][COLS] = {
  {'1', '2', '3', 'A'},
  {'4', '5', '6', 'B'},
  {'7', '8', '9', 'C'},
  {'*', '0', '#', 'D'}
};

byte rowPins[ROWS] = {11, 10, 9, 8}; //connect to the row pinouts of the keypad
byte colPins[COLS] = {7, 6, 5, 4}; //connect to the column pinouts of the keypad

Keypad customKeypad = Keypad(makeKeymap(hexaKeys), rowPins, colPins, ROWS, COLS);

LiquidCrystal_I2C lcd(0x27, 16, 2);

void setup(){
  lcd.backlight();
  lcd.init(); 
}

void loop(){
char customKey = '0';
while (isDigit(customKey)) {
        customKey = customKeypad.getKey();
	lcd.setCursor(7,0);
	  
	if (customKey >= '0' && customKey <= '9') // This keeps collecting the Value until customKey is not a number
	  {
		Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
		lcd.print(Value);
	  }
	if (customKey = '*')
	  {
		sens_rotation = false;
	  }
	if (customKey = '#')
	  {
		sens_rotation = true;
	  }
	/*if (customKey = 'D')
	{
	  lcd.clear();
	}
        */
}
	

switch (customKey)
    {
      case 'A': // Change set speed
        lcd.print(sens_rotation);
        break;

      case 'B':
        valeur = "+";
        break;

      case 'C':
        continuer;
        break;



      default: break; // numbers not allowed
    }
  }



#7 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 19 août 2018 - 10:35

Voilà ce que ça fait quand je démarre, ça affiche bien ce que je veux. Quand jappuie sur des numéros, ça marche pas, il ny a que les deux premiers chiffres qui apparaissent dans les case 1 et 2 ligne 1. Ça efface pas lecran.
Jai essayé de décrire le mieux possible le comportement de mon programme sur papier histoire detre bien clair dans ma tete.

Fichier(s) joint(s)



#8 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 19 août 2018 - 11:31

je viens de remarquer que pour les conditions d'égalité tu indique : 

if (customKey = '*')

mais dans le cas de l'égalité il faut doubler le "=" :
 

if (customKey == '*')

 



#9 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 19 août 2018 - 11:45

je n'ai pas testé mais je pense que cette structure serait plus appropriée (séquencer tes saisies via des boucles 'while') : 
 

void loop(){
	lcd.setCursor(7,0);
	while (customKey<>'#' || customKey<>'*') {	//tant qu'on a pas de réponse valable
		customKey = customKeypad.getKey();		//on attends qu'elle arrive
	}
	if (customKey == '#') {						//on défini sens_rotation
		sens_rotation = true;
	}
	else {
		sens_rotation = false;
	}

	char customKey = '0';						//on met un 0 dans customKey 
	while (customKey<>'D') {					//tant qu'on ne valide pas par 'D'
                customKey = customKeypad.getKey();
		if (isDigit(customKey)) {				//on saisi un nombre (isdigit n'accepte que les caracteres de 0 à 9)
			Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
			lcd.print(Value);
		}
		else if (customKey == 'C') {			//si on veux corriger
			Value = 0;							//on reinitialise Value
			lcd.print(value);
		}
	}
}

ce code n'a pas été vérifié.. 



#10 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 19 août 2018 - 06:47


void loop(){
             //on met un 0 dans customKey 

  char  customKey = customKeypad.getKey();

  while (customKey != '#' || customKey != '*') {  //tant qu'on a pas de réponse valable

  customKey = customKeypad.getKey();    //on attends qu'elle arrive

  }

// sens = 

  if (customKey == '#') {        //on défini sens_rotation
    sens_rotation = true;
    lcd.setCursor(6,0);

    lcd.print("+");

  }
  if (customKey == '*') {
    sens_rotation = false;

    lcd.setCursor(6,0);

    lcd.print("-");
  }
// selon ce qui est selectionné, afficher le resultat en 6,0
//ensuite, passer à la selection de l'angle voulu 

if (isDigit(customKey)) {       //on saisi un nombre (isdigit n'accepte que les caracteres de 0 à 9)

      Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value

      lcd.print(Value);

//tout ceci compris entre 0 et 200 degrés

//methode a trouver



//  char customKey = '0';

  while (customKey !='D') {          //tant qu'on ne valide pas par 'D'

                customKey = customKeypad.getKey();
/*    if (isDigit(customKey)) {       //on saisi un nombre (isdigit n'accepte que les caracteres de 0 à 9)
      Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
      lcd.print(Value);*/

    }
    if (customKey == 'C') {      //si on veux corriger

      Value = 0;              //on reinitialise Value

      lcd.print(Value);
    }
  }

}

j'ai transféré tel quel, rien ne s'affiche. j'ai modifié, rien ne s'affiche, je m'en arrachhe les cheveux  :help:
l'ordre des selection est :
1 choisir le sens de rotation ( la valeur sens est donc crée pour ca)
2 afficher la valeur sens en 6, 0 
3seulement maintenant, lire le clavier et afficher la selection de valeur comprise entre 0 et 200 (j'ai pas encore trouvé mais ca ne tardera pas)
4 attendre que D soit appuyé
5 afficher le message de mouvement et envoyer la commande
6 ma rumba envoie un message a la uno disant "ok, c'est fait"
7 retour a 1
pour le choix de la veleur, je ne comprends pas trop, quand j'appuie sur 1 et 2 et 3 et 4 puis ensuite 5, 6, 7en simultané, ca n'affiche pas tout ca met un truc comme -7635 alors que j'ai bien saisi dans l'ordre.
j'ai l'impression que cette ligne pose probleme

Value = Value * 10 + (customKey - '0');


Modifié par levend, 19 août 2018 - 07:54 .
Balises Code


#11 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 19 août 2018 - 11:25

as-tu essayé en deux lignes ?.. :
 

int i = customKey - '0';
Value = Value * 10 + i;

... on ne sait jamais.. 

edit : 
je me suis planté sur la première condition while, je pense que ça passera mieux ainsi : 
 

while (customKey != '#' && customKey != '*') {  //tant qu'on a pas de réponse valable

avec le OU ça ne pouvait jamais être validé. 
 



#12 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 20 août 2018 - 03:42

 

void loop(){

             //on met un 0 dans customKey 
  char  customKey = customKeypad.getKey();
  if (customKey == '#' || customKey == '*') {  //tant qu'on a pas de réponse valable
  sens = customKeypad.getKey();    //on attends qu'elle arrive
  }
switch (sens)
// sens = 
{
  case '#':        //on défini sens_rotation
    sens_rotation = true;
    lcd.setCursor(6,0);
    lcd.print("+");
  break;
  case '*': 
    sens_rotation = false;
    lcd.setCursor(6,0);
    lcd.print("-");
  break;
}
// selon ce qui est selectionné, afficher le resultat en 6,0
//ensuite, passer à la selection de l'angle voulu 
if (customKey >= '0' && customKey <= '9') // This keeps collecting the Value until customKey is not a number
  {
      Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
      lcd.setCursor(7,0);
      lcd.print(Value);
  }
//tout ceci compris entre 0 et 200 degrés
//methode a trouver
 
//  char customKey = '0';
  if (customKey =='D') {          //tant qu'on ne valide pas par 'D'
      lcd.print("demarrage");
      delay(2000);
    }
    if (customKey == 'C') {      //si on veux corriger
      Value = 0;              //on reinitialise Value
      lcd.print(Value);
      lcd.clear();
   }
  }
 

avec ca, la fonction effacer et demarrer fonctionnent. j'arrive toujours pas a mettre ma premiere condition. Je vais essayer avec une boucle while. 

Une idée de comment delimiter un affichage de caractere ? ( pas afficher plus que 200 ou alors prendre valider automatiquement quand 3 nombres sont rentrés)



#13 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 20 août 2018 - 06:32

 

Une idée de comment delimiter un affichage de caractere ? ( pas afficher plus que 200 ou alors prendre valider automatiquement quand 3 nombres sont rentrés)

 

 

X = constrain(X,INF,SUP); .

Fonction qui impose à la variable X de rester dans la plage de valeurs située entre INF et SUP. Retourne la valeur de X si elle est contenue dans la fourchette, INF si X est plus petit et SUP si X est supérieur.


#14 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 22 août 2018 - 09:14

 

void loop(){

             //on met un 0 dans customKey 
  char  customKey = customKeypad.getKey();
  while (customKey != '#' && customKey != '*') {  //tant qu'on a pas de réponse valable
  sens = customKeypad.getKey();    //on attends qu'elle arrive
  }
switch (sens)
// sens = 
{
  case '#':        //on défini sens_rotation
    sens_rotation = true;
    lcd.setCursor(6,0);
    lcd.print("+");
  break;
  case '*': 
    sens_rotation = false;
    lcd.setCursor(6,0);
    lcd.print("-");
  break;
}
// selon ce qui est selectionné, afficher le resultat en 6,0
//ensuite, passer à la selection de l'angle voulu 
if (customKey >= '0' && customKey <= '9') // This keeps collecting the Value until customKey is not a number
  {
      Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
      Value = constrain(Value, 0, 200);
      lcd.setCursor(7,0);
      lcd.print(Value);
  }
//tout ceci compris entre 0 et 200 degrés
//methode a trouver
//X = constrain(X,INF,SUP);
//  char customKey = '0';
  if (customKey =='D') {          //tant qu'on ne valide pas par 'D'
      lcd.print("demarrage");
      delay(2000);
    }
    if (customKey == 'C') {      //si on veux corriger
      Value = 0;              //on reinitialise Value
      lcd.print(Value);
      lcd.clear();
   }
  }
 

bon, maintenant, plus rien ne s'affiche, j'ai passé mon aprem a essayer des trucs, en vain  :Alvarin_07:  

c'est cette commande de debut qui foire tout. quand je l'enleve ca marche a peut pret



#15 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 22 août 2018 - 10:46

tu as mis des conditions "if".. du coup ça ne boucle pas à chaque étape.. le while me semble plus approprié.

bon je commence à m'embrouiller et à dire des bêtises... je me repose 5 minutes et je reprends tout la tête reposée.. 



#16 cocothebo

cocothebo

    Membre passionné

  • Membres
  • PipPipPip
  • 341 messages
  • Gender:Male

Posté 22 août 2018 - 03:07

Salut,

 

Il faut changer ton début

char  customKey = customKeypad.getKey();
  while (customKey != '#' && customKey != '*') {  //tant qu'on a pas de réponse valable
      sens = customKeypad.getKey();    //on attends qu'elle arrive
  }

par:

sens = customKeypad.getKey();
  while (sens != '#' && sens != '*') {  //tant qu'on a pas de réponse valable
     sens = customKeypad.getKey();    //on attends qu'elle arrive
  }

Quoi par un truc dans ce genre la. Dans ton code tu fais boucler tant que "customKey" ne vaut pas une des deux valeurs, c'est bien mais comme dans le corps du while tu ne mets pas à jours customKey, forcément si dedans ya pas la bonne valeur ça va boucler à l'infini...

Donc il faut que la variable qui sert de condition au while soit mise à jour dans le corps de ce while, sinon ça boucle.



#17 theo-paul

theo-paul

    Membre

  • Membres
  • 23 messages
  • Gender:Male
  • Location:Bretagne

Posté 22 août 2018 - 04:52

 

void loop(){

             //on met un 0 dans customKey 
sens = customKeypad.getKey();
  while (sens != '#' && sens != '*') {  //tant qu'on a pas de réponse valable
     sens = customKeypad.getKey();    //on attends qu'elle arrive
  }
switch (sens)
// sens = 
{
  case '#':        //on défini sens_rotation
    sens_rotation = true;
    lcd.setCursor(6,0);
    lcd.print("+");
  break;
  case '*': 
    sens_rotation = false;
    lcd.setCursor(6,0);
    lcd.print("-");
  break;
}
// selon ce qui est selectionné, afficher le resultat en 6,0
//ensuite, passer à la selection de l'angle voulu 
customKey = customKeypad.getKey();
 while (customKey >= '0' && customKey <= '9') // This keeps collecting the Value until customKey is not a number
  {
    Value = Value * 10 + (customKey - '0'); // concatnate key presses into one value
    lcd.print(Value);
  }
  switch (customKey)
    {
      case 'C': // Change set speed
      Value = 0;
      lcd.clear();
        break;
 
      case 'D':
      lcd.print("demarrage");
      delay(2000);
      lcd.clear();
        break;     
       // Value = constrain(Value, 0, 200);
      //lcd.setCursor(7,0);
      //lcd.print(Value);
  }
//tout ceci compris entre 0 et 200 degrés
//methode a trouver
//X = constrain(X,INF,SUP);
}

voila ce que ca donne, et ca marche !!!! pour le +et le -. pour les numeros c'est pas encore ca. j'ai des traits qui se mettent a la place. j'avance doucement mais surement. Merci de votre aide  :yahoo:







Aussi étiqueté avec au moins un de ces mots-clés : BCN2D moveo, arduino, UNO, keypad

0 utilisateur(s) li(sen)t ce sujet

0 members, 0 guests, 0 anonymous users