Aller au contenu


- - - - -

communication android arduino


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

#1 Guest_flo_*

Guest_flo_*
  • Guests

Posté 17 décembre 2011 - 11:47

Salu
pour mon robot je veux controler sa "tete" via une slidebar sur mon telephone. via une classe qui gere le bluetooth je reçois bien les caractère (de 0 a 180) je les stocke dans une variable de type char et je voudrais les convertir en int pour pouvoir commander les servomoteur avec l'instruction
servo.write(variable_type_int);

Savez vous comment faire ??

merci d'avance de vos reponse :)

#2 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 19 décembre 2011 - 04:11

Salut!
j'ai pas compris tout ce que j'ai vu sur internet mais apparemment il faut convertir chaque lettre en int en soustrayant le caractère 0 comme ceci:
switch(variable_type_char) {
case '0'...'9'
variable_type_int = variable_type_char - '0';
break;
}

sauf que pour que ça respecte les dizaines il faut à chaque fois d'abord multiplier le chiffre converti précédent par 10 et y ajouter le nouvelle valeur convertie:

switch(variable_type_char) {
case '0'...'9'
variable_type_int = variable_type_int * 10 + variable_type_char - '0';
break;
}


du coup si tu tapes par exemple 126, il va d'abord transformer le char '1' en int 1, puis le multiplier par 10 et y ajouter le caractère suivant converti en int ==> 12 et de même une troisième fois pour le 6 (multiplication de 12 par 10 puis on ajoute 6 ==> 126)
en tout cas c'est comme ça que je l'ai compris d'après ces pages: http://www.glacialwanderer.com/hobbyrobotics/?p=7 et http://www.daniweb.com/software-development/cpp/threads/78021
j’espère que j'ai été compréhensible :P

par contre l’inconvénient c'est qu'il faut appuyer sur entrée à chaque chiffre et indiquer que c'est fini à la fin du nombre (du style on tape le nombre chiffre par chiffre puis on tape "envoyer" et le programme n'écrit la valeur sur le servo que lorsqu'il a reçu "envoyer"...

quelqu'un aura peut-être une methode plus propre
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#3 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 19 décembre 2011 - 06:07

Effectivement purique tu ne peux lire qu'un seul caractère à la fois.

Cela marche pour les décimales (DEC)
Une autre solution consisterais a faire de la concaténation.
Tu récupère ton 1er caractère puis le 2em puis le 3eme puis tu fais une concaténation
Char1 , Char2, char3
tu te retrouve donc avec une chaine de 3 caractères que tu transforme en int.

http://arduino.cc/en/Tutorial/StringAdditionOperator

Cdlt
Yves

 


#4 Guest_flo_*

Guest_flo_*
  • Guests

Posté 19 décembre 2011 - 09:55

Merci de vos reponse mais j'ai eu un autre probleme entre temps.

Je suis passer sous linux mint et ma carte ne reçois plus rien. j'up mon programme et il ne fonctionne pas alors que sous windows il fonctionne pouvais vous me dire pourquoi??

Merci d'avance

