From 6395d3f2f71b8d22a974e68fca826fdca28eaede Mon Sep 17 00:00:00 2001 From: Scott Barnes <> Date: Sat, 16 Mar 2024 21:28:35 -0500 Subject: [PATCH] Motors working --- pom.xml | 5 + src/main/java/com/tearabite/Board.java | 403 ++++++++++++++++++ src/main/java/com/tearabite/DcMotor.java | 23 + src/main/java/com/tearabite/Main.java | 57 +-- src/main/java/com/tearabite/Robot.java | 10 + target/classes/com/tearabite/Main.class | Bin 4138 -> 3040 bytes target/lib/eaglebot.jar | Bin 6432 -> 9578 bytes .../compile/default-compile/createdFiles.lst | 6 +- .../compile/default-compile/inputFiles.lst | 1 + 9 files changed, 477 insertions(+), 28 deletions(-) create mode 100644 src/main/java/com/tearabite/Board.java create mode 100644 src/main/java/com/tearabite/DcMotor.java create mode 100644 src/main/java/com/tearabite/Robot.java diff --git a/pom.xml b/pom.xml index 07a7fdc..aa9a269 100644 --- a/pom.xml +++ b/pom.xml @@ -29,6 +29,11 @@ + + com.pi4j + pi4j-plugin-linuxfs + ${pi4j.version} + org.slf4j slf4j-api diff --git a/src/main/java/com/tearabite/Board.java b/src/main/java/com/tearabite/Board.java new file mode 100644 index 0000000..5be68a3 --- /dev/null +++ b/src/main/java/com/tearabite/Board.java @@ -0,0 +1,403 @@ +package com.tearabite; + +import com.pi4j.Pi4J; +import com.pi4j.context.Context; +import com.pi4j.context.ContextBuilder; +import com.pi4j.io.i2c.I2C; +import com.pi4j.io.i2c.I2CConfig; +import com.pi4j.io.i2c.I2CProvider; +import com.pi4j.library.pigpio.PiGpio; + +public class Board { + + + private static final int __ADC_BAT_ADDR = 0; + private static final int __SERVO_ADDR = 21; + private static final int __MOTOR_ADDR = 31; + private static final int __SERVO_ADDR_CMD = 40; + + private final int[]__motor_speed = new int[] { 0, 0, 0, 0 }; + private final int[] __servo_angle = new int[] { 0, 0, 0, 0, 0, 0 }; + private final int[] __servo_pulse = new int[] { 0, 0, 0, 0, 0, 0 }; + private static final int __I2C = 0x1; + private static final int __I2C_ADDR = 0x7A; + +// GPIO.setwarnings(False) +// GPIO.setmode(GPIO.BOARD) + + private static final int __RGB_COUNT = 2; + private static final int __RGB_PIN = 12; + private static final int __RGB_FREQ_HZ = 800000; + private static final int __RGB_DMA = 10; + private static final int __RGB_BRIGHTNESS = 120; + private static final int __RGB_CHANNEL = 0; + private static final boolean __RGB_INVERT = false; + private final Context pi4j; + private final I2C device; + + +// RGB = PixelStrip(__RGB_COUNT, __RGB_PIN, __RGB_FREQ_HZ, __RGB_DMA, __RGB_INVERT, __RGB_BRIGHTNESS, __RGB_CHANNEL) +//RGB.begin() +// for i in range(RGB.numPixels()): +// RGB.setPixelColor(i, PixelColor(0,0,0)) +// RGB.show() + + + + public Board() { + ContextBuilder pi4jb = Pi4J.newContextBuilder(); + this.pi4j = pi4jb.autoDetect().build(); + I2CProvider i2CProvider = pi4j.provider("linuxfs-i2c"); + I2CConfig i2cConfig = I2C.newConfigBuilder(pi4j).id("HiwonderMasterPi").bus(__I2C).device(__ADC_BAT_ADDR).build(); + device = i2CProvider.create(i2cConfig); + } + + public int setMotor(int index, int speed) { + if (index < 1 || index > 4) { + throw new IllegalArgumentException(String.format("Invalid motor num: %d", index)); + } + + speed = Math.max(Math.min(speed, 100), -100); + + byte reg = (byte) (__MOTOR_ADDR + --index); + device.writeRegister(reg, speed); + this.__motor_speed[index] = speed; + return __motor_speed[index]; + } + + public DcMotor getMotor(int index) { + return new DcMotor(this, index); + } + +// +// def getMotor(index): +// if index < 1 or index > 4: +// raise AttributeError("Invalid motor num: %d"%index) +// index = index - 1 +// return __motor_speed[index] +// +// def setPWMServoAngle(index, angle): +// if servo_id < 1 or servo_id > 6: +// raise AttributeError("Invalid Servo ID: %d"%servo_id) +// index = servo_id - 1 +// angle = 180 if angle > 180 else angle +// angle = 0 if angle < 0 else angle +// reg = __SERVO_ADDR + index +// with SMBus(__I2C) as bus: +// try: +// msg = i2c_msg.write(__I2C_ADDR, [reg, angle]) +// bus.i2c_rdwr(msg) +// __servo_angle[index] = angle +// __servo_pulse[index] = int(((200 * angle) / 9) + 500) +// +// except: +// msg = i2c_msg.write(__I2C_ADDR, [reg, angle]) +// bus.i2c_rdwr(msg) +// __servo_angle[index] = angle +// __servo_pulse[index] = int(((200 * angle) / 9) + 500) +// +// return __servo_angle[index] +// +// def setPWMServoPulse(servo_id, pulse = 1500, use_time = 1000): +// if servo_id< 1 or servo_id > 6: +// raise AttributeError("Invalid Servo ID: %d" %servo_id) +// deviation_data = yaml_handle.get_yaml_data(yaml_handle.Deviation_file_path) +// index = servo_id - 1 +// pulse += deviation_data[str(servo_id)] +// pulse = 500 if pulse < 500 else pulse +// pulse = 2500 if pulse > 2500 else pulse +// use_time = 0 if use_time < 0 else use_time +// use_time = 30000 if use_time > 30000 else use_time +// buf = [__SERVO_ADDR_CMD, 1] + list(use_time.to_bytes(2, 'little')) + [servo_id,] + list(pulse.to_bytes(2, 'little')) +// +// with SMBus(__I2C) as bus: +// try: +// msg = i2c_msg.write(__I2C_ADDR, buf) +// bus.i2c_rdwr(msg) +// __servo_pulse[index] = pulse +// __servo_angle[index] = int((pulse - 500) * 0.09) +// except BaseException as e: +// print(e) +// msg = i2c_msg.write(__I2C_ADDR, buf) +// bus.i2c_rdwr(msg) +// __servo_pulse[index] = pulse +// __servo_angle[index] = int((pulse - 500) * 0.09) +// +// return __servo_pulse[index] +// +// def setPWMServosPulse(args): +// ''' time,number, id1, pos1, id2, pos2...''' +// deviation_data = yaml_handle.get_yaml_data(yaml_handle.Deviation_file_path) +// arglen = len(args) +// servos = args[2:arglen:2] +// pulses = args[3:arglen:2] +// use_time = args[0] +// use_time = 0 if use_time < 0 else use_time +// use_time = 30000 if use_time > 30000 else use_time +// servo_number = args[1] +// buf = [__SERVO_ADDR_CMD, servo_number] + list(use_time.to_bytes(2, 'little')) +// dat = zip(servos, pulses) +// for (s, p) in dat: +// buf.append(s) +// p += deviation_data[str(s)] +// p = 500 if p < 500 else p +// p = 2500 if p > 2500 else p +// buf += list(p.to_bytes(2, 'little')) +// __servo_pulse[s-1] = p +// __servo_angle[s-1] = int((p - 500) * 0.09) +// +// with SMBus(__I2C) as bus: +// try: +// msg = i2c_msg.write(__I2C_ADDR, buf) +// bus.i2c_rdwr(msg) +// except: +// msg = i2c_msg.write(__I2C_ADDR, buf) +// bus.i2c_rdwr(msg) +// +// +// def getPWMServoAngle(servo_id): +// if servo_id < 1 or servo_id > 6: +// raise AttributeError("Invalid Servo ID: %d"%servo_id) +// index = servo_id - 1 +// return __servo_pulse[index] +// +// def getPWMServoPulse(servo_id): +// if servo_id < 1 or servo_id > 6: +// raise AttributeError("Invalid Servo ID: %d"%servo_id) +// index = servo_id - 1 +// return __servo_pulse[index] +// +// def getBattery(): +// ret = 0 +// with SMBus(__I2C) as bus: +// try: +// msg = i2c_msg.write(__I2C_ADDR, [__ADC_BAT_ADDR,]) +// bus.i2c_rdwr(msg) +// read = i2c_msg.read(__I2C_ADDR, 2) +// bus.i2c_rdwr(read) +// ret = int.from_bytes(bytes(list(read)), 'little') +// +// except: +// msg = i2c_msg.write(__I2C_ADDR, [__ADC_BAT_ADDR,]) +// bus.i2c_rdwr(msg) +// read = i2c_msg.read(__I2C_ADDR, 2) +// bus.i2c_rdwr(read) +// ret = int.from_bytes(bytes(list(read)), 'little') +// +// return ret +// +// def setBuzzer(new_state): +// GPIO.setup(31, GPIO.OUT) +// GPIO.output(31, new_state) +// +// def setBusServoID(oldid, newid): +// """ +// 配置舵机id号, 出厂默认为1 +// :param oldid: 原来的id, 出厂默认为1 +// :param newid: 新的id +// """ +// serial_serro_wirte_cmd(oldid, LOBOT_SERVO_ID_WRITE, newid) +// +// def getBusServoID(id=None): +// """ +// 读取串口舵机id +// :param id: 默认为空 +// :return: 返回舵机id +// """ +// +// while True: +// if id is None: # 总线上只能有一个舵机 +// serial_servo_read_cmd(0xfe, LOBOT_SERVO_ID_READ) +// else: +// serial_servo_read_cmd(id, LOBOT_SERVO_ID_READ) +// # 获取内容 +// msg = serial_servo_get_rmsg(LOBOT_SERVO_ID_READ) +// if msg is not None: +// return msg +// +// def setBusServoPulse(id, pulse, use_time): +// """ +// 驱动串口舵机转到指定位置 +// :param id: 要驱动的舵机id +// :pulse: 位置 +// :use_time: 转动需要的时间 +// """ +// +// pulse = 0 if pulse < 0 else pulse +// pulse = 1000 if pulse > 1000 else pulse +// use_time = 0 if use_time < 0 else use_time +// use_time = 30000 if use_time > 30000 else use_time +// serial_serro_wirte_cmd(id, LOBOT_SERVO_MOVE_TIME_WRITE, pulse, use_time) +// +// def stopBusServo(id=None): +// ''' +// 停止舵机运行 +// :param id: +// :return: +// ''' +// serial_serro_wirte_cmd(id, LOBOT_SERVO_MOVE_STOP) +// +// def setBusServoDeviation(id, d=0): +// """ +// 调整偏差 +// :param id: 舵机id +// :param d: 偏差 +// """ +// serial_serro_wirte_cmd(id, LOBOT_SERVO_ANGLE_OFFSET_ADJUST, d) +// +// def saveBusServoDeviation(id): +// """ +// 配置偏差,掉电保护 +// :param id: 舵机id +// """ +// serial_serro_wirte_cmd(id, LOBOT_SERVO_ANGLE_OFFSET_WRITE) +// +// time_out = 50 +// def getBusServoDeviation(id): +// ''' +// 读取偏差值 +// :param id: 舵机号 +// :return: +// ''' +// # 发送读取偏差指令 +// count = 0 +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_ANGLE_OFFSET_READ) +// # 获取 +// msg = serial_servo_get_rmsg(LOBOT_SERVO_ANGLE_OFFSET_READ) +// count += 1 +// if msg is not None: +// return msg +// if count > time_out: +// return None +// +// def setBusServoAngleLimit(id, low, high): +// ''' +// 设置舵机转动范围 +// :param id: +// :param low: +// :param high: +// :return: +// ''' +// serial_serro_wirte_cmd(id, LOBOT_SERVO_ANGLE_LIMIT_WRITE, low, high) +// +// def getBusServoAngleLimit(id): +// ''' +// 读取舵机转动范围 +// :param id: +// :return: 返回元祖 0: 低位 1: 高位 +// ''' +// +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_ANGLE_LIMIT_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_ANGLE_LIMIT_READ) +// if msg is not None: +// count = 0 +// return msg +// +// def setBusServoVinLimit(id, low, high): +// ''' +// 设置舵机电压范围 +// :param id: +// :param low: +// :param high: +// :return: +// ''' +// serial_serro_wirte_cmd(id, LOBOT_SERVO_VIN_LIMIT_WRITE, low, high) +// +// def getBusServoVinLimit(id): +// ''' +// 读取舵机转动范围 +// :param id: +// :return: 返回元祖 0: 低位 1: 高位 +// ''' +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_VIN_LIMIT_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_VIN_LIMIT_READ) +// if msg is not None: +// return msg +// +// def setBusServoMaxTemp(id, m_temp): +// ''' +// 设置舵机最高温度报警 +// :param id: +// :param m_temp: +// :return: +// ''' +// serial_serro_wirte_cmd(id, LOBOT_SERVO_TEMP_MAX_LIMIT_WRITE, m_temp) +// +// def getBusServoTempLimit(id): +// ''' +// 读取舵机温度报警范围 +// :param id: +// :return: +// ''' +// +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_TEMP_MAX_LIMIT_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_TEMP_MAX_LIMIT_READ) +// if msg is not None: +// return msg +// +// def getBusServoPulse(id): +// ''' +// 读取舵机当前位置 +// :param id: +// :return: +// ''' +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_POS_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_POS_READ) +// if msg is not None: +// return msg +// +// def getBusServoTemp(id): +// ''' +// 读取舵机温度 +// :param id: +// :return: +// ''' +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_TEMP_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_TEMP_READ) +// if msg is not None: +// return msg +// +// def getBusServoVin(id): +// ''' +// 读取舵机电压 +// :param id: +// :return: +// ''' +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_VIN_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_VIN_READ) +// if msg is not None: +// return msg +// +// def restBusServoPulse(oldid): +// # 舵机清零偏差和P值中位(500) +// serial_servo_set_deviation(oldid, 0) # 清零偏差 +// time.sleep(0.1) +// serial_serro_wirte_cmd(oldid, LOBOT_SERVO_MOVE_TIME_WRITE, 500, 100) # 中位 +// +//##掉电 +// def unloadBusServo(id): +// serial_serro_wirte_cmd(id, LOBOT_SERVO_LOAD_OR_UNLOAD_WRITE, 0) +// +//##读取是否掉电 +// def getBusServoLoadStatus(id): +// while True: +// serial_servo_read_cmd(id, LOBOT_SERVO_LOAD_OR_UNLOAD_READ) +// msg = serial_servo_get_rmsg(LOBOT_SERVO_LOAD_OR_UNLOAD_READ) +// if msg is not None: +// return msg +// +// setBuzzer(0) +// +//# setMotor(1, 60) +//# setMotor(2, 60) +//# setMotor(3, 60) +//# setMotor(4, 60) +} + diff --git a/src/main/java/com/tearabite/DcMotor.java b/src/main/java/com/tearabite/DcMotor.java new file mode 100644 index 0000000..226f4fb --- /dev/null +++ b/src/main/java/com/tearabite/DcMotor.java @@ -0,0 +1,23 @@ +package com.tearabite; + +public class DcMotor { + private final Board board; + private final int index; + private int multiplier = 1; + + public DcMotor(Board board, int index) { + this.board = board; + this.index = index; + } + + public void setPower(double power) { + int speed = (int) (100 * power * multiplier); + this.board.setMotor(index, speed); + } + + public void setDirection(Direction direction) { + this.multiplier = Direction.Reversed.equals(direction) ? -1 : 1; + } + + public enum Direction { Forward, Reversed } +} diff --git a/src/main/java/com/tearabite/Main.java b/src/main/java/com/tearabite/Main.java index 202960c..af9325e 100644 --- a/src/main/java/com/tearabite/Main.java +++ b/src/main/java/com/tearabite/Main.java @@ -11,11 +11,11 @@ import com.pi4j.io.gpio.digital.DigitalOutput; import com.pi4j.io.gpio.digital.DigitalState; import com.pi4j.platform.Platforms; import com.pi4j.util.Console; + import java.lang.reflect.InvocationTargetException; /** - * - * @author luca + * @author Scott Barnes */ public class Main { @@ -44,34 +44,37 @@ public class Main { } private void run(Context pi4j) throws Exception { - Platforms platforms = pi4j.platforms(); + Board board = new Board(); + DcMotor a = board.getMotor(1); + DcMotor b = board.getMotor(2); + DcMotor c = board.getMotor(4); + DcMotor d = board.getMotor(3); - console.box("Pi4J PLATFORMS"); - console.println(); - platforms.describe().print(System.out); - console.println(); + a.setDirection(DcMotor.Direction.Forward); + b.setDirection(DcMotor.Direction.Reversed); + c.setDirection(DcMotor.Direction.Reversed); + d.setDirection(DcMotor.Direction.Forward); - var ledConfig = DigitalOutput.newConfigBuilder(pi4j) - .id("led") - .name("LED Flasher") - .address(PIN_LED) - .shutdown(DigitalState.LOW) - .initial(DigitalState.LOW) - .provider("pigpio-digital-output"); - - var led = pi4j.create(ledConfig); - int counter = 0; - while (counter < 50) { - if (led.equals(DigitalState.HIGH)) { - led.low(); - System.out.println("low"); - } else { - led.high(); - System.out.println("high"); - } + for (int i = 0; i < 5; i++) { + a.setPower(100f); + Thread.sleep(500); + a.setPower(0f); + Thread.sleep(500); + + b.setPower(100f); + Thread.sleep(500); + b.setPower(0f); + Thread.sleep(500); + + c.setPower(100f); + Thread.sleep(500); + c.setPower(0f); + Thread.sleep(500); + + d.setPower(100f); + Thread.sleep(500); + d.setPower(0f); Thread.sleep(500); - counter++; } } - } diff --git a/src/main/java/com/tearabite/Robot.java b/src/main/java/com/tearabite/Robot.java new file mode 100644 index 0000000..508897c --- /dev/null +++ b/src/main/java/com/tearabite/Robot.java @@ -0,0 +1,10 @@ +package com.tearabite; + +public class Robot { + + private Drive drive; + + public Robot() { + + } +} diff --git a/target/classes/com/tearabite/Main.class b/target/classes/com/tearabite/Main.class index 1d5331d620f607ccc701e9d1630ff454a1aaedfd..f3004b9494518d3ee569c3727a499f6c7bd85ce2 100644 GIT binary patch delta 1261 zcmZ{j+iz4=6vlshX3m`H%%LQurI~7w+9tM5n?a4B9WU+B0tE^GX(Ggj1#i z#p`&%D_+3k<;BEAV@xn67Lw8k@kJ98pZpX22TXkM$r$UmXKG7HJvnFXwb!@z+TZ@x zI+r&8)|&j~pYMMFw(-eaG83)3itl0l-@414Tgry+67 zuZ#wjploRC8tLAOqw@~}sqgNBwhvm3k_zp{LUp|k6M6CYmUk?kI{%nx~tS=x!bf5tD*_>=L0 zafzkJo_yHjagGR8`UAnNFC}7KL)~LeeTn%q$&(aZCOnEvUimq3$Q(IsNDiMZ`qTEd zGX_&KI1^T2(Z7jSP4}$U6b!95VgKnXbV6TI-(>h>vcK`IByaPM%XyD`csER?elqWe zzoy#O8yc21aQQI&J=GKY$gnB=Bef~K&)eAk6vr?;E%Fgcw2{J-A5+XBE;|)YdmHaK zu9%%cGtbC+HQ(U`CpBvzU|Rd9!f(Cn=6E=@?%+dqRgdy)VFRZq3(afqDQ4usYg9O` zu}P6L%qrVi%{p-w$q;dQHvD_tE!F1~vrMwuvzc~#0+{PWNeEfE#^Cr>wvYD4<{8@8 z>&W)UdR;p>y>UCl`!2I6%t=T&bj96#fx(yAH_;q=2qE^uCs+k?xcmg6uFxYRk4Ta zR!z6j&%NYi_eh64_wyJJaFhqtT?0xoC3dnY@l1*747)`mW{+OO>=p4j9272 z;`%YK%8S=Zcsr3rWlp&E?Qj`%*}wd%fBq8Pm9i$(2(=~?g^pTdK4?g@LpL2*oS?F9x^^UH||9 literal 4138 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 delta 4264 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 RDairk00TS#pcDM(_Ft(S#PR?D diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst index 9f723ee..d67dd8c 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/createdFiles.lst @@ -1,2 +1,6 @@ -module-info.class +com/tearabite/Board.class +com/tearabite/DcMotor.class com/tearabite/Main.class +module-info.class +com/tearabite/Robot.class +com/tearabite/DcMotor$Direction.class diff --git a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst index 987814e..f804d08 100644 --- a/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst +++ b/target/maven-status/maven-compiler-plugin/compile/default-compile/inputFiles.lst @@ -1,2 +1,3 @@ +/Users/scott/Developer/EagleBot/eaglebot/src/main/java/com/tearabite/Board.java /Users/scott/Developer/EagleBot/eaglebot/src/main/java/module-info.java /Users/scott/Developer/EagleBot/eaglebot/src/main/java/com/tearabite/Main.java