关于996的思考

希望你能够获得加倍快乐


什么是996:

996工作制是一种违反《中华人民共和国劳动法》的延长法定工作时间的工作制度,指的是早上9点上班、晚上9点下班,中午和傍晚休息1小时(或不到),总计工作10小时以上,并且一周工作6天的工作制度,代表着中国互联网企业盛行的加班文化。


反对原因:

身体原因

我目前已经出现了严重脱发的问题,还变得油腻肥胖。。。。。
容易出现以下情况
例如:
1、 脱发
2、肥胖
3、腰间盘
4、脊椎
5、猝死


个人生活:

需要更多的时间处理自己的事情,享受生活的乐趣。
每天五点半准时打卡下班,周末双休,可以做很多,
例如:
1、有家庭的优先家庭
2、专研厨艺,自己做饭
3、 学习,多给自己充充电
4、去社交,多沟通一下

996的原因

传说中的内卷

为生活所迫,被迫接受。996你不干,总有人顶替你。

个人前途和机遇

对工作充满激情,热爱工作,想全心发展事业的人,精力允许的情况下主动选择996.

高薪

给的钱多,996值得。

总结

我希望自己能够走得更长远一些,至少能够健康的生活。
未来选择工作,优先保障身体健康,然后尽量多的休息时间。

我可能太过于理想化,有不同想法的可以交流一下