ps voici le code (c'est pour allumer une led):

char val;
void setup()
{
  pinMode(13, OUTPUT);
  Serial.begin(115200); 
}

void loop()
{
  val = Serial.read();

  Serial.write(val);

  if(val == '0')
  {
    digitalWrite(13, LOW);
  }

  if(val =='1')
  {
    digitalWrite(13, HIGH); 
  }
}


#5 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 20 décembre 2011 - 06:41

Tu as sélectionné le bon port série et la bonne carte dans l'IDE? et tu as bien installé les drivers?
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#6 Guest_flo_*

Guest_flo_*
  • Guests

Posté 20 décembre 2011 - 07:07

oui je peux up les programme sans problème mais mon bluetooth ne fonctionne pas, le serial monitor fonctionne bien comme il faut. Je pense que sa ne lui indique pas les broche a lire (rx tx).

s'avez vous comment on peut remédier a sa??

#7 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 20 décembre 2011 - 07:30

Petite question:

Comme tu et passé sous Linux maintenant , tu été sur quel système d'exploitation avant???

As-tu bien téléchargé le bon logiciel qui s'adapte sur Linux???

mais mon Bluetooth ne fonctionne pas


Ton Bluetooth et t'il bien compatible Linux???

Désolé si cela te semble répétitive , toutes les questions que l’on te pose, c'est pour bien comprendre le problème que ta.

#8 Guest_flo_*

Guest_flo_*
  • Guests

Posté 20 décembre 2011 - 07:37

avant jetait sur windows 7 et je le suis toujours(dual boot) et oui j'ai bien télécharger la version linux.
pour le bluetooth sa n'a pas d'importance (c'est un module bluesmirf (coté robot) les données son envoyer de mon téléphone et sous windows sa ce passe sans problème) lors de l'envoi le robot et débrancher de l'ordi il fonctionne sur batterie.

#9 seb03000

seb03000

    @pump_upp - best crypto pumps on telegram !

  • Membres
  • PipPipPipPipPip
  • 1 193 messages
  • Location:https://t.me/pump_upp

Posté 20 décembre 2011 - 07:46

Dual Boot , ça c'est pas mal , ça permet de lancer plusieurs systèmes, Fedora ou Windows ou autre par exemple.

Enfin pour ton problème je regarde de mon côté.

#10 Guest_flo_*

Guest_flo_*
  • Guests

Posté 20 décembre 2011 - 07:49

Ok merci je regarde aussi :)

#11 Guest_flo_*

Guest_flo_*
  • Guests

Posté 20 décembre 2011 - 08:36

bon ben problème résolu :) sa viens du soft je pense j'avais dl la dernier version sur le site officiel et sa marche pas j'ai tester apt-get install arduino qui ma installer la version 0022 j’avais la 1.0 et sa ne fonctionner pas.

je vais me mettre sur la conversion maintenant :)

#12 Guest_flo_*

Guest_flo_*
  • Guests

Posté 20 décembre 2011 - 11:13

voici les deux code fait pour tester la conversion:
#include <Servo.h>

Servo serv;

char recu;
int pos;

void setup()
{
  Serial.begin(9600);
  serv.attach(9);
  serv.write(90);

}

void loop()
{
  if(Serial.available() )
  {
    recu = Serial.read();
    switch(recu)
    {
    case '0'...'9':
      pos = pos * 10 + recu - '0';
      break;

    }
    Serial.println(pos);
  }
}

et la reponse du serial avec valeur prise au hazard:
1
18
180
180
1801
18010
18010
-16499
31618
31618
-11499
16084
16084

et le second :
#include <Servo.h>

Servo serv;

char recu;
int pos;

void setup()
{
  Serial.begin(9600);
  serv.attach(9);
  serv.write(90);

}

void loop()
{
  if(Serial.available() )
  {
    recu = Serial.read();
    switch(recu)
    {
    case '0'...'9':
      pos = pos * 10 + recu - '0';
      break;

    }
    Serial.println(pos);
  }
  
  pos = 0;
}

et la reponse (toujours avec un 0 en trop):

/-----------------------------------------------------------------/
1
8
0
0
1
0
0
9
0
0
1
2
0
/------------------------------------------------------------/

savez vous d'ou cela peut venir j'ai tester plusieurs code mais je n'ai jamais de résultat concluent ??

Merci d'avance :)

#13 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 20 décembre 2011 - 11:25

Tu as des valeurs parasites.

J'zi ruine problème similaire que j'zi réglé en filtrant les valeurs incorrectes. Mzis c'était particulier.
Pour filtrer tu exclu toutes valeurs non comprise entre 0 et 1023 mais je dirais que ces un problème électronique. PullUp ou mauvaise tension logique.

 


#14 Mgros

Mgros

    Membre occasionnel

  • Membres
  • Pip
  • 144 messages
  • Gender:Male
  • Location:Caissargues 30

Posté 21 décembre 2011 - 12:34

Je ne sais pas si c’est la solution à ton problème mais juste pour info et compléter l'idée du filtrage d'une valeur process...

Donc un petit exemple simple de code avec Capteur_ana0 = un capteur analogique puis capteur_ana0_moyenne qui est la valeur filtrée

