基于树莓派实现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();

}

原文地址:https://www.cnblogs.com/123talents/p/7575730.html