查看: 2348|回复: 2

Arduino 蓝牙机械臂

[复制链接]
  • TA的每日心情
    开心
    2019-2-13 16:03
  • 签到天数: 3 天

    [LV.2]偶尔看看I

    发表于 2019-2-22 20:30 | 显示全部楼层 |阅读模式
                                                      蓝牙机械臂(这次没用BLINKER,改用APP inventer2 广州 制作控制软件)(文饼创新)
             大概是两个月的想法,希望大家看后能在给我一点意见,谢谢啦
    材料
    Arduino uno
    hc-02(便宜,好用)
    几个舵机(用自带servo库。任何digital口都ok的,社区大神说的)


    软件
    arduino ide 加 appinventer2(好玩的,特别是制作蓝牙控制)


    成品图还是文饼以前机械臂的帖子,一臂多套方案。
    话不多说 上代码。
    [mw_shl_code=arduino,true]
    //4自由度机械臂
    #include <SoftwareSerial.h>
    #include <Servo.h>
    Servo servo01; //1号
    Servo servo02; //2号
    Servo servo03; //3号
    Servo servo04; //4号

    SoftwareSerial Bluetooth(10,11); // Arduino(RX, TX) - HC-05 Bluetooth (TX, RX) 串口通信
    int servo1Pos, servo2Pos, servo3Pos, servo4Pos; //  当前位置
    int servo1PPos, servo2PPos, servo3PPos, servo4PPos; // 起初位置
    int servo01SP[50], servo02SP[50], servo03SP[50], servo04SP[50]; //  用来储存数据的数组 数组大小根据实际意义
    int speedDelay = 20;  //伺服电机的速度
    int index = 0;          //数组大小初始化
    String dataIn = "";     //蓝牙的字符串

    void setup() {           
      servo01.attach(5);   //base
      servo02.attach(6);   // 前臂
      servo03.attach(7);   //
      servo04.attach(8);    //hand

      
      Bluetooth.begin(9600); // Default baud rate of the Bluetooth module
      
      // Robot arm initial position
      servo1PPos = 90;  //base 的起初位置
      servo01.write(servo1PPos);
      servo2PPos = 90;  //left 的起初位置
      servo02.write(servo2PPos);
      servo3PPos = 90;  //right 的起初位置
      servo03.write(servo3PPos);
      servo4PPos = 0;    //hand 的起初位置
      servo04.write(servo4PPos);
      
    }
    void loop() {
      // 检查检测是否有数据
      if (Bluetooth.available() > 0) {
        dataIn = Bluetooth.readString();  // 读取蓝牙的数据为字符串
       
       
    if (dataIn.startsWith("base")) //如果检测到的字符串 前面的字符为base
    {
          String dataInS = dataIn.substring(4, dataIn.length()); // Extract only the number. E.g. from "s1120" to "120",如例子 将后面的字符赋值给 datalns
          servo1Pos = dataInS.toInt();  //将后面的文本转换成数据
          // We use for loops so we can control the speed of the servo
          // 当读取的数据比起初的位置大时
          if (servo1PPos > servo1Pos) {
            for ( int j = servo1PPos; j >= servo1Pos; j--) {   // Run servo down
              servo01.write(j);
              delay(50);    // 这里是伺服电机的速度
            }
          }
          //  当读到的数比起初的数据要小时
          if (servo1PPos < servo1Pos) {
            for ( int j = servo1PPos; j <= servo1Pos; j++) {   // Run servo up
              servo01.write(j);
              delay(50);
            }
          }
          servo1PPos = servo1Pos;   //  将变化后 的数据储存变成起初的数据 作为后一个数据的前一个数据
        }
       
        // Move Servo 2
        if (dataIn.startsWith("left")) {
          String dataInS = dataIn.substring(4, dataIn.length());
          servo2Pos = dataInS.toInt();
          if (servo2PPos > servo2Pos) {
            for ( int j = servo2PPos; j >= servo2Pos; j--) {
              servo02.write(j);
              delay(50);
            }
          }
          if (servo2PPos < servo2Pos) {
            for ( int j = servo2PPos; j <= servo2Pos; j++) {
              servo02.write(j);
              delay(50);
            }
          }
          servo2PPos = servo2Pos;
        }
        // Move Servo 3
        if (dataIn.startsWith("right")) {
          String dataInS = dataIn.substring(5, dataIn.length());
          servo3Pos = dataInS.toInt();
          if (servo3PPos > servo3Pos) {
            for ( int j = servo3PPos; j >= servo3Pos; j--) {
              servo03.write(180-j);
              delay(50);
            }
          }
          if (servo3PPos < servo3Pos) {
            for ( int j = servo3PPos; j <= servo3Pos; j++) {
              servo03.write(180-j);
              delay(50);
            }
          }
          servo3PPos = servo3Pos;
        }
        // Move Servo 4 0-30
        if (dataIn.startsWith("hand")) {
          String dataInS = dataIn.substring(4, dataIn.length());
          servo4Pos = dataInS.toInt();
          if (servo4PPos > servo4Pos) {
            for ( int j = servo4PPos; j >= servo4Pos; j--) {
              servo04.write(j);
              delay(50);
            }
          }
          if (servo4PPos < servo4Pos) {
            for ( int j = servo4PPos; j <= servo4Pos; j++) {
              servo04.write(j);
              delay(50);
            }
          }
          servo4PPos = servo4Pos;
        }
       
         
       
        //  当储存键被按下时 ,单片机存储数据 ,按一次存储一次
        if (dataIn.startsWith("save")) {
          servo01SP[index] = servo1PPos;  //  将自己所希望的位置和步骤存储下来 是将当前所在位置存储下来
          servo02SP[index] = servo2PPos;
          servo03SP[index] = servo3PPos;
          servo04SP[index] = servo4PPos;
          index++;                        // 添加数组
        }
        // If button "RUN" is pressed
        if (dataIn.startsWith("run")) {
          runservo();  // 自动模式 自己运行储存的位置
        }
        // If button "RESET" is pressed
        if ( dataIn.startsWith("reset")){
          memset(servo01SP, 0, sizeof(servo01SP)); // Clear the array data to 0
          memset(servo02SP, 0, sizeof(servo02SP));
          memset(servo03SP, 0, sizeof(servo03SP));
          memset(servo04SP, 0, sizeof(servo04SP));
         index = 0;  // Index to 0
        }
      }
    }
    // Automatic mode custom function - run the saved steps
    void runservo()
    {
      while (dataIn != "reset") // 当不等于reset时 自动运行
    {  
        for (int i = 0; i <= index - 2; i++)  // 遍历所有储存的数据 这里要放在外面
        {
          if (Bluetooth.available() > 0) {      // 期间检查蓝牙是否有数据
            dataIn = Bluetooth.readString();    //读取数据
          
          //当读出的数据为停止时
            if ( dataIn == "pause") {           // 如果读取到的数据为pause 停止
              while (dataIn != "run") {         // 等待直到run重新被按,啥也不做
                if (Bluetooth.available() > 0) {  //在停止的情况下,检查蓝牙是否接收数据
                  dataIn = Bluetooth.readString();  //蓝牙读取数据
                  if ( dataIn == "reset") {          //如果读取的数据为reset 跳出这个循环
                    break;
                  }
                }
              }
            }
            
            // 觉得伺服电机的速度不够可以通过这个改
            if (dataIn.startsWith("speed")) {
              String dataInS = dataIn.substring(5, dataIn.length());
              speedDelay = dataInS.toInt(); // Change servo speed (delay time)
            }
          }
          // Servo 1
          if (servo01SP == servo01SP[i + 1]) { //如果数据一样不进行操作
          }
          if (servo01SP > servo01SP[i + 1]) {  //如果存储的数据一,比数据二的位置(或者度数)大。那么就在要进行操作
            for ( int j = servo01SP; j >= servo01SP[i + 1]; j--) {
              servo01.write(j);
              delay(speedDelay);//这里的原始数据是20
            }
          }
          if (servo01SP < servo01SP[i + 1]) {
            for ( int j = servo01SP; j <= servo01SP[i + 1]; j++) {
              servo01.write(j);
              delay(speedDelay);//这里的原始数据是20
            }
          }
          // Servo 2
          if (servo02SP == servo02SP[i + 1]) {
          }
          if (servo02SP > servo02SP[i + 1]) {
            for ( int j = servo02SP; j >= servo02SP[i + 1]; j--) {
              servo02.write(j);
              delay(speedDelay);
            }
          }
          if (servo02SP < servo02SP[i + 1]) {
            for ( int j = servo02SP; j <= servo02SP[i + 1]; j++) {
              servo02.write(j);
              delay(speedDelay);
            }
          }
          // Servo 3
          if (servo03SP == servo03SP[i + 1]) {
          }
          if (servo03SP > servo03SP[i + 1]) {
            for ( int j = servo03SP; j >= servo03SP[i + 1]; j--) {
              servo03.write(180-j);
              delay(speedDelay);
            }
          }
          if (servo03SP < servo03SP[i + 1]) {
            for ( int j = servo03SP; j <= servo03SP[i + 1]; j++) {
              servo03.write(180-j);
              delay(speedDelay);
            }
          }
          // Servo 4
          if (servo04SP == servo04SP[i + 1]) {
          }
          if (servo04SP > servo04SP[i + 1]) {
            for ( int j = servo04SP; j >= servo04SP[i + 1]; j--) {
              servo04.write(j);
              delay(speedDelay);
            }
          }
          if (servo04SP < servo04SP[i + 1]) {
            for ( int j = servo04SP; j <= servo04SP[i + 1]; j++) {
              servo04.write(j);
              delay(speedDelay);
            }
          }
         
         
        }
      }
    }[/mw_shl_code]

    以上是 代码 谢谢大神 谢谢大家。
    下面是 app inventer2 的详细
    1.PNG


    文饼蓝牙.rar (8.97 KB, 下载次数: 71)

    该用户从未签到

    发表于 2019-2-23 12:19 来自手机 | 显示全部楼层
    学习了,谢谢,app打不开

    该用户从未签到

    发表于 2019-4-21 21:32 | 显示全部楼层
    你好,我用你的项目无法控制手臂,调用serial.print发现是乱码,请问是什么原因
    您需要登录后才可以回帖 登录 | 立即注册

    本版积分规则

    热门推荐

    5分钟带你快速了解新一代开发板:M5STACK
    5分钟带你快速了解新一代
    一、什么是M5Stack M5Stack是一种模块化、可堆叠扩展的开发板,每个模块
    创客火首发无人机编队套装,开启不一样的人工智能教育
    创客火首发无人机编队套装
    2017年国务院发布《新一代人工智能发展规划》,提出要广泛开展人工智能科普活动,在中
    基于机器视觉的智能分拣机械臂
    基于机器视觉的智能分拣机
    本作品是一个基于机器视觉的智能机械臂操作平台,其采用atmega32单片机作为主控制系统
    服务器平台又挂了么,显示服务器未响应了
    服务器平台又挂了么,显示
    数据读不回来了
    esp8266-AP-控制LED灯
    esp8266-AP-控制LED灯
    网上很少这个ap控制led的灯,求人还不如求自己,自己开搞 我用了esp8266-01s,只有一
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   
    快速回复 返回顶部 返回列表