树莓派+Arduino 实现简易的手势识别智能小车

本实验使用Arduino+树莓派进行简单的手势识别,实现对小车状态的控制

材料准备:

  • Arduino开发板一块
  • 树莓派3B
  • 杜邦线若干
  • L298N
  • 小车底盘
  • HC-05蓝牙模块
  • MMA7361传感器
    ###实现原理:
    树莓派通过蓝牙串口与Arduino连接(实验室没有多余的蓝牙模块,零时想到用树莓派上的蓝牙代替下,使用树莓派作为主控控制小车有点大材小用哈哈),工作时Arduino作为发送端通过蓝牙传感器将佩戴在手上的加速度传感器的x,y轴变化量传输到树莓派上,树莓派作为接收端根据x,y轴变化量驱动L298N,实现对小车的状态控制。
    ###连线:

树莓派+Arduino 实现简易的手势识别智能小车_第1张图片

树莓派+Arduino 实现简易的手势识别智能小车_第2张图片

树莓派蓝牙配置(图形化界面下)
每次重启树莓派我们都需要进行配置,在树莓派上生成HC-05模块的配置文件rfcomm0
1.点击树莓派桌面上方蓝牙标志,连接HC-05(密码默认:1234)
2.在树莓派终端
依次输入:

bluetoothctl //进入蓝牙控制查看HC-05物理地址
exit          //退出蓝牙控制
sudo rfcomm bind0 B8:XX:XX:XX //B8:XX:XX:XX为刚刚查看的HC-05的物理地址

运行结果如下图,则在/etc中成功生成配置rfcomm0文件,
树莓派+Arduino 实现简易的手势识别智能小车_第3张图片

Arduino端代码(发送端):

Arduino端:
int X = A1;
int Y = A0;
void setup() {
  Serial.begin(9600);
  pinMode(X,INPUT);
  pinMode(Y,INPUT);
  // put your setup code here, to run once:

}

void loop() {
  
 /* Serial.print("X:");
  Serial.println(analogRead(X));
  Serial.print("Y:");
  Serial.println(analogRead(Y));*/
  if(analogRead(Y)>700){
    Serial.write('b');
  }
   if(analogRead(Y)<400){
    Serial.write('g');
  }
  if(analogRead(X)<400){
    Serial.write('l');
  }
   if(analogRead(X)>600){
    Serial.write('r');
  }
  delay(800);
  // put your main code here, to run repeatedly:
}

####树莓派端代码(接收端):

#coding=utf-8
import RPi.GPIO as GPIO
import time
import serial
from time import sleep
GPIO.setmode(GPIO.BOARD) //按照树莓派物理引脚
IN1 = 11
IN2 = 12
IN3 = 13
IN4 = 15
ENA = 16
ENB = 18
port = '/dev/rfcomm0'
ser = serial.Serial(port,9600)
ser.flushInput()
def init():
    GPIO.setup(IN1, GPIO.OUT)
    GPIO.setup(IN2, GPIO.OUT)
    GPIO.setup(IN3, GPIO.OUT)
    GPIO.setup(IN4, GPIO.OUT)
    GPIO.setup(ENB, GPIO.OUT)
    GPIO.setup(ENA, GPIO.OUT)
def up():
    GPIO.output(IN1, GPIO.HIGH)
    GPIO.output(IN2, GPIO.HIGH)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)
def down():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.HIGH)
    GPIO.output(IN4, GPIO.HIGH)
def turn_left():
    GPIO.output(IN1, GPIO.HIGH)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)
def turn_right():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.HIGH)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)
def breaking():
    GPIO.output(IN1, GPIO.LOW)
    GPIO.output(IN2, GPIO.LOW)
    GPIO.output(IN3, GPIO.LOW)
    GPIO.output(IN4, GPIO.LOW)

while(1):
    init()
    GPIO.output(ENA, GPIO.HIGH)
    GPIO.output(ENB, GPIO.HIGH)
    n = ser.inWaiting()
    breaking()
    if(n):
        v=ser.read(n)
        if(v=="g"):
            print("aa")
            up()
        if(v=="b"):
            down()
        if(v=="l"):
            turn_left()
        if(v=="r"):
            turn_right()

    sleep(.8)

注意事项:

  • 某宝购买的L298N的ENA、ENB都需要置高电平,GND与树莓派GND连接否则直流电机无法工作,L298N可以使用4节1.5V电池组供电。
  • 树莓派每次重启后都要重新配置rfcomm0文件
    演示视屏
    基本实现了功能,三等咸鱼,在线摸鱼,欢迎评论交流,如在茫茫人海中对您有所帮助,记得点赞呦,谢谢!

你可能感兴趣的:(树莓派)