raspberry pi 机器人

从小对机器人非常感兴趣,正好身边有一个raspberry pi,平时就当Linux的服务器练练命令行,写写脚本。这次打算把raspberry pi的强大的GPIO都利用起来,做个小机器人。

首先从网上买了机器人相关的配件,主要是驱动机器人移动的电机、L298N电机驱动板、HC-SR04超声波距离探测传感器、机器人车身等配件。用来制作机器人的是raspberry pi B+。此型号一共有40个GPIO口,足以满足入门型机器人的制作要求。

以下是我连接L298N电机驱动板和HC-SR04距离传感器的GPIO针脚示意图。


3V3


5V


uVcc


SDA1


5V


SCL1


GND


GP4


TXD0


GND


RXD0


N3


GP17


GP18


uEcho


N2


GP27


GND


uGND


N1


GP22


GP23


N4


3V3


GP24


uTrig


MOSI


GND


MISO


GP25


SCLK


CE0


GND


CE1


EED


EEC


GP5


GND


GP6


GP12


GP13


GND


GP19


GP16


GP26


GP20


ENB


GND


GP21


ENA

raspberry pi驱动电机的主要原理是,通过在电机两极上施加电压使之转动,利用两个针脚之间的高低电平差决定转动方向。

首先为了驱动电机,写了一个关于motor的类文件。

[email protected] ~/robot/class $ cat motor.py
#!/usr/bin/python
import RPi.GPIO as GPIO
from time import sleep
import sys
import os,tty,termios,time

time_sleep = 1
class motor:
    RIGHT = 15
    LEFT = 16
    RIGHTB = 13
    LEFTB = 11
    RIGHTPWM = 40
    LEFTPWM = 38

    def __init__(self):
        GPIO.setmode(GPIO.BOARD)
        GPIO.setwarnings(False)

        GPIO.setup(self.RIGHTPWM, GPIO.OUT)
        self.rightpwm = GPIO.PWM(self.RIGHTPWM, 500)
        self.rightpwm.start(0)
        GPIO.setup(self.RIGHT, GPIO.OUT)
        GPIO.setup(self.RIGHTB, GPIO.OUT)
        GPIO.setup(self.LEFTPWM, GPIO.OUT)
        self.leftpwm = GPIO.PWM(self.LEFTPWM,500) 
        self.leftpwm.start(0)
        GPIO.setup(self.LEFT, GPIO.OUT)
        GPIO.setup(self.LEFTB, GPIO.OUT)
        
    def motor(self,leftspeed,left,rightspeed,right): # initiate speed
        self.rightpwm.ChangeDutyCycle(leftspeed*100) # leftspeed 0 to 1
        GPIO.output(self.RIGHTPWM, right)            # right True or False
        self.leftpwm.ChangeDutyCycle(rightspeed*100) # rightspeed 0 to 1
        GPIO.output(self.LEFTPWM, left)              # left True or False
   
    
    def forward(self,lspeed,rspeed, second):
        GPIO.output(self.LEFTB, False)
        GPIO.output(self.LEFT, True)
        GPIO.output(self.RIGHT, True)
        GPIO.output(self.RIGHTB, False)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()
    def stop(self):
        self.motor(0,0,0,0)

    def reverse(self, lspeed,rspeed, second):
        GPIO.output(self.LEFTB, True)
        GPIO.output(self.LEFT, False)
        GPIO.output(self.RIGHT, False)
        GPIO.output(self.RIGHTB, True)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()

    def right(self, lspeed, rspeed, second):
        GPIO.output(self.LEFTB, True)
        GPIO.output(self.LEFT, True)
        GPIO.output(self.RIGHT,True)
        GPIO.output(self.RIGHTB, False)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()

    def left(self, lspeed, rspeed, second):
        GPIO.output(self.LEFTB, False)
        GPIO.output(self.LEFT, True)
        GPIO.output(self.RIGHT,True)
        GPIO.output(self.RIGHTB, True)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()

    def pivot_right(self, lspeed, rspeed, second):
        GPIO.output(self.LEFTB, True)
        GPIO.output(self.LEFT, False)
        GPIO.output(self.RIGHT,True)
        GPIO.output(self.RIGHTB, False)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()

    def pivot_left(self, lspeed, rspeed, second):
        GPIO.output(self.LEFTB, False)
        GPIO.output(self.LEFT, True)
        GPIO.output(self.RIGHT,False)
        GPIO.output(self.RIGHTB, True)
        self.motor(lspeed,0,rspeed,0)
        if second > 0:
            time.sleep(second)
            self.stop()

然后编写通过控制端电脑键盘控制机器人的程序,此程序调用motor.py这个驱动脚本

#!/usr/bin/python

import motor
import time
import sys
import os,tty,termios,time

time_sleep = 0.070
lspeed = 1 
rspeed = 1
m = motor.motor()

def getch():
    fd = sys.stdin.fileno()
    old_settings = termios.tcgetattr(fd)
    try:
        tty.setraw(sys.stdin.fileno())
        ch = sys.stdin.read(1)
    finally:
        termios.tcsetattr(fd, termios.TCSADRAIN, old_settings)
    return ch

