Pages: 1 [2] 3 4   Go Down
Author Topic: radiocomando rc motor shield rev3  (Read 3578 times)
0 Members and 1 Guest are viewing this topic.
0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

1500 +-100(circa)microsec è il segnale PPM che indica il centro dello stick. quindi non solo puoi comandare avanti e indietro, ma pure la velocità
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

niente non solo ho provato e riprovato decine di codici diversi exnovi o modifiche di altri,ma tutto quello che sono riuscito a fare è far girare il motore ininterrottamente senza nessun controllo.
mi fuma la testa...
devo essere sincero,senza una minima base di conoscenza informatica di programmazzione,è quasi impossibile solo capire quello che si sta scrivendo, figuriamoci capire i codici più complessi.per chi volesse farsi due risate smiley:
// This is the main code, it should run on the main processor
// digital pins 3 & 12 control motor1,
// DP is inputs from the R/C receiver.
// All analog pins are open.
//

int pwmmotor = 3; // motor 1 PWM
int dirmotor = 12; // motor 1 DIR
int servo1 = 2;  // r/c channel 1
int power = 4; // power for R/C receiver, stays HIGH (5v).
int durata = 0;

volatile unsigned long servo1_startPulse;
volatile unsigned servo1_val;
volatile int adj_val1;
volatile int servo1_Ready;



int low1 = 1100;  // adjust these values if your R/C readings are above or below these for channels 1
int high1 = 1900;
int n = 0;

void setup() {
 
  Serial.begin(9600);
 
  //motor1 pins
  pinMode(pwmmotor, OUTPUT);
  pinMode(dirmotor, OUTPUT);

  //pinMode(relay_Pin, OUTPUT);
 
  pinMode(power, OUTPUT);
 
  //PPM inputs from RC receiver
  pinMode(servo1, INPUT); //Pin 2 as input
 
  digitalWrite(power, HIGH);
  //digitalWrite(relay_Pin, LOW);
 
  delay(1200);

  }
/////// MAIN LOOP

void loop() {
 

///// channel 1 good signal check
 if (servo1_val < 1100 || servo1_val > 1900) {  // only set the servo1_Ready flag if the value is a valid Servo pulse between 1100-1900 microseconds.
  servo1_Ready = false;
  servo1_val = 1500;
  durata = pulseIn(servo1,HIGH);  // durata impulso
 }

 else {
  servo1_Ready = true; // if not, don't pass the value to be processed
 }

    if (servo1_Ready) {
     
      servo1_Ready = false; 
      adj_val1 = map(constrain(servo1_val, 1100, 1900), low1, high1, 0, 511);
      constrain(adj_val1, 0, 551);
     
      if (adj_val1 < 0) {
        adj_val1 = 0;
      }     
      if (adj_val1 > 551) {
        adj_val1 = 551;
      }
     if(durata < 1650) { 
         digitalWrite (dirmotor,LOW);
         analogWrite (pwmmotor,adj_val1);
    }
         if(durata > 1450) { 
         digitalWrite (dirmotor,HIGH);
         analogWrite (pwmmotor,adj_val1);
    }
}   
 
   //print values to Serial monitor in Arduino IDE
    Serial.print("ch1:  ");
    Serial.print(adj_val1);
    Serial.print("  ");
    Serial.print("rc1:  ");
    Serial.print(servo1_val);
    Serial.print("  ");
    Serial.print("loop counter:  ");
    Serial.print(n);
    Serial.println("  ");   

    //n++;

 
 
}
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

allora, usa il tag [ code][ /code] se no non si capisce una mazza.
puoi allegare anche l'output dell'arduino su seriale?

edit: anche schemi di collegamento con i componenti utilizzati
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset





io sò che ci sono moltissimi errori nel mio pseudo codice e capisco quanda pazienza stai portando con me e ti ringrazio,

allora :
1:Motor shield rev3 agganciata ad arduino
2:motore 12v collegato alla motor shield rev3 sul uscita "A" dove PWM= pin 3 arduino e DIR=pin 12 arduino
3:alimentazione ricevente RC su 5v e GND arduino
4:rirno del segnale della ricevente = pin 2 arduino
5:alimentazione Arduino esterna tramite alimentatore 12v 1A



------------------------------------------------------------------------------------------------------------------

