最近闲来无事,便开始倒腾一些小玩具。我想从比较简单的开始入手,就先是树莓派遥控小汽车吧!
本文用来分享和总结经验。从0开始,小白级教程。

一.必备材料:

1.树莓派 1 个(什么版本都可以)
2.智能小车底盘 1 套(带电机)
3.L298N电机驱动板模块 1 个(3轮最多一个,4轮可以两个,但是需要更多电池,不推荐)
4.公对母杜邦线×8、普通导线×8
5.螺丝刀、扎带、小型充电宝
6.5号电池 4 节

二.小车组件安装

1.电机接线
按照下图,将电机的两端用两根导线相连,玩过四驱车的肯定都懂。因为是直流电机,所以不存在正负之分,随便连,剩下三个复制此操作。

2.L298N模块接线

AB:电机1接口,将一组电机导线两端分别接上。
CD:电机2接口,将另一组电机导线两端分别接上。
E:接电池正极,由于4节干电池电压不够,所以最好将树莓派+5V GPIO引脚也接入。
F:接电池负极。
G:接树莓派+5V GPIO引脚。
HIJK:IN1、IN2、IN3、IN4(IN1和IN2控制AB组电机,IN3和IN4控制CD组电机)。

3.树莓派GPIO接线
树莓派4b的GPIO接口图

由上图可知树莓派的GPIO口有7、11、12、13、15、16、18、22、29、31、32、33、36、37,小车只需用到4个即可(还有两个+5V口)。
将IN1、IN2、IN3、IN4分别接到GPIO口7、11、13、15位置。
(图中红色的是散热扇的线,请忽略)
4.车身固定
先将4个电机装好,再用扎带将电池盒、L298N模块、树莓派固定在底盘上,树莓派最好使用移动电源供电,所以部件摆放位置可以自由发挥。

二.代码实现

在终端输入

mkidr /home/pi/car #创建car目录
cd /home/pi/car #进入car目录
touch up.py #创建python文件
vim up.py #编辑python文件

然后在编辑器中按下"i"进入插入编辑模式并输入下面的代码。

"up.py"

import RPi.GPIO as GPIO
import time
GPIO.setmode(GPIO.BOARD) #设置GPIO口引用模式IN1 = 7   #引用刚才接线的GPIO口
IN2 = 11
IN3 = 13
IN4 = 15
GPIO.setup(IN1,GPIO.OUT)  #设置GPIO口为输出模式
GPIO.setup(IN2,GPIO.OUT)
GPIO.setup(IN3,GPIO.OUT)
GPIO.setup(IN4,GPIO.OUT)GPIO.output(IN1,GPIO.HIGH)  #根据L298N的操作说明来改变电平
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.HIGH)

输入完后按下"ESC"退出编辑模式,英文输入法下输入":“并输入"wq"保存退出(详情见VIM编辑器使用方法)
代码中的变量IN1和IN2控制第一组电机,IN3和IN4控制第二组电机。

上面的代码是负责前进的,根据他我们再创建"down.py”、“left.py”、“right.py”、"stop.py"四个python文件并修改对应的代码。

"down.py"

GPIO.output(IN1,GPIO.LOW)
GPIO.output(IN2,GPIO.HIGH)
GPIO.output(IN3,GPIO.HIGH)
GPIO.output(IN4,GPIO.LOW)

"left.py"

GPIO.output(IN1,GPIO.LOW)
GPIO.output(IN2,GPIO.HIGH)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.HIGH)

"right.py"

GPIO.output(IN1,GPIO.HIGH)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.HIGH)
GPIO.output(IN4,GPIO.LOW)

"stop.py"

GPIO.output(IN1,GPIO.LOW)
GPIO.output(IN2,GPIO.LOW)
GPIO.output(IN3,GPIO.LOW)
GPIO.output(IN4,GPIO.LOW)

此时我们的树莓派对GPIO的管理代码已经完毕,在终端输入:

sudo python up.py

即可调用"up.py"使小车转起来。
再输入:

sudo python stop.py

