Go Down

Topic: Empilement de shield (Read 1 time) previous topic - next topic

juliensl

Bonjour,
Pour un projet, j'aurais besoin d'empiler 1 carte uno et 2 shield.
Donc j'ai une carte Arduino uno R3, un shield motor R3 et une carte wifi R3.
Est-ce compatible ?

Merci, bonne journée! =)

B@tto

Il suffit de regarder quels sont les pins utilisés par chaque shield et de voir s'il y en a en commun. S'il y en a en commun (autre que ceux des alims évidemment), ça peut aller s'il s'agit de bus de communication (SPI, i2c ...).

juliensl

Merci de ta réponse rapide.
Je débute en arduino donc je suis un peu perdu, il y a les pins 11,12,13 qui sont utilisé pour les directions et pwm du moteur et qui sont utilisé aussi pour les SCK, MISO et MOSI du shield wifi.
Est-ce compatible ou va-t-il y avoir un problème ?

Merci beaucoup !! :D

B@tto

La oui ça va poser problème

skywodd

Bonjour,

Un site bien pratique (mais mis à jour en ce moment) :
http://shieldlist.org/

De toute évidence la shield moteur va perturber le bon fonctionnement du port SPI, donc non pas de compatibilité possible entre les deux.
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

juliensl

Oh la loose... va falloir que je m'amuse avec des ponts h du coup :(

Ben merci pour t'a réponse ;)

Christian_R

pas forcément, tu peux aussi rediriger des pins par câblage.
Christian

skywodd


pas forcément, tu peux aussi rediriger des pins par câblage.

Et faire du SPI software ? Bof bof ...
Le plus simple serait d'utiliser un contrôleur de moteur série (module pololu par exemple).
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

juliensl

Hey!

Ne vous faites pas de bill, j'ai fait un petit montage pour intégrer une puce l298 (double pont h) qui remplace mon shield motor ;)
Par contre j'ai un problème:

Actuellement vu que je ne sais pas encore comment fonctionne le shield wifi, j'ai essayer de piloter mes 2 moteurs du pc à la carte via un cable usb.
Seulement, je me suis rendu compte que la carte prenais entre 1 et 6 sec avant d'interpréter la commande que je lui est envoyer.
J'ai cherché un peu partout et je me suis rendu compte que le problème devait certainement venir du Baud.

Voici mon code:
Code: [Select]
      int i=0;
      int lu;
      int z=1;
      // déclaration de fonction
      void efface(void);

      void setup() {
            pinMode(2, OUTPUT); //Moteur 1 Sens 1
            pinMode(4, OUTPUT); //Moteur 1 Sens 2
            pinMode(7, OUTPUT); // ON/OFF 1
            pinMode(12, OUTPUT); //Moteur 2 Sens 1
            pinMode(13, OUTPUT); //Moteur 2 Sens 2
            pinMode(8, OUTPUT); // ON/OFF 2
            Serial.begin(9600);
      }
     
      void loop() {
            if (Serial.available() > 0){
            lu = Serial.read();
            delay(100);
            }
           
            switch(lu){   //interrupteur "lu" (g,d,a,r,s) Correspond a la lettre envoyé depuis le moniteur.
                  case 'g': // Si case g envoyé dans le moniteur :
                  case 'G':
                   
                  efface();   // Appelé la fonction efface qui éteint tout les moteurs.
                  while (z=1) {   // Tant que z=1 faire tourner dans le sens g.
                  digitalWrite(2, HIGH);
                  digitalWrite(4, LOW);
                  digitalWrite(12, LOW);
                  digitalWrite(13, HIGH);
                  digitalWrite(7, HIGH);
                  digitalWrite(8, HIGH);
                  break;
                  }
                 
                  //
               
                  case 'd': // Si case g envoyé dans le moniteur :
                  case 'D':
                 
                  efface(); 
                  while (z=1) { // Tant que z=1 faire tourner dans le sens d
                  digitalWrite(2, LOW);
                  digitalWrite(4, HIGH);
                  digitalWrite(12, HIGH);
                  digitalWrite(13, LOW);
                  digitalWrite(7, HIGH);
                  digitalWrite(8, HIGH);
                 
                  break;
                  }
                  //
                 
                  case 'a': // Lorsque la case a est envoyé dans le moniteur :
                  case 'A':
                 
                  efface();
                  while (z=1) {  // Tant que z=1 faire avancer.
                  digitalWrite(2, HIGH);
                  digitalWrite(4, LOW);
                  digitalWrite(12, HIGH);
                  digitalWrite(13, LOW);
                  digitalWrite(7, HIGH);
                  digitalWrite(8, HIGH);
                 
                  break;
                  }
                  //
                 
                  case 'r': // Lorsque la case a est envoyé dans le moniteur :
                  case 'R':
                 
                  efface ();
                  while (z=1) {  // Tant que z=1 faire reculer.
                  digitalWrite(2, LOW);
                  digitalWrite(4, HIGH);
                  digitalWrite(12, LOW);
                  digitalWrite(13, HIGH);
                  digitalWrite(7, HIGH);
                  digitalWrite(8, HIGH);
                 
                  break;
                  }
                  //
                 
                  case 's': // Lorsque la case s est envoyé dans le moniteur :
                  case 'S':
                 
                  efface ();
                  while(z=1) {  // Tant que z=1 arrêter tout = STOP.
                  digitalWrite(2,LOW);
                  digitalWrite(4, LOW);
                  digitalWrite(12, LOW);
                  digitalWrite(13, LOW);
                  digitalWrite(7, LOW);
                  digitalWrite(8, LOW);
                 
                  break;
                  }
                  default:  // Par défault, tout est éteint.
                  efface();
            } // fin du switch
      } // fin de loop()

      void efface(){                 // Cette fonction éteint tout les moteurs.
            digitalWrite(2, LOW);
            digitalWrite(4, LOW);
            digitalWrite(12, LOW);
            digitalWrite(13, LOW);
            digitalWrite(7, LOW);
            digitalWrite(8, LOW);
      }


Du coup j'ai modifier cette ligne:
Code: [Select]
Serial.begin(9600);
j'ai remplacé le 9600 par 115200, j'ai téléversé le programme, dans le moniteur j'ai modifier le canal par 115200, mais quand j'envoie des données, rien, la carte ne reçois rien...
J'ai essayer quelques canaux mais rien, la carte ne reçois les information que si je suis en canal 9600... Quelqu'un pourrait m'aider ?

(j'ai une arduino uno)

Merci tout le monde =)

skywodd

Tes break sont à l'intérieur des boucles while, ils ne devraient pas logiquement.

Fait une boucle d'attente au lieu de faire un delay(100) en boucle :
Code: [Select]
while(Serial.available() < 1); // Bloque tant qu'un octet n'est pas reçu
Des news, des tuto et plein de bonne chose sur http://skyduino.wordpress.com !

juliensl

Ah ben oui c'est sur que ça marche 1000 fois mieux :D
Merci =)

Maintenant j'arrive à faire fonctionner mon shield wifi n_n mais du coup ça marche pas avec cette boucle O.O
Et avec une tempo de 100 ça fonctionne... (c'est bizarre l'informatique parfois... xD)

Merci =D

Go Up