int pwmmotor = 3;            // motor 1 PWM
int dirmotor = 12;           // motor 1 DIR
int servo1 = 2;              // r/c channel 1
int power = 4;               // power for R/C receiver, stays HIGH (5v).
int durata = 0;

volatile unsigned long servo1_startPulse;
volatile unsigned servo1_val;
volatile int adj_val1;
volatile int servo1_Ready;



int low1 = 1100;
int high1 = 1900;
int n = 0;

void setup() {
 
  Serial.begin(9600);
 

  pinMode(pwmmotor, OUTPUT);
  pinMode(dirmotor, OUTPUT);
  pinMode(power, OUTPUT);
  pinMode(servo1, INPUT); 

  digitalWrite(power, HIGH);
 
  delay(1200);
}

void loop() {
 


 if (servo1_val < 1100 || servo1_val > 1900) { 
  servo1_Ready = false;
  servo1_val = 1500;
  durata = pulseIn(servo1,HIGH);          // durata impulso
 }

 else {
  servo1_Ready = true;
  }

    if (servo1_Ready) {
     
      servo1_Ready = false; 
      adj_val1 = map(constrain(servo1_val, 1100, 1900), low1, high1, 0, 511);
      constrain(adj_val1, 0, 551);
     
      if (adj_val1 < 0) {
        adj_val1 = 0;
      }     
      if (adj_val1 > 551) {
        adj_val1 = 551;
      }
     if(durata < 1650) { 
         digitalWrite (dirmotor,LOW);
         analogWrite (pwmmotor,adj_val1);
    }
         if(durata > 1450) { 
         digitalWrite (dirmotor,HIGH);
         analogWrite (pwmmotor,adj_val1);
    }
}   
 
    Serial.print("ch1:  ");
    Serial.print(adj_val1);
    Serial.print("  ");
    Serial.print("rc1:  ");
    Serial.print(servo1_val);
    Serial.print("  ");
    Serial.print("loop counter:  ");
    Serial.print(n);
    Serial.println("  ");   
 
}


-----------------------------------------------------------------------------
Serial monitor:


ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 
ch1:  255  rc1:  1500  loop counter:  0 


quando ho provato un altro codice ho visto che il valore rc1 variava da 1100 a 1900 ma in questo codice no.
Fammi saperese ti ho detto tutto e chiaro o hai bisogno di altro.
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

USA IL TAG CODE!

allora la
Code:
durata = pulseIn(servo1,HIGH);          // durata impulso
la fai ogni loop, non capisco che diavolo serva la if che hai messo, se non per far casino.

adj_val1 va da 0 a 255, non capisco cosa centri il 551