即可让小车停下。
这里可能的问题
1.只有一两根轮子能转:说明电压不够,返回步骤"二-2"查看E接口,有没有将树莓派+5V接入。
2.轮子转动方向不同:说明电机接线反了或者代码里电平给错了,按组排查即可。

到了这里,小车就算是能跑起来了!但是不要沾沾自喜,还有很多功能等待你发掘。

用"sudo python XX.py"控制小车是不是非常蛋疼?由于python是为了玩这个紧急学习的,了解的并不多,所以我这里决定使用C++来编写一个socket通信来通过图形界面控制小车,也就是做个遥控器。这里只展示PC上的遥控器。

三.进阶遥控(选修)

1.服务端
我让树莓派作为服务端,在/home/pi/car路径下新建一个文件叫"CarServer.cpp"(确保你的树莓派装有g++用来编译.cpp文件,新一点的树莓派都自带,安装方法自行百度)。
使用vim CarServer.cpp进行编辑并将下面的代码复制进去。

#include <iostream>
#include <unistd.h>
#include <cstring>
#include <string>
#include <sys/types.h>
#include <sys/socket.h>
#include <netinet/in.h>
#include <arpa/inet.h>
#include <cstdlib>
using namespace std;
#define USEPORT 1234int main()
{//****创建套接字int serverSock = socket(AF_INET, SOCK_STREAM, 0);//Windows中,AF_INET==PF_INET//Linux中,不同的版本这两者有微小差别.对于BSD是AF,对于POSIX是PFif (serverSock < 0){cout << "socket creation failed" << endl;exit(-1);}cout << "socket creation successfully" << endl;//****绑定ip和端口struct sockaddr_in serverAddr;memset(&serverAddr, 0, sizeof(serverAddr));serverAddr.sin_family = AF_INET;serverAddr.sin_port = htons(USEPORT);//INADDR_ANY绑定所有IPserverAddr.sin_addr.s_addr = htonl(INADDR_ANY);//****绑定套接字if (bind(serverSock,(struct sockaddr*)&serverAddr,sizeof(struct sockaddr)) == -1){cout << "Bind error, Port[" << USEPORT << "]" << endl;exit(-1);}cout << "Bind successfully" << endl;//****监听if (listen(serverSock, 10) == -1){cout << "Listen error!" << endl;}cout << "Listening on port[" << USEPORT << "]" << endl;//****开始接收accept()struct sockaddr clientAddr;int size = sizeof(struct sockaddr);int clientSock = accept(serverSock, (struct sockaddr*)&clientAddr, (socklen_t*)&size);cout << "The Controler Connected!" << endl;system("sudo python stop.py");//****通信while (1){char revData[5];int ret = recv(clientSock,revData,5,0);if(ret > 0){revData[ret] = 0x00;cout<<"retrevData:"<<revData<<endl;}cout<<"lenth:"<<ret<<endl;cout<<"revData:"<<revData<<endl;if(strcmp(revData, "UPUP") == 0){cout<<"up"<<endl;system("ls");system("sudo python up.py");}else if(strcmp(revData,"DOWN") == 0){system("sudo python down.py");printf("down");}else if(strcmp(revData,"LEFT") == 0){system("sudo python left.py");printf("left");}else if(strcmp(revData,"RIGHT") == 0){system("sudo python right.py");printf("right");}else if(strcmp(revData,"STOP") == 0){system("sudo python stop.py");printf("stop");}else if(strcmp(revData,"QUIT") == 0){cout<<"shutdown"<<endl;break;}}close(serverSock);return 0;
}

保存后在终端输入:

g++ CarServer.cpp

服务端就编写完了。

2.客户端
(1).在Qt Creator中,新建一个Qt Widgets Application项目,Build system选择qmake,基类选择QMainWindow。

(2).进入设计页面添加6个按钮和1个标签

(3).将4个控制上下左右的按钮的objectName改为:UpButton、DownButton、LeftButton、RightButton。
(4).将两个控制服务连接的按钮objectName改为:ConnectButton、BreakButton。(按钮的objectName可以自定义,不过下面的代码里也要跟着改)(双击组件可以修改标题名称)

