Aller au contenu


Photo
- - - - -

Robot incendie: programme


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

#1 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 26 février 2018 - 09:18

Bonjour,

 

En bref, je dois faire une robot incendie pour le Bac. Ce robot possède un capteur ultrasons HC-SR04. (plus de détails sur le robot http://www.robot-maker.com/forum/topic/11816-robot-incendie/)
 

Fichier joint  Image1.png   170,44 Ko   28 téléchargement(s)Fichier joint  Image2.png   170,56 Ko   25 téléchargement(s)Fichier joint  Image3.png   40,4 Ko   27 téléchargement(s)

 

Je me questionne donc sur la valibité de mon programme. Est-il bon ? Contient-il des erreurs de définition de variables, des contradictions ... ? Je ne connais pas trop la programmation, alors merci d'avance de votre aide :thank_you:



#2 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 26 février 2018 - 03:19

ça ne détecte pas le feu les ultrasons.. comment il va fonctionner ce robot ?
pour savoir si ton prog contient des erreurs de syntaxe ou incohérences, cliquer sur le bouton le plus a gauche dans la barre d'icones.. ça va te faire un rapport.
pour savoir si ça fonctionne IRL il faut juste essayer (tu trouvera facilement un clone d'arduino nano et un capteur ultrason dans la boutique de ce site)



#3 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 27 février 2018 - 08:24

Il n'est pas prévu pour détecter le feu mais les obstacles devant le robot qui pourraient êtres masqués par la fumée, et donc non-visible par l’œil humain à travers la caméra.

J'ai  vérifié et au niveau de la syntaxe, il n'y a aucun problème. Je me suis mal exprimée; ce que j'entendais, c'est "est-ce que mon programme correspond à ce que je veux ?" car je n'en suis pas sûre ...

Merci de ta réponse thermo_nono



#4 thermo_nono

thermo_nono

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 825 messages

Posté 28 février 2018 - 12:42

à première vue ça a l'air pas mal.. après je n'ai fait que survoler le code (d'ailleurs ça pique un peu les yeux de lire sur des captures d'écran, tu aurais dû faire un copier/coller du code avec "CTRL+A" pour tout sélectionner, "CTRL+C" pour copier en mémoire, puis "CTRL+V" (ou un clique droit de la souris puis "coller") pour le recoller sur le forum)
 



#5 Mike118

Mike118

    Staff Robot Maker

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

Posté 28 février 2018 - 02:21

Je partage les remarque de thermo_nono c'est pas facile à lire mais ça a l'air pas mal vu de loin =)  du coup au passage je suggère de lire cet article pour savoir comment publier différent types de contenu sur le forum    =) 

Ensuite quelques conseils en vrac : 

utiliser un " enum" pour spécifier les cas  " danger / obstacleProche / Libre "  ça serait mieux et du coup tu aurais un code plus facile à lire en mode : 


return danger ;   // ( au lieu de return 0 )

etc ...

et de la même façon tu aurais 

 

case : danger    ;) 

 

De la même façon que tu as utilisé des #define à très bon escient pour les paramètre DANGER, PROCHE etc... 

sache qu' un enum c'est typiquement fait pour énumérer des cas ;) Donc c'est parfait dans ton cas précis =) 

 

bref il y a plus qu'à essayer pour voir ce que ça donne ! =) 

 


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 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 01 mars 2018 - 02:48

#define PROCHE 20
#define DANGER 10
#define AFOND 200
#define PRUDENT 50
#define NBMESURE 5
#define VSON 59
//initialisation
int pinSRF=2; //pin numérique utilisé pour le capteur ultrasons.

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

void loop() {
  switch (mesure()){ //utilisation de la condition switch
    case 0: //l'obstacle est dans la zone DANGER
      Serial.println("*DANGER*");
      arret(); // on arrête le robot
      delay(200);
      recule(PRUDENT); // on le fait reculer un peu
      delay(200);
      recherche(); // on recherche la bonne voie
      break;
    case 1: //l'obstacle est dans la zone PROCHE
      Serial.println("Attention...");
      avance(PRUDENT); // on ralentit la vitesse
    default:
      avance(AFOND);
  }
   }
