Pages: [1]   Go Down
Author Topic: difficulty in controlling both brushless and dc motors  (Read 722 times)
0 Members and 1 Guest are viewing this topic.
Maniago, Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I am trying to program my arduino 2009 to control both a brushless motor and 2 Dc motors.

For the brushless motor I am using the Servo.h library, using the command "writeMicroseconds()" to control it.
For the Dc motors I am using the Qik2s9v1 controller with Qik2s9v1.h and NewSoftSerial.h libraries (commands: motor.motor0Forward(),  motor.motor0Reverse() etc.).

The two functions if used in separate sketches work perfectly (start, stop, increase and decrease of speed all work well).
If however I try to put them together in the same program I can only get one of them to work (either the 2 dc motors or the brushless motor) even if they are working on different pins.
Any suggestions or places to look for a program that works and that I could copy?
Tks.
Logged

0
Offline Offline
Tesla Member
***
Karma: 145
Posts: 9696
Arduino rocks
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

Without your code issues may be hard to trouble shoot. Check the servo library information and make note of which pins can/can't be used when running PWM and the servo library together.   
Logged

Consider the daffodil. And while you're doing that, I'll be over here, looking through your stuff.   smiley-cool

Manchester (England England)
Offline Offline
Brattain Member
*****
Karma: 635
Posts: 34572
Solder is electric glue
View Profile
WWW
 Bigger Bigger  Smaller Smaller  Reset Reset

Quote
Any suggestions or places to look for a program that works and that I could copy?
On this forum we will help you learn. Where is the learning in copying?
Logged

Maniago, Italy
Offline Offline
Newbie
*
Karma: 0
Posts: 21
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

The project is to build a robot grass cutter: the brushless motor turns the blade that cuts the grass and the 2 dc motors are attached to the wheels.

THIS IS THE PROGRAM (THAT WORKS)TO CONTROL THE BRUSHLESS MOTOR:

#include <Servo.h>
Servo myservo;  // create servo object to control a servo (brushless motor)

int minspe = 800; // min blade speed
int maxspe = 1900; // max speed for blade
int spe;
void setup()
{Serial.begin(9600); // scriviamo qualcosa sul monitor?
  myservo.attach(2);  // attaches the servo on pin 2 to the servo object
 myservo.writeMicroseconds(minspe); //min pulse (otherwise the ESC stops working)
}

void loop()   {
 
  delay (10000); // ******* INITIAL DELAY TO GET THE ESC RUNNING********
  accelerazioneLamaDiTaglio();
  delay (5000);
  decelerazioneLamaDiTaglio();
 delay (5000);
}


void accelerazioneLamaDiTaglio(){
  Serial.println("inizio for loop di accelerazione    ");
  for (spe=800; spe <maxspe; spe++)
  { myservo.writeMicroseconds(spe);
  delay(15);   
  }
}
 
void decelerazioneLamaDiTaglio(){
  for (spe=2000; spe > 800; spe--)
  { myservo.writeMicroseconds(spe);
  delay(15);   
}
}



THIS PROGRAM WORKS AND CONTROLS THE 2 DC MOTORS:

#include <CompactQik2s9v1.h>
#include <NewSoftSerial.h>

/*
   Important Note:
      The rxPin goes to the Qik's "TX" pin
      The txPin goes to the Qik's "RX" pin
*/
#define rxPin 3
#define txPin 4
#define rstPin 5

NewSoftSerial mySerial =  NewSoftSerial(rxPin, txPin);
CompactQik2s9v1 motor = CompactQik2s9v1(&mySerial,rstPin);

byte motorSelection;
byte motorSpeed;
int maxspeed = 110;

 void setup() 
{
  Serial.begin(9600);
  mySerial.begin(9600);
  motor.begin();
 
//  motor.stopBothMotors();
}


void loop()
{
  Serial.println("inizio accer");
motorsacceleration();
delay (10000);
Serial.println("inizio decel");
motorsdecceleration();
delay (3000);
Serial.println("inizio reverse and fwd dx");
motorsreversefwddx();
///delay (5000);
motorsacceleration();
Serial.println("inizio reverse and fwd sx");
delay (10000);
motorsreversefwdsx();
///delay (5000);
 
}
void motorsacceleration(){
  for (int i=10; i<maxspeed; i++){   
 motor.motor0Forward(i);
 motor.motor1Forward(i);
 delay (10);}
}

