零基础玩转树莓派(六)—遥控小车

上一篇介绍了树莓派控制直流电机,现在就可以做一个小车,通过远程来控制。

一、硬件连接

找有个小车底盘,将上一篇中用到的所有东西固定到小车底盘上,搭建一个小车,并将所有线路连接好。
在这里插入图片描述

二、L298控制

小车需要实现基本的前进、后退、左转、右转以及停止的动作,主要通过两个电机来实现的。

电机前进后退左转右转停止
左电机正转反转反转正转
右电机正转反转正转反转

电机是通过L298电机驱动模块上的 IN1-4 接口来控制的,信号控制图如下
在这里插入图片描述

三、小车程序

1、硬件按照上述连接好后,将树莓派上电,使用SSH远程连接树莓派
在这里插入图片描述
2、输入nano xiaoche.py,创建一个名为xiaoche的python文件

nano xiaoche.py

在这里插入图片描述
3、文件编辑界面输入以下内容(现在程序叫复杂,后期会优化)

# -*- coding: utf-8 -*-                         #通过声明可以在程序中书写中文
import RPi.GPIO as GPIO                         #引入RPi.GPIO库函数命名为GPIO
import time                                     #引入计时time函数
#接口定义
INT1 = 11                                       #将L298 INT1口连接到树莓派Pin11
INT2 = 12                                       #将L298 INT2口连接到树莓派Pin12
INT3 = 13                                       #将L298 INT3口连接到树莓派Pin13
INT4 = 15                                       #将L298 INT4口连接到树莓派Pin15
ENA = 16                                        #将L298 ENA口连接到树莓派Pin16
ENB = 18                                        #将L298 ENB口连接到树莓派Pin18

def init():                                     #定义一个初始化函数
        GPIO.setmode(GPIO.BOARD)                #将GPIO编程方式设置为BOARD模式
        GPIO.setup(INT1,GPIO.OUT)               #将相应接口设置为输出模式
        GPIO.setup(INT2,GPIO.OUT)
        GPIO.setup(INT3,GPIO.OUT)
        GPIO.setup(INT4,GPIO.OUT)
        GPIO.setup(ENA,GPIO.OUT)
        GPIO.setup(ENB,GPIO.OUT)
def forward():                                  #定义前进函数
        GPIO.output(INT1,GPIO.HIGH)             #将INT1接口设置为高电压
        GPIO.output(INT2,GPIO.LOW)             #将INT2接口设置为低电压
        GPIO.output(INT3,GPIO.HIGH)             #将INT3接口设置为高电压
        GPIO.output(INT4,GPIO.LOW)              #将INT4接口设置为低电压
        GPIO.cleanup()                          #释放配置过的gpio

def back():                                     #定义后退函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.HIGH)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.HIGH)
        GPIO.cleanup()

def left():                                     #定义左转函数
        GPIO.output(INT1,GPIO.HIGH)
        GPIO.output(INT2,GPIO.LOW)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.HIGH)
        GPIO.cleanup()

def right():                                    #定义右转函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.HIGH)
        GPIO.output(INT3,GPIO.HIGH)
        GPIO.output(INT4,GPIO.LOW)
        GPIO.cleanup()

def stop():                                     #定义停止函数
        GPIO.output(INT1,GPIO.LOW)
        GPIO.output(INT2,GPIO.LOW)
        GPIO.output(INT3,GPIO.LOW)
        GPIO.output(INT4,GPIO.LOW)
        GPIO.cleanup()

init()                                          #调用初始化程序,进行初始化
pwma = GPIO.PWM(ENA,80)                         #创建一个pwma实例,控制左电机转速。两个参数:1GPIO引脚(ENA即为引脚16);2、频率(设置为80)
pwmb = GPIO.PWM(ENB,80)                         #创建一个pwmb实例,控制右电机转速。
pwma.start(0)                                   #以输出0%占空比开始
pwmb.start(0)


while 1:                                        #1为真,永远成立,程序一直执行
        res = raw_input()                       #将键盘输入字符赋值给res
        if res == "w" or res =="W":             #如果输入字符为W
                forward()                       #调用前进函数,使小车前进
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(70)
                pwmb.start(70)
        elif res == "x" or res =="X":
                back()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(70)
                pwmb.start(70)
        if res == "a" or res =="A":
                left()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(35)
                pwmb.start(35)
        elif res == "d" or res =="d":
                right()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(35)
                pwmb.start(35)
        elif res == "s" or res =="S":
                stop()
                init()
                pwma = GPIO.PWM(ENA,80)
                pwmb = GPIO.PWM(ENB,80)
                pwma.start(0)
                pwmb.start(0)

4、保存退出文件并且执行程序

sudo python xiaoche.py

在这里插入图片描述
5、输入w/a/d/x/s,按回车便可控制下车运动。
在这里插入图片描述
6、现在控制小车,输入相应字符需要按回车键,小车才能运动,后面会加上键盘输入检测,不需要每个指令都按回车。

  • 20
    点赞
  • 145
    收藏
    觉得还不错? 一键收藏
  • 9
    评论
这是一个简单的使用socket实现树莓派遥控小车的Python代码: ```python import RPi.GPIO as GPIO import socket # 初始化GPIO GPIO.setmode(GPIO.BOARD) GPIO.setup(11, GPIO.OUT) GPIO.setup(13, GPIO.OUT) GPIO.setup(15, GPIO.OUT) GPIO.setup(16, GPIO.OUT) # 建立socket连接 sock = socket.socket(socket.AF_INET, socket.SOCK_STREAM) sock.bind(('0.0.0.0', 8888)) sock.listen(1) print('等待连接...') while True: # 等待客户端连接 conn, addr = sock.accept() print('已连接:', addr) while True: # 接收客户端发送的指令 data = conn.recv(1024) if not data: break # 处理指令 cmd = data.decode() if cmd == 'F': GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.HIGH) GPIO.output(16, GPIO.LOW) elif cmd == 'B': GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.HIGH) GPIO.output(15, GPIO.LOW) GPIO.output(16, GPIO.HIGH) elif cmd == 'L': GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.HIGH) GPIO.output(15, GPIO.HIGH) GPIO.output(16, GPIO.LOW) elif cmd == 'R': GPIO.output(11, GPIO.HIGH) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) GPIO.output(16, GPIO.HIGH) elif cmd == 'S': GPIO.output(11, GPIO.LOW) GPIO.output(13, GPIO.LOW) GPIO.output(15, GPIO.LOW) GPIO.output(16, GPIO.LOW) # 关闭连接 conn.close() # 清理GPIO GPIO.cleanup() ``` 这个代码使用了GPIO库来控制树莓派的GPIO口,使用socket库来建立与客户端的连接,并通过接收到的指令来控制小车运动。具体指令包括: - F:前进 - B:后退 - L:左转 - R:右转 - S:停止 客户端可以使用任意支持TCP连接的工具发送指令,比如使用Python的socket库、使用Telnet工具等。

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论 9
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值