Bonjour à tous,
premier post sur Codelab, premières expériences sur arduino, je m'excuse d'avance si pas pertinent...
Je viens d'acheter deux shield : le shield DMX de TrinkerKit et le shield 16 canaux PWM/Servo d'Adafruit.
Le but s'est de réaliser une espèce de gradateur (dimmer) à 32 canaux pour lampes LED commandable par DMX (pour de soucis de connectivité dans des théâtres et de coordination avec d'autres arduino, je préfères ne pas utiliser de WIFI pour le moment).
L'idée est donc la suivante : envoyer avec PD du dmx (grâce au patch de Labomedia http://wiki.labomedia.org/index.php/Pur … Enttec_Pro) au shield Tinkerkit qui, lui, envoie le commandes vers les 32PWM (2 shields de 16 PWM chacun).
J'ai d'abord modifié le shield DMX comme indiqué ici : http://ericbarch.com/post/81655982662/u … to-receive.
Pratiquement (si j'ai bien compris), il s'agit de modifier la carte pour qu'il envoie le DMX reçu au port sérial pour qu'il soit lu par la librairie DMXSerial-master.
Tout seul le shield fonctionne.
Le problème c'est que le shield Adafruit PWM/servo (https://www.adafruit.com/products/1411) et sa librairie (Adafruit-PWM-Servo-Driver-Library-master) utilisent aussi le port sériale de l'arduino (Tx et Rx) et du coup, au moment de compiler, j'ai l'erreur suivant :
J'ai vu sur internet que d'autres personnes ont eu des soucis similaires, notamment ce monsieur qui semble avoir résolu ses soucis : http://forum.arduino.cc/index.php/topic,17071.0.html.
Mon souci à moi c'est que le monsieur parle chinois pour mon (bas) niveau de compétences.
J'ai commencé à effacer des trucs plus ou moins au pif dans la librairie DMXserial pour voir si j'y arrivais, et à un moment je n'ai plus d'erreurs, mais la carte DMX ne fonctionne plus très bien.
Est-ce une bonne piste ? Ou le port sérial de l'Arduino peut être utilisée par un seul shield à la fois ?
Est-ce que quelqu'un pourrait m'éclairer ?
Merci d'avance pour vos réponses,
Ale
Hors ligne
ale a écrit:
J'ai d'abord modifié le shield DMX comme indiqué ici : http://ericbarch.com/post/81655982662/u … to-receive.
Pratiquement (si j'ai bien compris), il s'agit de modifier la carte pour qu'il envoie le DMX reçu au port sérial pour qu'il soit lu par la librairie DMXSerial-master.
Salut, on dirait bien que c'est ça Merci d'avoir pris la peine de d'expliquer en détails ton problème, ainsi que ce que tu as déjà fait et trouvé (ça nous change...), j'en profite pour ajouter quelques liens en rapport.
Déjà, l'article concernant cette modification matérielle donne un lien vers une page qui renvoie à son tour vers d'autres ressources bien utiles sur le même sujet (notamment le schéma du shield, et un article présentant la même modif mais avec une autre librairie DMX-Série). Il est malheureusement erroné, mais voici le bon : http://www.inmotion.pt/en/audio-midi/67 … hield.html (voir Documentation, en bas de page).
citation :
Le problème c'est que le shield Adafruit PWM/servo (https://www.adafruit.com/products/1411) et sa librairie (Adafruit-PWM-Servo-Driver-Library-master) utilisent aussi le port sériale de l'arduino (Tx et Rx) et du coup, au moment de compiler, j'ai l'erreur suivant :
J'ai vu sur internet que d'autres personnes ont eu des soucis similaires, notamment ce monsieur qui semble avoir résolu ses soucis : http://forum.arduino.cc/index.php/topic,17071.0.html.
Sur la page du produit, son nom est écrit en gros : "Adafruit 16-Channel 12-bit PWM/Servo Shield - I2C interface" . Si I2C est bien, par définition, une liaison de type série, il ne s'agit pas de ce qu'on dénomme habituellement "le port série" (ou encore UART, avec ses connections TX et RX). La première utilise d'autres connecteurs (pour SDA/SCL) à l'aide de la librairie "Wire" (http://www.arduino.cc/en/reference/Wire) alors que ce dernier utilise la librairie Serial (http://www.arduino.cc/en/reference/serial).
Donc ton interface Adafruit n'a pas besoin du port série, et pour ce qui est de sa libraire dédiée, en jetant un coup d’œil au code (pas très long) sur le github : https://github.com/adafruit/Adafruit-PW … er-Library on voit que le port série est simplement utilisé pour renvoyer des messages de "debug", afin qu'ils s'affichent sur le Serial Monitor (voir https://learn.adafruit.com/adafruit-ard … al-monitor).
Il faudrait donc commencer par essayer de "commenter" les quelques lignes (qui ne le sont pas déjà et) qui contiennent "Serial" (ou bien les supprimer) pour que le compilateur ne tente pas d'utiliser la librairie par défaut d'Arduino. En effet, celle-ci risque d'entrer en conflit avec l'implémentation "série" non-standard de ta librairie DMX (qui utilise, à un plus bas niveau, les interruptions matérielles, comme celles évoquées dans la discussion que tu mentionnes sur le forum Arduino), ce qui pourrait expliquer les messages d'erreurs rencontrés.
Pour la librairie DMXSerial (https://github.com/mathertel/DmxSerial), c'est justement expliqué sur la (très instructive) page d'acceuil du projet (http://www.mathertel.de/Arduino/DMXSerial.aspx , à la rubrique "Don't use the Arduino Serial implementation") : "So you have to avoid using the Serial object at all and even don't use it for debugging purpose!"... qui est la seule ligne écrite en rouge de toute la page
edit: Le site du dernier lien semble être en panne depuis cette nuit, mais on peut consulter sa version archivée :
https://web.archive.org/web/20150221200 … erial.aspx
Matthias Hertel a même intégré le protocole RDM (qui permet d'interroger les périphériques DMX pour connaître leur état et leurs fonctionnalités) dans une nouvelle version de sa librairie ! : https://web.archive.org/web/20150221204 … rial2.aspx
Dernière modification par Nicolas Lhommet (2015-05-21 09:05:20)
Hors ligne
Yes!!!! Merci Nicolas !
Je me suis bien compliqué la vie pour rien,
j'ai beaucoup travaillé sur la librairie du shield dmx
alors que la réponse était bien plus simple en s'attaquant à la librairie du shield pwm.
D'ailleurs il y en a même pas besoin :
en commentant les lignes série je suis tombé sur un autre erreur :
dans mon patch, pour une série de copier/coller j'avais les lignes suivantes :
Serial.begin(9600); Serial.println("16 channel PWM test!");
(ces lignes font partie du sketch d'exemple pwmtest de la carte Adafruit)
En commentant ces lignes, même pas besoin de commenter les lignes de la librairie...
donc maintenant je peux dimmer une lampe led en envoyant du dmx au shield en question avec ce code :
#include <Wire.h> #include <Adafruit_PWMServoDriver.h> #include <DMXSerial.h> // called this way, it uses the default address 0x40 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(); int convpwm = 0; void setup() { //Serial.begin(9600); //Serial.println("16 channel PWM test!"); DMXSerial.init(DMXReceiver); pwm.begin(); pwm.setPWMFreq(1600); // This is the maximum PWM frequency // save I2C bitrate uint8_t twbrbackup = TWBR; // must be changed after calling Wire.begin() (inside pwm.begin()) TWBR = 12; // upgrade to 400KHz! } void loop() { unsigned long lastPacket = DMXSerial.noDataSince(); if (lastPacket < 5000) { // read recent DMX values and set pwm levels int convpwm = (4096/255)* DMXSerial.read(1); //Pour l'instant le canal dmx 1 pilote le pwm 15 pwm.setPWM(15, 0, convpwm ); } }
Tout ça pour ça...
En tout cas je vais documenter tout le travail (pour l'instant il n'y a que les tests préliminaires) ici:
http://wiki.labomedia.org/index.php/Lam … vs_Arduino
Encore merci et à la prochaine,
Ale
Hors ligne
Pages: 1