//fonctions
int mesure(){
  //fonction qui mesure une distance avec le capteur
  unsigned long mesure = 0; // variable de mesure
  unsigned long cumul = 0; //variable pour la moyenne
  for (int t = 0; t < NBMESURE; t++) { // boucle pour effectuer les mesures
    pinMode (pinSRF, OUTPUT); //on prépare le pin pour envoyer le signal
    digitalWrite(pinSRF, LOW); //on commence à l'état bas
    delayMicroseconds(2); //on attend que le signal soit clair
    digitalWrite(pinSRF, HIGH);//mise à l'état haut
    delayMicroseconds(10); //pendant 10 µs
    digitalWrite(pinSRF, LOW); //mise à l'état bas
    pinMode(pinSRF, INPUT); //on prépare le pin pour recevoir un état
    mesure = pulseIn(pinSRF, HIGH); // fonction pulseIn qui attend un état haut et renvoie le temps d'attente
    cumul+=mesure; //on cumule les mesures
    delay(50); //attente obligatoire entre deux mesures
  }
  mesure=cumul/NBMESURE; //on calcule la moyenne des mesures
  mesure=mesure/VSON;//on transforme en cm
 
  if (mesure<=DANGER){//on teste si l'obstacle est dans la zone DANGER
    return 0; //si oui, on retourne le code de danger
  }
  else if (mesure>DANGER && mesure<=PROCHE){//on teste s'il est dans la zone PROCHE
    return 1; //si oui, on retourne le code de proche
  }
  return 2; // on retourne le code de sans risque
}
void recherche(){
  //fonction pour rechercher un passage
  tourneGauche(AFOND); //on positionne le robot à gauche (facultatif)
  delay (300);
  int etat=0; //variable de test de possibilité d'avancer
  while (etat!=2){ // tant que la distance n'est pas suffisante
    etat=mesure(); // on effectue la mesure
    tourneDroite(PRUDENT); //on fait tourner le robot
  }
  Serial.println("La voie est libre !");
  //retour au programme principal
}
void arret(){
  Serial.println("Je stoppe");
  //fonction d'arrêt des moteurs
}
void avance(int v){
  Serial.print("J'avance");
  affiche(v);
  //fonctin de mise en route des deux moteurs dans le sens avant
  // on utilise la variable v pour le pilotage PWM
}
void recule(int v){
  Serial.print("Je recule");
  affiche(v);
  //fonctin de mise en route des deux moteurs dans le sens arrière
  // on utilise la variable v pour le pilotage PWM
}
void tourneDroite(int v){
  Serial.print("Je tourne a droite");
  affiche(v);
  //fonction de rotation à droite : un moteur dans un sens, l'autre dans le sens opposé
  // on utilise la variable v pour le pilotage PWM
}
void tourneGauche(int v){
  Serial.print("Je tourne a gauche");
  affiche(v);
  //fonction de rotation à gauche : un moteur dans un sens, l'autre dans le sens opposé
  // on utilise la variable v pour le pilotage PWM
}
void affiche(int v){
  //fonction complémentaire d'affichage
  if (v==AFOND){
    Serial.println(" a fond !");
  }
  else{
    Serial.println(" prudemment...");
  }
}

Je crois que c'est mieux comme ça. Je m'excuse pour l'inconfort.

Donc Mike, si j'ai bien compris, je remplace #define par enum, c'est bien ça ?



#7 Mike118

Mike118

    Staff Robot Maker

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

Posté 01 mars 2018 - 06:23

non non ne remplace pas par #define par enum, ce que tu as fais en #define est bien ! 

en gros tu ajoutes un enum en haut de ton code 

enum { CASDANGER,
       CASPRUDENT,
       CASDEFAULT };


le but c'est de remplacer le 0 et 1 dans le case et dans les return de ta fonction mesure. 
Rien de plus ;)

 

 

comme ça tu auras : " return CASDANGER;  " au lieu de "return 0; " 
" case CASDANGER:  " au lieu de " case : 0 " . 

 

ça permet juste de rendre le code encore plus facile à lire. 
C'est une broutille de confort, pas du tout obligatoire, mais ça te permet de voir comment et pourquoi on utilise un autre type pour certaines chose les enum ;)

 

Grosso modo quand j'ai un switch case quelque part la plus part du temps je mets aussi un enum pour bien voir les cas. 

 

Le gros avantage aussi c'est que si tu viens à rajouter des cas et que tu souhaite les réorganiser pour faire du  " etat++" pour passer au cas suivant par exemple c'est beaucoup plus pratique avec les enum de faire de telle modification.


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  

 

 

 


#8 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 05 mars 2018 - 08:25

Merci beaucoup pour tes explications Mike



#9 Mike118

Mike118

    Staff Robot Maker

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

Posté 05 mars 2018 - 10:01

De rien ! =) N'hésite pas à poster ton code modifié avec l'enum ;) 


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  

 

 

 


#10 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 06 mars 2018 - 10:40

Le voilà :)

#define PROCHE 20
#define DANGER 10
#define AFOND 200
#define PRUDENT 50
#define NBMESURE 5
#define VSON 59
définit variables qd faut agir
enum { CASDANGER
     CASPRUDENT
     CASDEFAULT }
//initialisation
int pinSRF=2; //pin numérique utilisé pour le capteur ultrasons.

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

