Linux驅動程序(PWM接口)與超聲波測距

一、利用阿里云服務器實現樹莓派外網訪問(SSH 反向代理)

1. 樹莓派端配置

步驟 1:安裝 SSH 服務(若未安裝)

sudo apt-get install openssh-server

步驟 2:創建反向代理連接

-p 22:指定阿里云服務器的 SSH 端口

-qngfN:靜默模式、后臺運行、不分配偽終端

-R:反向代理參數

2222:阿里云服務器用于映射的端口(需自行定義未被占用的端口)

username:阿里云服務器登錄用戶名

步驟 3:設置開機自啟動
將反向代理命令添加到~/.bashrc或創建啟動腳本:

echo "ssh -p 22 -qngfNTR 2222:localhost:22 username@114.55.126.125" >> ~/.bashrc
2. 阿里云服務器端配置

步驟 1:檢查端口監聽狀態

ss -ntl | grep 2222

若輸出類似LISTEN 0 128 :::2222 :::*,說明端口已成功綁定。

步驟 2:配置防火墻(若使用安全組)
在阿里云控制臺的安全組規則中添加入方向規則,允許 TCP 協議訪問 2222 端口。

3. 外網訪問樹莓派
# 格式: ssh -p [服務器映射端口] [樹莓派用戶名]@[服務器IP]
ssh -p 2222 pi@114.55.126.125

二、樹莓派 PWM LED 呼吸燈(含多線程實現)

1. 單線程順序呼吸燈
import RPi.GPIO as GPIO
import time# 設置GPIO模式為BOARD編號
GPIO.setmode(GPIO.BOARD)# 定義LED引腳(可修改為實際連接的引腳)
YELLOW_LED = 11  # 黃燈
GREEN_LED = 16   # 綠燈# 初始化引腳
GPIO.setup(YELLOW_LED, GPIO.OUT)
GPIO.setup(GREEN_LED, GPIO.OUT)# 創建PWM對象(頻率60Hz)
pwm_yellow = GPIO.PWM(YELLOW_LED, 60)
pwm_green = GPIO.PWM(GREEN_LED, 60)# 啟動PWM(初始占空比0)
pwm_yellow.start(0)
pwm_green.start(0)try:# 循環3次呼吸效果for _ in range(3):# 黃燈呼吸for dc in range(0, 101, 5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)# 綠燈呼吸for dc in range(0, 101, 5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)finally:# 停止PWM并清理資源pwm_yellow.stop()pwm_green.stop()GPIO.cleanup()
2. 多線程同時呼吸燈實現
import RPi.GPIO as GPIO
import time
import threading# 設置GPIO模式
GPIO.setmode(GPIO.BOARD)# 定義LED引腳
YELLOW_LED = 11
GREEN_LED = 16# 初始化引腳
GPIO.setup(YELLOW_LED, GPIO.OUT)
GPIO.setup(GREEN_LED, GPIO.OUT)# 創建PWM對象
pwm_yellow = GPIO.PWM(YELLOW_LED, 60)
pwm_green = GPIO.PWM(GREEN_LED, 60)# 啟動PWM
pwm_yellow.start(0)
pwm_green.start(0)def yellow_breath():"""黃燈呼吸函數"""for _ in range(3):for dc in range(0, 101, 5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_yellow.ChangeDutyCycle(dc)time.sleep(0.05)def green_breath():"""綠燈呼吸函數"""for _ in range(3):for dc in range(0, 101, 5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)for dc in range(100, -1, -5):pwm_green.ChangeDutyCycle(dc)time.sleep(0.05)try:# 創建并啟動線程t1 = threading.Thread(target=yellow_breath)t2 = threading.Thread(target=green_breath)t1.start()t2.start()# 等待線程結束t1.join()t2.join()finally:# 清理資源pwm_yellow.stop()pwm_green.stop()GPIO.cleanup()

三、樹莓派超聲波測距程序

1. 硬件連接

超聲波模塊 Trig 引腳 → 樹莓派 GPIO23(BCM 編號)

超聲波模塊 Echo 引腳 → 樹莓派 GPIO24(BCM 編號)

模塊 VCC → 樹莓派 5V

模塊 GND → 樹莓派 GND

2. 完整代碼
import RPi.GPIO as GPIO
import time# 設置GPIO模式為BCM
GPIO.setmode(GPIO.BCM)# 定義引腳
TRIG_PIN = 23
ECHO_PIN = 24# 初始化引腳
GPIO.setup(TRIG_PIN, GPIO.OUT)
GPIO.setup(ECHO_PIN, GPIO.IN)def measure_distance():"""測量距離函數"""# 發送觸發信號GPIO.output(TRIG_PIN, True)time.sleep(0.00001)  # 10微秒GPIO.output(TRIG_PIN, False)# 記錄發送和接收時間start_time = time.time()stop_time = time.time()# 等待Echo變為高電平(發送超聲波)while GPIO.input(ECHO_PIN) == 0:start_time = time.time()# 等待Echo變為低電平(接收超聲波)while GPIO.input(ECHO_PIN) == 1:stop_time = time.time()# 計算距離(聲速343m/s,轉換為cm)time_elapsed = stop_time - start_timedistance = (time_elapsed * 34300) / 2return distancetry:print("超聲波測距程序啟動,按Ctrl+C停止")while True:dist = measure_distance()print(f"距離: {dist:.2f} cm")time.sleep(1)  # 每秒測量一次except KeyboardInterrupt:print("程序停止")
finally:GPIO.cleanup()

四、Linux 驅動程序控制 PWM(含編譯與測試)

1. 準備編譯環境
# 安裝內核頭文件(樹莓派專用)
sudo apt-get install raspberrypi-kernel-headers
2. 驅動程序代碼

pwmled.h 文件

#define PWMLED_MAX_BRIGHTNESS 1000typedef enum {PWMLED_CMD_SET_BRIGHTNESS = 0x1,PWMLED_CMD_GET_BRIGHTNESS,
} pwmled_cmd_t;

