查看: 1146|回复: 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(好玩的,特别是制作蓝牙控制)


    成品图还是文饼以前机械臂的帖子,一臂多套方案。
    话不多说 上代码。

    kittenblock中小学创客名师推荐的图形化编程软件

    
    //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);
            }
          }
         
         
        }
      }
    }


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


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

    该用户从未签到

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

    该用户从未签到

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

    本版积分规则

    热门推荐

    OLED 128*64自制可达10000000个选项的菜单(已更新)
    OLED 128*64自制可达10000
    OLED 128*64自制可达10000000个选项的菜单 温馨提示: 建议占个楼再食用本帖子
    【原创】全球最小口袋3D打印机mini one直播教程贴
    【原创】全球最小口袋3D打
    最近闲得蛋疼,没事搞个掌上3D打印机,先放效果图吧。 简介: 采用低导程15mm丝
    图表功能好像用不了
    图表功能好像用不了
    情况是这样,之前做好了一个 温度计,今天做另外一个的时候发现一样的代码写进去但是
    Mac连上Arduino,为什么在开发版信息中显示BN:未知的开发板
    Mac连上Arduino,为什么在
    温湿度DHT11+LCD1602
    温湿度DHT11+LCD1602
    (本人常年潜水,最近做一个小东西,有兴趣的小伙伴可以做一做) 利用 DHT11 + LCD160
    Copyright   ©2015-2016  Arduino中文社区  Powered by©Discuz!   ( 蜀ICP备14017632号-3 )
    快速回复 返回顶部 返回列表