void loop() {
  switch (mesure()){ //utilisation de la condition switch
    case : CASDANGER //l'obstacle est dans la zone DANGER
      Serial.println("*DANGER*");
      arret(); // on arrête le robot
      delay(200);
      recule(PRUDENT); // on le fait reculer un peu
      delay(200);
      break;
    case :CASPRUDENT //l'obstacle est dans la zone PROCHE
      Serial.println("Attention...");
      avance(PRUDENT); // on ralentit la vitesse
    default:
      avance(AFOND);
  }
   }
//fonctions
int mesure(){
  //fonction qui mesure une distance avec le capteur
  unsigned long mesure = 0; // variable de mesure
  unsigned long cumul = 0; //variable pour la moyenne
  for (int t = 0; t < NBMESURE; t++) { // boucle pour effectuer les mesures
    pinMode (pinSRF, OUTPUT); //on prépare le pin pour envoyer le signal
    digitalWrite(pinSRF, LOW); //on commence à l'état bas
    delayMicroseconds(2); //on attend que le signal soit clair
    digitalWrite(pinSRF, HIGH);//mise à l'état haut
    delayMicroseconds(10); //pendant 10 µs
    digitalWrite(pinSRF, LOW); //mise à l'état bas
    pinMode(pinSRF, INPUT); //on prépare le pin pour recevoir un état
    mesure = pulseIn(pinSRF, HIGH); // fonction pulseIn qui attend un état haut et renvoie le temps d'attente
    cumul+=mesure; //on cumule les mesures
    delay(50); //attente obligatoire entre deux mesures
  }
  mesure=cumul/NBMESURE; //on calcule la moyenne des mesures
  mesure=mesure/VSON;//on transforme en cm
 
  if (mesure<=DANGER){//on teste si l'obstacle est dans la zone DANGER
    return CASDANGER; //si oui, on retourne le code de danger
  }
  else if (mesure>DANGER && mesure<=PROCHE){//on teste s'il est dans la zone PROCHE
    return CASPRUDENT; //si oui, on retourne le code de proche
  }
  return CASDEFAULT; // on retourne le code sans risque
}
void recherche(){
  //fonction pour rechercher un passage
  tourneGauche(AFOND); //on positionne le robot à gauche (facultatif)
  delay (300);
  int etat=0; //variable de test de possibilité d'avancer
  while (etat!=2){ // tant que la distance n'est pas suffisante
    etat=mesure(); // on effectue la mesure
    tourneDroite(PRUDENT); //on fait tourner le robot
  }
  Serial.println("La voie est libre !");
  //retour au programme principal
}
void arret(){
  Serial.println("Je stoppe");
  //fonction d'arrêt du moteur
}
void avance(int v){
  Serial.print("J'avance");
  affiche(v);
  //fonction de mise en route du moteur dans le sens avant
}
void recule(int v){
  Serial.print("Je recule");
  //fonction de mise en route du moteur dans le sens arrière
}
void tourneDroite(int v){
  Serial.print("Je tourne a droite");
  //fonction de rotation à droite
}
void tourneGauche(int v){
  Serial.print("Je tourne a gauche");
  //fonction de rotation à gauche
}

Verdict ?



#11 Mike118

Mike118

    Staff Robot Maker

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

Posté 06 mars 2018 - 12:32

Nickel pour l'ajout de l'enum ;) 


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  

 

 

 


#12 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 08 mars 2018 - 03:57

Il faut dire que j'ai eu un bon professeur  ^_^ 



#13 Mike118

Mike118

    Staff Robot Maker

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

Posté 08 mars 2018 - 05:09

Minute papillon! Honte à moi je suis allé trop vite en besogne en regardant ce que tu as fais ... 

La logique est bonne mais il y a quelques petites erreur de sytaxe mais rien de bien grave... 

 

un commentaire doit absolument être défini en tant que commentaire sinon ça fait planter le compilateur : 

"définit variables qd faut agir " => " // définit variables qd faut agir " 

 

ensuite un enum ça se fait ainsi : 

enum { CASDANGER,
CASPRUDENT,
CASDEFAULT };

il ne faut pas oublier les virgules et le point virgule final ;) 

 

ensuite un case ça s'écrit ainsi : 

case VALEUR : 
// Code à exécuter 
break; 

si tu mets la valeurs après les : ça ne compile pas ... 

Ensuite il manque la fonction  "affiche(int v) ", 

 

bref une fois que tu aura corrigé tout ça tu pourra compiler le code sur ton PC avec l'IDE arduino ;) 

Un code ne peut être bon que déjà si il commence par compiler. 
Si il compile pas c'est qu'il y a des soucis à régler. =) 

Je te laisse corriger ;) 


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  

 

 

 


#14 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 13 mars 2018 - 08:23

Je ne comprends pas pour "affiche(int v)". Je dois la définir au début du programme ou j'ai oublié de la mettre quelque part dans le programme ?

Le reste est modifié, merci beaucoup encore une fois :thank_you:

 

