本文章用于记录和整理本鼠鼠在学习智能小车中学到的芝士和经验。

注:关于镜像刷入和树莓派镜像资源请看我的这篇文章:https://hash070.top/raspberry-image-flush.html

小车初始化

我用的是Raspbot视觉基础小车的第三方镜像,用的其他镜像的不用在意这两个步骤,资源链接如下

链接:https://pan.baidu.com/s/1dVcEgVg5-Q4Mr-Rxt_82wg?pwd=8888
提取码:8888

第一步:关闭主程序(可能是会影响使用)

ps -ef|grep raspbot.pyc
#找到这个程序的pid然后关闭

打开JypterLab运行程序

在浏览器中输入

[ip]:8888
#登录密码yahboom

小车马达操控

舵机控制机制分析

这个是小车运动代码

#!/usr/bin/env python
# coding=UTF-8
import  RPi.GPIO as GPIO
import time

PWMA   =  18
AIN1   =  22
AIN2   =  27

PWMB   =  23
BIN1   =  25
BIN2   =  24

def t_up(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,True) #AIN1
#up 
        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,True) #BIN1
        time.sleep(t_time)

def t_stop(t_time):
        L_Motor.ChangeDutyCycle(0)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,False) #AIN1
#stop
        R_Motor.ChangeDutyCycle(0)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)

def t_down(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,True)#AIN2
        GPIO.output(AIN1,False) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,True)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)

def t_left(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,True)  #AIN2
        GPIO.output(AIN1,False) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,False)#BIN2
        GPIO.output(BIN1,True) #BIN1
        time.sleep(t_time)

def t_right(speed,t_time):
        L_Motor.ChangeDutyCycle(speed)
        GPIO.output(AIN2,False)#AIN2
        GPIO.output(AIN1,True) #AIN1

        R_Motor.ChangeDutyCycle(speed)
        GPIO.output(BIN2,True)#BIN2
        GPIO.output(BIN1,False) #BIN1
        time.sleep(t_time)    

GPIO.setwarnings(False) 
GPIO.setmode(GPIO.BCM)
GPIO.setup(AIN2,GPIO.OUT)
GPIO.setup(AIN1,GPIO.OUT)
GPIO.setup(PWMA,GPIO.OUT)

GPIO.setup(BIN1,GPIO.OUT)
GPIO.setup(BIN2,GPIO.OUT)
GPIO.setup(PWMB,GPIO.OUT)

L_Motor= GPIO.PWM(PWMA,100)
L_Motor.start(0)

R_Motor = GPIO.PWM(PWMB,100)
R_Motor.start(0)

#控制模块开始

try:
    while True:
        t_up(50,3)
        t_down(50,3)
        t_left(50,3)
        t_right(50,3)
        t_stop(3)
except KeyboardInterrupt:
    GPIO.cleanup()

根据分析,这里的PWMA/B分别指的是左右两边轮子的速度,A/BIN分别控制左右两侧的电机的运动方向,即分别控制左右马达是前进还是后退。

下图归纳总结了A/BIN的状态和运动方向的关系(对号=True;叉叉=False)

1670036407003.webp

Socket远程控制

关于PythonSocket网络编程的文章:

https://hash070.top/python-socket.html

学习Python网络编程语法后写出来的小车控制程序

https://hash070.top/rasp-with-tcp.html

获取树莓派摄像头实时视频流

如何获取树莓派的摄像头的实时视频流:

https://hash070.top/mjpg-streamer.html

Q.E.D.