Go Down

Topic: Code to Control Stepper Motors (Read 1 time) previous topic - next topic

StudentUser460

May 17, 2014, 01:16 am Last Edit: May 17, 2014, 02:15 am by StudentUser460 Reason: 1
Hello Everyone,

I am so sorry to bother you but I need a little help with my code. For my senior design project I am using the neurosky mindwave mobile headset to gather attention values. From those attention values i want to do three things with my stepper motor: turn the motor clockwise, turn the motor counter clockwise, or have the motor be at rest.

I want to use an array of type byte in my code (code is below) to gather up to 5 values between the ranges shown in my switch cases. Once those five values are collected, I want to then send a signal to my motors. I am new to coding for arduino and I greatly appreciate your help at figuring out if this code looks decent and where to put the array. Thank you so much.

More info about the code: I got part of it from the Neurosky website's sample code and the other half from the seeed stepper motor driver wiki.

Thank You Again.

Here is the code:


Code: [Select]
#define LED 13
#define BAUDRATE 115200 // Sets the data rate in bits per second (baud) for serial data transmission.
#define DEBUGOUTPUT 0
#define LED13 0x0D  //(Pin(of(Visual(indication( for(runing("heart(beat"(using(onboard(LED(
#define CW_LIMIT_ANGLE 0x3E8 //(({Hexadecimal}(lowest(clockwise(angle(is(1,(
as(when(set(to(0(it(set(servo(to(wheel(mode(
#define CCW_LIMIT_ANGLE 0xBB8 //( {Hexadecimal}( Highest( anitDclockwise(
angle(is(0XFFF,(as(when(set(to(0(it(set(servo(to(wheel(mode(




#include <Stepper.h>

const int stepsPerRevolution = 400;

int speedpinA=9;//enable motor A
int speedpinB=10;//enable motor B
int speed =127;//define the speed of motor
   ......
analogWrite(speedpinA,speed);//AnalogWrite to Generate PWM to control the motor speed
analogWrite(speedpinB,speed);

int pinI1=8;//define I1 interface
int pinI2=11;//define I2 interface
   ......
digitalWrite(pinI2,HIGH);//turn DC Motor A move clockwise
digitalWrite(pinI1,LOW);


Stepper myStepper(stepsPerRevolution, 8,11,12,13);

// checksum variables
byte generatedChecksum = 0;
byte checksum = 0;
int payloadLength = 0;
byte payloadData[64] = {
0};
byte poorQuality = 0;
byte attention = 0;
byte meditation = 0;
// system variables
long lastReceivedPacket = 0;
boolean bigPacket = false;
//////////////////////////
// Microprocessor Setup //
//////////////////////////
void setup() {
delay(1000); //for Stepper Motor
pinMode(LED,(OUTPUT);
pinMode(BLUESMIRFON,(OUTPUT);//initalize(BlueSMiRF
digitalWrite(BLUESMIRFON,(HIGH);//powertoBlueSMiRF
Serial.begin(BAUDRATE);//USB

// set the speed at 60 rpm:
myStepper.setSpeed(60);
// initialize the serial port:
Serial.begin(9600);
pinMode(9,OUTPUT);
pinMode(10,OUTPUT);
digitalWrite(9,HIGH);
digitalWrite(10,HIGH);

delay(3000) ;
Serial.print(194,BYTE) ;
}
////////////////////////////////
// Read data from Serial UART //
////////////////////////////////
byte ReadOneByte() {
int ByteRead;
while(!Serial.available());
ByteRead = Serial.read();
#if DEBUGOUTPUT
Serial.print((char)ByteRead);   // echo the same byte out the USB serial (for debug purposes)
#endif
return ByteRead;
}
/////////////
//MAIN LOOP//
/////////////
void loop() {
// Look for sync bytes
if(ReadOneByte() == 170) {
if(ReadOneByte() == 170) {
payloadLength = ReadOneByte();
if(payloadLength > 169)                   //Payload length can not be greater than 169
    return;
generatedChecksum = 0;    
for(int i = 0; i < payloadLength; i++) {
  payloadData[i] = ReadOneByte();         //Read payload into memory
      generatedChecksum += payloadData[i];
}  
checksum = ReadOneByte();                   //Read checksum byte from stream  
    generatedChecksum = 255 - generatedChecksum;   //Take one's compliment of generated checksum
  if(checksum == generatedChecksum) {
  poorQuality = 200;
  attention = 0;
  meditation = 0;
  for(int i = 0; i < payloadLength; i++) { // Parse the payload
    switch (payloadData[i]) {
    case 2:
      i++;        
          poorQuality = payloadData[i];
      bigPacket = true;        
      break;
    case 4:
      i++;
      attention = payloadData[i];                    
      break;
    case 5:
      i++;
      meditation = payloadData[i];
      break;
    case 0x80:
          i = i + 3;
      break;
    case 0x83:
      i = i + 25;  
      break;
    default:
      break;
    } // switch
  } // for loop
#if !DEBUGOUTPUT
  // *** Add your code here ***
  if(bigPacket) {
        if(poorQuality == 0)
          digitalWrite(LED, HIGH);
    else
          digitalWrite(LED, LOW);
        Serial.print("PoorQuality: ");
        Serial.print(poorQuality, DEC);
        Serial.print(" Attention: ");
        Serial.print(attention, DEC);

        Serial.print(" Time since last packet: ");
        Serial.print(millis() - lastReceivedPacket, DEC);
        lastReceivedPacket = millis();
        Serial.print("\n");

        switch(attention /3 ) {
    case 0:
// where motor does not move
    if(attention < 30, meditation < 30)
          {

           myStepper.setSpeed(0);

    }
         break;
    case 1:
  // where motor moves clockwise
If(attention >= 80, attention <=100) {
void loop() {
// step one revolution  in one direction:
Serial.println("clockwise");
myStepper.step(stepsPerRevolution);
delay(500);
 }
}
break;
    case 2:
      // where motor moves counter clockwise
If( attention > = 50, attention <=70 )
{
void loop() {
//step one revolution in the other direction:
Serial.println("counterclockwise");
myStepper.step(-stepsPerRevolution);
delay(500);
    }
}
break;
       
   }                
  }
#endif    
  bigPacket = false;    
}
else {
  // Checksum Error
}  // end if else for checksum
} // end if read 0xAA byte
} // end if read 0xAA byte
}

jremington

Please modify your post and put the code in "code tags" -- use the # button on the forum editor.
You might read the sticky on how to post, as well.

Gilgamesh90

What kind of steppers do you have (bipolar or unipolar). I've controlled steppers in the past and I suggest not to use stepper library.

bharathn

AA AA 04 80 02 02 CC AF
this is output i'm getting in mindwave mobile
and wt is the meditation and attention value and then how to get to know it

StanD

The code to control stepper motors will depend on a couple of things:
  • The type of stepper motor - bipolar / unipolar
  • The stepper motor controller
  • The Arduino library you choose to use
I would definitely recommend looking into the AccelStepper library for controlling multiple motors, using non-blocking code and having more advanced functions.

I messed around with stepper motors recently and documented the results on my blog, with sample code and wiring. Hope you find those useful:
Stepper motor wiring tutorial
Bipolar stepper motor control with Arduino and an H-Bridge
28BYJ-48 Unipolar Stepper Motor with ULN2003 driver and Arduino Uno
Arduino experiments, resources and hacks http://42bots.com

Go Up
 


Please enter a valid email to subscribe

Confirm your email address

We need to confirm your email address.
To complete the subscription, please click the link in the email we just sent you.

Thank you for subscribing!

Arduino
via Egeo 16
Torino, 10131
Italy