Au fait, je me pose une question. Comme dans le projet je n'ai fait que commander un capteur, le brancher à la carte et faire son programme, je dois tester les deux types de capteurs pour lesquels j'hésitais (ultrasons et infrarouge). Et comme j'ai déjà un programme complet (enfin je crois) sous la main, je me demandais s'il est possible de le changer, à plus ou moins grande échelle, pour l'utiliser pour mon capteur IR.



#15 Mike118

Mike118

    Staff Robot Maker

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

Posté 13 mars 2018 - 09:52

En fait dans ta fonction avance, tu utilise une fonction  affiche( ) qui visiblement n'existe pas dans ton code. 
Soit tu arrêtes de l'utiliser ( surtout qu'elle te sert à rien visiblement ^^ ) soit tu crées une fonction affiche ! 

Il faut que ton code compile dans l'IDE arduino. Tant que chez toi tu as pas un code qui compile ça sert à rien d'aller plus loin =) 

 

ensuite pour le changement de capteur tu peux ajouter un define et faire en sorte qu'en fonction de ce define ça appelle la fonction mesure avec l'un ou l'autre des capteurs ;)


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  

 

 

 


#16 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 13 mars 2018 - 10:30

Okay, j'ai tout compris. Merci beaucoup de ton aide Mike



#17 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 26 mars 2018 - 07:42

en lisant tes commentaire j'ai l'impression que tu es débutante dans la programmation et dans la robotique. Si j'étais toi je me ferai une petite plateforme ou je peux facilement ajouter tout ce que je veux. Pour la programmation je ferai quelques exercices faciles (Je peux t'en donner si tu veux.) ce qui permettrai de mieux comprendre. La meilleure façon d'apprendre c'est de tester et de se tromper.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#18 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 27 mars 2018 - 07:18

Exact, je débute ^^'

 

Si j'étais toi je me ferai une petite plateforme ou je peux facilement ajouter tout ce que je veux

C'est à dire ? Je crois que je n'ai pas compris

 

Pour la programmation je ferai quelques exercices faciles (Je peux t'en donner si tu veux.) ce qui permettrai de mieux comprendre.

Eh bien je suis preneuse, merci beaucoup :thank_you:



#19 R2D21995

R2D21995

    Membre passionné

  • Membres
  • PipPipPip
  • 385 messages

Posté 27 mars 2018 - 11:55

Alors quand je parle de plateforme je parle d'un robot qui sert juste à tester un nouveau capteur, ou une nouvelle option. Par exemple premier post tu poste ton code et tu dis que tu ne sais pas si il fonctionne. Ben teste-le sur cette fameuse plateforme que tu aura développer.

 

Pour les exercices.

 

- tu peux refaire les fonctions strlen, strcpy, strncpy ... C'est ce qu'on faisait à l'école. C'est un peu chiant à faire mais ça permet de bien comprendre le fonctionnement des choses.

 

Faire un programme ou l'utilisateur entre une commande prédéfinie et le programme l'exécute.

Par exemple l'utisateur entre "avance" et le programme récupère la commande "avance" et affiche par exemple: J'ai bien compris j'avance."

 

C'est un peu bébéte mais ça permet de bien manipuler les chaînes de caractères.
Ensuites des fonctions plus utiles.

 

Ensuite créer 4 fonctions pour les quatre opérations de bases (+ - * / )

grâce aux fonctions créer tout à l'heure créer un programme qui effectue les opérations

par exemple

 

nombre n°1 : 4

nombre n°2 : 2

opération: *

résultat : 8

 

str_to_wordtab

Donc cette fonction prends une une chaine de caractère et la transforme en un tableau de chaine de caractère.
Par exemple: "Je m'appelle manon" et  "je suis en Terminale". C'est deux chaines

tu la passe dans la fonction et ça donne "Je m'appelle manon je suis en Terminale"

 

tu peux aussi faire un programme qui utilise le chiffrement de César pour chiffrer un message.

 

Tu dois bien gérer la mémoire. Donc tu dois allouer la mémoire et ensuite la libérer.

Aussi tu dois créer un fichier .h pour les includes et les déclarations de variables.

 

Ce sont des exercices que j'ai fais quand j'étais à l'école. Ils sont pas facile quand on débute mais ça permet de bien comprendre.

 

Peut-être que d'autre pourront en mettre.

 

N'hésite pas à publier tes avancées et tes échecs.


Il faut toujours viser la lune, car même en cas d’échec, on atterrit dans les étoiles


#20 Manonsti2d

Manonsti2d

    Membre

  • Membres
  • 30 messages
  • Gender:Female
  • Location:Haute Savoie

Posté 03 avril 2018 - 07:43

Merci beaucoup, je vais commencer de ce pas






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

0 members, 0 guests, 0 anonymous users