spinmry's Lab

绝赞摸鱼中Orz

Category

  • Algorithm
  • Hardware
  • Homelab
  • Programming
  • Retro
  • Software

Tags

  • 算法
  • OI
  • Linux
  • 数据结构
  • HardwareHacking
  • 离散化
  • QQBot
  • Nspire
  • 机器人
  • 线段树
  • VEX
  • 计算设备
  • Vintage
  • Homelab
  • 平衡树
  • 图论
  • Kruskal
  • RobotC
  • 单片机
  • CUDA
  • 数论
  • STM32
  • Python
  • iLO
  • 动态规划
  • Tarjan
  • 爬虫
  • Loongson
  • 树状数组
  • ARM
  • 分块
  • ACG
  • Wolfram
  • 网页
  • Mattermost

Recent replies

  • jiyouzhan 发表于「使用 Debian + libvirt + WebVirtCloud 作为 homelab 虚拟化平台」
  • jianchen 发表于「在 Loongson 2F 上编译 Common Desktop Environment」
  • rantrism 发表于「解决 Linux Optimus 混合模式下独立显卡外接显示器卡顿的问题」
  • 千羽 发表于「在 Loongson 2F 上编译 Common Desktop Environment」
  • spinmry 发表于「QQ - Mattermost 双向转发机器人」

友情链接

空白酱
Woshiluo
FlyGoat
BeyondLimits
Memo von EFS
Paizhang
Ntzyz
ZephRay
Polarnova
Tautcany
NekoDaemon
MaxAlex
Abyss Studio
EE Archeology 电子考古学
桜庭清夏的小站
欠陥電気の摸鱼小池
白玉楼製作所
naivekun's blog

娱乐向跑分

Coremark
Linpack
标签:RobotC

VEX Robot C 入门教程 #2 手柄控制

2019 年 3 月 9 日分类:Programming#机器人#VEX#RobotC
提示:在继续阅读之前,请注意此文章最后更新于 2257 天前,其中的部分内容可能已经无效或过时。

VEX Robot C 入门教程 #2 手柄控制

0x00 手柄概览

VEX 手柄共有四组按键与两组摇杆。 在 Robot C 中,手柄的操作也被抽象到一个数组 vexRT[] 上。 在这个数组中,按键以 BtnXY 命名,其中 X 代表按键属于哪一组,Y 代表按键具体的名称。比如 Btn7U 代表第七组按键的 U 键。而摇杆以通道 ChX 命名,其中 X 代表第几通道摇杆。比如 Ch1 代表第一通道的摇杆。 当一个按键按下时,vexRT 数组中对应下标的值会变为 1,而未按下时,数组对应下标的值为 0。 下面是判断一个按键是否被按下的代码,当按键 7U 被按下时,电机 port2 开始以最大速度正转,当按键被松开时,电机 port2 停止转动。

    if(vexRT[Btn7U] == 1){
        motor[port2] = 127;
    }
    else if(vexRT[Btn7U] == 0){
        motor[port2] = 0;
    }

摇杆输出的是一个线性变化的值,其区间大约在 $$[-127,127]$$ 之间,也就是说,我们可以将摇杆值直接赋值给电机,从而实现摇杆控制电机转速。

    int speed = vexRT[Ch1];
    motor[port2] = speed;

0x01 摇杆与机器人控制

上面我们了解了如何通过编程获取手柄按键与摇杆的状态,下面我们将利用上面的知识开始实际操作。 假设我们的机器人有四个电机分别驱动机器人的前后左右四个轮子,我们将用两种方式通过摇杆控制机器人的运动。 以下的代码是双摇杆控制机器人运动的例子。通过两边摇杆的控制来使机器人比较灵活的前后运动与转弯。

    
    #pragma config(Motor,  port2,           right_front,   tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port7,           left_back,     tmotorVex393_MC29, openLoop, reversed)
    #pragma config(Motor,  port8,           right_back,    tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port9,           left_front,    tmotorVex393_MC29, openLoop, reversed)
    
    int left_speed, right_speed, rtX, rtY;
    const int noise = 15;//这里指摇杆的"噪音",即当摇杆值大于这个值时电机才会开始运动。
    
    void DualJoystick(){
        left_speed = vexRT[Ch3];
        right_speed =vexRT[Ch2];
        if(abs(left_speed) > noise && abs(right_speed) > noise){
            motor[right_back] = -1 * right_speed;
            motor[right_front] = -1 * right_speed;
            motor[left_back] = -1 * left_speed;
            motor[left_front] = -1 * left_speed;
        }else{
            motor[right_back] = 0;
            motor[right_front] = 0;
            motor[left_back] = 0;
            motor[left_front] = 0;
        }
    }