Avec 9 et 10 le filtrage n'est pas excellent mais il peut varier plus rapidement...
capteur_ana0_moyenne = (Capteur_ana0_moyenne*9 + Capteur_ana0)/10;

Avec 999 et 1000 le filtrage est bon mais il peut varier plus lentement...
capteur_ana0_moyenne = (Capteur_ana0_moyenne*999 + Capteur_ana0)/1000;

Tant qu'on respecte cette forme c'est à toi de trouver le meilleur compromis avec des essais ...
@+
Celui qui trouve sans chercher est celui qui a longtemps cherché sans trouver.
Ma Chaîne youtube
------

#15 Guest_flo_*

Guest_flo_*
  • Guests

Posté 21 décembre 2011 - 11:26

voila le code fonctionnel:

#include <Servo.h>

// This is the pin you need to attach the servo to
#define SERVO_1_PIN 9

Servo g_servo1;

static int val = 0;

void setup()
{
  pinMode(A0, INPUT);
  pinMode(SERVO_1_PIN, OUTPUT);
  g_servo1.attach(SERVO_1_PIN);
  Serial.begin(115200);
}

void servo()
{
  if (Serial.available())
  {
    char ch = Serial.read();
    switch(ch)
    {
    case '0'...'9':
      val = val * 10 + ch - '0';
      break;
    case 's':
      g_servo1.write(val);
      val = 0;
      break;
    }
  }
}

void loop()
{

  servo();

}

demain je me met a l'envois de distance du capteur

#16 Guest_flo_*

Guest_flo_*
  • Guests

Posté 23 décembre 2011 - 11:22

la partie reception de la distance ne foncionne pas et fait planter l'application android :'( je lance l'application et elle plante sans que je n'ai eu le temp de faire la moindre action je pense que cela vient de la ligne:
dist_recu += tblue.read();

car quand je mais cette ligne en commantaire le programme fonctionne il ne plante pas.

je vous joint l'archive du programme.
si vous avez une idée de pourquoi l'appli ne fonctionne pas dite le moi car j'ai tester plusieurs code mais j'ai toujours le même résultat

Merci d'avance :)

Fichier(s) joint(s)



#17 swolf

swolf

    Membre chevronné

  • Membres
  • PipPipPipPip
  • 626 messages
  • Gender:Male

Posté 23 décembre 2011 - 11:46

cette ligne elle sert à ajouter la distance lue au tableau?
Notre blog, à FJprod et moi: http://2froblog.wordpress.com/

#18 Guest_flo_*

Guest_flo_*
  • Guests

Posté 24 décembre 2011 - 12:11

oui cette ligne sert à stocké les info reçu dans une variable de type string

#19 Astondb8

Astondb8

    Pilier du forum

  • Membres
  • PipPipPipPipPip
  • 1 111 messages
  • Gender:Male
  • Location:Paris

Posté 24 décembre 2011 - 01:19

Quelle est la version IDE que tu utilise ?

As tu fais la mise à jour vers la version 1.0 de l'IDE Arduiono ?

Si c'est le cas, essais de repasser en 0018 ou 0022 ou 0023. Des versions stables, testées, et opérationnelles, car la version 1.0 comporte quelques nouveautés et / ou quelques bugs non encore complètement répertoriés.
Voir l'article sur Pobot à ce sujet. Si cela venait à fonctionner avec ces anciennes versions, il faudrait le signaler à Julien pour qu'il puisse mettre à jour la liste des bugs répertoiretiriés.

Cdlt
Yves

 


#20 Guest_flo_*

Guest_flo_*
  • Guests

Posté 24 décembre 2011 - 01:47

je n'ai même pas commencer la parti arduino je lance l'application sur mon téléphone rien ne s'affiche et un message d'erreur arrive disant que l'application à du être fermer de force et un bouton forcer à quitter. sa vient du code mais d'ou je sais pas j'ai tester différente manière que j'ai trouver sur le net et sur le livre ou j'ai trouver récupéré l'adresse de la classe tblue qui permet de simplifier la gestion du bluetooth.




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

0 members, 0 guests, 0 anonymous users