树莓派智能小车基本移动实验指导书

1.安装LOBOROBOT库函数

LOBOROBOT.py代码如下:

#!/usr/bin/python
# -*- coding: utf-8 -*-import time
import math
import smbus
import RPi.GPIO as GPIODir = ['forward','backward',
]class PCA9685:# Registers/etc.__SUBADR1            = 0x02__SUBADR2            = 0x03__SUBADR3            = 0x04__MODE1              = 0x00__PRESCALE           = 0xFE__LED0_ON_L          = 0x06__LED0_ON_H          = 0x07__LED0_OFF_L         = 0x08__LED0_OFF_H         = 0x09__ALLLED_ON_L        = 0xFA__ALLLED_ON_H        = 0xFB__ALLLED_OFF_L       = 0xFC__ALLLED_OFF_H       = 0xFDdef __init__(self, address, debug=False):self.bus = smbus.SMBus(1)self.address = addressself.debug = debugif (self.debug):print("Reseting PCA9685")self.write(self.__MODE1, 0x00)def write(self, reg, value):"Writes an 8-bit value to the specified register/address"self.bus.write_byte_data(self.address, reg, value)if (self.debug):print("I2C: Write 0x%02X to register 0x%02X" % (value, reg))def read(self, reg):"Read an unsigned byte from the I2C device"result = self.bus.read_byte_data(self.address, reg)if (self.debug):print("I2C: Device 0x%02X returned 0x%02X from reg 0x%02X" % (self.address, result & 0xFF, reg))return resultdef setPWMFreq(self, freq):"Sets the PWM frequency"prescaleval = 25000000.0    # 25MHzprescaleval /= 4096.0       # 12-bitprescaleval /= float(freq)prescaleval -= 1.0if (self.debug):print("Setting PWM frequency to %d Hz" % freq)print("Estimated pre-scale: %d" % prescaleval)prescale = math.floor(prescaleval + 0.5)if (self.debug):print("Final pre-scale: %d" % prescale)oldmode = self.read(self.__MODE1)newmode = (oldmode & 0x7F) | 0x10        # sleepself.write(self.__MODE1, newmode)        # go to sleepself.write(self.__PRESCALE, int(math.floor(prescale)))self.write(self.__MODE1, oldmode)time.sleep(0.005)self.write(self.__MODE1, oldmode | 0x80)def setPWM(self, channel, on, off):"Sets a single PWM channel"self.write(self.__LED0_ON_L + 4*channel, on & 0xFF)self.write(self.__LED0_ON_H + 4*channel, on >> 8)self.write(self.__LED0_OFF_L + 4*channel, off & 0xFF)self.write(self.__LED0_OFF_H + 4*channel, off >> 8)if (self.debug):print("channel: %d  LED_ON: %d LED_OFF: %d" % (channel,on,off))def setDutycycle(self, channel, pulse):self.setPWM(channel, 0, int(pulse * (4096 / 100)))def setLevel(self, channel, value):if (value == 1):self.setPWM(channel, 0, 4095)else:self.setPWM(channel, 0, 0)# 控制机器人库
class LOBOROBOT():def __init__(self):self.PWMA = 0self.AIN1 = 2self.AIN2 = 1self.PWMB = 5self.BIN1 = 3self.BIN2 = 4self.PWMC = 6self.CIN2 = 7self.CIN1 = 8self.PWMD = 11self.DIN1 = 25self.DIN2 = 24self.pwm = PCA9685(0x40, debug=False)self.pwm.setPWMFreq(50)GPIO.setwarnings(False)GPIO.setmode(GPIO.BCM)GPIO.setup(self.DIN1,GPIO.OUT)GPIO.setup(self.DIN2,GPIO.OUT)def MotorRun(self, motor, index, speed):if speed > 100:returnif(motor == 0):self.pwm.setDutycycle(self.PWMA, speed)if(index == Dir[0]):self.pwm.setLevel(self.AIN1, 0)self.pwm.setLevel(self.AIN2, 1)else:self.pwm.setLevel(self.AIN1, 1)self.pwm.setLevel(self.AIN2, 0)elif(motor == 1):self.pwm.setDutycycle(self.PWMB, speed)if(index == Dir[0]):self.pwm.setLevel(self.BIN1, 1)self.pwm.setLevel(self.BIN2, 0)else:self.pwm.setLevel(self.BIN1, 0)self.pwm.setLevel(self.BIN2, 1)elif(motor == 2):self.pwm.setDutycycle(self.PWMC,speed)if(index == Dir[0]):self.pwm.setLevel(self.CIN1,1)self.pwm.setLevel(self.CIN2,0)else:self.pwm.setLevel(self.CIN1,0)self.pwm.setLevel(self.CIN2,1)elif(motor == 3):self.pwm.setDutycycle(self.PWMD,speed)if (index == Dir[0]):GPIO.output(self.DIN1,0)GPIO.output(self.DIN2,1)else:GPIO.output(self.DIN1,1)GPIO.output(self.DIN2,0)def MotorStop(self, motor):if (motor == 0):self.pwm.setDutycycle(self.PWMA, 0)elif(motor == 1):self.pwm.setDutycycle(self.PWMB, 0)elif(motor == 2):self.pwm.setDutycycle(self.PWMC, 0)elif(motor == 3):self.pwm.setDutycycle(self.PWMD, 0)# 前进def t_up(self,speed,t_time):self.MotorRun(0,'forward',speed)self.MotorRun(1,'forward',speed)self.MotorRun(2,'forward',speed)self.MotorRun(3,'forward',speed)time.sleep(t_time)#后退def t_down(self,speed,t_time):self.MotorRun(0,'backward',speed)self.MotorRun(1,'backward',speed)self.MotorRun(2,'backward',speed)self.MotorRun(3,'backward',speed)time.sleep(t_time)# 左移def moveLeft(self,speed,t_time):self.MotorRun(0,'backward',speed)self.MotorRun(1,'forward',speed)self.MotorRun(2,'forward',speed)self.MotorRun(3,'backward',speed)time.sleep(t_time)#右移def moveRight(self,speed,t_time):self.MotorRun(0,'forward',speed)self.MotorRun(1,'backward',speed)self.MotorRun(2,'backward',speed)self.MotorRun(3,'forward',speed)time.sleep(t_time)# 左转def turnLeft(self,speed,t_time):self.MotorRun(0,'backward',speed)self.MotorRun(1,'forward',speed)self.MotorRun(2,'backward',speed)self.MotorRun(3,'forward',speed)time.sleep(t_time)# 右转def turnRight(self,speed,t_time):self.MotorRun(0,'forward',speed)self.MotorRun(1,'backward',speed)self.MotorRun(2,'forward',speed)self.MotorRun(3,'backward',speed)time.sleep(t_time)# 前左斜def forward_Left(self,speed,t_time):self.MotorStop(0)self.MotorRun(1,'forward',speed)self.MotorRun(2,'forward',speed)self.MotorStop(0)time.sleep(t_time)# 前右斜def forward_Right(self,speed,t_time):self.MotorRun(0,'forward',speed)self.MotorStop(1)self.MotorStop(2)self.MotorRun(3,'forward',speed)time.sleep(t_time)# 后左斜def backward_Left(self,speed,t_time):self.MotorRun(0,'backward',speed)self.MotorStop(1)self.MotorStop(2)self.MotorRun(3,'backward',speed)time.sleep(t_time)# 后右斜def backward_Right(self,speed,t_time):self.MotorStop(0)self.MotorRun(1,'backward',speed)self.MotorRun(2,'backward',speed)self.MotorStop(3)time.sleep(t_time)# 停止def t_stop(self,t_time):self.MotorStop(0)self.MotorStop(1)self.MotorStop(2)self.MotorStop(3)time.sleep(t_time)# 辅助功能,使设置舵机脉冲宽度更简单。def set_servo_pulse(self,channel,pulse):pulse_length = 1000000    # 1,000,000 us per secondpulse_length //= 60       # 60 Hzprint('{0}us per period'.format(pulse_length))pulse_length //= 4096     # 12 bits of resolutionprint('{0}us per bit'.format(pulse_length))pulse *= 1000pulse //= pulse_lengthself.pwm.setPWM(channel, 0, pulse)# 设置舵机角度函数  def set_servo_angle(self,channel,angle):angle=4096*((angle*11)+500)/20000self.pwm.setPWM(channel,0,int(angle))