(5).返回编辑页面,在.pro文件里添加:

QT += network
LIBS += -lpthread libwsock32 libws2_32

(6).在.h文件的构造函数的public里添加:

QTcpSocket* socket;

(7).在.h文件的构造函数里的public和private之间添加:

private slots:void on_ConnectButton_clicked();void on_UpButton_pressed();void on_UpButton_released();void on_BreakButton_clicked();void on_DownButton_pressed();void on_DownButton_released();void on_LeftButton_pressed();void on_LeftButton_released();void on_RightButton_pressed();void on_RightButton_released();

(8).进入mainwindow.cpp并将下面代码复制进去(注意修改下面的IP,每个人都不同):

#include "mainwindow.h"
#include "ui_mainwindow.h"
#include "iostream"
#include "string"
#include "winsock2.h"
#include <QApplication>
using namespace std;
MainWindow::MainWindow(QWidget *parent): QMainWindow(parent), ui(new Ui::MainWindow)
{ui->setupUi(this);socket = new QTcpSocket();QObject::connect(socket,&QTcpSocket::readyRead,this,&MainWindow::on_ConnectButton_clicked);
}MainWindow::~MainWindow()
{delete ui;
}void MainWindow::on_ConnectButton_clicked()
{socket->abort();socket->connectToHost("192.168.3.30",1234); //这里修改为你树莓派的IP,端口是服务端里设置的if(!socket->waitForConnected(30000))ui->label->setText("连接失败,请重试!");elseui->label->setText("连接成功!");
}void MainWindow::on_UpButton_pressed()
{socket->write("UPUP");
}void MainWindow::on_UpButton_released()
{socket->write("STOP");
}void MainWindow::on_BreakButton_clicked()
{socket->write("QUIT");ui->label->setText("未连接!");
}void MainWindow::on_DownButton_pressed()
{socket->write("DOWN");
}void MainWindow::on_DownButton_released()
{socket->write("STOP");
}void MainWindow::on_LeftButton_pressed()
{socket->write("LEFT");
}void MainWindow::on_LeftButton_released()
{socket->write("STOP");
}void MainWindow::on_RightButton_pressed()
{socket->write("RIGHT");
}void MainWindow::on_RightButton_released()
{socket->write("STOP");
}

3.开始连接
先在Qt Creator中点击运行,然后在树莓派终端/home/pi/car路径下先输入:

g++ CarServer.cpp
./a.out

运行CarServer.cpp,此时点击连接按钮,终端显示连接成功。

此时点击"↑",服务端会显示信息说明通信成功。
出现"stop.py:RuntimeWarning:This channel is already in use, continuing anyway. Use GPIO.setwarnings(False) to disable warning.”忽视即可。

至此小车就可以通过windows遥控了!

Bili视频教程:https://www.bilibili.com/video/BV1Di4y1E7dr/
如果过程中有问题欢迎私信我!记得关注喔!

