Ch'zé Membre
Age : 59 Localisation : Le parcq Nombre de messages : 36 Date d'inscription : 26/02/2022
| Sujet: commande aiguille avec Multimaus - Arduino- PCA9685 Ven 3 Fév 2023 - 9:42 | |
| Bonjour mes gens, J'ai réussi commandé une led avec ma multi Maus via un circuit electronique d'essai et un Arduino, en suivant la demarche suivante http://letraindejembi.canalblog.com/archives/2019/08/05/37543458.htmlJ'ai aussi testé la commande d'un servo avec un bouton poussoir. OK Maintenant je cherche à concilier ce bout de programme avec la commande I2C vers 2 cartes PCA9685 qui va gérer les 19 aiguilles de mon réseau. Quelqu'un a t il déjà associé Multimaus - Arduino - carte PCA9685 - servo ?. J'aimerai connaitre le code si possible |
|
Fantasio Membre
Age : 64 Localisation : Saint Médard en Jalles (33) Nombre de messages : 2367 Date d'inscription : 15/11/2019
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Dim 26 Mar 2023 - 22:16 | |
| Pour insérer ton code tu trouveras dans la barre d'outils l'icone "Code". Ce qui te permettra d'insérer ton code en l'ayant copié préalablement. Voila ce que cela donne: - Code:
-
void setup() { // put your setup code here, to run once:
}
void loop() { // put your main code here, to run repeatedly:
} En espérant que cela puisse t'aider |
|
GrandCharles Membre
Age : 46 Localisation : 54700 PONT-A-MOUSSON Nombre de messages : 1972 Date d'inscription : 29/12/2016
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Dim 26 Mar 2023 - 22:18 | |
| Pour insérer un code, il semble qu'il y ait cette balise : - Code:
-
insérer le code ici... Elle se trouve sous ce bouton : Charles EDIT : On se complète avec Fantasio ! |
|
Ch'zé Membre
Age : 59 Localisation : Le parcq Nombre de messages : 36 Date d'inscription : 26/02/2022
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Dim 26 Mar 2023 - 22:30 | |
| Entendu, il faut j'aille sur un pc. Il n'y a pas l'icône sur le mobile |
|
Ch'zé Membre
Age : 59 Localisation : Le parcq Nombre de messages : 36 Date d'inscription : 26/02/2022
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Lun 27 Mar 2023 - 0:05 | |
| - Code:
-
#include <NmraDcc.h>
// This Example shows how to use the library as a DCC Accessory Decoder or a DCC Signalling Decoder // It responds to both the normal DCC Turnout Control packets and the newer DCC Signal Aspect packets // You can also print every DCC packet by uncommenting the "#define NOTIFY_DCC_MSG" line below
#include <Wire.h> #include <Adafruit_PWMServoDriver.h>
#define SERVOMIN 250 // this is the 'minimum' pulse length count (out of 4096) #define SERVOMAX 480 // this is the 'maximum' pulse length count (out of 4096)
// called this way, it uses the default address 0x40 Adafruit_PWMServoDriver pwm = Adafruit_PWMServoDriver(0x40); // 1ere carte PCA9685 Adafruit_PWMServoDriver pwm1 = Adafruit_PWMServoDriver(0x41);// 2eme carte PCA9685
NmraDcc Dcc ;
typedef struct { uint16_t servoAddr; uint16_t minPos; uint16_t maxPos; } myServo;
myServo servoArray[16] = { {65533, SERVOMIN,SERVOMAX},//Accessoire A1 multimaus ROCO Z1 decallé de -4 {65534, SERVOMIN,SERVOMAX}, {65535, SERVOMIN,SERVOMAX}, {0, SERVOMIN,SERVOMAX},
{1, SERVOMIN,SERVOMAX}, {2, SERVOMIN,SERVOMAX}, {3, SERVOMIN,SERVOMAX}, {4, SERVOMIN,SERVOMAX},
{5, SERVOMIN,SERVOMAX}, {6, SERVOMIN,SERVOMAX}, {7, SERVOMIN,SERVOMAX}, {8, SERVOMIN,SERVOMAX},
{9, SERVOMIN,SERVOMAX}, {10, SERVOMIN,SERVOMAX}, {11, SERVOMIN,SERVOMAX}, {12, SERVOMIN,SERVOMAX}, } ; myServo servoArray1[16] = { {13, SERVOMIN,SERVOMAX}, {14, SERVOMIN,SERVOMAX}, {15, SERVOMIN,SERVOMAX}, {16, SERVOMIN,SERVOMAX},
{17, SERVOMIN,SERVOMAX}, {18, SERVOMIN,SERVOMAX}, {19, SERVOMIN,SERVOMAX}, {20, SERVOMIN,SERVOMAX},
{21, SERVOMIN,SERVOMAX}, {22, SERVOMIN,SERVOMAX}, {23, SERVOMIN,SERVOMAX}, {24, SERVOMIN,SERVOMAX},
{25, SERVOMIN,SERVOMAX}, {26, SERVOMIN,SERVOMAX}, {27, SERVOMIN,SERVOMAX}, {28, SERVOMIN,SERVOMAX},
} ;
const int DccAckPin = 3 ;
//int firstServo = 21; //int numServos = 16; int numServos = 32;
// This function is called whenever a normal DCC Turnout Packet is received and we're in Output Addressing Mode void notifyDccAccTurnoutOutput( uint16_t Addr, uint8_t Direction, uint8_t OutputPower ) { Serial.print("notifyDccAccTurnoutOutput: ") ; Serial.print(Addr,DEC) ; Serial.print(','); Serial.print(Direction,DEC) ; Serial.print(','); Serial.println(OutputPower, HEX) ;
for (int i=0; i< numServos; i++) if (Addr == servoArray[i].servoAddr) { if (Direction == 0) pwm.setPWM(i, 0, servoArray[i].minPos); else pwm.setPWM(i, 0, servoArray[i].maxPos); } for (int i=0; i< numServos; i++) if (Addr == servoArray1[i].servoAddr) { if (Direction == 0) pwm1.setPWM(i, 0, servoArray1[i].minPos); else pwm1.setPWM(i, 0, servoArray1[i].maxPos); }
}
// This function is called whenever a DCC Signal Aspect Packet is received void notifyDccSigOutputState( uint16_t Addr, uint8_t State) { Serial.print("notifyDccSigOutputState: ") ; Serial.print(Addr,DEC) ; Serial.print(','); Serial.println(State, HEX) ; }
void setup() { // put your setup code here, to run once: Serial.begin(115200); // Configure the DCC CV Programing ACK pin for an output pinMode( DccAckPin, OUTPUT );
Serial.println("NMRA DCC Example 1"); // Setup which External Interrupt, the Pin it's associated with that we're using and enable the Pull-Up Dcc.pin(0, 2, 1); // Call the main DCC Init function to enable the DCC Receiver Dcc.init( MAN_ID_DIY, 10, CV29_ACCESSORY_DECODER | CV29_OUTPUT_ADDRESS_MODE, 0 );
Serial.println("Init Done"); // initialisation des 2 cartes PCA9786 pwm.begin(); pwm.setPWMFreq(60); // Analog servos run at ~60 Hz updates
pwm1.begin(); pwm1.setPWMFreq(60); // Analog servos run at ~60 Hz updates
}
void loop() { // put your main code here, to run repeatedly: // You MUST call the NmraDcc.process() method frequently from the Arduino loop() function for correct library operation Dcc.process(); } |
|
Fantasio Membre
Age : 64 Localisation : Saint Médard en Jalles (33) Nombre de messages : 2367 Date d'inscription : 15/11/2019
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Lun 27 Mar 2023 - 0:29 | |
| Dans un précédent message, je te cite - Ch'zé a écrit:
- ...
J'ai réussi commandé une led avec ma multi Maus via un circuit electronique d'essai et un Arduino...
Ce code m'intéresse particulièrement, te serait il possible de le poster? Merci par avance. |
|
Ch'zé Membre
Age : 59 Localisation : Le parcq Nombre de messages : 36 Date d'inscription : 26/02/2022
| Sujet: Re: commande aiguille avec Multimaus - Arduino- PCA9685 Lun 27 Mar 2023 - 9:41 | |
| - Code:
-
// Utilisation de la librairie DCC Decoder pour lire les trames DCC #include "DCC_Decoder.h"
// Adresse de base du Arduino-Decodeur #define baseAdresse 100
// Déclaration des éléments par rapport aux broches de l'Arduino // La LED verte est connectée à la broche 3 // La LED rouge est connectée à la broche 4 const int Led_Verte = 3; const int Led_Rouge = 4;
// Cette fonction est appelée par la librairie pour // chaque activer / désactiver au niveau des adresses void BasicAccDecoderPacket_Handler(int address, boolean activate, byte data) { address -= 1; address *= 4; address += 1; address += (data & 0x06) >> 1; //address = address - 4; // cette ligne devra être décommentée si centrale RocoMouse et/ou z21
boolean enable = (data & 0x01) ? 1 : 0; // Ex: si adresse de base est 100 alors l'arduino réagit aux adresse 100, 101, 102,... // Si l'adresse accessoire envoyée par la centrale correspond à l'une de notre programme // Alors on récupère son état (activé/désactivé) et on exécute en conséquence les actions // Ici la gestion de l'alimentation de 2 LEDs. switch (address) { case (baseAdresse): if (enable) { digitalWrite(Led_Rouge, LOW); digitalWrite(Led_Verte, HIGH); } else { digitalWrite(Led_Rouge, HIGH); digitalWrite(Led_Verte, LOW); } break;
// Cas pour les adresses suivantes /* case (baseAdresse + 1):
break;
case (baseAdresse + 2): break; */ }
}
void setup() { // Broche des LEDs en mode "Sortie" pinMode(Led_Rouge, OUTPUT); pinMode(Led_Verte, OUTPUT); // Init les Voyants, par défaut Rouge actif digitalWrite(Led_Rouge, HIGH); digitalWrite(Led_Verte, LOW);
// Les 2 lignes suivantes permettent d'initialiser la librairie DCC Decoder DCC.SetBasicAccessoryDecoderPacketHandler(BasicAccDecoderPacket_Handler, true); DCC.SetupDecoder( 0x00, 0x00, 0 ); }
void loop() {
// Appel de la librairie DCC pour lire les valeurs DCC.loop(); } "piloter l’adresse 100 depuis votre centrale (ou ordinateur) et basculer entre les états on/off pour allumer le voyant rouge ou vert." |
|