远程连接树莓派智能小车

运行LOBOROBOT.py代码,加载上了库函数

2.运行基本移动代码

from LOBOROBOT import LOBOROBOT  # 载入机器人库import osif __name__ == "__main__":clbrobot = LOBOROBOT() # 实例化机器人对象try:while True:clbrobot.t_up(50,3)      # 机器人前进clbrobot.t_stop(1) # 机器人停止clbrobot.t_down(50,3)    # 机器人后退clbrobot.t_stop(1) # 机器人停止clbrobot.turnLeft(50,3)  # 机器人左转clbrobot.t_stop(1) # 机器人停止clbrobot.turnRight(50,3) # 机器人右转clbrobot.t_stop(1) # 机器人停止clbrobot.moveLeft(50,3)  # 机器人左移clbrobot.t_stop(1) # 机器人停止clbrobot.moveRight(50,3) # 机器人右移clbrobot.t_stop(1) # 机器人停止clbrobot.forward_Left(50,3) # 机器人前左斜clbrobot.t_stop(1) # 机器人停止clbrobot.backward_Right(50,3) # 机器人后右斜clbrobot.t_stop(1) # 机器人停止clbrobot.forward_Right(50,3)  # 机器人前右斜clbrobot.t_stop(1) # 机器人停止clbrobot.backward_Left(50,3)  # 机器人后左斜clbrobot.t_stop(5)       # 机器人停止            except KeyboardInterrupt:clbrobot.t_stop(0) # 机器人停止

