樹莓派智能小車基本移動實驗指導書

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
繁體地址,請注明出處:http://hk.pswp.cn/web/83719.shtml
英文地址,請注明出處:http://en.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…