Hello,
If you want, there is some source. If not, do not fret. Someone helped me
along the way and I got things resolved.
Seth
On Monday, January 27, 2020 at 5:41:43 AM UTC-6, Mala Dies wrote:
>
> Hello,
>
> Hmm. I have been trying to get my Motor Bridge Cape to work recently for a
> Maker Faire coming up. If all else fails, I will try to get the BBBW and
> MotorCape working again.
>
> ...
>
> So, w/out further ado, here is the source:
>
> # /*
> # * MotorBridge.py
> # * This is a library for BBG/BBB motor bridge cape
> # *
> # * Copyright (c) 2015 seeed technology inc.
> # * Author : Jiankai Li
> # * Create Time : Nov 2015
> # * Change Log : From #beagle on Freenode and my changes (Seth 2019)!
> # *
> # * The MIT License (MIT)
> # *
> # * Permission is hereby granted, free of charge, to any person obtaining
> a copy
> # * of this software and associated documentation files (the "Software"),
> to deal
> # * in the Software without restriction, including without limitation the
> rights
> # * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> sell
> # * copies of the Software, and to permit persons to whom the Software is
> # * furnished to do so, subject to the following conditions:
> # *
> # * The above copyright notice and this permission notice shall be
> included in
> # * all copies or substantial portions of the Software.
> # *
> # * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> # * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> # * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL THE
> # * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> # * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING FROM,
> # * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS IN
> # * THE SOFTWARE.
> # */
> # FileName : MotorBridge.py
> # by Jiankai.li
>
> from smbus2 import SMBus
> import time
> import pathlib
>
> # reset pin is P9.23, i.e. gpio1.17
> reset_pin = pathlib.Path('/sys/class/gpio/gpio49/direction')
> reset_pin.write_text('low')
>
> MotorBridge = SMBus('/dev/i2c-2')
>
> ReadMode = 0
> WriteMode = 1
> DeAddr = 0X4B
> ConfigValid = 0x3a6fb67c
> DelayTime = 0.005
>
> # TB_WORKMODE
>
> TB_SHORT_BREAK = 0
> TB_CW = 1
> TB_CCW = 2
> TB_STOP = 3
> TB_WORKMODE_NUM = 4
>
>
> # TB_PORTMODE
>
> TB_DCM = 0
> TB_SPM = 1
> TB_PORTMODE_NUM = 2
>
>
> # SVM_PORT
>
> SVM1 = 0
> SVM2 = 1
> SVM3 = 2
> SVM4 = 3
> SVM5 = 4
> SVM6 = 5
> SVM_PORT_NUM = 6
>
> # SVM_STATE
>
> SVM_DISABLE = 0
> SVM_ENABLE = 1
> SVM_STATE_NUM = 2
>
> # IO_MODE
>
> IO_IN = 0
> IO_OUT = 1
> IO_MODE_NUM = 2
>
> # IO_PUPD
>
> IO_PU = 0
> IO_PD = 1
> IO_NP = 2
> IO_PUPD_NUM = 3
>
> # IO_PPOD
>
> IO_PP = 0
> IO_OD = 1
> IO_PPOD_NUM = 2
>
> # IO_STATE
>
> IO_LOW = 0
> IO_HIGH = 1
> IO_STATE_NUM = 2
>
> # IO_PORT
>
> IO1 = 0
> IO2 = 1
> IO3 = 2
> IO4 = 3
> IO5 = 4
> IO6 = 5
> IO_NUM = 6
>
>
> # PARAM_REG
>
> CONFIG_VALID = 0
> CONFIG_TB_PWM_FREQ = CONFIG_VALID + 4
>
> I2C_ADDRESS = CONFIG_TB_PWM_FREQ + 4
>
> TB_1A_MODE = I2C_ADDRESS + 1
> TB_1A_DIR = TB_1A_MODE + 1
> TB_1A_DUTY = TB_1A_DIR + 1
> TB_1A_SPM_SPEED = TB_1A_DUTY + 2
> TB_1A_SPM_STEP = TB_1A_SPM_SPEED + 4
>
> TB_1B_MODE = TB_1A_SPM_STEP + 4
> TB_1B_DIR = TB_1B_MODE + 1
> TB_1B_DUTY = TB_1B_DIR + 1
> TB_1B_SPM_SPEED = TB_1B_DUTY + 2
> TB_1B_SPM_STEP = TB_1B_SPM_SPEED + 4
>
> TB_2A_MODE = TB_1B_SPM_STEP + 4
> TB_2A_DIR = TB_2A_MODE + 1
> TB_2A_DUTY = TB_2A_DIR + 1
> TB_2A_SPM_SPEED = TB_2A_DUTY + 2
> TB_2A_SPM_STEP = TB_2A_SPM_SPEED + 4
>
> TB_2B_MODE = TB_2A_SPM_STEP + 4
> TB_2B_DIR = TB_2B_MODE + 1
> TB_2B_DUTY = TB_2B_DIR + 1
> TB_2B_SPM_SPEED = TB_2B_DUTY + 2
> TB_2B_SPM_STEP = TB_2B_SPM_SPEED + 4
>
> SVM1_STATE = TB_2B_SPM_STEP + 4
> SVM1_FREQ = SVM1_STATE + 1
> SVM1_ANGLE = SVM1_FREQ + 2
>
> SVM2_STATE = SVM1_ANGLE + 2
> SVM2_FREQ = SVM2_STATE + 1
> SVM2_ANGLE = SVM2_FREQ + 2
>
> SVM3_STATE = SVM2_ANGLE + 2
> SVM3_FREQ = SVM3_STATE + 1
> SVM3_ANGLE = SVM3_FREQ + 2
>
> SVM4_STATE = SVM3_ANGLE + 2
> SVM4_FREQ = SVM4_STATE + 1
> SVM4_ANGLE = SVM4_FREQ + 2
>
> SVM5_STATE = SVM4_ANGLE + 2
> SVM5_FREQ = SVM5_STATE + 1
> SVM5_ANGLE = SVM5_FREQ + 2
>
> SVM6_STATE = SVM5_ANGLE + 2
> SVM6_FREQ = SVM6_STATE + 1
> SVM6_ANGLE = SVM6_FREQ + 2
>
> IO1_STATE = SVM6_ANGLE + 2
> IO1_MODE = IO1_STATE + 1
> IO1_PUPD = IO1_MODE + 1
> IO1_PPOD = IO1_PUPD + 1
>
> IO2_STATE = IO1_PPOD + 1
> IO2_MODE = IO2_STATE + 1
> IO2_PUPD = IO2_MODE + 1
> IO2_PPOD = IO2_PUPD + 1
>
> IO3_STATE = IO2_PPOD + 1
> IO3_MODE = IO3_STATE + 1
> IO3_PUPD = IO3_MODE + 1
> IO3_PPOD = IO3_PUPD + 1
>
> IO4_STATE = IO3_PPOD + 1
> IO4_MODE = IO4_STATE + 1
> IO4_PUPD = IO4_MODE + 1
> IO4_PPOD = IO4_PUPD + 1
>
> IO5_STATE = IO4_PPOD + 1
> IO5_MODE = IO5_STATE + 1
> IO5_PUPD = IO5_MODE + 1
> IO5_PPOD = IO5_PUPD + 1
>
> IO6_STATE = IO5_PPOD + 1
> IO6_MODE = IO6_STATE + 1
> IO6_PUPD = IO6_MODE + 1
> IO6_PPOD = IO6_PUPD + 1
>
> PARAM_REG_NUM = IO6_PPOD + 1
>
> def WriteByte(Reg,Value):
> data = [0 for i in range(2)]
> data[0] = Reg
> data[1] = Value
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def WriteHalfWord(Reg,Value):
> data = [0 for i in range(3)]
> data[0] = Reg
> data[1] = Value & 0xff
> data[2] = (Value>>8) & 0xff
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def WriteOneWord(Reg,Value):
> data = [0 for i in range(5)]
> data[0] = Reg
> data[1] = Value & 0xff
> data[2] = (Value>>8) & 0xff
> data[3] = (Value>>16) & 0xff
> data[4] = (Value>>24) & 0xff
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def SetDefault():
> WriteOneWord(CONFIG_VALID,0x00000000)
>
> class MotorBridgeCape:
> def __init__(self):
> reset_pin.write_text('high')
> time.sleep(1)
>
> # init stepper motor A
> def StepperMotorAInit(self):
> WriteByte(TB_1A_MODE,TB_SPM) #Stepper
> time.sleep(DelayTime)
> WriteHalfWord(TB_1A_DUTY,1000) # voltage
> time.sleep(DelayTime)
>
> # MoveSteps > 0 CW
> # MoveSteps < 0 CCW
> # StepDelayTime : delay time for every step. uint us
> def StepperMotorAMove(self,MoveSteps,StepDelayTime):
> if MoveSteps > 0:
> WriteByte(TB_1A_DIR,TB_CW) #CW
> else:
> WriteByte(TB_1A_DIR,TB_CCW) #CW
> MoveSteps = -MoveSteps
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_SPM_SPEED,StepDelayTime) # unit us
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_SPM_STEP,MoveSteps)
> time.sleep(DelayTime)
>
>
> # init stepper motor B
> def StepperMotorBInit(self):
> WriteByte(TB_2A_MODE,TB_SPM) #Stepper
> time.sleep(DelayTime)
> WriteHalfWord(TB_2A_DUTY,1000) # voltage
> time.sleep(DelayTime)
>
> # MoveSteps > 0 CW
> # MoveSteps < 0 CCW
> # StepDelayTime : delay time for every step. uint us
> def StepperMotorBMove(self,MoveSteps,StepDelayTime):
> if MoveSteps > 0:
> WriteByte(TB_2A_DIR,TB_CW) #CW
> else:
> WriteByte(TB_2A_DIR,TB_CCW) #CW
> MoveSteps = -MoveSteps
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_SPM_SPEED,StepDelayTime) # unit us
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_SPM_STEP,MoveSteps)
> time.sleep(DelayTime)
>
> # Init DC Motor
> def DCMotorInit(self,MotorName,Frequency):
> # Init the DC Frequency
> WriteOneWord(CONFIG_TB_PWM_FREQ,Frequency)
> time.sleep(DelayTime)
>
> # Set the port as DC Motor
> if MotorName == 1 or MotorName == 2:
> WriteByte(TB_1A_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_1A_DIR,TB_STOP)
> time.sleep(DelayTime)
> WriteByte(TB_1B_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_1B_DIR,TB_STOP)
> time.sleep(DelayTime)
> if MotorName == 3 or MotorName == 4:
> WriteByte(TB_2A_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_2A_DIR,TB_STOP)
> time.sleep(DelayTime)
> WriteByte(TB_2B_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_2B_DIR,TB_STOP)
> time.sleep(DelayTime)
>
> # Drive the DC Motor
> # Direction 1 CW | 2 CCW
> # PWNDuty 0 ~ 100
> def DCMotorMove(self, MotorName,Direction,PWMDuty):
> if MotorName == 1:
> WriteByte(TB_1B_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_1B_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 2:
> WriteByte(TB_1A_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 3:
> WriteByte(TB_2B_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_2B_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 4:
> WriteByte(TB_2A_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> # Stop the DC motor
> def DCMotorStop(self, MotorName):
> if MotorName == 1:
> WriteByte(TB_1B_DIR,TB_STOP)
> if MotorName == 2:
> WriteByte(TB_1A_DIR,TB_STOP)
> if MotorName == 3:
> WriteByte(TB_2B_DIR,TB_STOP)
> if MotorName == 4:
> WriteByte(TB_2A_DIR,TB_STOP)
> time.sleep(DelayTime)
>
> # init the Servo
> def ServoInit(self,ServoName,Frequency):
> if ServoName == 1:
> WriteHalfWord(SVM1_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM1_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 2:
> WriteHalfWord(SVM2_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM2_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
> if ServoName == 3:
> WriteHalfWord(SVM3_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM3_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 4:
> WriteHalfWord(SVM4_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM4_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
> if ServoName == 5:
> WriteHalfWord(SVM5_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM5_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 6:
> WriteHalfWord(SVM6_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM6_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> def ServoMoveAngle(self,ServoName,Angle):
> if ServoName == 1:
> WriteHalfWord(SVM1_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 2:
> WriteHalfWord(SVM2_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 3:
> WriteHalfWord(SVM3_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 4:
> WriteHalfWord(SVM4_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 5:
> WriteHalfWord(SVM5_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 6:
> WriteHalfWord(SVM6_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if __name__=="__main__":
> print( 'Hello From MotorBridge' )
> #motor = MotorBridgeCape()
> #motor.StepperMotorBInit()
> #while True:
> #motor.StepperMotorBMove(1000,1000) # 20 steppers 1000us every
> step
> #time.sleep(1)
> #motor.StepperMotorBMove(-1000,1000) # 20 steppers 1000us every
> step
> #time.sleep(1)
>
> This listed source is the library from the MotorBridge.py file.
>
> Next, I will provide the source just for regular DC Motor movement.
>
> from MotorBridge import MotorBridge
> from flask import Flask, render_template
> import time
>
> MotorName = 1
> MotorName = 2
> ClockWise = 1
> CounterClockWise = 2
> PwmDuty = 90
> Frequency = 1000
>
> app = Flask(__name__)
> @app.route("/")
> @app.route("/<state>")
>
> def updates(state=None):
>
> #Straight/Forward!
> if state == "F":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 1, 90)
> motor.DCMotorMove(2, 1, 90)
>
> #Left
> if state == "L":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 2, 90)
> motor.DCMotorMove(2, 1, 90)
>
> #Right
> if state == "R":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 1, 90)
> motor.DCMotorMove(2, 2, 90)
>
> #Stop!
> if state == "S":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 0)
> motor.DCMotorInit(2, 0)
> motor.DCMotorMove(1, 0, 0)
> motor.DCMotorMove(2, 0, 0)
>
> #Reverse!
> if state == "Rev":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 2, 90)
> motor.DCMotorMove(2, 2, 90)
>
>
> template_data = {
> "title" : state,
> }
> return render_template("Geaux.html", **template_data)
>
> if __name__ == "__main__":
> app.run(host="0.0.0.0", port=5000, debug=True)
>
>
> ...
>
> I have changed the source many times. I have put the motor.DCMotorInit and
> motor = MotorBridgeCape() calls under my function before calling
> motor.DCMotorMove in my if statements.
>
> ...
>
> Anyway...here is the issue. Since i2c communication was cut short on the
> Adafruit_BBIO side and since the Adafruit_GPIO.I2C library is read only, I
> tried smbus2 via a pip install for i2c communication.
>
> ...
>
> If you are still following along, thank you. So, my server works w/ the
> BBGW, Motor Bridge Cape, and power over WiFi but the served HTML page only
> allows me to control seconds of commands before it halts.
>
> If you understand that the halting happens w/ forward and etc, then there
> should be an obvious reason for it (this reason bewilders me). I cannot
> find out why my source and library change create the halting of my program
> to run continuously.
>
> Seth
>
> P.S. If you made it this far, please reply. If you need me to post the
> smbus2 library, please let me know. It can easily be installed on our
> BeagleBoard.org board of choice w/ pip3 install smbus2.
>
>
>
>
>
>
>
On Monday, January 27, 2020 at 5:41:43 AM UTC-6, Mala Dies wrote:
>
> Hello,
>
> Hmm. I have been trying to get my Motor Bridge Cape to work recently for a
> Maker Faire coming up. If all else fails, I will try to get the BBBW and
> MotorCape working again.
>
> ...
>
> So, w/out further ado, here is the source:
>
> # /*
> # * MotorBridge.py
> # * This is a library for BBG/BBB motor bridge cape
> # *
> # * Copyright (c) 2015 seeed technology inc.
> # * Author : Jiankai Li
> # * Create Time : Nov 2015
> # * Change Log : From #beagle on Freenode and my changes (Seth 2019)!
> # *
> # * The MIT License (MIT)
> # *
> # * Permission is hereby granted, free of charge, to any person obtaining
> a copy
> # * of this software and associated documentation files (the "Software"),
> to deal
> # * in the Software without restriction, including without limitation the
> rights
> # * to use, copy, modify, merge, publish, distribute, sublicense, and/or
> sell
> # * copies of the Software, and to permit persons to whom the Software is
> # * furnished to do so, subject to the following conditions:
> # *
> # * The above copyright notice and this permission notice shall be
> included in
> # * all copies or substantial portions of the Software.
> # *
> # * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND,
> EXPRESS OR
> # * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF
> MERCHANTABILITY,
> # * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT
> SHALL THE
> # * AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
> # * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE,
> ARISING FROM,
> # * OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
> DEALINGS IN
> # * THE SOFTWARE.
> # */
> # FileName : MotorBridge.py
> # by Jiankai.li
>
> from smbus2 import SMBus
> import time
> import pathlib
>
> # reset pin is P9.23, i.e. gpio1.17
> reset_pin = pathlib.Path('/sys/class/gpio/gpio49/direction')
> reset_pin.write_text('low')
>
> MotorBridge = SMBus('/dev/i2c-2')
>
> ReadMode = 0
> WriteMode = 1
> DeAddr = 0X4B
> ConfigValid = 0x3a6fb67c
> DelayTime = 0.005
>
> # TB_WORKMODE
>
> TB_SHORT_BREAK = 0
> TB_CW = 1
> TB_CCW = 2
> TB_STOP = 3
> TB_WORKMODE_NUM = 4
>
>
> # TB_PORTMODE
>
> TB_DCM = 0
> TB_SPM = 1
> TB_PORTMODE_NUM = 2
>
>
> # SVM_PORT
>
> SVM1 = 0
> SVM2 = 1
> SVM3 = 2
> SVM4 = 3
> SVM5 = 4
> SVM6 = 5
> SVM_PORT_NUM = 6
>
> # SVM_STATE
>
> SVM_DISABLE = 0
> SVM_ENABLE = 1
> SVM_STATE_NUM = 2
>
> # IO_MODE
>
> IO_IN = 0
> IO_OUT = 1
> IO_MODE_NUM = 2
>
> # IO_PUPD
>
> IO_PU = 0
> IO_PD = 1
> IO_NP = 2
> IO_PUPD_NUM = 3
>
> # IO_PPOD
>
> IO_PP = 0
> IO_OD = 1
> IO_PPOD_NUM = 2
>
> # IO_STATE
>
> IO_LOW = 0
> IO_HIGH = 1
> IO_STATE_NUM = 2
>
> # IO_PORT
>
> IO1 = 0
> IO2 = 1
> IO3 = 2
> IO4 = 3
> IO5 = 4
> IO6 = 5
> IO_NUM = 6
>
>
> # PARAM_REG
>
> CONFIG_VALID = 0
> CONFIG_TB_PWM_FREQ = CONFIG_VALID + 4
>
> I2C_ADDRESS = CONFIG_TB_PWM_FREQ + 4
>
> TB_1A_MODE = I2C_ADDRESS + 1
> TB_1A_DIR = TB_1A_MODE + 1
> TB_1A_DUTY = TB_1A_DIR + 1
> TB_1A_SPM_SPEED = TB_1A_DUTY + 2
> TB_1A_SPM_STEP = TB_1A_SPM_SPEED + 4
>
> TB_1B_MODE = TB_1A_SPM_STEP + 4
> TB_1B_DIR = TB_1B_MODE + 1
> TB_1B_DUTY = TB_1B_DIR + 1
> TB_1B_SPM_SPEED = TB_1B_DUTY + 2
> TB_1B_SPM_STEP = TB_1B_SPM_SPEED + 4
>
> TB_2A_MODE = TB_1B_SPM_STEP + 4
> TB_2A_DIR = TB_2A_MODE + 1
> TB_2A_DUTY = TB_2A_DIR + 1
> TB_2A_SPM_SPEED = TB_2A_DUTY + 2
> TB_2A_SPM_STEP = TB_2A_SPM_SPEED + 4
>
> TB_2B_MODE = TB_2A_SPM_STEP + 4
> TB_2B_DIR = TB_2B_MODE + 1
> TB_2B_DUTY = TB_2B_DIR + 1
> TB_2B_SPM_SPEED = TB_2B_DUTY + 2
> TB_2B_SPM_STEP = TB_2B_SPM_SPEED + 4
>
> SVM1_STATE = TB_2B_SPM_STEP + 4
> SVM1_FREQ = SVM1_STATE + 1
> SVM1_ANGLE = SVM1_FREQ + 2
>
> SVM2_STATE = SVM1_ANGLE + 2
> SVM2_FREQ = SVM2_STATE + 1
> SVM2_ANGLE = SVM2_FREQ + 2
>
> SVM3_STATE = SVM2_ANGLE + 2
> SVM3_FREQ = SVM3_STATE + 1
> SVM3_ANGLE = SVM3_FREQ + 2
>
> SVM4_STATE = SVM3_ANGLE + 2
> SVM4_FREQ = SVM4_STATE + 1
> SVM4_ANGLE = SVM4_FREQ + 2
>
> SVM5_STATE = SVM4_ANGLE + 2
> SVM5_FREQ = SVM5_STATE + 1
> SVM5_ANGLE = SVM5_FREQ + 2
>
> SVM6_STATE = SVM5_ANGLE + 2
> SVM6_FREQ = SVM6_STATE + 1
> SVM6_ANGLE = SVM6_FREQ + 2
>
> IO1_STATE = SVM6_ANGLE + 2
> IO1_MODE = IO1_STATE + 1
> IO1_PUPD = IO1_MODE + 1
> IO1_PPOD = IO1_PUPD + 1
>
> IO2_STATE = IO1_PPOD + 1
> IO2_MODE = IO2_STATE + 1
> IO2_PUPD = IO2_MODE + 1
> IO2_PPOD = IO2_PUPD + 1
>
> IO3_STATE = IO2_PPOD + 1
> IO3_MODE = IO3_STATE + 1
> IO3_PUPD = IO3_MODE + 1
> IO3_PPOD = IO3_PUPD + 1
>
> IO4_STATE = IO3_PPOD + 1
> IO4_MODE = IO4_STATE + 1
> IO4_PUPD = IO4_MODE + 1
> IO4_PPOD = IO4_PUPD + 1
>
> IO5_STATE = IO4_PPOD + 1
> IO5_MODE = IO5_STATE + 1
> IO5_PUPD = IO5_MODE + 1
> IO5_PPOD = IO5_PUPD + 1
>
> IO6_STATE = IO5_PPOD + 1
> IO6_MODE = IO6_STATE + 1
> IO6_PUPD = IO6_MODE + 1
> IO6_PPOD = IO6_PUPD + 1
>
> PARAM_REG_NUM = IO6_PPOD + 1
>
> def WriteByte(Reg,Value):
> data = [0 for i in range(2)]
> data[0] = Reg
> data[1] = Value
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def WriteHalfWord(Reg,Value):
> data = [0 for i in range(3)]
> data[0] = Reg
> data[1] = Value & 0xff
> data[2] = (Value>>8) & 0xff
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def WriteOneWord(Reg,Value):
> data = [0 for i in range(5)]
> data[0] = Reg
> data[1] = Value & 0xff
> data[2] = (Value>>8) & 0xff
> data[3] = (Value>>16) & 0xff
> data[4] = (Value>>24) & 0xff
> MotorBridge.write_i2c_block_data(0x4b, 1, data)
>
> def SetDefault():
> WriteOneWord(CONFIG_VALID,0x00000000)
>
> class MotorBridgeCape:
> def __init__(self):
> reset_pin.write_text('high')
> time.sleep(1)
>
> # init stepper motor A
> def StepperMotorAInit(self):
> WriteByte(TB_1A_MODE,TB_SPM) #Stepper
> time.sleep(DelayTime)
> WriteHalfWord(TB_1A_DUTY,1000) # voltage
> time.sleep(DelayTime)
>
> # MoveSteps > 0 CW
> # MoveSteps < 0 CCW
> # StepDelayTime : delay time for every step. uint us
> def StepperMotorAMove(self,MoveSteps,StepDelayTime):
> if MoveSteps > 0:
> WriteByte(TB_1A_DIR,TB_CW) #CW
> else:
> WriteByte(TB_1A_DIR,TB_CCW) #CW
> MoveSteps = -MoveSteps
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_SPM_SPEED,StepDelayTime) # unit us
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_SPM_STEP,MoveSteps)
> time.sleep(DelayTime)
>
>
> # init stepper motor B
> def StepperMotorBInit(self):
> WriteByte(TB_2A_MODE,TB_SPM) #Stepper
> time.sleep(DelayTime)
> WriteHalfWord(TB_2A_DUTY,1000) # voltage
> time.sleep(DelayTime)
>
> # MoveSteps > 0 CW
> # MoveSteps < 0 CCW
> # StepDelayTime : delay time for every step. uint us
> def StepperMotorBMove(self,MoveSteps,StepDelayTime):
> if MoveSteps > 0:
> WriteByte(TB_2A_DIR,TB_CW) #CW
> else:
> WriteByte(TB_2A_DIR,TB_CCW) #CW
> MoveSteps = -MoveSteps
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_SPM_SPEED,StepDelayTime) # unit us
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_SPM_STEP,MoveSteps)
> time.sleep(DelayTime)
>
> # Init DC Motor
> def DCMotorInit(self,MotorName,Frequency):
> # Init the DC Frequency
> WriteOneWord(CONFIG_TB_PWM_FREQ,Frequency)
> time.sleep(DelayTime)
>
> # Set the port as DC Motor
> if MotorName == 1 or MotorName == 2:
> WriteByte(TB_1A_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_1A_DIR,TB_STOP)
> time.sleep(DelayTime)
> WriteByte(TB_1B_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_1B_DIR,TB_STOP)
> time.sleep(DelayTime)
> if MotorName == 3 or MotorName == 4:
> WriteByte(TB_2A_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_2A_DIR,TB_STOP)
> time.sleep(DelayTime)
> WriteByte(TB_2B_MODE,TB_DCM)
> time.sleep(DelayTime)
> WriteByte(TB_2B_DIR,TB_STOP)
> time.sleep(DelayTime)
>
> # Drive the DC Motor
> # Direction 1 CW | 2 CCW
> # PWNDuty 0 ~ 100
> def DCMotorMove(self, MotorName,Direction,PWMDuty):
> if MotorName == 1:
> WriteByte(TB_1B_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_1B_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 2:
> WriteByte(TB_1A_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_1A_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 3:
> WriteByte(TB_2B_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_2B_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> if MotorName == 4:
> WriteByte(TB_2A_DIR,Direction)
> time.sleep(DelayTime)
> WriteOneWord(TB_2A_DUTY,PWMDuty*10)
> time.sleep(DelayTime)
>
> # Stop the DC motor
> def DCMotorStop(self, MotorName):
> if MotorName == 1:
> WriteByte(TB_1B_DIR,TB_STOP)
> if MotorName == 2:
> WriteByte(TB_1A_DIR,TB_STOP)
> if MotorName == 3:
> WriteByte(TB_2B_DIR,TB_STOP)
> if MotorName == 4:
> WriteByte(TB_2A_DIR,TB_STOP)
> time.sleep(DelayTime)
>
> # init the Servo
> def ServoInit(self,ServoName,Frequency):
> if ServoName == 1:
> WriteHalfWord(SVM1_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM1_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 2:
> WriteHalfWord(SVM2_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM2_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
> if ServoName == 3:
> WriteHalfWord(SVM3_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM3_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 4:
> WriteHalfWord(SVM4_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM4_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
> if ServoName == 5:
> WriteHalfWord(SVM5_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM5_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> if ServoName == 6:
> WriteHalfWord(SVM6_FREQ,Frequency)
> time.sleep(DelayTime)
> WriteByte(SVM6_STATE,SVM_ENABLE)
> time.sleep(DelayTime)
>
> def ServoMoveAngle(self,ServoName,Angle):
> if ServoName == 1:
> WriteHalfWord(SVM1_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 2:
> WriteHalfWord(SVM2_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 3:
> WriteHalfWord(SVM3_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 4:
> WriteHalfWord(SVM4_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 5:
> WriteHalfWord(SVM5_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if ServoName == 6:
> WriteHalfWord(SVM6_ANGLE,Angle)
> time.sleep(DelayTime)
>
> if __name__=="__main__":
> print( 'Hello From MotorBridge' )
> #motor = MotorBridgeCape()
> #motor.StepperMotorBInit()
> #while True:
> #motor.StepperMotorBMove(1000,1000) # 20 steppers 1000us every
> step
> #time.sleep(1)
> #motor.StepperMotorBMove(-1000,1000) # 20 steppers 1000us every
> step
> #time.sleep(1)
>
> This listed source is the library from the MotorBridge.py file.
>
> Next, I will provide the source just for regular DC Motor movement.
>
> from MotorBridge import MotorBridge
> from flask import Flask, render_template
> import time
>
> MotorName = 1
> MotorName = 2
> ClockWise = 1
> CounterClockWise = 2
> PwmDuty = 90
> Frequency = 1000
>
> app = Flask(__name__)
> @app.route("/")
> @app.route("/<state>")
>
> def updates(state=None):
>
> #Straight/Forward!
> if state == "F":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 1, 90)
> motor.DCMotorMove(2, 1, 90)
>
> #Left
> if state == "L":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 2, 90)
> motor.DCMotorMove(2, 1, 90)
>
> #Right
> if state == "R":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 1, 90)
> motor.DCMotorMove(2, 2, 90)
>
> #Stop!
> if state == "S":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 0)
> motor.DCMotorInit(2, 0)
> motor.DCMotorMove(1, 0, 0)
> motor.DCMotorMove(2, 0, 0)
>
> #Reverse!
> if state == "Rev":
> motor = MotorBridgeCape()
> motor.DCMotorInit(1, 1000)
> motor.DCMotorInit(2, 1000)
> motor.DCMotorMove(1, 2, 90)
> motor.DCMotorMove(2, 2, 90)
>
>
> template_data = {
> "title" : state,
> }
> return render_template("Geaux.html", **template_data)
>
> if __name__ == "__main__":
> app.run(host="0.0.0.0", port=5000, debug=True)
>
>
> ...
>
> I have changed the source many times. I have put the motor.DCMotorInit and
> motor = MotorBridgeCape() calls under my function before calling
> motor.DCMotorMove in my if statements.
>
> ...
>
> Anyway...here is the issue. Since i2c communication was cut short on the
> Adafruit_BBIO side and since the Adafruit_GPIO.I2C library is read only, I
> tried smbus2 via a pip install for i2c communication.
>
> ...
>
> If you are still following along, thank you. So, my server works w/ the
> BBGW, Motor Bridge Cape, and power over WiFi but the served HTML page only
> allows me to control seconds of commands before it halts.
>
> If you understand that the halting happens w/ forward and etc, then there
> should be an obvious reason for it (this reason bewilders me). I cannot
> find out why my source and library change create the halting of my program
> to run continuously.
>
> Seth
>
> P.S. If you made it this far, please reply. If you need me to post the
> smbus2 library, please let me know. It can easily be installed on our
> BeagleBoard.org board of choice w/ pip3 install smbus2.
>
>
>
>
>
>
>
--
For more options, visit http://beagleboard.org/discuss
---
You received this message because you are subscribed to the Google Groups
"BeagleBoard" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
To view this discussion on the web visit
https://groups.google.com/d/msgid/beagleboard/afd3b640-cb34-4a31-b9d6-708cce8b60b4%40googlegroups.com.