void motorsdecceleration(){
  for (int i=maxspeed; i>1; i--){ 
 motor.motor0Forward(i);
 motor.motor1Forward(i);
 delay (10);}
}

void motorsreversefwddx(){
//if (int i>0) { motorsdecceleration();}
 for (int i=10; i<60; i++){   
 motor.motor0Reverse(i*2);
 motor.motor1Reverse(i);
 delay (10);}
delay (3000);
}

void motorsreversefwdsx(){
   for (int i=10; i<60; i++){   
 motor.motor0Reverse(i);
 motor.motor1Reverse(i*2);
 delay (10);}
delay (3000);
}


THIS IS THE PROGRAM THAT HAS SOME DIFFICULTY IN RUNNING CORRECTLY: I PUT A FEW LINES OF PROGRAM TO SEE IF I COULD CONTROL THE MOTORS MANUALLY (WITH 2 SWITCHES) ON PIN 9 AND 12.
 I CAN MODIFY THE SPEED OF THE BLADE BUT NO RESPONSE FROM THE 2 DC MOTORS
// .h
#include <Servo.h> //per la lama
Servo myservo;  // create servo object to control a servo

#include <CompactQik2s9v1.h> // per i motori di trazione
#include <NewSoftSerial.h>  // per i motori di trazione


// variables - lama di taglio
int minspe = 800; // velocita' zero lama di taglio
int maxspe = 1900; // massima velocita' lama di taglio
int spe;


// variables - 2 motori di trazione
#define rxPin 3
#define txPin 4
#define rstPin 5

NewSoftSerial mySerial =  NewSoftSerial(rxPin, txPin);
CompactQik2s9v1 motor = CompactQik2s9v1(&mySerial,rstPin);

///byte motorSelection;
///byte motorSpeed;
int maxspeed = 110;


void setup(){

  myservo.attach(2);  // attaches the servo on pin 2 to the servo object
 myservo.writeMicroseconds(minspe); //fornire al motore l'impulso minimo (altrimenti si blocca)
 delay (10000);
 accelerazioneLamaDiTaglio();
}
void loop()   {
  Serial.println("loop    ");
 int ledPin = 12;   // manual control of blade
 pinMode (ledPin, INPUT); // manual control of blade
int ledPin9 = 9;
 pinMode (ledPin9, INPUT);
 
 if (digitalRead(ledPin)== HIGH)
 decelerazioneLamaDiTaglio() ;
 delay (15);
if (digitalRead (ledPin)== LOW && spe < 900)
accelerazioneLamaDiTaglio();

if (digitalRead(ledPin9)== HIGH)
motorsacceleration();
delay (10);
}


void accelerazioneLamaDiTaglio(){
  Serial.println("inizio for loop di accelerazione    ");
  for (spe=800; spe <maxspe; spe++)
  { myservo.writeMicroseconds(spe);
  delay(15);   
  }
}
void decelerazioneLamaDiTaglio(){
  for (spe=2000; spe > 800; spe--)
  { myservo.writeMicroseconds(spe);
  delay(10);   
}}

void motorsacceleration(){
  for (int i=10; i<maxspeed; i++){   
 motor.motor0Forward(i);
 motor.motor1Forward(i);
 delay (10);}}


Grumpy_Mike, you are right:
my idea of coping was to learn by reading a program that works...

Tks.
Logged

Montreal
Offline Offline
Faraday Member
**
Karma: 30
Posts: 2602
Per aspera ad astra.
View Profile
 Bigger Bigger  Smaller Smaller  Reset Reset

I can't see Serial.begin(9600) in combine sketch setup.
And second, both sketches use "blocking" function  to control motors - delay.
Whenever one motor accelerating / decelerating another motor just waiting.
You have to re-work your code, get rid of DELAY. Look into example :
"Blinking w/o delay" for begining.
Logged

Pages: [1]   Go Up
Jump to: