树莓派+pyhton控制9g舵机

本文记录了使用树莓派通过Python控制9g舵机的全过程,包括树莓派的PWM控制原理、接线方法、RPi.GPIO模块的安装与使用,以及程序编写和硬件测试。在实践中遇到问题,如接线混淆、模块导入错误等,通过逐步排查解决,体验到树莓派的灵活性。
摘要由CSDN通过智能技术生成

项目记录:
1、因为Raspberry Pi没有模拟输出,使用类似改变电压电平的时间宽度来控制舵机的动作(PWM)
2、树莓派的接线(因为我是用树莓派3B)
树莓派接口图
树莓派接口的信号口号码和第几个接口必须要区分开来
ex:树莓派上的第三个接口是2号信号口
(在这里栽了一晚上的跟头)
在这里插入图片描述

我的接线是将舵机的正负极接在树莓派的接口上(2、4、6号口上)
3、在树莓派上下载RPi.GPIO模块
在命令提示符里面安装pip(适用于win)

> sudo apt-get install -y python-pip

安装完pip后就安装RPi.GPIO

>  sudo apt-get -y python-pip   
>  sudo pip install rpi.gpio

一定要发现模块的名字是G P i.G P I O,不是GPI.GPIO,中间的 i 是搞死人的存在
python是一门对大小写极其敏感的语言,如果大小写出错只会得到无尽的no module named ‘GPI’

4、程序编写

聊天室是一个比较复杂的项目,需要使用到网络编程、多线程、GUI等知识。下面是一个简单的聊天室实现方案,使用C++客户端和Python服务器。 1. 服务器端 服务器端使用Python语言编写,需要使用socket模块进行网络通信。服务器需要监听客户端的连接,接收客户端发送的消息,并将消息广播给所有在线的客户端。以下是一个简单的服务器端代码: ```python import socket import threading # 定义服务器地址和端口号 HOST = '127.0.0.1' PORT = 8888 # 创建socket对象 server_socket = socket.socket(socket.AF_INET, socket.SOCK_STREAM) # 绑定地址和端口号 server_socket.bind((HOST, PORT)) # 设置监听 server_socket.listen() # 定义一个列表保存客户端连接对象 clients = [] def broadcast(msg, client): # 广播消息给所有在线客户端 for c in clients: if c != client: c.send(msg.encode()) def handle_client(client_socket, client_address): # 处理客户端连接 print(f'客户端 {client_address} 已连接') # 将连接对象加入列表 clients.append(client_socket) while True: try: # 接收客户端消息 msg = client_socket.recv(1024).decode() if msg: # 广播消息给所有在线客户端 broadcast(msg, client_socket) else: # 客户端断开连接 client_socket.close() clients.remove(client_socket) print(f'客户端 {client_address} 已断开连接') break except Exception as e: print(e) client_socket.close() clients.remove(client_socket) print(f'客户端 {client_address} 已断开连接') break while True: # 等待客户端连接 client_socket, client_address = server_socket.accept() # 创建一个线程处理客户端连接 client_thread = threading.Thread(target=handle_client, args=(client_socket, client_address)) client_thread.start() ``` 2. 客户端 客户端使用C++语言编写,需要使用socket库进行网络通信。客户端需要建立与服务器的连接,发送消息给服务器,并接收服务器广播的消息。以下是一个简单的客户端代码: ```cpp #include <iostream> #include <string> #include <thread> #include <WinSock2.h> #pragma comment(lib, "ws2_32.lib") using namespace std; void receive_msg(SOCKET sock) { char buf[1024]; int len; while (true) { len = recv(sock, buf, 1024, 0); if (len > 0) { buf[len] = '\0'; cout << buf << endl; } } } int main() { // 初始化WinSock WSADATA wsaData; WSAStartup(MAKEWORD(2, 2), &wsaData); // 创建socket对象 SOCKET sock = socket(AF_INET, SOCK_STREAM, IPPROTO_TCP); // 定义服务器地址和端口号 string host = "127.0.0.1"; int port = 8888; // 连接服务器 sockaddr_in serverAddr; serverAddr.sin_family = AF_INET; serverAddr.sin_port = htons(port); inet_pton(AF_INET, host.c_str(), &serverAddr.sin_addr.s_addr); connect(sock, (sockaddr*)&serverAddr, sizeof(serverAddr)); // 创建接收消息线程 thread t(receive_msg, sock); // 发送消息给服务器 string msg; while (true) { getline(cin, msg); send(sock, msg.c_str(), msg.length(), 0); } // 关闭socket closesocket(sock); // 清理WinSock WSACleanup(); return 0; } ``` 以上代码只是一个简单的实现方案,仅供参考。实际开发中还需要考虑异常处理、防止空消息等问题,同时需要对GUI界面进行设计。
评论 12
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值