而如果我们要使用单个摇杆控制,我们就要用到差速法,通过获取单个摇杆横竖两个通道的值,分别计算两侧轮子需要的功率,从而实现机器人灵活的操作。 下面是代码。

    
    #pragma config(Motor,  port2,           right_front,   tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port7,           left_back,     tmotorVex393_MC29, openLoop, reversed)
    #pragma config(Motor,  port8,           right_back,    tmotorVex393_MC29, openLoop)
    #pragma config(Motor,  port9,           left_front,    tmotorVex393_MC29, openLoop, reversed)
    
    int left_speed, right_speed, rtX, rtY;
    const int noise = 15;//这里指摇杆的"噪音",即当摇杆值大于这个值时电机才会开始运动。
    
    void SingleJoystick(){
        rtX = vexRT[Ch4];
        rtY = vexRT[Ch3];
        if(abs(rtX) > noise || abs(rtY) > noise){
            if(rtY > -1 * noise){
                left_speed = ((-1 * rtY) - rtX) >> 1;
                right_speed = ((-1 * rtY) + rtX) >> 1;
            }
            else if(rtY < -1 * noise){
                left_speed = ((-1 * rtY) + rtX) >> 1;
                right_speed = ((-1 * rtY) - rtX) >> 1;
            }
        }
        else{
            right_speed = 0;
            left_speed = 0;
        }
        motor[left_back] = left_speed;
        motor[left_front] = left_speed;
        motor[right_back] = right_speed;
        motor[right_front] = right_speed;
    }

VEX Robot C 入门教程 #1

2019 年 3 月 9 日分类:Programming#机器人#VEX#RobotC
提示:在继续阅读之前,请注意此文章最后更新于 2257 天前,其中的部分内容可能已经无效或过时。

VEX Robot C 入门教程 #1

rt,应老师要求,为了造福下届学弟学妹,特此写下此入门教程。(下届不是都用 V5 了吗(划掉)) 下面这篇教程相当于一个 Hello World 的例子,将通过程序驱动一个电机。

0x00 Robot C 程序结构

Robot C 中大部分基础语法与 C 语言相同,在此就不一一赘述了(其实是懒)。 一个简单的 Robot C 程序通常是以以下结构存在的:

#pragma config(blablablabla)

void fun(){
/*blablablabla*/
}

task main(){
/*blablablabla*/
}

其中 task 代表一个任务。Robot C 语言支持多任务,在后文中会对此进行介绍。 在将此程序烧写到主控盒后,程序会从 main() 任务开始执行。 在后面的教程中我将介绍有关 Robot C 的编程结构。

0x01 电机驱动

VEX EDR 主控共有十个电机端口,其中有八个为三线端口,其余两个为双线端口。 要通过程序控制电机,我们必须先配置电机。 在 Robot C 中,配置电机可以通过单击_Motor and Sensor Setup_按钮来配置,如图所示: 电机配置

也可以通过以下代码来配置:

#pragma config(Motor, port2, left_front, tmotorVex393_MC29, openLoop, reversed)

配置完成后,即可开始编程来操控电机。

在 VEX Robot C 中,有一种十分方便的控制电机的方式,那就是 motor[] 数组。 通过使用motor[portX]可以操控端口 X 电机的功率,其中赋值范围为 $$ [-127,127] $$ 。当赋值为负时,电机会反转。 比如,以下代码会使端口 2 的电机正转 1s 后反转 1s 最后停止。

motor[port2] = 127;//将电机 2 设置为最大功率正转
wait1Msec(1000);//此语句的作用为使主控盒延时 1000ms 再执行下面的语句
motor[port2] = -127;//将电机 2 设置为最大功率反转
wait1Msec(1000);
motor[port2] = 0;

以上就是控制电机的一种简单方法了,下面来让我们写一个完整的 VEX Robot C 程序。

#pragma config(Motor, port2, Left, tmotorVex393_MC29, openLoop)

task main(){
    while(1){
        motor[port2] = 127
        wait1Msec(1000);
        motor[port2] = -127;
        wait1Msec(1000);
        motor[port2] = 0;
    }
}

0x02 编译 & 烧写程序

首先确保主控盒烧写了同 Robot C 同版本的固件。 将主控盒通过数据线连接至计算机后,待到主控盒两个 LED 灯变为绿色后,点击 Compile Program 对程序进行重新编译,然后点击 Download 按钮开始烧写程序。

  • «
  • 1
  • »
Copyright © 2019-2023 spinmry. All rights reserved.
Except where otherwise noted, content on this blog is licensed under CC BY-SA 4.0.