while True:
    char = getch()
    
    if(char == ‘w‘):
        m.forward(lspeed,rspeed,time_sleep)
    if(char == ‘s‘):
        m.reverse(lspeed,rspeed,time_sleep)
    if(char == ‘a‘):
        m.left(lspeed,rspeed,time_sleep)
    if(char == ‘d‘):
        m.right(lspeed,rspeed,time_sleep)
    if(char == ‘q‘):
        m.pivot_left(lspeed,rspeed,time_sleep)
    if(char == ‘e‘):
        m.pivot_right(lspeed,rspeed,time_sleep)
    if(char == ‘c‘):
        os.system(‘/home/pi/camera/startstream.sh‘)
    if(char == ‘x‘):
        os.system(‘/home/pi/camera/stopstream.sh‘)
    if(char == ‘n‘):
        os.system(‘/home/pi/robot/class/autodrive.sh‘)
    if(char == ‘f‘):
        print("Program Ended")
        break

此后我可以通过wifi网络用电脑远程控制机器人了。

时间: 2024-10-29 19:10:20

raspberry pi 机器人的相关文章

Raspberry PI 3B + Debian 9 aarch64 + ROS lunar

从使用Rspberry Pi之后,了解有ROS这么一个开源的机器人操作系统. 最早使用Raspberry Pi 2B +raspbian Jessie 成功用源码安装成功过ROS Indigo,而后换了RaspberryPi3以后,再次尝试就怎么也不成功. 后来闲来无事,找了找移植raspberryPi 3B debian 9 arm64的方法,成功运行起64位的系统. 由于是debian 9(stretch),ROS的支持只有 lunar,所以就使用apt-get的方式进行安装了. 详细步骤在

VNC connect to raspberry pi under ubuntu desktop environment

1 使用Remmina Remote Desktop ubuntu 14.04自带一款远程桌面叫作 Remmina Remote Desktop 利用它即可方便打开已经开启VNC server的raspberry pi 如图,已经新建好了一个raspberry的链接. 新建服务链接 填写链接name 选择链接所使用protocol,注意要选VNC 填写server的地址 填写登录user name以及password 如图: 2 使用SSL/SSH VNC Viewer 下载vnc viewer

Adding an On/Off switch to your Raspberry Pi

http://www.raspberry-pi-geek.com/Archive/2013/01/Adding-an-On-Off-switch-to-your-Raspberry-Pi#article_f5 Which Switch? Aaron Shaw Pulling the plug on your Pi without an orderly shutdown can corrupt the SD card. Also, many users prefer a convenient sw

Raspberry pi,一个好玩的派:第五季 无线网卡

Raspberry pi的板子由于成本原因是没有加无线模块的,不想被网线束缚的我们,需要自备USB无线模块.在购买板子时,看见官方推荐EDUP无线网卡,价格还算合适,就直接入手了. 采用REALTEK8188芯片,802.11n,传输速度150Mbps,适用范围130平方米. 将其插到任一U口即可,如下图: 由于外壳阻碍了电源插孔,所以只好先裸着了,图中已经加电,HDMI的另一头是电视机. 接下来的任务就是如何让这个无线网卡工作,连接到我已经开启的无线路由器. 一.wpa_gui 在进入Rasp

Raspberry pi,一个好玩的派:第一季 开源硬件

开源之风从软件吹到了硬件,三个比较有代表性的是Raspberry Pi(树梅派).Arduino(阿尔杜伊诺,好吧,原谅我的发音)和BeagleBone Black.所谓的开源精神,有人总结为四种维度: 第一,人人可用:第二,人人可探:第三,人人可改:第四,人人可再发布. 说白了,就是我们可以窥探这些硬件是设计的细节,比如如何走线.排板啦,或更厉害的,使用芯片的技术细节我们也可以知道.这增加了我们再次开放的可能性,使可玩性更高.喜欢折腾的硬件黑客\GEEK把这些板子变成最好玩的玩具,在折腾的过程

Raspberry Pi 3 with Openwrt

https://wiki.openwrt.org/toh/raspberry_pi_foundation/raspberry_pi#boot_log_raspberry_pi_3 Table of Contents Supported Versions Hardware Specifications Raspberry Pi SoCs Raspberry Pi Models Using I2C and SPI Power Notes Serial Boot Logs Boot Log (Rasp

Raspberry Pi(树莓派)国内软件源

树莓派自带的软件源是 1 deb http://mirrordirector.raspbian.org/raspbian/ wheezy main contrib non-free rpi 由于网站在国外,导致下载速度非常慢,因此需要修改为国内镜像站点即可. Raspberry Pi(树莓派)国内软件源: 修改配置文件 1 [email protected] ~ $ vi /etc/apt/sources.list 2 3 deb http://mirrors.neusoft.edu.cn/ra

树莓派(Raspberry Pi)-浙大(ZJU)VPN连接

本文参考链接:http://blog.sina.com.cn/s/blog_7362afc40101ae5q.html 连接上树莓派后,系统自动默认进入的是命令行模式,默认的用户名为:pi,密码:raspberry. 可以在刚刚启动的界面中进行修改为图形界面模式,然后sudo reboot后就进入可桌面模式. 由于树莓派默认的为UK标准的键盘,会发现和外接键盘不匹配,可以将其修改成US的键盘. 参考:http://bbs.ickey.cn/group-topic-id-3720.html 关于树

树莓派(Raspberry Pi)上手小记

引言 本日志中有不少软广告,博主并没有收他们任何好处,完全是给想入手的小伙伴们指条路而已.不喜勿看,不喜勿闻,不喜勿喷. 介绍 之前两三个月突然听说了这么个东西,也没有留意,某天突然在一个微信公众号上看到说有个“5美元的树莓派”,于是好奇的百度了一下,之后便震惊了:这货特么居然是个计算机! 以下介绍来自百度百科: “树莓派由注册于英国的慈善组织“Raspberry Pi 基金会”开发,Eben·Upton/埃·厄普顿为项目带头人.2012年3月,英国剑桥大学埃本·阿普顿(Eben Epton)正