zoukankan      html  css  js  c++  java
  • 基于树莓派实现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();

    }

  • 相关阅读:
    Java并发编程:volatile关键字解析
    多线程之指令重排序
    《paste命令》-linux命令五分钟系列之二十
    《cut命令》-linux命令五分钟系列之十九
    《ln命令》-linux命令五分钟系列之十八
    Clone Graph
    House Robber
    《wc》-linux命令五分钟系列之十七
    who am i
    《man男人》-linux命令五分钟系列之十五
  • 原文地址:https://www.cnblogs.com/123talents/p/7575730.html
Copyright © 2011-2022 走看看