insomma sistema il codice, in pratica nel loop deve rimanere:
1 pulseIn (ovvero prendere l'input)
2 la gestione del motore
Code:
if(durata < 1650) {
         digitalWrite (dirmotor,LOW);
         analogWrite (pwmmotor,adj_val1);
    }
         if(durata > 1450) {
         digitalWrite (dirmotor,HIGH);
         analogWrite (pwmmotor,adj_val1);
    }
aggiustando però il fatto che le due durate "cozzano" tra di loro
3 il codice di debug sulla Serial.

devi assicurati che il valore di rc1 vari da 1100 a 1900, e che il motore risponda di conseguenza.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Dubai, UAE
Offline Offline
Edison Member
*
Karma: 22
Posts: 1675
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Hi,
  are you just trying to use a RC transmitter and receiver to drive dc motors through a 293 or similar ic ?

If so I have a similar project which I plan to complete shortly, mine is a tracked vehicle which I want to control with my RC car transmitter. The transmitter has a trigger for throttle and a wheel for steering so I will be using a simple mapping on the throttle and steering channels to convert the steering input into a speed differential between the left and right motors, over all speed will be determined by the throttle input.

One thing you should consider is instead of using constrain to bring invalid inputs into a valid range, treat invalid input as an error and stop or slow down your vehicle, my RC cars run at 40km so it's very important that I deal with even the smallest error. at the very least you should turn on an indicator led for a short time every time you read an invalid post, that way you can at least tell if you have a problem you need to look into.

sorry for the English again

Duane B



Logged


Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

cosi è quello che mi dicevi di usare il tag code? il codice potrebbe andare?l'ho provato ma cosi non mi legge nessun parametro del telecomando, nel serial monotor è tutto a zero.per il codice di dubug seriale non sò come si fa a vederlo.
Quote
int pwmmotor = 3;            // motor 1 PWM
int dirmotor = 12;           // motor 1 DIR
int servo1 = 2;              // r/c channel 1
int power = 4;               // power for R/C receiver, stays HIGH (5v).


volatile unsigned long servo1_startPulse;
volatile unsigned servo1_val;
volatile int adj_val1;
volatile int servo1_Ready;
volatile int durata;


int low1 = 1100;
int high1 = 1900;
int n = 0;


void setup() {

  Serial.begin(9600);

  
  pinMode(pwmmotor, OUTPUT);
  pinMode(dirmotor, OUTPUT);
  pinMode(power, OUTPUT);
  pinMode(servo1, INPUT); 

  digitalWrite(power, HIGH);

  delay(1200);
}

void loop() {



  durata = pulseIn(servo1,HIGH);  // durata impulso

  adj_val1 = map(constrain(servo1_val, 1600, 1900), low1, high1, 0, 255);
  constrain(adj_val1, 0, 255);

  if(durata > 1600) { 
    digitalWrite (dirmotor,HIGH);
    analogWrite (pwmmotor,adj_val1);
  }     

  if(durata < 1400) { 
    digitalWrite (dirmotor,LOW);
    analogWrite (pwmmotor,adj_val1);
  }     


  Serial.print("ch1:  ");
  Serial.print(adj_val1);
  Serial.print("  ");
  Serial.print("rc1:  ");
  Serial.print(servo1_val);
  Serial.print("  ");
  Serial.print("loop counter:  ");
  Serial.print(n);
  Serial.println("  ");   

}

Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

sì, questo è il tag code... c'è una bella differenza, che dici?  smiley-mr-green

allora, tu fai:
Code:
durata = pulseIn(servo1,HIGH);  // durata impulso
e fin quì ok.
poi fai:
Code:
adj_val1 = map(constrain(servo1_val, 1600, 1900), low1, high1, 0, 255);
ma servi1_val non viene "scritta"(si dice inizializzata) da nessuna parte, quindi contiene un valore a caso (in questo caso 0)

di conseguenza adj_val1 rimarrà sempre a 0!
devi mettere durata al posto di servo1_val. (errore di distrazione?)

per codice di debug della seriale intendo il codice con cui mandi i valori via seriale per controllare se sono giusti, appunto il debug.
in pratica il codice di debug è questo:
Code:
  Serial.print("ch1:  ");
  Serial.print(adj_val1);
  Serial.print("  ");
  Serial.print("rc1:  ");
  Serial.print(servo1_val);
  Serial.print("  ");
  Serial.print("loop counter:  ");
  Serial.print(n);
  Serial.println("  ");
a cui manca la print di durata.

il resto mi pare a posto, vabbè qualche variabile messa lì a far la muffa ma niente di grave
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

si molto megliola lettura tag,scusa ma non ne conoscevo l'esistenza.
finalmente inizio a vedere qualche piccolo risultato,ho modificato questo:
Quote
 adj_val1 = map(constrain(durata, 1600, 1900), low1, high1, 0, 255);
  constrain(adj_val1, 0, 255);
e questo:
  Serial.print("dura:  ");
  Serial.print(durata);
  Serial.print("ch1:  ");
  Serial.print(adj_val1);
  Serial.print("  ");
  Serial.print("rc1:  ");
  Serial.print(servo1_val);
  Serial.print("  ");
  Serial.print("loop counter:  ");
  Serial.print(n);
  Serial.println("  ");        
ora però quando gli dò solo un inpulso avanti il motore gira in avanti senza variare velocità e senza fermarsi,poi dò un colpetto indietro e il motore inverte il senso di rotaione ma senza mai variare velocità e senza mai fermarsi.funziona un pò come un invertitore di marcia a piena velocità che come un variatore di velocità,non sò se mi sono spiegato.
 ecco il serial:


dura:  2018ch1:  255  rc1:  0  loop counter:  0  
dura:  1860ch1:  242  rc1:  0  loop counter:  0  
dura:  3531ch1:  255  rc1:  0  loop counter:  0  
dura:  6336ch1:  255  rc1:  0  loop counter:  0  
dura:  1511ch1:  159  rc1:  0  loop counter:  0  
dura:  1484ch1:  159  rc1:  0  loop counter:  0  
dura:  1570ch1:  159  rc1:  0  loop counter:  0  
dura:  1992ch1:  255  rc1:  0  loop counter:  0  
dura:  3315ch1:  255  rc1:  0  loop counter:  0  
dura:  1507ch1:  159  rc1:  0  loop counter:  0  
dura:  1621ch1:  166  rc1:  0  loop counter:  0  
dura:  1964ch1:  255  rc1:  0  loop counter:  0  
dura:  5891ch1:  255  rc1:  0  loop counter:  0  
dura:  1482ch1:  159  rc1:  0  loop counter:  0  
dura:  1494ch1:  159  rc1:  0  loop counter:  0  
dura:  1619ch1:  165  rc1:  0  loop counter:  0  
dura:  1955ch1:  255  rc1:  0  loop counter:  0  
dura:  6742ch1:  255  rc1:  0  loop counter:  0  
dura:  1523ch1:  159  rc1:  0  loop counter:  0  
dura:  1505ch1:  159  rc1:  0  loop counter:  0  
dura:  1602ch1:  160  rc1:  0  loop counter:  0  
dura:  5377ch1:  255  rc1:  0  loop counter:  0  
dura:  6878ch1:  255  rc1:  0  loop counter:  0  
dura:  1515ch1:  159  rc1:  0  loop counter:  0  
dura:  1598ch1:  159  rc1:  0  loop counter:  0  
dura:  1957ch1:  255  rc1:  0  loop counter:  0  
dura:  5622ch1:  255  rc1:  0  loop counter:  0  
dura:  1392ch1:  159  rc1:  0  loop counter:  0  
dura:  1989ch1:  255  rc1:  0  loop counter:  0  
dura:  1610ch1:  162  rc1:  0  loop counter:  0  
dura:  5622ch1:  255  rc1:  0  loop counter:  0  
dura:  10210ch1:  255  rc1:  0  loop counter:  0  
dura:  1527ch1:  159  rc1:  0  loop counter:  0  
dura:  1482ch1:  159  rc1:  0  loop counter:  0  
dura:  1578ch1:  159  rc1:  0  loop counter:  0  
dura:  5789ch1:  255  rc1:  0  loop counter:  0  
dura:  1497ch1:  159  rc1:  0  loop counter:  0  
dura:  1511ch1:  159  rc1:  0  loop counter:  0  
dura:  1621ch1:  166  rc1:  0  loop counter:  0  
dura:  1569ch1:  159  rc1:  0  loop counter:  0  
dura:  6553ch1:  255  rc1:  0  loop counter:  0  
dura:  1510ch1:  159  rc1:  0  loop counter:  0  
dura:  1476ch1:  159  rc1:  0  loop counter:  0  
dura:  1602ch1:  160  rc1:  0  loop counter:  0  
dura:  1069ch1:  159  rc1:  0  loop counter:  0  
dura:  2013ch1:  255  rc1:  0  loop counter:  0  
dura:  1507ch1:  159  rc1:  0  loop counter:  0  
dura:  1615ch1:  164  rc1:  0  loop counter:  0  
dura:  1502ch1:  159  rc1:  0  loop counter:  0  
dura:  6316ch1:  255  rc1:  0  loop counter:  0  
dura:  1410ch1:  159  rc1:  0  loop counter:  0  
dura:  1511ch1:  159  rc1:  0  loop counter:  0  
dura:  1599ch1:  159  rc1:  0  loop counter:  0  
dura:  1085ch1:  159  rc1:  0  loop counter:  0  
dura:  6094ch1:  255  rc1:  0  loop counter:  0  

edit: misono accorto che ho messoda 1600 -1900 anzichè 1100-1900

 adj_val1 = map(constrain(durata, 1100, 1900), low1, high1, 0, 255);
  constrain(adj_val1, 0, 255);

ora che l'ho cambiato fa lo stesso scherzo solo che quando gira in avanti gira veloce(PWM 255 +- fisso),mentre quando gira indietro(PWM basso) però sempre senza mai fermarsi.
PS.:non funziona più il tag code me lo copia cosi...
« Last Edit: May 09, 2012, 01:29:42 pm by micky861 » Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Vabbe con i tag ci puoi litigare dopo. Ora l'errore e nella map:tu vuoi che a 1600 il pwm sia 0, e che sia 255 sia a 1100 che a 1900.
O metti 2mappa nell'if oppure una mappa con valori da -255 a255 poi cambi l'of e dici che se il pwm e negativo attivi la retromarcia, se positivo la marcia normale. Poi fai il modulo del pwm e fai l'analogwrite
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

inanzi tutto non sò come mai se copi il codice con edit>copia per forum non mi copia più nel modo tag code ma copia normalissimamente(nel modo che non ci capisci un cazzo).
allora ho aggiunto un altro blocco map.sembrerebbe funzionare solo che non sò come mai il motore smatta quando gli impulsi di durata sono tra 1400 e 1600,mentre invece dovrebbe essere fermo in quel range o sbaglio?in più quando arrivi a fondo scala con la levetta del telecomando e poi molli,a volte il motore non si ferma rimane alla massima velocità.



int pwmmotor = 3;            // motor 1 PWM
int dirmotor = 12;           // motor 1 DIR
int servo1 = 2;              // r/c channel 1
int power = 4;               // power for R/C receiver, stays HIGH (5v).


volatile unsigned long servo1_startPulse;
volatile unsigned servo1_val;
volatile unsigned servo2_val;
volatile int adj_val1;
volatile int adj_val2;
volatile int servo1_Ready;
volatile int durata;


int low1 = 1100;
int high1 = 1400;
int low2 = 1600;
int high2 = 1900;
int n = 0;


void setup() {

  Serial.begin(9600);


  pinMode(pwmmotor, OUTPUT);
  pinMode(dirmotor, OUTPUT);
  pinMode(power, OUTPUT);
  pinMode(servo1, INPUT); 

  digitalWrite(power, HIGH);

  delay(1200);
}

void loop() {



  durata = pulseIn(servo1,HIGH);  // durata impulso

  adj_val1 = map(constrain(durata, 1100, 1400), low1, high1, 255, 0);
  constrain(adj_val1, 0, 255);
 
  adj_val2 = map(constrain(durata, 1600, 1900), low2, high2, 0, 255);
  constrain(adj_val2, 0, 255);
 
  if(durata > 1600) { 
    digitalWrite (dirmotor,HIGH);
    analogWrite (pwmmotor,adj_val2);
  }     

  if(durata < 1400) { 
    digitalWrite (dirmotor,LOW);
    analogWrite (pwmmotor,adj_val1);
  }     

  Serial.print("dura:  ");
  Serial.print(durata);
  Serial.print("ch1:  ");
  Serial.print(adj_val1);
  Serial.print("  ");
  Serial.print("rc1:  ");
  Serial.print(servo1_val);
  Serial.print("  ");
  Serial.print("loop counter:  ");
  Serial.print(n);
  Serial.println("  ");   

}



Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

tu VORRESTI che stesse fermo, ma dove dici mai al motore di fermarsi?
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

scusa ma se adj_val1 modula il PWM da 1100 a 1400 (da 255 a 0) e adj_val2 modula il PWM da 1600 a 1900 (da 0 a 255), la zona da 1400 a 1600 non dovrebbe essere "morta" ovvero senza nessun segnale PWM?poi se porto lo stick del radiocomando avanti tutto arriva un segnale di circa 1900(motore avanti,PWM 255) ok,qundo lo mollo torna in posizione centrale circa 1500,quindi dato che non rientra in nessun valore adj_valX,non dovrebbero esserci segnali PWM in uscita o sbaglio?
Logged

0
Online Online
Shannon Member
****
Karma: 132
Posts: 10490
:(){:|:&};:
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

ni, il problema è che se il segnale va da 1400 a 1600, tu non chiami l'analogWrite, che di conseguenza continua a ripetere l'ultima cosa che gli hai detto di fare.
Logged

sei nuovo? non sai da dove partire? leggi qui: http://playground.arduino.cc/Italiano/Newbie

Offline Offline
Jr. Member
**
Karma: 0
Posts: 75
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

quindi dovrei aggiungere un blocco che dice che da 1400 a 1600 e viceversa imposta il motore in HIGH o LOW però a 0 di PWM?!
Logged

Pages: 1 [2] 3 4   Go Up
Jump to: