本实验使用Arduino+树莓派进行简单的手势识别,实现对小车状态的控制
材料准备:
- Arduino开发板一块
- 树莓派3B
- 杜邦线若干
- L298N
- 小车底盘
- HC-05蓝牙模块
- MMA7361传感器
实现原理:
树莓派通过蓝牙串口与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)
注意事项:
- 某宝购买的L298N的ENA、ENB都需要置高电平,GND与树莓派GND连接否则直流电机无法工作,L298N可以使用4节1.5V电池组供电。
- 树莓派每次重启后都要重新配置rfcomm0文件
演示视屏
基本实现了功能,三等咸鱼,在线摸鱼,欢迎评论交流,如在茫茫人海中对您有所帮助,记得点赞呦,谢谢!
网友评论