Bonjour,Je suis nouveau sur Arduino et je suis heureux de poster mon premier poste sur ce forum
Après avoir passé quelque temps à allumée et éteindre des LED et réceptionner les informations de mes capteurs dans le serial monitor je tente un projet un peu plus complexe qui ressemblera à ça
J'ai constater en le recevant (comme son nom l'indique "bouclier") qu'il couvrait tout les ports de l'arduino uno, du coup comment est il possible de couplé ce composant avec d'autre tel qu'un capteur ou un recepteur wifi?
Une autre question est ou trouver de la documentation sur ces modules, DFROBOT n'en fournit pas beaucoup?
Dernière petite question toujours sur MIDI shield, dans le Wiki DFROBOT fournit un code de controle, qui me produit une erreur dans le débuging d'arduino, "a fonction BYTE n'est plus supporter"
Ps: je parle de récepteur wifi, mais je ne suis pas du tout sur que c'est le module sans fil le mieux adapter, bluetooth ou xbee est peut-être moins cher et plus adéquat?
C'est un problème récurrent avec les shield : on ne peut pas toujours les empiler, et cela pour plusieurs raisons :
Dans certains cas comme celui-ci ils ne proposent pas les broches femelles sur le haut
Et le plus souvent ils utilisent les même broches d'interface avec l'Arduino donc ils ne peuvent pas marcher ensemble
Dans ton cas, le problème 1 pourrait être réglé en utilisant par exemple le shield WiFly de Sparkfun ou celui de DFrobot qui eux disposent des broches femelles.
Dans ce cas - d'un point de vue mécanique - le sandwich Arduino + Wifi + MidiShield est possible.
Concernant le problème 2 c'est plus délicat.
Il faut déterminer qu'elles broches chaque shield utilise.
Pour cela 2 moyens complémentaires :
le site ShieldList.org qui possède une page descriptive pour la plupart des shields. On y trouve le Wifly, malheureusement pas le MidiShield ni le bon Wifi Shield de DFRobot.
les schémas : tous les vendeurs de shields adhèrent au concept Open Hardware et publie le schéma électronique de leur shield. Tu peux ainsi faire la liste toi même des broches utilisées.
Comme tu peux le voir, il existe certains conflits mais on peut s'en sortir.
Dans un premier temps je dirait que comme à la fois le shield Midi et le shield Wifi DFRobot ont besoin de la liaison série TXD/RDX, ils sont fondamentalement incompatibles.
L'Arduino UNO ayant une seule liaison série, on peut donc pas utiliser simultanément ces 2 shields même avec un bricolage.
Sur une Mega2560 qui possède plus de liaisons série, on pourrait bricoler le Midi Shield par exemple pour utiliser une autre liaison série en coupant des pistes et tirant des fils.
Il existe aussi une bibliothèque SoftwareSerial qui permet de simuler une liaison série par logiciel mais pas au débit demandé par le Midi 31250 bps
Donc je pense que tu as de meilleurs chances avec le shield Wifi de Sparkfun.
Ce shield utilise la liaison SPI pour communiquer avec le module Wifi, ce qui présente l'avantage de ne pas être en conflit avec RX/TX et surtout d'être plus rapide !
Reste le problème du signal IRD qui est connecté à la même broche que la LED rouge du shield Wifi.
2 solutions :
Soit tu peux te passer soit de la LED rouge soit du signal IRQ et en modifiant les logiciels fournis avec chacun de ces shields tu t'arrange pour éviter le conflit
Soit tu coupe le fil soit de la LED rouge, soit de l'IRQ et tu le connectes àune autre broche libre. Il faudra ensuite adapter aussi le logiciel correspondant.
Merci beaucoup pour ta réponse clair et complète.
Tu as dissipé ma confusion sur beaucoup choses mais fait naitre aussi plusieurs questions.
En regardant plus attentivement les Shields par les liens que tu m'as donné je me demande si le wifi est le plus adapter, en tout cas il n'est pas le moins cher (deux modules wifly reception emetteur coute prés de 180$ )
Ce que j'ai besoin c'est juste réceptionner les information des capteurs, est ce que Xbee conviendrait? (shield+module 35$ x2 70$)
Dans cas j'ai trouvé deux boucliers:
Wireless SD Shield Arduino (dont je n'arrive pas à trouver le diagram des ports)
Xbee Shield For Arduino de dfrobot (le moins cher mais il utilise D0 et D1, et si j'ai bien compris ce que tu m'a c'est donc pas possible de le monter en même temps que le midi shield)
Ou encore la solution de ne pas utilisée le Midi shield et de procéder comme ici http://arduino.cc/en/Tutorial/Midi
Ce qui à l'avantage de ne pas bloquer tout les ports non utilisée mais le midi utilise encore le port tx)
Une question importante qui me vient est: Quelle est la difference entre les Port tx, rx et les autres? Pourquoi ne sont t'il pas interchangeable?
Dans le cas d'une arduino mega je pourrais cumuler plus facilement les deux shields?
Merci
Ps: je repose une question du premier post que je ne veut pas oublier:
Au sujet du midi shield Wiki DFROBOT fournit un code de controle, qui me produit une erreur dans le débuging d'arduino, "a fonction BYTE n'est plus supporter" , comment paré ce problème?
Pour commencer à te répondre j'ai fait pas mal de recherche.
Si tu ne veux pas décourrager les gens à qui tu demande de l'aide, simplifie leur la tache et donne plus de détails.
Tu parles de Xbee, de sheilds : donne les liens directs.
Exemple de code : pareil.
Moins nous perdons de temps a chercher les éléments dont tu parles, plus nous pouvons répondre aux questions.
Tu parles de capteurs ?
Quels capteurs ?
Les XBee peuvent fonctionner en partie de manière autonomes en envoyer la valeur de pins numériques ou analogiques. Mais ils ne peuvent pas gérer de capteurs complexes comme un capteur I2C, SPI ou OneWire. Tu aura peut être besoin de mettre une intelligence coté capteur (autre Arduino).
Dans ce cas suivant les capteurs, la fréquences infos a transmettre, la distance, ... un module RF433MHz à 3€ fera peut être aussi l'affaire.
Si tu n'as pas besoin des potars et des boutons du shield Midi, alors tu n'a peut être pas besoin du shield Midi. La liaison Midi OUT est assez facile a mettre en oeuvre en effet.
Sur l'Arduino, il y a des broches à usage général et des broches qui peuvent être utilisée soit comme broches générales, soit pour une certaine fonction dédiée. Dans ce cas, pour cet usage particulier, seule cette broche là peut convenir.
C'est le cas de TXD et RXD qui correspondent respectivement à la sortie et l'entrée de la liaison série asynchrone (UART) que tu utilise avec les fonctions de Serial.
Quand tu fait un Serial.print ( "Hello world" ); le données ne peuvent sortir que sur la broche TXD. Quand tu tapes quelque chose dans le SerialMonitor, ce ne peut rentrer dans l'Arduino que par RDX. C'est une partie hardware du composant ATmega328P appellée UART qui gère cette transmission tout seul sans perturber le logiciel.
Et c'est pareil pour le MIDI qui est une liaison série Asynchrone. Tu va envoyer tes ordres MIDI par des commandes Serial.write() et ca ne peut partir vers ton synthé que par TXD.
Il existe comme je le signalait une bibliothèque logicielle appellée SoftwareSerial qui permet de simuler un RXD et un TXD sur n'importe quelle broche mais avec des contraintes de performance incompatible avec l'usage MIDI.
Il y a d'autre usages spécifiques que j'ai listé dans mon tableau (colonne Usage) comme les interruptions (INT0 et INT1) et la liaison série synchrone SPI (SS, MISO, MOSI, SCK) destinée à dialoguer avec d'autres composants, de même la liaison I2C (SDA et SCL).
Le capteur que je penses utiliser est un gyroscope 2 ou 3 axe
J'ai donc refais mon Schemat avec les nouvelles données:
Voici le diagram du receveur
J'essai d'être au plus clair dans mais questions, mais ces concept sont nouveau pour moi et je découvre assez rapidement les limites de mais question peu aprés les avoir posé, je te remercie du temps que passe a grandement éclaircir ces choses encore obsure
Bonjour
Merci de ta réponse,
J'ai du laissée de coté quelque temps mon projet arduino, puis j'ai préféré avancer avant de reposter.
J'en suis maintenant au stade où j'ai la plupart des éléments, j'ai réussi à faire fonctionner d'une part le connecteur midi , d'autre part le gyroscope (avec une seul valeur) et les modules RF.
J'utilise donc une arduino uno, les modules RF me demande un serial 2400, tandis que le midi lui m'impose 31400, est il possible d'ouvrir plusieurs port ou contourner ce problème et sans changer de materiel?
PS dernière petite question: Sur l'émetteur de mon module RF j'utilise de la carte Arduino que l'alimentation et la terre, je suppose qu'elle ne m'est donc pas réellement necessaire , comment puis-je m'en passer ? Quelle et la méthode la plus simple sans carte d'obtenir une alimentation de 5v au bon ampérage et une terre?
Pour la communication sur module RF il existe une lib dédiée à cela : VirtualWire
VirtualWire n'utilise pas la liaison série (Serial) mais n'importe qu'elle broche
Elle a l'avantage de permettre de transférer d'environ 30 octets max, elle gère un protocole qui fiabilise la transmission :
entête pour permettre au controle de gain du récepteur de se régler
motif de synchronisation
données
CRC pour vérifier s'il y a eu des erreurs de transmission
Merci
J'ai tester virtualwire, j'ai mis du temps mais j'y suis finalement arriver.
Mais je bloque maintenant pour recevoir un message sur un pin et l'envoyer comme message avec virtualwire, et aussi pour le contraire recevoir un message de virtualwire et le retransmettre dans un pin
j'envoie les deux code que j'ai pour le moment:
emeteur:
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
const char *msg = "ok"; // Tableau qui contient notre message
void setup() // Fonction setup()
{
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Tuto VirtualWire"); // Petit message de bienvenue
vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
}
void loop() // Fonction loop()
{
Serial.print("TX ... "); // On signale le début de l'envoi
vw_send((uint8_t *)msg, strlen(msg)); // On envoi le message
vw_wait_tx(); // On attend la fin de l'envoi
Serial.println("Done !"); // On signal la fin de l'envoi
delay(1000); // Et on attend 1s pour pas flooder
}
recepteur:
#include <VirtualWire.h> // inclusion de la librairie VirtualWire
uint8_t buf[VW_MAX_MESSAGE_LEN]; // Tableau qui va contenir le message recu (de taille maximum VW_MAX_MESSAGE_LEN)
uint8_t buflen = VW_MAX_MESSAGE_LEN; // Taille maximum de notre tableau
void setup() // Fonction setup()
{
Serial.begin(9600); // Initialisation du port série pour avoir un retour sur le serial monitor
Serial.println("Tuto VirtualWire"); // Petit message de bienvenue
vw_setup(2000); // initialisation de la librairie VirtualWire à 2000 bauds (note: je n'utilise pas la broche PTT)
vw_rx_start(); // Activation de la partie réception de la librairie VirtualWire
}
void loop() // Fonction loop()
{
if (vw_wait_rx_max(200)) // Si un message est recu dans les 200ms qui viennent
{
if (vw_get_message(buf, &buflen)) // On copie le message, qu'il soit corrompu ou non
{
Serial.print("RX : ");
for (byte i = 0; i < buflen; i++) // Si il n'est pas corrompu on l'affiche via Serial
Serial.print(buf[i]);
Serial.println("");
}
}
}
Merci
Autre petite question qui me laisse perplexe:
est-ce normal que sur une carte vide de connectique avec un code type celui ci dessous , sans aucun capteur ,:
void setup()
{
Serial.begin(2400);
}
int val;
void loop()
{
val = analogRead(2);
Serial.println(val);
delay(200);
}
kimli:
c'est comme du bruit permanent , et cela me fait ca sur mes deux cartes, anomalie de la carte ou quelque chose que je ne comprend pas?
C'est normal, ce sont des interférences EMF due au 50Hz du secteur, aux divers modules sans fils, etc ...
Si tu trace un graphique de ces valeurs tu doit obtenir un jolie sinusoïde
Broche flottante (INPUT ou entrée en mode analogique) = antenne