pwmled.c 文件

#include <linux/module.h>
#include <linux/fs.h>
#include <linux/miscdevice.h>
#include <linux/pwm.h>
#include "pwmled.h"MODULE_LICENSE("Dual MIT/GPL");
MODULE_AUTHOR("Your Name");
MODULE_DESCRIPTION("PWM LED Driver");#define PWM_PERIOD_NS 1000000  // 1ms周期(1000000納秒)static struct {struct pwm_device *pwm;unsigned int brightness;
} pwmled;// IOCTL處理函數
long pwmled_ioctl(struct file *filp, unsigned int cmd, unsigned long arg) {switch (cmd) {case PWMLED_CMD_SET_BRIGHTNESS:// 限制亮度范圍0~1000pwmled.brightness = arg > PWMLED_MAX_BRIGHTNESS ? PWMLED_MAX_BRIGHTNESS : arg;// 計算占空比(亮度*1000納秒)int duty_ns = pwmled.brightness * 1000;// 配置PWMpwm_config(pwmled.pwm, duty_ns, PWM_PERIOD_NS);// 啟用或禁用PWMif (pwmled.brightness > 0) {pwm_enable(pwmled.pwm);} else {pwm_disable(pwmled.pwm);}break;case PWMLED_CMD_GET_BRIGHTNESS:return pwmled.brightness;default:return -EINVAL;}return 0;
}// 文件操作結構體
static struct file_operations fops = {.owner = THIS_MODULE,.unlocked_ioctl = pwmled_ioctl,
};// 雜項設備結構體
static struct miscdevice pwmled_misc = {.minor = MISC_DYNAMIC_MINOR,.name = "pwmled",.fops = &fops,
};// 模塊初始化函數
int __init pwmled_init(void) {int ret;// 請求PWM通道0(根據實際硬件修改通道號)pwmled.pwm = pwm_request(0, "pwmled");if (IS_ERR(pwmled.pwm)) {ret = PTR_ERR(pwmled.pwm);printk(KERN_ERR "Failed to request PWM channel\n");return ret;}// 初始化亮度為0pwmled.brightness = 0;// 注冊雜項設備ret = misc_register(&pwmled_misc);if (ret < 0) {printk(KERN_ERR "Failed to register misc device\n");pwm_free(pwmled.pwm);return ret;}printk(KERN_INFO "PWM LED driver initialized\n");return 0;
}// 模塊退出函數
void __exit pwmled_exit(void) {// 禁用PWMpwm_disable(pwmled.pwm);// 釋放PWM資源pwm_free(pwmled.pwm);// 注銷雜項設備misc_deregister(&pwmled_misc);printk(KERN_INFO "PWM LED driver unloaded\n");
}module_init(pwmled_init);
module_exit(pwmled_exit);
3. 編譯驅動(Makefile)
obj-m += pwmled.oall:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) modules
clean:make -C /lib/modules/$(shell uname -r)/build M=$(PWD) clean
4. 加載驅動與測試

步驟 1:編譯并加載驅動

# 編譯驅動
make
# 加載驅動
sudo insmod pwmled.ko

步驟 2:查看設備節點

ls /dev/pwmled

步驟 3:編寫測試程序