[树莓派] 轻松制作一个遥控小车(C++,Socket)相关推荐

  1. android控制手机强制手机横竖方向,使用android IOIO和安卓手机制作视频遥控小车(控制灯的开关、实时视频传输、方向控制)...

    android IOIO是通过安卓手机的USB接口控制的电路板,通过android IOIO可以不需要太多的硬件知识,通过安卓手机转接的IOIO板控制外围设备,配件有纸盒.L298N电机驱动模块.旧手 ...

  2. 使用树莓派摄像头做一个监控小车

    最近在网络上看到一句话,让我感触颇深: "你看那些,牵着手说着笑,通往厕所的身影,看那一堆人抱怨着,畅想着.看几个人大笑着吃着泡面的场景,你看,那是我们回不去的青春." 游戏手柄, ...

  3. STC+Andriod+ESP8266制作手机遥控小车

    硬件配置 主控芯片:STC12C5A32S2 1个 晶振:11.0592MHz 1个: 电容:30pf 2个 电机控制:L298N 1个~2个 wifi芯片:ESP8266 1个 电动小车模型(4个轮 ...

  4. 用Python轻松制作一个股票K线图网站

    在前面的文章中,我们学习了如何使用 Tkinter 构建股票数据抓取以及展示K线图功能,虽然大致的功能已经具备,但是在当今这个人手一个 Web 服务的年代,GUI 程序还是没有 Web 服务来的香啊. ...

  5. 使用树莓派3B+ 制作一个属于自己的无线AP 无线路由器 一个Wi-Fi热点

    前提条件: 硬件准备: 1.树莓派3(选择因为它有一个以太网端口和一个内置的Wi-Fi连接). 2.树莓派的电源. 3.一张至少8GB的MicroSD卡. 4. 一条RJ45网线 软件: 5. Ras ...

  6. PywebIO 轻松制作一个数据大屏,代码只需100行

    今天我给大家分享一个制作数据大屏的工具,非常的好用,100行的Python代码就可以制作出来一个完整的数据大屏,并且代码的逻辑非常容易理解. PywebIO介绍 Python当中的PywebIO模块可 ...

  7. 毕业设计 树莓派视觉远程监控遥控小车设计与实现 - 嵌入式 物联网

    文章目录 0 前言 1 简介 2 实现效果 3 树莓派视觉环境搭建 3.1 树莓派安装系统 3.2 设置静态网络 3.3 更换镜像源 3.4 安装中文输入法 3.5 电脑控制树莓派 3.6 OpenC ...

  8. 蓝牙遥控小车2.0版发布啦

    蓝牙遥控小车2.0版发布啦! 蓝牙模块的主从机模式 1.主从机模式 2.设置主从机模式 蓝牙遥控器 1.硬件接线 2.程序设计 蓝牙小车 1.硬件接线 2.程序设计 今天要跟大家分享的是两个蓝牙模块之 ...

  9. 基于STM32 Cortex-M3内核F103制作的智能小车项目

    目录 一.简单介绍: 二.硬件支持: 三.软件部分介绍: 四.整体调试: 五.学习总结: 一.简单介绍: 花上一周的时间制作一个智能小车玩玩吧,一直想要制作一辆自己的智能小车,看多了网上的各种小车,有 ...

最新文章

  1. Unity2D游戏开发和C#编程大师班
  2. Office 365离线安装
  3. 微信电脑网页二维码扫描登录简单实现
  4. 2.9 情感分类-深度学习第五课《序列模型》-Stanford吴恩达教授
  5. 手把手教你用jQuery实现手动自动轮播
  6. netstat 详解
  7. 解读ASP.NET 5 MVC6系列(9):日志框架
  8. Node连接MySQL数据库进行基本的增删改查操作(一看就会)
  9. 详解:hiveserver2的使用与介绍
  10. 01 Nginx的高并发处理
  11. JavaScript编程风格 (share)
  12. cmd 打开资源监视器
  13. Latex论文下载学习教程
  14. CSS 常见布局 水平垂直居中对齐
  15. linux7.4邮件服务器,CentOS7 基于Postfix Dovecot Extmail 搭建邮件服务器
  16. wow插件实现优雅的动画页面
  17. 网络安全从零开始(基础知识)
  18. Unity-动画机学习
  19. 如何在Kindle上阅读漫画书和漫画
  20. 如何查看电脑端口占用

热门文章

  1. 【蜂口 | AI人工智能】三维人脸重建——龙鹏 深度学习与人脸图像应用连载(十)...
  2. 网站开发进阶(七十):CSS 实现圆角有立体感的 DIV 边框
  3. easyui datagrid合并列中相同的单元格
  4. Centos 安装FTP配置目录权限,iptables设置ftp服务
  5. 《MINECRAFT我的世界 新手完全攻略(第3版)》一2.2 去找树
  6. java编程:放苹果
  7. 运动耳机排行榜10强,运动人士必备的几款运动耳机分享
  8. lambda表达式的3种写法
  9. 关于length specifier
  10. 二手家具回收app功能