玩转树莓派树莓派arduino

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

2019-05-27  本文已影响110人  呆呆的院长

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

材料准备:

实现原理:

树莓派通过蓝牙串口与Arduino连接(实验室没有多余的蓝牙模块,零时想到用树莓派上的蓝牙代替下,使用树莓派作为主控控制小车有点大材小用哈哈),工作时Arduino作为发送端通过蓝牙传感器将佩戴在手上的加速度传感器的x,y轴变化量传输到树莓派上,树莓派作为接收端根据x,y轴变化量驱动L298N,实现对小车的状态控制。

连线:

Arduino+HC-05+加速度传感器 树莓派+L298N+直流电机.jpg

树莓派蓝牙配置(图形化界面下)

每次重启树莓派我们都需要进行配置,在树莓派上生成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文件,


图1.png

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)

注意事项:

演示视屏

基本实现了功能,三等咸鱼,在线摸鱼,欢迎评论交流,如在茫茫人海中对您有所帮助,记得点赞呦,谢谢!

上一篇 下一篇

猜你喜欢

热点阅读