基于树莓派实现PC对机械臂的网络控制/基于手机蓝牙来实现对机械臂进行网络控制
本课题来源于陈安老师的嵌入式的实践课程,机械臂共有6个自由度,可以转动一定的角度,相互配合可以让机械臂做出不同的动作。本课题共实现了两种无线控制方案,一种是基于蓝牙实现手机无线控制六轴机械臂,手机端安装spp蓝牙助手,发送对应字符即可控制机械臂运动。一种是基于树莓派实现PC端远程控制机械臂动作,树莓派和电脑采用socket通信,手机开启热点,树莓派,笔记本电脑都连上手机的热点。运行服务端和客户端程序,只要在PC端输入相应的数字指令,机械臂就可以转动做出相应的动作。
基于树莓派实现PC端远程控制机械臂动作
树莓派与PC网络通信
服务端
from socket import* #服务端程序
from time import ctime
import serial
import time
ser = serial.Serial("/dev/ttyACM0",9600) #串口初始化
ser.flushInput()
ser.flushOutput()
HOST = "
PORT = 6666 #端口号
BUFSIZE = 1024
ADDR=(HOST,PORT)
tcpSrvSock = socket(AF_INET,SOCK_STREAM) #ip地址 + 端口号
tcpSrvSock.bind(ADDR) #赋给socket特定地址,绑定地址
#addr:一个const struct sockaddr*指针,指向要绑定给socket的协议地址
tcpSrvSock.listen(5) #监听此socket
while True: #建立服务端与客户端连接
print 'waiting for connection...'
tcpCliSock,addr = tcpSrvSock.accept() #接受请求
print 'connected from:',addr
while True:
data = tcpCliSock.recv(BUFSIZE) # 接受字符命令
if not data:
break
#tcpCliSock.send('[%]%s'%(ctime(),data))
print [ctime()],':',data
if data = = 'q': #退出命令
print "funExit()"
break
ser.write(data) # 将指令通过串口发送到arduino
tcpCliSock.close()
tcpSrvSock.close() #关闭通信
客户端
from socket import*
HOST = '192.168.43.90'
PORT = 6666
BUFSIZE = 1024
ADDR = (HOST,PORT)
tcpCliSock=socket(AF_INET,SOCK_STREAM)
tcpCliSock.connect(ADDR)
while True:
print "socket client start!"
data = raw_input('>')
if not data:
break;
tcpCliSock.send(data) #发送数据
#data=tcpCliSock.recv(BUFSIZE)
#if not data:
#break
print data
tcpCliSock.close()
基于蓝牙实现手机无线控制六轴机械臂
Arduino 控制程序
#include<Servo.h>
Servo myservo3;
Servo myservo5;
Servo myservo6;
Servo myservo9;
Servo myservo10;
Servo myservo11;
void serialtest() //串口检测,蓝牙是否发送数据
{
if(Serial.available()) // 如果串口接受到数据,则Serial.available()返回1
{
char a = Serial.read(); //读取串口第一个字节的字符,之后第一个字节清空
Serial.print(a);
int t = 15 ;
if(a=='7'&&t<50) // 减速
{
t+=5;
}
if(a=='8'&&t>0)
{
t-=5;
}
if(a=='1') //如果收到字符1
{
int pos;
for(pos=30;pos<=150;pos+=1)
{
myservo9.write(pos);
delay(t);
}
for(pos=150;pos>=30;pos-=1)
{
myservo9.write(pos);
delay(t);
}
}
if(a='2')//如果收到字符2
{
int pos;
for(pos =30;pos<=150;pos+=1)
{
myservo3.write(pos);
delay(t);
}
for(pos=150;pos>=30;pos-=1)
{
myservo3.write(pos);
delay(t);
}
}
if(a=='3')
{
int pos;
for(pos=10;pos<=170;pos+=1)
{
myservo10.write(pos);
myservo11.write(pos);
delay(t);
}
for(pos=170;pos>=10;pos-=1)
{
myservo10.write(pos);
myservo11.write(pos);
delay(t);
}
}
if(a=='4')
{
int pos;
for(pos = 60;pos<=120;pos+=1)
{
myservo5.write(pos);
delay(t);
}
for(pos=120;pos>=60;pos-=1)
{
myservo5.write(pos);
delay(t);
}
}
if(a=='5')
{
myservo5.write(90);
myservo6.write(90);
int pos;
for(pos=20;pos<=150;pos+=1)
{
myservo3.write(pos);
myservo9.write(pos);
myservo10.write(pos);
myservo11.write(pos);
delay(t);
}
}
if(a=='6')
{
int pos;
for(pos=60;pos<=120;pos+=1)
{
myservo6.write(pos);
delay(t);
}
for(pos=120;pos>=60;pos-=1)
{
myservo6.write(pos);
}
}
if(a=='9')
{
delay(5000);
}
}
}
void setup(){
myservo3.attach(3);
myservo3.attach(5);
myservo3.attach(6);
myservo3.attach(9);
myservo3.attach(10);
myservo3.attach(11);
Serial.begin(9600);
}
void loop(){
serialtest();
}