发 帖  
原厂入驻New

[经验] (一天速成)APP控制树莓派的室内机器人

5 天前  489 树莓派 机器人
分享
2
本人在校生兼职攻城狮,这段时间疫情在家真是憋到慌。每天也就刷刷网课,完成一下作业,再东搞搞西搞搞,没找到那种实验室日夜兼程的感觉,浑身不自在。
所以给自己整点事情玩玩,正巧以前申请的大创项目要结项了,所以买点材料来搞搞,顺便消遣一下时间,顺便检验一下自己“调库”的能力有没有退化了。
历时:一个晚上+一个早上
材料:某宝购买的树莓派+亚克力地盘+电源舵机控制板+摄像头+超声波+DHT11
目标:制作APP端可以控制树莓派小车运动和摄像头的运动,显示视频监控和温湿度超声波测的数据
最终效果视频:
树莓派的室内机器人.zip (6.13 MB, 下载次数: 6)

record如下:

1.收到零件后已经是下午了,吃个晚饭,然后开始琢磨一下这个车。买来都是散件花了一个多小时才装出来个样子。(已经是老司机了,轻车熟路嘿嘿嘿)


小车侧面图.png


2.刷树莓派系统:还是老配方啦

首先安装官方纯净版系统

然后配置摄像头能用

然后安装mpeg_stream+局域网优化

安装一下这个机器人常用的python库,这里主要用到Adafruit_PWM_Servo_Driver库,RPi.GPIO,Adafruit_DHT

上面步骤自行百度安装教程啦,都是老生常谈了。

树莓派系统.png

(额,,,照片歪了,算了不调了麻烦)


3.装完刚刚那些配置环境后,运行MPEG_stream测试一下摄像头能用不。

主要指令如下:

  1. cd mjpg-streamer/mjpg-streamer-experimental
复制代码
  1. sudo ./start.sh
复制代码

4.编写机器人的程序

由于我需要用APP来控制机器人,所以需要用到机器人与个人设备的通信

通信我用TCP/IP协议,主要是基于python的socket类编程。socket是个好东西,通信必备,不懂的建议百度。

