Bonjour,
cela fait pas mal de temps que je travail sur un projet de tourelles motorisés pour camera,
je me suis donc fait une télécommande et deux tourelles avec moteurs PaP unipolaires.
Mais voila, j'ai eu beau tester des liaisons sans fil en 433Mhz, en Xbee et maintenant en 2.4GHz, la commande des moteurs avec différentes librairies, puis avec controleur pololu (et moteurs modifiés en bipolaire), le symptôme est toujours le même, les moteurs ne réagissent pas dutout comme il faut, ils sont lents et saccadés, mais avec un programme démo simple, ça fonctionne nickel.
Avez-vous deja eu le souci ?
// ianoo, camturret-base v14-05-16.
// Librairies
#include <RH_NRF24.h>
#include <SPI.h>
//#include <VirtualWire.h>
//#include <IRremote.h>
//IRsend irsend;
// Constantes
const int adresse = 1; //configurer ici le N° de tourelle de 1 a 4
const int tiltdirpin = 2;
// la pin pour la LED IR est forcément la 3
const int pandirpin = 4;
const int tiltsteppin = 5;
const int pansteppin = 7;
const int disable = 8;
// Variables
int idcam;
int zoom;
int dezoom;
int senstilt;
int speedtilt;
int senspan;
int speedpan;
int pertilt;
int perpan;
unsigned long previousTiltMillis = 0;
unsigned long previousPanMillis = 0;
unsigned long previousRadioMillis = 0;
int tiltstepstate;
int panstepstate;
// Instance pilote Radio
RH_NRF24 nrf24(9, 10);
// Predefine the message buffer here: Don't put this on the stack:
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN]; // Actually: 28 bytes (32 minus 4 byte header)
void setup() {
Serial.begin(57600);
Serial.println("Run");
if (!nrf24.init())
Serial.println("init failed");
// Defaults after init are 2.402 GHz (channel 2), 2Mbps, 0dBm
if (!nrf24.setChannel(1))
Serial.println("setChannel failed");
if (!nrf24.setRF(RH_NRF24::DataRate2Mbps, RH_NRF24::TransmitPower0dBm))
Serial.println("setRF failed");
// config I/O
pinMode(tiltdirpin, OUTPUT);
pinMode(pandirpin, OUTPUT);
pinMode(tiltsteppin, OUTPUT);
pinMode(pansteppin, OUTPUT);
pinMode(disable, OUTPUT);
}
void loop() {
unsigned long currentMillis = micros();
uint8_t buf[RH_NRF24_MAX_MESSAGE_LEN];
uint8_t len = sizeof(buf);
// if ( curentMillis - previousRadioMillis > 1000) {
// previousRadioMillis = currentMillis;
//if (nrf24.waitAvailableTimeout(100)){
if (nrf24.recv(buf, &len))
{
idcam = buf[1];
zoom = buf[2];
dezoom = buf[3];
senstilt = buf[4];
speedtilt = buf[5];
senspan = buf[6];
speedpan = buf[7];
}
// }
// Si les donnees séries sont bien adressées a cette tourelle
if (idcam == adresse) {
// Gestion du moteur haut/bas
if (speedtilt > 10) {
digitalWrite(disable, LOW);
if (senstilt == 1) {
digitalWrite(tiltdirpin, HIGH);
}
else {
digitalWrite(tiltdirpin, LOW);
}
// commande impulsions non bloquantes
pertilt = map (speedtilt, 10, 255, 2000, 100);
if ((currentMillis - previousTiltMillis) > pertilt)
{
previousTiltMillis = currentMillis;
if (tiltstepstate == LOW) {
tiltstepstate = HIGH;
}
else {
tiltstepstate = LOW;
}
digitalWrite(tiltsteppin, tiltstepstate);
}
}
// Gestion du moteur gauche/droite
if (speedpan > 10) {
digitalWrite(disable, LOW);
if (senspan == 1) {
digitalWrite(pandirpin, HIGH);
}
else {
digitalWrite(pandirpin, LOW);
}
// commande impulsions non bloquantes
perpan = map (speedpan, 10, 255, 2000, 100);
if (currentMillis - previousPanMillis > perpan)
{
previousPanMillis = currentMillis;
if (panstepstate == LOW) {
panstepstate = HIGH;
}
else {
panstepstate = LOW;
}
digitalWrite(pansteppin, panstepstate);
}
}
//On desactive les moteurs si inutilises pour eviter la chauffe
//if ((speedpan && speedtilt) < 10) {
// digitalWrite(disable, HIGH);
// }
// Gestion du zoom
/* if (zoom == 1) {
//for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xC1C738C7, 32); // zoom (28)
delay(40);
//}
}
if (dezoom == 1) {
// for (int i = 0; i < 3; i++) {
irsend.sendNEC(0xC1C7B847, 32); // dezoom (29)
delay(40);
// }
}
*/
}
// Données pour le moniteur série
Serial.print(idcam);
Serial.print(" ");
Serial.print(zoom);
Serial.print(" ");
Serial.print(dezoom);
Serial.print(" ");
Serial.print(senstilt);
Serial.print(" ");
Serial.print(speedtilt);
Serial.print(" ");
Serial.print(senspan);
Serial.print(" ");
Serial.print(speedpan);
Serial.print(" ");
Serial.print(pertilt);
Serial.print(" ");
Serial.println(perpan);
Serial.print(" ");
Serial.print(currentMillis);
Serial.print(" ");
Serial.println(previousPanMillis);
}