SeeedStudio Motorshield V2 with STP 42D206 Stepper

I was trying to use a STP42D306 stepper with a SeeedStudio Motor Shield V2 on an Arduino. This is a bipolar 2 phase stepper motor. I needed to modify the code to get it working as the SeeedStudio example is for a Unipolar motor. The code used is below. And here’s a pic of the setup:

image

No guarantee that I’ve done it correctly, but the motor spins clockwise/anticlockwise. There are some nice diagrams of the stepping process here.

//  Demo function:The application method to drive the stepper motor.
//  Hareware:Stepper motor - 24BYJ48,Seeed's Motor Shield v2.0
//  Author:Frankie.Chu
//  Date:20 November, 2012
#define MOTOR_CLOCKWISE      0
#define MOTOR_ANTICLOCKWISE  1
/******Pins definitions*************/
#define MOTORSHIELD_IN1	8//8
#define MOTORSHIELD_IN2	11//11
#define MOTORSHIELD_IN3	12//12
#define MOTORSHIELD_IN4	13//13
#define CTRLPIN_A		9//9
#define CTRLPIN_B		10//10

const unsigned char stepper_ctrl[]={0x27,0x36,0x1e,0x0f};




struct MotorStruct
{
	int8_t speed;
	uint8_t direction;
};
MotorStruct stepperMotor;
unsigned int number_of_steps = 200;
/**********************************************************************/
/*Function: Get the stepper motor rotate                               */
/*Parameter:-int steps,the total steps and the direction the motor rotates.*/
/*			if steps > 0,rotates anticlockwise,			   			   */
/*			if steps < 0,rotates clockwise.           				   */
/*Return:	void                      							      */
void step(int steps)
{
	int steps_left = abs(steps)*4;
	int step_number;
	int millis_delay = 60L * 1000L /number_of_steps/(stepperMotor.speed + 50);
delay(millis_delay);


	if (steps > 0) 
	{
		stepperMotor.direction= MOTOR_ANTICLOCKWISE;
		step_number = 0; 
	}
    else if (steps < 0) 
	{
		stepperMotor.direction= MOTOR_CLOCKWISE;
		step_number = number_of_steps;
	}
	else return;


	while(steps_left > 0) 
	{
  
               if(step_number%4 == 0) {
                 digitalWrite(MOTORSHIELD_IN1,1);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,1);
                 digitalWrite(CTRLPIN_B,0);                                
               }
               if(step_number%4 == 1) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,1);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,0);
                 digitalWrite(CTRLPIN_B,1);                                
               }
               if(step_number%4 == 2) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,1);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,0);
                 digitalWrite(CTRLPIN_A,1);
                 digitalWrite(CTRLPIN_B,0);                                
               }
               if(step_number%4 == 3) {
                 digitalWrite(MOTORSHIELD_IN1,0);
                 digitalWrite(MOTORSHIELD_IN2,0);
                 digitalWrite(MOTORSHIELD_IN3,0);
                 digitalWrite(MOTORSHIELD_IN4,1);
                 digitalWrite(CTRLPIN_A,0);
                 digitalWrite(CTRLPIN_B,1);                                
               }               
  
		//PORTB = stepper_ctrl[step_number%4];
		delay(millis_delay);
		if(stepperMotor.direction== MOTOR_ANTICLOCKWISE)
		{
			step_number++;
		    if (step_number == number_of_steps)
		    	step_number = 0;
		}
		else 
		{
			step_number--;
		    if (step_number == 0)
		    	step_number = number_of_steps;
		}
		steps_left --;
		
	}
}
void initialize()
{
	pinMode(MOTORSHIELD_IN1,OUTPUT);
	pinMode(MOTORSHIELD_IN2,OUTPUT);
	pinMode(MOTORSHIELD_IN3,OUTPUT);
	pinMode(MOTORSHIELD_IN4,OUTPUT);
	pinMode(CTRLPIN_A,OUTPUT);
	pinMode(CTRLPIN_B,OUTPUT);
	stop();
	stepperMotor.speed = 1;
	stepperMotor.direction = MOTOR_CLOCKWISE;
}
/*******************************************/
void stop()
{
	/*Unenble the pin, to stop the motor. */
	digitalWrite(CTRLPIN_A,LOW);
    digitalWrite(CTRLPIN_B,LOW);
}

void setup()
{
	initialize();//Initialization for the stepper motor.
}

void loop()
{
	step(200);//Stepper motors rotate anticlockwise 200 steps.
	delay(1000);
	step(-200);//Stepper motors rotate clockwise 200 steps.
	delay(1000);
}

My brain

A view weeks ago I fell over and basically scratched my head. However health care in Japan being how it is (of varying quality, but nothing if not high-tech) I could get an MRI done for about $70. I jumped at the chance, because I’ve always wanted to see inside my own head.

Anyway, for your viewing pleasure here are my MRI images, the raw DICOM data is also available as a tarball incase anyone playing with these systems is looking for a test dataset.

brainA

brainB

brainC

awk oneliners

Remove consecutive lines where the 2nd item is the same:

awk '{if($2 != v) print $0; v=$2}'

zlib simple example (gzseek)

Very simple zlib example. The neat thing is that zlib is transparent to uncompressed files, so you can just replace all your file seeking with zlib code and it’ll work with compressed and uncompressed code. It’s worth noting that gzseek does not support SEEK_END, which can cause issues.


#include <zlib.h>
#include <stdio.h>

int main() {
  gzFile file = gzopen("test.gz", "rb");
  if(file == NULL) {
    fprintf(stderr, "gzopen error\n");
  }

  char buffer[1000];
  int uncomprLen = gzread(file, buffer, 1000);
  buffer[uncomprLen]=0;
  printf("data: %s\n",buffer);  

  int pos = gzseek(file, 5, SEEK_SET);
  
  uncomprLen = gzread(file, buffer, 5);
  buffer[6]=0;
  printf("data: %s\n",buffer);  

  gzclose(file);
}