B4R Library rCheapStepper - library for the 28BYJ-48 stepper motor using ULN2003 driver board

Discussion in 'B4R Libraries' started by Johan Schoeman, Jul 20, 2019.

Similar threads

B4R Question Random Number
B4R Library rAdafruitMotorShield (V2)
B4R Library Stepper motors
B4R Question Stepper motor + L298N
Games [XUI2D] Mouse following a path
  1. Johan Schoeman

    Johan Schoeman Expert Licensed User

    A wrap for this Github project.

    I have not tested or tried to figure out all the wrapped methods. Just using the stepSingle(Boolean) method to move the stepper motor. Will spend some more time on this to figure out some of the other methods exposed.

    The attached B4R project positions the motor very accurately (using variable "stepcount" to track the position of the motor shaft).

    See the comments in the attached B4R code for what the attached B4R project does:
    1. Clicking on button "Move" moves the motor shaft by the number of degrees specified (in the attached example a random number generated from the natural noise on pin A0)
    2. Clicking on button "Home" returns the motor shaft to the home position via the shortest angle/route
    3. Clicking on button "Nudge" rotates the motor shaft in clockwise direction by "nudgesteps" and the home position will be set according to the last applied "nudgesteps"

    B4R lib attached (rCheapStepper):
    1. Copy the rCheapStepper folder and its contents (.h and .cpp files) to your B4R additional libs folder
    2. Copy rCheapStepper.xml to the root of your B4R additional libs folder.

    1. You can set a value other than 4096 for the number of steps (some motors do 4076 steps per revolution)
    2. You can set the shaft speed (rpm) - I am using 16rpm as max (see setting in B4R code) as it seems to work well.
    3. Using some inline C code to generate a random number from the natural noise on pin A0.
    4. The Looper - it has to be there.
    5. Some methods are blocking and some are non-blocking (main thread)


    Sample Code:
    #Region Project Attributes
    #AutoFlushLogs: True
    #CheckArrayBounds: True
    #StackBufferSize: 300
    #End Region

    Sub Process_Globals
    'These global variables will be declared once when the application starts.
        'Public variables can be accessed from all modules.
        Public Serial1 As Serial
    Dim cs As CheapStepper
    Dim p4, p5, p6 As Pin
    Dim p4click, p5click, p6click As Boolean = False
    Dim stepcount As Long = 0              'keep track of where the stepper motor is relative to the startup or set position
        Dim num As Long                        'it is set by the inline C code and called in p5_StateChanged - random number by reading the natural noise on pin A0
        Dim clockwise As Boolean = True        'clockwise = True, anti-clockwise = False
        Dim nudgesteps As Int = 20
    End Sub

    Private Sub AppStart
    4, p4.MODE_INPUT_PULLUP)  'button to nudge the shaft clockwise forward in "nudgesteps" - see value assigned to nudgesteps above
        p5.Initialize(5, p5.MODE_INPUT_PULLUP)  'button that creates a random number and move the motor shaft accordingly (from shaft current position)
        p6.Initialize(6, p6.MODE_INPUT_PULLUP)  'button to move motor shaft to home position via the shortest route (smallest travel angle)
    "p4_StateChanged")       'add a listener for the button
        p5.AddListener("p5_StateChanged")       'add a listener for the button
        p6.AddListener("p6_StateChanged")       'add a listener for the button
    891011)             'the motor is connected via the motor driver to pins 8, 9, 10, and 11
        cs.Rpm = 16                             'Seems to work well at 16rpm
        cs.TotalSteps = 4096                    '4096 per revolution for the motor that I am using - define your own motor steps

    "myLooper")                   'we need to call cs.run continuously

    End Sub

    Sub myLooper
    'this call needs to be called continuously to keep the stepper motor moving and updated
    End Sub

    Sub p5_StateChanged                         'step a number of random degrees in clockwise direction
    If p5click = False Then                 'only execute code on button down
            Log("state 5 changed")
            p5click = 
    "getRandomNumber"Null)  'get a random number from  0 to 360 from the Inline C code - it comes from the natural noise on pin A0
            Dim deg As Int = num
    Log("DEG = ", deg)
    Dim dir As Byte = Rnd(0,2)          'select a random direction - 0 is clockwise and 1 is anti-clockwise

    If dir = 0 Then
                clockwise = 
    True                'go clockwise
                clockwise = 
    False                'go anti-clockwise
            End If
    Dim steps As Int = 4096 * (deg / 360'4096 = 1 revolution. Based on the "random" value (0 to 360) crearted by the inline C code, calculate the number of steps to move
            For i = 0 To steps
    'do the move in single steps
    If clockwise = True Then              'keep track of how many steps we are moving clockwise/anti-clokwise       
                stepcount = stepcount + steps     'if clockwise - add
                stepcount = stepcount - steps     
    'if anti-clockwise - subtract
            End If     
    Log("Step Count = ", stepcount)
            p5click = 
    End If

    End Sub

    Sub p6_StateChanged                                             'go back to the initial zero position via the shortest turn path
    If p6click = False Then                                     'only execute code on button down
            Log("state 6 changed")
            p6click = 
            stepcount = stepcount 
    Mod 4096                          'how far are we away from the home position?
            Log("MOD stepcount = ", stepcount)
    If stepcount > 2048 Then                                'we are past halve way from home in clockwise direction.
                stepcount = 4096 - stepcount                        'this will be the shortest path to the home position             
                For i = 0 To stepcount - 1
    True)                             'go clockwise back to home position - it is the shortest path
    else If stepcount >= 0 And stepcount <= 2048 Then       'we are less than halve way from home in clockwise direction.
                For i = 0 To stepcount - 1                          'take the shortest path home
                    cs.stepSingle(False)                            'go anti-clockwise back to home position - it is the shortest path
    Else If stepcount < 0 And stepcount > -2048 Then        'we are less than halve way from home in anti-clockwise direction.
                stepcount = -1 * stepcount                          'this will be the shortest path to the home position
                For i = 0 To stepcount - 1
    True)                             'go clockwise back to home position - it is the shortest path
    Else If stepcount <= -2048 And stepcount > -4096 Then   'we are more than halve way from home in anti-clockwise direction.
                stepcount = 4096 + stepcount                        'this will be the shortest path to the home position
                For i = 0 To stepcount - 1
    False)                            'go anti-clockwise back to home position - it is the shortest path
    End If
            stepcount = 
    0                                           'set the home position
            p6click = 
    End If
    End Sub

    Sub p4_StateChanged                                       'move clockwise in steps of 10 micro steps and set the home tracking position accordingly
    If p4click = False Then                               'only execute code on button down
            Log("state 4 changed")
            p4click = 
    True, nudgesteps)                  'move the motor shaft by defined "nudgesteps" in the clockwise direction
            stepcount = 0                                     'the position will set the new "home" position. stepcount will be calculated from here.
            p4click = 
    End If

    End Sub

    'Generate a random number (0 to 360) from the natural "noise" on pin A0
    #If C

    void getRandomNumber (B4R::Object* o) {
       long randNumber;
       randNumber = random(361);
       b4r_main::_num = randNumber;

    #End If

    Attached Files:

    Last edited: Jul 20, 2019
    Erel, rbghongade and Johan Hormaza like this.
  1. This site uses cookies to help personalise content, tailor your experience and to keep you logged in if you register.
    By continuing to use this site, you are consenting to our use of cookies.
    Dismiss Notice