小车完成基本移动,如每行代码注释所示

3.实验视频如下:

小车基本移动

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.pswp.cn/web/83719.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

如何对目标检测算法RT-DETR进行创新和改进:突破瓶颈,提升性能!

更多精彩,详见文末~~~ 在目标检测的高速发展中,RT-DETR作为DETR(DEtection TRansformer)的高效变体,凭借其优异的性能和较快的推理速度,已经成为许多实际应用中的首选算法。然而,尽管RT-DETR在…

Java-String

前言 package com.kjxy.st;public class TestString1 {public static void main(String[] args) {String s1 "hello";String s2 "hello";String s3 new String("hello");String s4 new String("hello");System.out.println(s1 s2…

计算机组成原理——C/存储系统

🌈个人主页:慢了半拍 🔥 创作专栏:《史上最强算法分析》 | 《无味生》 |《史上最强C语言讲解》 | 《史上最强C练习解析》|《史上最强C讲解》|《史上最强计组》|《史上最强数据结构》 🏆我的格言:一切只是时…

什么是电输运性能

电输运性能‌是指材料在电场作用下,电子在材料中传输的能力和效率。具体来说,电输运性能包括以下几个方面: ‌电子的自由移动性‌:导体中的电子具有较大的自由移动能力,这是由于导体中的原子或分子结构具有一定的松散…

k3s入门教程(二)部署前后端分离程序

文章目录 部署基础服务部署Redis部署MySQL端口转发测试 运行与构建前后端镜像构建后端镜像 docker build -t ruoyi-admin:v3.8 .构建前端镜像 docker build -t ruoyi-ui:v3.8 .创建私库,推拉镜像 前后端应用部署后端应用部署前端应用部署 启动顺序与初始化容器修改前…

Seata如何与Spring Cloud整合?

🔧 一、整合核心步骤 1. 启动 Seata Server(TC) 环境准备: 修改 registry.conf,指定注册中心(如 Nacos)和配置中心:registry {type "nacos"nacos {serverAddr "l…

Python惰性函数与技术总结-由Deepseek产生

在Python中,惰性(Lazy)技术指延迟计算直到真正需要结果时才执行,常用于优化内存和性能。以下是常见的惰性函数和技术: 1. 生成器(Generators) 原理:使用 yield 返回迭代结果&#x…

轮廓 裂缝修复 轮廓修复 填补孔洞 源代码

目录 1. 形态学闭合操作填补小孔洞 完整代码: 使用 Douglas-Peucker 算法对轮廓进行多边形逼近 2.裂缝修复 轮廓修复 轮廓补全 函数封装 调用示例: 1. 形态学闭合操作填补小孔洞 完整代码: import cv2 import numpy as np# 创建模拟图像(白色区域 + 多个不规则黑洞)…

HTTP1.1

HTTP基础知识 HTTP(HyperText Transfer Protocol)是用于传输超文本 的应用层协议,采用客户端-服务器 模型。 客户端(如浏览器)发起请求,服务器响应并返回数据。 工作原理 客户端发送HTTP请求至服…

【Linux教程】Linux 生存指南:掌握常用命令,避开致命误操作

Linux 常用操作命令:避免误操作指南 在 Linux 系统中,熟练掌握常用操作命令是高效工作的基础,但同时也要警惕误操作带来的风险。无论是部署程序、配置防火墙、管理端口还是处理进程,一个小小的失误都可能导致系统故障、数据丢失等…

PHP:Web 开发领域的常青树

在当今数字化浪潮中,Web 开发技术日新月异,各种新兴语言和框架层出不穷。然而,PHP 作为一门经典的后端开发语言,依然在 Web 开发领域占据着重要地位,展现出强大的生命力和广泛的应用价值。 PHP 的历史与现状 PHP&…

平均数与倍数

目录 一. 平均数现期平均数基期平均数(比较冷门)两期平均数-比较平均数的增长量平均数的增长率 二. 倍数基期倍数 \quad 一. 平均数 \quad 现期平均数 \quad \quad \quad \quad \quad \quad \quad \quad \quad \quad 平均数速算技巧:削峰填谷…

一个完整的日志收集方案:Elasticsearch + Logstash + Kibana+Filebeat (三)

现在我们主要完成AI-RAG服务的扩展,利用ES的向量检索能力完成历史聊天记录的存储和向量检索,让ai聊天有记忆。 主要做法是在首次聊天完成后将对话内容写出日志到D:\dev\dev2025\EC0601\logs\chat-his.log 写出日志同时嵌入向量 向量可以从ollama的端点&…

Vue嵌套(多级)路由

一、前言 在构建中大型单页应用(SPA)时,页面结构往往比较复杂,比如仪表盘、用户中心、商品管理等模块通常包含多个子功能页面。为了更好地组织这些页面,Vue Router 提供了嵌套(多级)路由的功能。 通过嵌套路由,我们可以在父级组件中嵌入一个 <router-view> 来展…

Kubernetes 集群安全(身份认证机制、SecurityContext、Network Policy网络策略、预防配置泄露、全面加固集群安全)

Kubernetes 集群安全(身份认证机制、SecurityContext、Network Policy网络策略、预防配置泄露、全面加固集群安全) 一、Kubernetes 身份认证机制 身份认证(Authentication): 在 K8S 中,身份认证是安全访问控制的第一道大门,它的目标是: 确认请求发起者的真实身份 K8…

【VUE3】基于Vue3和Element Plus的递归组件实现多级导航栏

文章目录 前言一、递归的意义二、递归组件的实现——基于element-plus UI的多级导航栏2.1 element-plus Menu菜单官方示例2.2 接口定义2.3 组件递归2.4 父组件封装递归组件 三、完整代码——基于element-plus UI的多级导航栏3.1 组件架构3.2 types.ts3.3 menuTreeItem.vue3.4 i…

思科资料-ACL的基础配置-详细总结

一、ACL技术 1、定义 访问控制列表访问控制列表使用包过滤技术&#xff0c;在路由器上读取第三层及第四层包头中的信息如源地址&#xff0c;目的地址&#xff0c;源端口&#xff0c;目的端口等&#xff0c;根据预先定 义好的规则对包进行过滤&#xff0c;从而达到访问控制的目…

GitHub 上 PAT 和 SSH 的 7 个主要区别:您应该选择哪一个?

在代码仓库和像 Github 这样的版本控制系统中,有时您需要安全高效地访问您的仓库。随着对更安全实践的需求日益增长,开发人员一直在寻找最高效、最安全的方式来与 Github 交互。为了解决这个问题,我们将探讨两种常用的方法:个人访问令牌 (PAT) 和安全 Shell (SSH) 密钥。本…

Vue 事件修饰符详解

Vue 事件修饰符详解 事件修饰符是 Vue 中处理 DOM 事件细节的强大工具。下面我将通过一个交互式示例全面解析各种事件修饰符的用法和原理。 <!DOCTYPE html> <html lang"zh-CN"> <head><meta charset"UTF-8"><meta name"…

初探Qt信号与槽机制

3.3 按键响应 - 初识信号与槽 3.3.1 信号与槽基本介绍 提出疑问&#xff0c;界面上已经有按键了&#xff0c;怎么操作才能让用户按下按键后有操作上的反应呢&#xff1f; 在 Qt 中&#xff0c; 信号和槽机制 是一种非常强大的事件通信机制。这是一个重要的概念&#xff0…