<think>好的,用户的问题是关于使用ESP32开发板配合PCA9685控制舵机,并通过游戏手柄控制六轴机械臂。需要详细的MicroPython代码,以及所需的库文件硬件连接说明。首先,我需要明确用户的需求:用Thonny上传代码到ESP32,控制6个舵机(4个180度,2个360度),使用锂电池LM2596降压,同时通过USB连接的游戏手柄控制。 首先,硬件方面,ESP32通过I2C连接PCA9685,PCA9685驱动舵机。LM2596用于将锂电池电压降到适合ESP32舵机的电压。注意舵机电压是否匹配,可能需要额外电源。360度舵机实际上是连续旋转舵机,控制方式与普通舵机不同,需调整PWM占空比来控制速度方向,而不是角度。 接下来是软件部分。用户使用MicroPython,需要PCA9685的驱动库。常见的adafruit_pca9685库可能不兼容,需改用MicroPython兼容的版本,比如使用micropython-pca9685库或者自己编写驱动。此外,需要读取游戏手柄的输入,可能需要使用pygame库在电脑端运行,或者ESP32直接读取USB HID设备。但考虑到ESP32可能无法直接处理复杂的USB主机功能,更可行的方案是电脑运行Python脚本读取手柄输入,然后通过串口发送令到ESP32,ESP32解析令并控制舵机。 因此,系统架构分为两部分:电脑端处理手柄输入并通过串口发送令,ESP32接收令并控制PCA9685。这样代码需要两个部分:电脑端的pygame脚本ESP32的MicroPython代码。 需要确认用户是否希望在ESP32上直接读取手柄,但考虑到复杂性兼容性,分体式设计更现实。因此,代码需要分为两个部分。但用户要求所有代码上传到ESP32,可能误解了可行性。需要澄清:ESP32作为从设备,接收来自电脑的令,而电脑运行处理手柄的代码。或者,如果使用ESP32的蓝牙/WiFi功能,可能直接连接手柄,但需要相应的协议支持,这可能比较复杂。 综合考虑,采用电脑端处理手柄输入,通过USB串口发送令到ESP32的方案更可行。因此,用户需要在电脑上运行个Python脚本(使用pygame读取手柄输入),并通过串口发送控制命令到ESP32,ESP32上的MicroPython代码接收并解析这些命令,进而控制PCA9685驱动舵机。 接下来,需要编写代码。ESP32部分需要初始化I2CPCA9685,设置舵机频率(通常50Hz),并映射角度或速度到PWM占空比。对于180度舵机,角度对应脉冲宽度500-2500微秒;360度舵机,脉冲宽度控制速度方向,例如1500停止,1300反转,1700正转。 库方面,使用MicroPython的machine库的I2CPin模块,以及PCA9685的驱动。可能需要自定义PCA9685驱动,或者使用现有的MicroPython兼容库,例如从GitHub获取。 然后,编写ESP32的主循环,不断读取串口输入,解析令,设置各个舵机的PWM值。同时,处理可能的异常,比如串口数据格式错误。 电脑端脚本需要使用pygame读取手柄的轴按钮,将输入转换为舵机控制令,通过串口发送。例如,手柄的摇杆控制某个舵机的角度或速度。 最后,用户需要安装必要的库:在ESP32上,需要pca9685.py驱动库;在电脑端,需要pygamepyserial。 可能的问题包括:PCA9685的地址是否正确,I2C引脚是否正确连接(ESP32的默认I2C引脚是2122),舵机接线是否正确,电源是否足够,以及手柄的轴按钮映射是否正确。 总结步骤: 1. 连接硬件,确保PCA9685正确连接到ESP32的I2C,舵机连接到PCA9685的PWM通道,电源稳定。 2. 在ESP32上安装MicroPython固件。 3. 上传PCA9685的MicroPython驱动库到ESP32。 4. 编写ESP32的主程序,处理串口令并控制舵机。 5. 在电脑上安装pygamepyserial,编写脚本读取手柄并发送令。 6. 测试各部分功能,调试可能出现的问题。 现在,需要将上述思考转化为具体的代码步骤说明,确保用户能够按照导进行操作,并处理可能的问题。</think>以下是实现该项目的详细步骤代码: 1. 硬件连接: - ESP32 ↔ PCA9685:SDA(GPIO21), SCL(GPIO22), VCC(5V), GND - PCA9685 ↔ 舵机:舵机信号线接PWM0-PWM5通道 - 锂电池 → LM2596 → 输出5V → 给PCA9685舵机供电 - ESP32单独供电(建议) 2. 需要上传到ESP32的文件: - `pca9685.py` (MicroPython兼容驱动) - `main.py` (主程序) ```python # pca9685.py (MicroPython驱动) from machine import I2C class PCA9685: def __init__(self, i2c, address=0x40): self.i2c = i2c self.address = address self.reset() def reset(self): self.write(0x00, 0x00) # Mode1 register def freq(self, freq=None): if freq is None: return int(25000000 / (4096 * (self.read(0xFE) - 0.5))) prescale = int(25000000 / (4096 * freq)) - 1 old_mode = self.read(0x00) self.write(0x00, (old_mode & 0x7F) | 0x10) self.write(0xFE, prescale) self.write(0x00, old_mode) def pwm(self, index, on=0, off=0): self.write(0x06 + 4 * index, on & 0xFF) self.write(0x07 + 4 * index, on >> 8) self.write(0x08 + 4 * index, off & 0xFF) self.write(0x09 + 4 * index, off >> 8) def write(self, address, value): self.i2c.writeto_mem(self.address, address, bytearray([value])) def read(self, address): return self.i2c.readfrom_mem(self.address, address, 1)[0] ``` ```python # main.py (ESP32主程序) from machine import Pin, I2C, UART from pca9685 import PCA9685 import time # 初始化I2CPCA9685 i2c = I2C(0, scl=Pin(22), sda=Pin(21), freq=400000) pca = PCA9685(i2c) pca.freq(50) # 舵机PWM频率 # 舵机通道映射 servo_channels = { 0: 0, # 关节1 (180度) 1: 1, # 关节2 (180度) 2: 2, # 关节3 (180度) 3: 3, # 夹爪 (180度) 4: 4, # 旋转关节1 (360度) 5: 5 # 旋转关节2 (360度) } def set_angle(channel, angle): pulse = int(angle * (2500 - 500) / 180 + 500) # 500-2500us set_pwm(channel, pulse) def set_speed(channel, speed): # 用于360度舵机 pulse = 1500 + speed * 400 # 1100-1900us set_pwm(channel, pulse) def set_pwm(channel, pulse_us): period = 20000 # 20ms duty = int(pulse_us * 4096 / period) pca.pwm(channel, 0, duty) # UART初始化 uart = UART(1, baudrate=115200, tx=17, rx=16) while True: if uart.any(): data = uart.readline().decode().strip() try: cmd = data.split(&#39;:&#39;) if len(cmd) == 3: servo_type = cmd[0] # &#39;A&#39;角度舵机/&#39;S&#39;速度舵机 channel = int(cmd[1]) value = float(cmd[2]) if servo_type == &#39;A&#39; and 0 <= value <= 180: set_angle(servo_channels[channel], value) elif servo_type == &#39;S&#39; and -1 <= value <= 1: set_speed(servo_channels[channel], value) except Exception as e: print("Error:", e) ``` 3. 电脑端控制程序(使用PyGame): ```python # gamepad_control.py (电脑端运行) import pygame import serial import time # 初始化PyGame pygame.init() j = pygame.joystick.Joystick(0) j.init() # 串口配置 ser = serial.Serial(&#39;COM3&#39;, 115200) # 修改为ESP32的串口号 # 摇杆死区处理 DEADZONE = 0.1 # 舵机映射配置 controls = { &#39;axes&#39;: { 0: (&#39;S&#39;, 4, 1.0), # 左摇杆X轴 → 旋转舵机4 1: (&#39;S&#39;, 5, 1.0), # 左摇杆Y轴 → 旋转舵机5 2: (&#39;A&#39;, 0, 90), # 右摇杆X轴 → 关节1 3: (&#39;A&#39;, 1, 90) # 右摇杆Y轴 → 关节2 }, &#39;buttons&#39;: { 0: (&#39;A&#39;, 2, 0), # A按钮 → 关节3归零 1: (&#39;A&#39;, 3, 180) # B按钮 → 夹爪全开 } } try: while True: pygame.event.pump() # 处理摇杆输入 for axis in controls[&#39;axes&#39;]: a_type, channel, scale = controls[&#39;axes&#39;][axis] value = j.get_axis(axis) if abs(value) < DEADZONE: continue if a_type == &#39;A&#39;: angle = (value * scale) + 90 cmd = f"{a_type}:{channel}:{angle:.1f}" elif a_type == &#39;S&#39;: cmd = f"{a_type}:{channel}:{value:.2f}" ser.write(cmd.encode() + b&#39;\n&#39;) # 处理按钮输入 for btn in controls[&#39;buttons&#39;]: if j.get_button(btn): a_type, channel, value = controls[&#39;buttons&#39;][btn] cmd = f"{a_type}:{channel}:{value}" ser.write(cmd.encode() + b&#39;\n&#39;) time.sleep(0.05) except KeyboardInterrupt: j.quit() ser.close() ``` 使用步骤: 1. 将`pca9685.py``main.py`上传到ESP32 2. 安装电脑端依赖:`pip install pygame pyserial` 3. 运行电脑端程序:`python gamepad_control.py` 所需库: - ESP32端:仅需自带machine库 - 电脑端:pygame(手柄输入)、pyserial(串口通信)
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值