Announcement

Collapse
No announcement yet.

STEPPER with PHPOC BLUE

Collapse
X
 
  • Filter
  • Time
  • Show
Clear All
new posts

  • STEPPER with PHPOC BLUE

    hello,

    i want to wire a stepper with my PHPOC Blue board but without using a shield; i have my arduino driver card card (ULN2003APG IC);
    please do you have any idea;
    i start to regret buying this board... =(

  • #2
    Hi elias,
    Driving a stepper motor is very easy. You already have the ULN2003 driver. Just do a google search for how to wire it to your stepper motor and power supply (note that the stepper motor should not be connected to the PHPoC Blue power as stepper motors require much more current than the board can supply.

    There are several different types of stepper motor wiring configurations, so you need to identify that first. Do you have a 4, 5, or 6 wire motor? The following is for a 6 wire stepper.

    Click image for larger version

Name:	XUC5e.gif
Views:	32
Size:	5.8 KB
ID:	1466



    You then only need to write code to set the controller pins to the desired levels to set the motor position. With this type of hardware, you can do full and half stepping.
    If you want to do full stepping, just set each pin high in turn as follows in a loop. Your loop speed will adjust the stepper motor speed.
    In a loop that repeats four times, each time set the four controller pins to one of the following lines;

    1,0,0,0 (first loop)
    delay 100mS
    0,1,0,0 (second loop)
    delay 100mS
    0,0,1,0 (third loop)
    delay 100mS
    0,0,0,1 (fourth loop)
    delay 100mS

    Your motor should spin. Decrease the delay to make the motor spin faster.

    If you want half stepping, loop eight times instead of four using the following controller pin values.
    1,0,0,0
    1,1,0,0
    0,1,0,0
    0,1,1,0
    0,0,1,0
    0,0,1,1
    0,0,0,1
    0,0,0,1

    Please don't regret buying this board, they are excellent products that are very well made and are quite powerful. Everything takes time to learn, so stick with it and you will be successful.

    Comment


    • #3
      PHPoC is a solution that helps developer bring product from idea to market in a fastest way.
      For controlling step motor, we have designed the step motor controller, which have many convenient features.

      If you want to use ULN2003 driver, @gjt211 has answered clearly in term of hardware and working principle.

      For source code, you can refer to this code.
      PHP Code:
      <?php

      // $psp_id sd_stepper_4p.php date 20160527
      // 4pin control stepper motor driver

      define("STEPPER_MODE_WAVE"0// wave drive
      define("STEPPER_MODE_FULL"1// full step drive
      define("STEPPER_MODE_HALF"2// half step drive

      $st_pid = array( 000);
      $st_start_id 0;
      $st_step_count 0;
      $st_step_mode 0;
      $st_step_us 10000;
      $st_prev_dir 1;

      function 
      add_table_to_int($map$id)
      {
          
      $add = ($map >> ($id 4)) & 0xf;
          if(
      $add 0x8)
              
      $add = -($add 0x8);
          return 
      $add;
      }

      function 
      stepper_set_st($sid$c1$c2$delay$repc)
      {
          global 
      $st_pid;

          
      pid_ioctl($st_pid[$sid], "set count $c1 $c2");
          
      pid_ioctl($st_pid[$sid], "set delay $delay");
          
      pid_ioctl($st_pid[$sid], "set repc $repc");
      }

      function 
      stepper_drive_wave($steps)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_count;
          global 
      $st_step_mode;
          global 
      $st_step_us;

          if(!
      $steps)
              return;

          
      $mod4 $st_step_count 4;
          if(
      $mod4 0)
              
      $mod4 += 4;

          if(
      $steps 0)
          {
              
      $sid0 = ($mod4 0) % 4;
              
      $sid1 = ($mod4 1) % 4;
              
      $sid2 = ($mod4 2) % 4;
              
      $sid3 = ($mod4 3) % 4;
          }
          else
          {
              
      $sid0 = ($mod4 0) % 4;
              
      $sid1 = ($mod4 3) % 4;
              
      $sid2 = ($mod4 2) % 4;
              
      $sid3 = ($mod4 1) % 4;
          }

          
      $st_step_count += $steps;

          if(
      $steps 0)
              
      $steps = -$steps;

          
      $mod4 = ($steps 1) % 4;

          
      // steps to repc table : wave drive mode (high low low low)
          // steps | 1 2 3 4 5 6 7 8 9 ...
          // div2  | 0 1 1 2 2 3 3 4 4 ...
          // repc0 | 1 1 1 2 3 3 3 4 5 ...
          // repc1 | 1 2 2 2 3 4 4 4 5 ...
          // repc2 | 0 1 2 2 2 3 4 4 4 ...
          // repc3 | 0 0 1 2 2 2 3 4 4 ...

                                                                 // div2_add table
          
      $repc0 $steps add_table_to_int(0x0001$mod4); // 1, 0, 0, 0
          
      $repc1 $steps add_table_to_int(0x0111$mod4); // 1, 1, 1, 0
          
      $repc2 $steps add_table_to_int(0x0100$mod4); // 0, 0, 1, 0
          
      $repc3 $steps add_table_to_int(0x0090$mod4); // 0, -1, 0, 0

          //echo "repc: $repc0 $repc1 $repc2 $repc3\r\n";

          
      $high $st_step_us;
          
      $low $st_step_us 3;

          
      $d0 $st_step_us 2;
          
      $d1 0;
          
      $d2 $st_step_us;
          
      $d3 $st_step_us 2;

          
      $trg_id $st_start_id $sid1;

          
      stepper_set_st($sid0$high$low$d0$repc0);
          
      pid_ioctl($st_pid[$sid0], "set trigger from st$trg_id");
          
      pid_ioctl($st_pid[$sid0], "start");

          if(
      $repc2)
          {
              
      stepper_set_st($sid2$low$high$d2$repc2);
              
      pid_ioctl($st_pid[$sid2], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid2], "start");
          }

          if(
      $repc3)
          {
              
      stepper_set_st($sid3$low$high$d3$repc3);
              
      pid_ioctl($st_pid[$sid3], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid3], "start");
          }

          
      stepper_set_st($sid1$low$high$d1$repc1);
          
      pid_ioctl($st_pid[$sid1], "set trigger from php");
          
      pid_ioctl($st_pid[$sid1], "start");
      }

      function 
      stepper_drive_full($steps)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_count;
          global 
      $st_step_mode;
          global 
      $st_step_us;

          if(!
      $steps)
              return;

          
      $mod4 $st_step_count 4;
          if(
      $mod4 0)
              
      $mod4 += 4;

          if(
      $steps 0)
          {
              
      $sid0 = ($mod4 0) % 4;
              
      $sid1 = ($mod4 1) % 4;
              
      $sid2 = ($mod4 2) % 4;
              
      $sid3 = ($mod4 3) % 4;
          }
          else
          {
              
      $sid0 = ($mod4 1) % 4;
              
      $sid1 = ($mod4 0) % 4;
              
      $sid2 = ($mod4 3) % 4;
              
      $sid3 = ($mod4 2) % 4;
          }

          
      $st_step_count += $steps;

          if(
      $steps 0)
              
      $steps = -$steps;

          
      // steps to repc table : full step drive mode (high high low low)
          // steps | 1 2 3 4 5 6 7 8 9 ...
          // div2  | 0 1 1 2 2 3 3 4 4 ...
          // repc0 | 1 1 2 2 3 3 4 4 5 ...
          // repc1 | 0 1 1 2 2 3 3 4 4 ...
          // repc2 | 1 1 2 2 3 3 4 4 5 ...
          // repc3 | 0 1 1 2 2 3 3 4 4 ...

          
      $repc0 = ($steps 1) / 2;
          
      $repc1 $steps 2;
          
      $repc2 = ($steps 1) / 2;
          
      $repc3 $steps 2;

          
      //echo "repc: $repc0 $repc1 $repc2 $repc3\r\n";

          
      $high $st_step_us 2;
          
      $low $st_step_us 2;

          
      $d0 0;
          
      $d1 $st_step_us;
          
      $d2 0;
          
      $d3 $st_step_us;

          
      $trg_id $st_start_id $sid0;

          if(
      $repc1)
          {
              
      stepper_set_st($sid1$high$low$d1$repc1);
              
      pid_ioctl($st_pid[$sid1], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid1], "start");
          }

          
      stepper_set_st($sid2$high$low$d2$repc2);
          
      pid_ioctl($st_pid[$sid2], "set trigger from st$trg_id");
          
      pid_ioctl($st_pid[$sid2], "start");

          if(
      $repc3)
          {
              
      stepper_set_st($sid3$high$low$d3$repc3);
              
      pid_ioctl($st_pid[$sid3], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid3], "start");
          }

          
      stepper_set_st($sid0$high$low$d0$repc0);
          
      pid_ioctl($st_pid[$sid0], "set trigger from php");
          
      pid_ioctl($st_pid[$sid0], "start");
      }

      function 
      drive_half_state_0($sid0$sid1$sid2$sid3$steps)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_us;

          
      $mod8 = ($steps 1) % 8;

          
      // steps to repc table : half step state 0 (high low low low)
          // steps | 1 2 3 4 5 6 7 8 9 ...
          // div4  | 0 0 0 1 1 1 1 2 2 ...
          // repc0 | 0 1 1 1 1 1 2 2 2 ...
          // repc1 | 1 1 1 2 2 2 2 2 3 ...
          // repc2 | 0 0 1 1 1 2 2 2 2 ...
          // repc3 | 0 0 0 0 1 1 1 2 2 ...

                                                                     // div4_add table
          
      $repc0 $steps add_table_to_int(0x01000110$mod8); // 0, 1, 1, 0, 0, 0, 1, 0
          
      $repc1 $steps add_table_to_int(0x01111111$mod8); // 1, 1, 1, 1, 1, 1, 1, 0
          
      $repc2 $steps add_table_to_int(0x01100100$mod8); // 0, 0, 1, 0, 0, 1, 1, 0
          
      $repc3 $steps add_table_to_int(0x00009000$mod8); // 0, 0, 0, -1, 0, 0, 0, 0

          //echo "repc: $repc0 $repc1 $repc2 $repc3\r\n";

          
      $high $st_step_us 3;
          
      $low $st_step_us 5;

          
      $d0 $st_step_us 3;
          
      $d1 0;
          
      $d2 $st_step_us 2;
          
      $d3 $st_step_us 4;

          
      $trg_id $st_start_id $sid1;

          if(
      $repc0)
          {
              
      stepper_set_st($sid0$high$low$d0$repc0);
              
      pid_ioctl($st_pid[$sid0], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid0], "start");
          }

          if(
      $repc2)
          {
              
      stepper_set_st($sid2$low$high$d2$repc2);
              
      pid_ioctl($st_pid[$sid2], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid2], "start");
          }

          if(
      $repc3)
          {
              
      stepper_set_st($sid3$low$high$d3$repc3);
              
      pid_ioctl($st_pid[$sid3], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid3], "start");
          }

          
      stepper_set_st($sid1$low$high$d1$repc1);
          
      pid_ioctl($st_pid[$sid1], "set trigger from php");
          
      pid_ioctl($st_pid[$sid1], "start");
      }

      function 
      drive_half_state_1($sid0$sid1$sid2$sid3$steps)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_us;

          
      $mod8 = ($steps 1) % 8;

          
      // steps to repc table : half step state 1 (high high low low)
          // steps | 1 2 3 4 5 6 7 8 9 ...
          // div4  | 0 0 0 1 1 1 1 2 2 ...
          // repc0 | 1 1 1 1 1 2 2 2 3 ...
          // repc1 | 0 0 1 1 1 1 1 2 2 ...
          // repc2 | 0 1 1 1 2 2 2 2 2 ...
          // repc3 | 0 0 0 1 1 1 2 2 2 ...

                                                                     // div4_add table
          
      $repc0 $steps add_table_to_int(0x01100111$mod8); // 1, 1, 1, 0, 0, 1, 1, 0
          
      $repc1 $steps add_table_to_int(0x00000100$mod8); // 0, 0, 1, 0, 0, 0, 0, 0
          
      $repc2 $steps add_table_to_int(0x01110110$mod8); // 0, 1, 1, 0, 1, 1, 1, 0
          
      $repc3 $steps add_table_to_int(0x01000000$mod8); // 0, 0, 0, 0, 0, 0, 1, 0

          //echo "repc: $repc0 $repc1 $repc2 $repc3\r\n";

          
      $high $st_step_us 3;
          
      $low $st_step_us 5;

          
      $d0 $st_step_us;
          
      $d1 $st_step_us 3;
          
      $d2 0;
          
      $d3 $st_step_us 2;

          
      $trg_id $st_start_id $sid0;

          if(
      $repc1)
          {
              
      stepper_set_st($sid1$high$low$d1$repc1);
              
      pid_ioctl($st_pid[$sid1], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid1], "start");
          }

          if(
      $repc2)
          {
              
      stepper_set_st($sid2$low$high$d2$repc2);
              
      pid_ioctl($st_pid[$sid2], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid2], "start");
          }

          if(
      $repc3)
          {
              
      stepper_set_st($sid3$low$high$d3$repc3);
              
      pid_ioctl($st_pid[$sid3], "set trigger from st$trg_id");
              
      pid_ioctl($st_pid[$sid3], "start");
          }

          
      stepper_set_st($sid0$high$low$d0$repc0);
          
      pid_ioctl($st_pid[$sid0], "set trigger from php");
          
      pid_ioctl($st_pid[$sid0], "start");
      }

      function 
      stepper_drive_half($steps)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_count;
          global 
      $st_step_mode;
          global 
      $st_step_us;
          global 
      $st_prev_dir;

          if(!
      $steps)
              return;

          
      $step_state $st_step_count 2;

          
      //echo "step_state $step_state\r\n";

          
      $div2_mod4 = ($st_step_count 2) % 4;
          if(
      $div2_mod4 0)
              
      $div2_mod4 += 4;

          if(
      $steps 0)
          {
              if(
      $step_state == 0)
              {
                  
      $sid0 = ($div2_mod4 0) % 4;
                  
      $sid1 = ($div2_mod4 1) % 4;
                  
      $sid2 = ($div2_mod4 2) % 4;
                  
      $sid3 = ($div2_mod4 3) % 4;
              }
              else
              {
                  if(
      $st_prev_dir 0)
                  {
                      
      $sid0 = ($div2_mod4 0) % 4;
                      
      $sid1 = ($div2_mod4 1) % 4;
                      
      $sid2 = ($div2_mod4 2) % 4;
                      
      $sid3 = ($div2_mod4 3) % 4;
                  }
                  else
                  { 
      // reverse direction
                      
      $sid0 = ($div2_mod4 3) % 4;
                      
      $sid1 = ($div2_mod4 0) % 4;
                      
      $sid2 = ($div2_mod4 1) % 4;
                      
      $sid3 = ($div2_mod4 2) % 4;
                  }
              }

              
      //$st_prev_dir = 1;
          
      }
          else
          {
              if(
      $step_state == 0)
              {
                  
      $sid0 = ($div2_mod4 0) % 4;
                  
      $sid1 = ($div2_mod4 3) % 4;
                  
      $sid2 = ($div2_mod4 2) % 4;
                  
      $sid3 = ($div2_mod4 1) % 4;
              }
              else
              {
                  if(
      $st_prev_dir 0)
                  {
                      
      $sid0 = ($div2_mod4 0) % 4;
                      
      $sid1 = ($div2_mod4 3) % 4;
                      
      $sid2 = ($div2_mod4 2) % 4;
                      
      $sid3 = ($div2_mod4 1) % 4;
                  }
                  else
                  { 
      // reverse direction
                      
      $sid0 = ($div2_mod4 1) % 4;
                      
      $sid1 = ($div2_mod4 0) % 4;
                      
      $sid2 = ($div2_mod4 3) % 4;
                      
      $sid3 = ($div2_mod4 2) % 4;
                  }
              }

              
      //$st_prev_dir = -1;
          
      }

          
      $st_step_count += $steps;

          if(
      $steps 0)
              
      $steps = -$steps;

          if(
      $step_state == 0)
              
      drive_half_state_0($sid0$sid1$sid2$sid3$steps);
          else
              
      drive_half_state_1($sid0$sid1$sid2$sid3$steps);
      }

      function 
      stepper_setup($st_id$uio0_pin$mode)
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_mode;

          if(
      $st_id 4)
              exit(
      "stepper_setup: st_id out of range $st_id\r\n");

          if(
      $uio0_pin 26)
              exit(
      "stepper_setup: uio0_pin out of range $uio0_pin\r\n");

          for(
      $id 0$id 4$id++)
          {
              
      $mmap_id $st_id $id;

              if(!
      $st_pid[$id])
                  
      $st_pid[$id] = pid_open("/mmap/st$mmap_id");

              
      $pin $uio0_pin $id;

              
      pid_ioctl($st_pid[$id], "reset");
              
      pid_ioctl($st_pid[$id], "set div us");
              
      pid_ioctl($st_pid[$id], "set mode output toggle");
              
      pid_ioctl($st_pid[$id], "set output dev uio0 $pin");

              if(
      $mode == STEPPER_MODE_WAVE)
              {
                  if(
      $id == 0)
                      
      //pid_ioctl($st_pid[$id], "set output high");
                      
      pid_ioctl($st_pid[$id], "set output invert");
                  else
                      
      pid_ioctl($st_pid[$id], "set output low");
              }
              else
              if(
      $mode == STEPPER_MODE_FULL)
              {
                  if((
      $id == 0) || ($id == 1))
                      
      //pid_ioctl($st_pid[$id], "set output high");
                      
      pid_ioctl($st_pid[$id], "set output invert");
                  else
                      
      pid_ioctl($st_pid[$id], "set output low");
              }
              else
              if(
      $mode == STEPPER_MODE_HALF)
              {
                  if(
      $id == 0)
                      
      //pid_ioctl($st_pid[$id], "set output high");
                      
      pid_ioctl($st_pid[$id], "set output invert");
                  else
                      
      pid_ioctl($st_pid[$id], "set output low");
              }
              else
                  exit(
      "stepper_setup: invalid mode $mode\r\n");
          }

          
      $st_start_id $st_id;
          
      $st_step_mode $mode;
      }

      function 
      stepper_speed($step_per_sec)
      {
          global 
      $st_step_us;

          
      $st_step_us 1000000 $step_per_sec;
      }

      function 
      stepper_drive($steps)
      {
          global 
      $st_step_mode;
          global 
      $st_prev_dir;

          if(
      $st_step_mode == STEPPER_MODE_WAVE)
              
      stepper_drive_wave($steps);
          else
          if(
      $st_step_mode == STEPPER_MODE_FULL)
              
      stepper_drive_full($steps);
          else
          if(
      $st_step_mode == STEPPER_MODE_HALF)
              
      stepper_drive_half($steps);

          if(
      $steps)
          {
              if(
      $steps 0)
                  
      $st_prev_dir 1;
              else
                  
      $st_prev_dir = -1;
          }
      }

      function 
      stepper_state()
      {
          global 
      $st_pid;

          for(
      $id 0$id 4$id++)
              if(
      pid_ioctl($st_pid[$id], "get state"))
                  return 
      1;
          return 
      0;
      }

      function 
      stepper_wait()
      {
          while(
      stepper_state())
              
      usleep(1000);
      }

      function 
      stepper_stop()
      {
          global 
      $st_pid;
          global 
      $st_start_id;
          global 
      $st_step_count;
          global 
      $st_prev_dir;

          if(!
      stepper_state())
              return;

          
      $id0 $st_start_id 0;
          
      $id1 $st_start_id 1;
          
      $id2 $st_start_id 2;
          
      $id3 $st_start_id 3;

          
      pid_ioctl($st_pid[0], "stopm $id0 $id1 $id2 $id3");

          
      $repc  = (int)pid_ioctl($st_pid[0], "get repc");
          
      $repc += (int)pid_ioctl($st_pid[1], "get repc");
          
      $repc += (int)pid_ioctl($st_pid[2], "get repc");
          
      $repc += (int)pid_ioctl($st_pid[3], "get repc");

          if(
      $st_prev_dir 0)
              
      $st_step_count -= $repc;
          else
              
      $st_step_count += $repc;
      }

      ?>
      Note that, the above source code is just for reference. It has not tested for stability yet.

      Comment

      Working...
      X