然后先基于树莓派环境编写机器人代码,代码主要如下:

  1. #coding:utf-8
  2. from Adafruit_PWM_Servo_Driver import PWM
  3. import  RPi.GPIO as GPIO
  4. import socket
  5. import time
  6. import sys
  7. import Adafruit_DHT

  8. HOST_IP = "10.3.141.1"
  9. HOST_PORT = 888

  10. PWMA = 18
  11. AIN1   =  22
  12. AIN2   =  27

  13. PWMB = 23
  14. BIN1   = 25
  15. BIN2  =  24
  16. TRIG = 20
  17. ECHO = 21
  18. # Set sensor type : Options are DHT11,dht22 or AM2302
  19. sensor=Adafruit_DHT.DHT11
  20. # Set GPIO sensor is connected to
  21. gpio=16

  22. s1=90
  23. ss1=90
  24. pwm = PWM(0x40,debug = False)
  25. servoMin = 150  # Min pulse length out of 4096
  26. servoMax = 600  # Max pulse length out of 4096
  27. def setServoPulse(channel, pulse):
  28.   pulseLength = 1000000.0                   # 1,000,000 us per second
  29.   pulseLength /= 50.0                       # 60 Hz
  30.   pulseLength /= 4096.0                     # 12 bits of resolution
  31.   pulse *= 1000.0
  32.   pulse /= (pulseLength*1.0)
  33.   pwm.setPWM(channel, 0, int(pulse))
  34. #Angle to PWM
  35. def write(servonum,x):
  36.   y=x/90.0+0.5
  37.   y=max(y,0.5)
  38.   y=min(y,2.5)
  39.   setServoPulse(servonum,y)
  40. pwm.setPWMFreq(50)                        # Set frequency to 60 Hz

  41. def t_up(speed,t_time):
  42.         L_Motor.ChangeDutyCycle(speed)
  43.         GPIO.output(AIN2,False)#AIN2
  44.         GPIO.output(AIN1,True) #AIN1

  45.         R_Motor.ChangeDutyCycle(speed)
  46.         GPIO.output(BIN2,False)#BIN2
  47.         GPIO.output(BIN1,True) #BIN1
  48.         time.sleep(t_time)
  49.         
  50. def t_stop(t_time):
  51.         L_Motor.ChangeDutyCycle(0)
  52.         GPIO.output(AIN2,False)#AIN2
  53.         GPIO.output(AIN1,False) #AIN1

  54.         R_Motor.ChangeDutyCycle(0)
  55.         GPIO.output(BIN2,False)#BIN2
  56.         GPIO.output(BIN1,False) #BIN1
  57.         time.sleep(t_time)
  58.         
  59. def t_down(speed,t_time):
  60.         L_Motor.ChangeDutyCycle(speed)
  61.         GPIO.output(AIN2,True)#AIN2
  62.         GPIO.output(AIN1,False) #AIN1

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

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

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

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

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

  83. GPIO.setwarnings(False)
  84. GPIO.setmode(GPIO.BCM)
  85. GPIO.setup(AIN2,GPIO.OUT)
  86. GPIO.setup(AIN1,GPIO.OUT)
  87. GPIO.setup(PWMA,GPIO.OUT)
  88. GPIO.setup(TRIG, GPIO.OUT)
  89. GPIO.setup(ECHO, GPIO.IN)
  90. GPIO.setup(BIN1,GPIO.OUT)
  91. GPIO.setup(BIN2,GPIO.OUT)
  92. GPIO.setup(PWMB,GPIO.OUT)
  93. L_Motor= GPIO.PWM(PWMA,100)
  94. L_Motor.start(0)

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

  97. def distance():
  98.     GPIO.output(TRIG, 0)
  99.     time.sleep(0.000002)

  100.     GPIO.output(TRIG, 1)
  101.     time.sleep(0.00001)
  102.     GPIO.output(TRIG, 0)

  103.     while GPIO.input(ECHO) == 0:
  104.         a = 0
  105.     time1 = time.time()
  106.     while GPIO.input(ECHO) == 1:
  107.         a = 1
  108.     time2 = time.time()
  109.     during = time2 - time1
  110.     return during * 340 / 2 * 100

  111. write(0, 120)
  112. time.sleep(1)
  113. write(1, ss1)
  114. time.sleep(1)
  115. write(2,s1)
  116. time.sleep(1)

  117. '''
  118. while True:
  119.   dis_f = distance()
  120.   print 'Dis:',dis_f, 'cm'
  121.   
  122.   humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
  123.   IF humidity is not None and temperature is not None:
  124.     print 'Temp={0:0.1f}*C  Humidity={1:0.1f}%'.format(temperature, humidity)
  125.   time.sleep(0.5)
  126. GPIO.cleanup()
  127. '''
  128. print("Starting socket: TCP...")
  129. #1.create socket object:socket=socket.socket(family,type)
  130. socket_tcp = socket.socket(socket.AF_INET, socket.SOCK_STREAM)
  131. print("TCP server listen @ %s:%d!" %(HOST_IP, HOST_PORT) )
  132. host_addr = (HOST_IP, HOST_PORT)
  133. #2.bind socket to addr:socket.bind(address)
  134. socket_tcp.bind(host_addr)
  135. #3.listen connection request:socket.listen(backlog)
  136. socket_tcp.listen(1)
  137. #4.waite for client:connection,address=socket.accept()
  138. socket_con, (client_ip, client_port) = socket_tcp.accept()
  139. print("Connection accepted from %s." %client_ip)
  140. socket_con.send("Welcome to RPi TCP server!")

  141. print("Receiving package...")
  142. ###主循环
  143. while True:
  144.    
  145.     try:
  146.         data=socket_con.recv(512)      
  147.         if(data == b'g'):
  148.             dis_f = distance()
  149.             humidity, temperature = Adafruit_DHT.read_retry(sensor, gpio)
  150.             socket_con.send('Dis={0:0.01f}cm Temp={1:0.1f}*C  Humidity={2:0.1f}%'.format(dis_f,temperature, humidity))         
  151.         elif(data == b'w'):
  152.             t_up(15,1)
  153.         elif(data == b's'):
  154.             t_stop(3)
  155.         elif(data == b'x'):
  156.             t_down(15,1)
  157.         elif(data == b'a'):
  158.             t_left(30,1)
  159.         elif(data == b'd'):
  160.             t_right(30,1)
  161.         elif(data == b'y'):
  162.             if s1 <180:
  163.                 s1 = s1 + 10
  164.             write(1, s1)
  165.         elif(data == b'h'):
  166.             if s1>0:
  167.                 s1 = s1 - 10
  168.             write(1, s1)   
  169.         elif(data == b'u'):
  170.             if ss1 <180:
  171.                 ss1 = ss1 + 10
  172.             write(1, ss1)
  173.         elif(data == b'j'):
  174.             if ss1>0 :
  175.                 ss1 = ss1 - 10
  176.             write(1, ss1)     
  177.     except Exception:
  178.             socket_tcp.close()
  179.             sys.exit(1)
复制代码

然后在电脑端用网络调试助手发送指令控制小车。

嘿嘿这里的指令主要有

指令功能
w前进
s停车
x后退
a左转
d右转
y摄像头的舵机向上移动
h摄像头的舵机向下移动
u摄像头的舵机向下移动
j摄像头的舵机向上移动
g更新距离和温湿度数据
然后测试一下


5.接下来是编写APP程序来代替电脑网络调试助手
APP全景图.png

APP是基于易安卓开发的,也是顺风顺水,几十分钟内搞定。
文末我会附上这个APP,不喜欢捣鼓的可以直接用,嘿嘿嘿。

6.尾声:历时一个晚上加一个上午终于捣鼓好了。来跑一下
控制中.png
回顾一下我们的功能:制作APP端可以控制树莓派小车运动和摄像头的运动,显示视频监控和温湿度超声波测的数据。
ok收稿,好久没有这么整过了。
附件:功能视频+APP
距离温湿度信息显示.png

评分

参与人数 1积分 +10 收起 理由
elecfans短短 + 10 您的帖子很精彩,期待您分享的下一个帖子!

查看全部评分

相关经验

QQSD 5 天前
文末提到的APP附件在文前面的展示视频那里里面,太久没发贴了操作失误
回复

举报

很不错的分享哦
回复

举报

呆呆鸟34 前天 19:36
很不错的分享哦
回复

举报

呆呆鸟34 10 小时前
很不错的分享哦
回复

举报

评论

高级模式
您需要登录后才可以回帖 登录 | 注册

声明:本文内容及配图由入驻作者撰写或者入驻合作网站授权转载。文章观点仅代表作者本人,不代表电子发烧友网立场。文章及其配图仅供工程师学习之用,如有内容图片侵权或者其他问题,请联系本站作侵删。 侵权投诉
发经验
关闭

站长推荐 上一条 /7 下一条

快速回复 返回顶部 返回列表