import os
import fcntl# 定義IOCTL命令
PWMLED_CMD_SET_BRIGHTNESS = 0x1
PWMLED_CMD_GET_BRIGHTNESS = 0x2# 打開設備文件
fd = os.open("/dev/pwmled", os.O_RDWR)
if fd < 0:print("Failed to open /dev/pwmled")exit(1)try:# 設置亮度(0~1000)brightness = 500print(f"設置亮度為: {brightness}")fcntl.ioctl(fd, PWMLED_CMD_SET_BRIGHTNESS, brightness)# 等待5秒time.sleep(5)# 獲取當前亮度current_brightness = fcntl.ioctl(fd, PWMLED_CMD_GET_BRIGHTNESS)print(f"當前亮度: {current_brightness}")finally:# 關閉設備文件os.close(fd)

步驟 4:卸載驅動

sudo rmmod pwmled

本文來自互聯網用戶投稿,該文觀點僅代表作者本人,不代表本站立場。本站僅提供信息存儲空間服務,不擁有所有權,不承擔相關法律責任。
如若轉載,請注明出處:http://www.pswp.cn/pingmian/85425.shtml
繁體地址,請注明出處:http://hk.pswp.cn/pingmian/85425.shtml
英文地址,請注明出處:http://en.pswp.cn/pingmian/85425.shtml

如若內容造成侵權/違法違規/事實不符,請聯系多彩編程網進行投訴反饋email:809451989@qq.com,一經查實,立即刪除!

相關文章

Web攻防-XSS跨站文件類型功能邏輯SVGPDFSWFHTMLXMLPMessageLocalStorage

知識點&#xff1a; 1、Web攻防-XSS跨站-文件類型-html&pdf&swf&svg&xml 2、Web攻防-XSS跨站-功能邏輯-postMessage&localStorage 一、演示案例-WEB攻防-XSS跨站-文件類型觸發XSS-SVG&PDF&SWF&HTML&XML等 1、SVG-XSS SVG(Scalable Vect…

強大模型通過自我和解進步——Unsupervised Elicitation of Language Models——論文閱讀筆記

本周關注的工作是&#xff1a;Unsupervised Elicitation of Language Models 這篇文章通篇體現了這樣一件事——香蕉皮大需要香蕉大&#xff01; 一句話總結 首先注意&#xff1a;這個工作不是面向對齊的&#xff0c;而是寫【如何準備】對齊任務的Reward Model需要的數據集的…

Qt—(Qt初識,槽,信號,事件)

一 Qt初識 暫時不寫了 我的理解是類似于c#&#xff0c;是一個組件庫&#xff0c;不局限是一個組件框架。 二 Qt Core Qt Core 是 Qt 框架的基礎模塊&#xff0c;提供非 GUI 的核心功能&#xff1a; 核心類&#xff1a;QObject&#xff08;信號槽機制&#xff09;、QEvent&…

深度學習——基于卷積神經網絡實現食物圖像分類【2】(數據增強)

文章目錄 引言一、項目概述二、環境準備三、數據預處理3.1 數據增強與標準化3.2 數據集準備 四、自定義數據集類五、構建CNN模型六、訓練與評估6.1 訓練函數6.2 評估函數6.3 訓練流程 七、關鍵技術與優化八、常見問題與解決九、完整代碼十、總結 引言 本文將詳細介紹如何使用P…

詳細說說分布式Session的幾種實現方式

1. 基于客戶端存儲&#xff08;Cookie-Based&#xff09; 原理&#xff1a;將會話數據直接存儲在客戶端 Cookie 中 實現&#xff1a; // Spring Boot 示例 Bean public CookieSerializer cookieSerializer() {DefaultCookieSerializer serializer new DefaultCookieSerializ…

用mac的ollama訪問模型,為什么會出現模型胡亂輸出,然后過一會兒再訪問,就又變成正常的

例子&#xff1a;大模型推理遇到內存不足 1. 場景還原 你在Mac上用Ollama運行如下代碼&#xff08;以Python為例&#xff0c;假設Ollama有API接口&#xff09;&#xff1a; import requestsprompt "請寫一首關于夏天的詩。" response requests.post("http:…

簡說 Linux 用戶組

Linux 用戶組 的核心概念、用途和管理方法&#xff0c;盡量簡明易懂。 &#x1f31f; 什么是 Linux 用戶組&#xff1f; 在 Linux 系統中&#xff1a; &#x1f449; 用戶組&#xff08;group&#xff09; 是一組用戶的集合&#xff0c;用來方便地管理權限。 &#x1f449; 用…

S32DS上進行S32K328的時鐘配置,LPUART時鐘配置步驟詳解

1&#xff1a;S32K328的基礎信息 S32K328官網介紹 由下圖可知&#xff0c;S32K328的最大主頻為 240MHz 2&#xff1a;S32K328時鐘樹配置 2.1 system clock node 節點說明 根據《S32K3xx Reference Manual》資料說明 Table 143 各個 系統時鐘節點 的最大頻率如下所示&#…

wordpress小語種網站模板

