2019-09-21 | UNLOCK

嵌入式机器人(用方向键和空格控制小车5个动作)

如何用键盘的方向键(上下左右)和空格,控制小车的前进、后退、左转、右转和停止呢?

这里借鉴了我所参考的资料、项目2-4和项目3-3所做成。在这之前先把项目2-4的代码烧入到Arduino上。

项目2-4

C\C++ Arduino

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
#define Left1   6		//左前轮由Arduino的数字口D6控制
#define Left2 7 //左后前轮由Arduino的数字口D7控制
#define Right1 9 //右前轮由Arduino的数字口D9控制
#define Right2 8 //右后轮由Arduino的数字口D8控制
#define Left_PWM 5 //左轮速度由Arduino的脉宽调制输出引脚D5控制
#define Right_PWM 10 //右轮速度由Arduino的脉宽调制输出引脚D10控制

void setup() //Arduino的初始化
{
pinMode(Left1,OUTPUT); //设置Arduino控制电机的6个引脚均为输出模式
pinMode(Left2,OUTPUT);
pinMode(Right1,OUTPUT);
pinMode(Right2,OUTPUT);
pinMode(Left_PWM,OUTPUT);
pinMode(Right_PWM,OUTPUT);
Serial.begin(9600); //Arduino串口初始化,并设置波特率9600
}
void Forward(int Speed) //小车前进子函数 Speed范围0到255
{
digitalWrite(Left1, HIGH);
digitalWrite(Left2, LOW);
digitalWrite(Right1, HIGH);
digitalWrite(Right2, LOW);
analogWrite(Left_PWM, Speed);
analogWrite(Right_PWM, Speed);
}
void Backward(int Speed) //小车后退子函数 Speed范围0到255
{
digitalWrite(Left1, LOW);
digitalWrite(Left2, HIGH);
digitalWrite(Right1, LOW);
digitalWrite(Right2, HIGH);
analogWrite(Left_PWM, Speed);
analogWrite(Right_PWM, Speed);
}
void Turn_Left(int Speed) //小车左转子函数 Speed 50到255 通过两侧车轮速度差转向
{
digitalWrite(Left1, HIGH);
digitalWrite(Left2, LOW);
digitalWrite(Right1, HIGH);
digitalWrite(Right2, LOW);
analogWrite(Left_PWM, 50);
analogWrite(Right_PWM, Speed);
}
void Turn_Right(int Speed) //小车右转子函数 Speed 50到255 通过两侧车轮速度差转向
{
digitalWrite(Left1, HIGH);
digitalWrite(Left2, LOW);
digitalWrite(Right1, HIGH);
digitalWrite(Right2, LOW);
analogWrite(Left_PWM, Speed);
analogWrite(Right_PWM, 50);
}
void Stop() //小车停止函数
{ analogWrite(Left_PWM, 0);
analogWrite(Right_PWM, 0);
}
void loop()
{
int Receive_dat;
if (Serial.available() > 0) //判断串口接收缓存是否有数据
{
Receive_dat = Serial.read(); //从串口读一个字节数据
switch (Receive_dat) //判断接收到的数据并作出相应动作
{
case 'w': //前进指令
Forward(255);
break;
case 'a': //左转指令
Turn_Left(255);
break;
case 's': //后退指令
Backward(255);
break;
case 'd': //右转指令
Turn_Right(255);
break;
default:
Stop(); //停止指令
break;
}
}
}

本次所需要用到的程序(树莓派)

python python2

1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
import serial
import keyboard #监听键盘

ser = serial.Serial('/dev/ttyUSB0',9600,timeout=1) #初始化串口

def Forward():
ser.write('w')
print("前进")

def TurnLeft():
ser.write('a')
print("左转")

def TurnRight():
ser.write('d')
print("右转")

def Backward():
ser.write('s')
print("后退")

def Stop():
ser.write('t')
print("停止")



if __name__ == '__main__':
keyboard.add_hotkey('up', Forward) #这个函数就是监听键盘,如果按下 “上”方向键,就执行前进函数。下面同理
keyboard.add_hotkey('down', Backward)
keyboard.add_hotkey('left', TurnLeft)
keyboard.add_hotkey('right', TurnRight)
keyboard.add_hotkey('space', Stop)
keyboard.wait() #一直等待键盘输入 这里可以根据我上面参考的资料做一个esc键 退出并终止程序

因为项目还没有在实际的小车上做实验,但是通过python控制台做相对应的操作,都能执行相对应结果。所以理论上绝对是可以做的。这里在实际的小车上可能会遇到的问题,keyboard这个库在小车上的linux系统上没有这个库,而且小车暂时无法连上网去安装这个库,但可以用u盘离线去安装这个库。献上方法离线安装第三方包。这个包可以在我的网盘上下载罗泽涛的网盘,选第一个文件夹【Robot】然后输入密码3,选择【源代码】里的“keyboard-master.zip”然后安装上面的方法去安装keyboard这个第三方库。

学以致用,完结,Thanks♪(・ω・)ノ