wordpress朝鮮語模板 紫色風格的韓語wordpress主題&#xff0c;適合做韓國、朝鮮的外貿公司官方網站使用。 https://www.jianzhanpress.com/?p8486 wordpress日文模板 綠色的日語wordpress外貿主題&#xff0c;用來搭建日文外貿網站很實用。 https://www.jianzhanpress.co…

網絡:Wireshark解析https協議,firefox

文章目錄 問題瀏覽器訪問的解決方法python requests問題 現在大部分的網站已經切到https,很多站點即使開了80的端口,最終還是會返回301消息,讓客戶端轉向到https的一個地址。 所以在使用wireshark進行問題分析的時候,解析tls上層的功能,是必不可少的,但是這個安全交換的…

ollama部署開源大模型

1. 技術概述 Spring AI&#xff1a;Spring 官方推出的 AI 框架&#xff0c;簡化大模型集成&#xff08;如文本生成、問答系統&#xff09;&#xff0c;支持多種 LLM 提供商。Olama&#xff1a;開源的本地 LLM 推理引擎&#xff0c;支持量化模型部署&#xff0c;提供 REST API …

Kafka 可靠性保障:消息確認與事務機制(二)

Kafka 事務機制 1. 冪等性與事務的關系 在深入探討 Kafka 的事務機制之前&#xff0c;先來了解一下冪等性的概念。冪等性&#xff0c;簡單來說&#xff0c;就是對接口的多次調用所產生的結果和調用一次是一致的。在 Kafka 中&#xff0c;冪等性主要體現在生產者端&#xff0c…

使用 React.Children.map遍歷或修改 children

使用場景&#xff1a; 需要對子組件進行統一處理&#xff08;如添加 key、包裹額外元素、過濾特定類型等&#xff09;。 動態修改 children 的 props 或結構。 示例代碼&#xff1a;遍歷并修改 children import React from react;// 一個組件&#xff0c;給每個子項添加邊框…

智能體三階:LLM→Function Call→MCP

哈嘍&#xff0c;我是老劉 老劉是個客戶端開發者&#xff0c;目前主要是用Flutter進行開發&#xff0c;從Flutter 1.0開始到現在已經6年多了。 那為啥最近我對MCP和AI這么感興趣的呢&#xff1f; 一方面是因為作為一個在客戶端領域實戰多年的程序員&#xff0c;我覺得客戶端開發…

flutter的常規特征

前言 Flutter 是由 Google 開發的開源 UI 軟件開發工具包&#xff0c;用于構建跨平臺的高性能、美觀且一致的應用程序。 一、跨平臺開發能力 1.多平臺支持&#xff1a;Flutter 支持構建 iOS、Android、Web、Windows、macOS 和 Linux 應用&#xff0c;開發者可以使用一套代碼庫在…

【Git】代碼托管服務

博主&#xff1a;&#x1f44d;不許代碼碼上紅 歡迎&#xff1a;&#x1f40b;點贊、收藏、關注、評論。 格言&#xff1a; 大鵬一日同風起&#xff0c;扶搖直上九萬里。 文章目錄 Git代碼托管服務概述Git核心概念主流Git托管平臺Git基礎配置倉庫創建方式Git文件狀態管理常用…

Android 網絡請求的選擇邏輯(Connectivity Modules)

代碼分析 ConnectivityManager packages/modules/Connectivity/framework/src/android/net/ConnectivityManager.java 許多APN已經棄用,應用層統一用 requestNetwork() 來請求網絡。 [ConnectivityManager] example [ConnectivityManager] requestNetwork() [Connectivi…

C#建立與數據庫連接(版本問題的解決方案)踩坑總結

1.如何優雅的建立數據庫連接 今天使用這個deepseek寫代碼&#xff0c;主要就是建立數據庫的鏈接&#xff0c;包括這個建庫建表啥的都是他整得&#xff0c;我就是負責執行&#xff0c;然后解決這個里面遇到的一些問題&#xff1b; 其實我學習這個C#不過是短短的4天的時間&…

FastAPI的初步學習(Django用戶過來的)

我一直以來是Django重度用戶。它有清晰的MVC架構模式、多應用組織結構。它內置用戶認證、數據庫ORM、數據庫遷移、管理后臺、日志等功能&#xff0c;還有強大的社區支持。再搭配上Django REST framework (DRF) &#xff0c;開發起來效率極高。主打功能強大、易于使用。 曾經也…

提升IT運維效率 貝銳向日葵推出自動化企業腳本功能

在企業進行遠程IT運維管理的過程中&#xff0c;難免會涉及很多需要批量操作下發指令的場景&#xff0c;包括但不限于下列場景&#xff1a; ● ?規模設備部署與初始化、設備配置更新 ● 業務軟件安裝與系統維護&#xff0c;進行安全加固或執行問題修復命令 ● 遠程設備監控與…