如何使机器人准确地运动?Studuino平台机器人概述和功能

图片

我工作的组织被要求举办一个小型的机器人技术网络研讨会,以2020年莫斯科国际教育沙龙的形式进行。演讲的主题留给我开放,并进行了机器人技术方面的教育。因此,我熟悉了日本ArTeC公司的产品(这不是广告,我也不是ArTeC的雇员-这只是我与他们的产品进行交流的个人经验)。网络研讨会结束后,我决定写这篇文章,因为在俄罗斯,乐高教育的工具包非常受欢迎,这是我第一次遇到这位日本设计师。

文章分为两个部分。第一部分对选择教育机器人套件的​​人很有用。在第二部分中,我研究了使用套件来解决生活中可能出现的应用问题。

因此,如果有人对它是什么类型的机器人套件感兴趣,以及可以用它做什么,我就请一只猫来。所以走吧!

作为构建的基础,设计人员仅使用一些基本零件即可从中组装非常复杂的结构。

ArTeC Designer基础块
ArTeC Designer基础块

图片
来自Designer零件的示例模型

由于零件的特殊性-连接的孔和尖峰的交错顺序,并非总是很快就能找到正确的零件组合来达到目的。与乐高玩具不同的是,优势在于:所有零件都足够大,损失难度更大。第二个优点是您不必长时间寻找必要的零件,因为基本零件只有5-6件(零件颜色的差异不计算在内)。负号是指-只要零件是全新的,它们之间的分离有时会变成折磨-因此它们彼此紧紧地粘在一起。为了帮助它们脱离,套件中提供了一种特殊工具。

除了该套件中的基本块外,还有几种车轮和齿轮以及齿条。

现在介绍一下该机器人套件电子部分中包含的内容。日本网站上有大量不同的传感器和模块。当然,我的数量要少得多,但是那些已经具有一定创造力的空间。

为了填充主控制单元,日文制作了他们的Arduino开发板版本,并对其进行了最终化处理,并将其命名为Studuino。他们在其中添加了一个直流电动机控制驱动器,并引入了一条用于3针连接器的线(标准BLS-3,它们放置在伺服器上)。每个此类连接器上都有电源:正号和负号,以及Arduino板的引脚之一。所有连接器均已签名,因此连接时很难出错。

Studuino平台
Studuino平台

为了与标准位置上的标准Arduino屏蔽板兼容,有一些类似于Arduino的连接器。

与Arduino开发板的主要区别在于控制器的电压为3.3V。这可以通过以下事实解释:中央控制模块通过随附的3个AA电池(总计4.5 V)的电池仓供电。不幸的是,没有提供电池,它甚至不能在制造商的网站上购买。

评估板位于一个塑料盒中,您可以在其上连接设计器的基础部件和其他元素。

ArTeC中央单位
ArTeC中央单位

作为执行器,制造商提供了两个带齿轮箱的直流电机和多达8个自己设计的伺服驱动器(它们的数量可能会根据套件配置而有所不同)。电机通过板上的特殊连接器连接。

带齿轮的直流电动机及其连接
带有齿轮箱的直流电动机及其连接

可以想到的是,可以非常轻松,快速地组装最简单的结构:具有两个电动机的机器人机器,通过控制它们,可以使电动机向正确的方向移动。

具有两个直流电动机的简单机器人机器
具有两个直流电动机的简单机器人机器

通过设置发动机端子D2,D4,D3的逻辑状态来控制发动机,该端子连接到M1,而电动机端子D7,D8,D5则连接到Studuino板上的M2连接器。基于这些结论,Studuino板的开发人员并联了一个电机驱动器驱动器芯片。通过在此处连接电路来使用这些结论,并同时使用引擎,将会失败。

考虑如何控制连接到M1连接器的引擎。通过将端子D2和D4设置为不同的逻辑状态,可以实现发动机沿期望方向的旋转。例如:对于D2-1和D4-0,引擎将顺时针旋转,如果D2--0和D4-1,则引擎将逆时针旋转。还需要通过在引脚D3上设置PWM值来设置电动机转速-可以在0到255之间。如果该值为0,则电动机将不会旋转,如果该值为255,我们将获得最大转速。引擎驱动器还允许即时改变引擎的旋转方向并支持引擎制动模式。为了使发动机减速,必须在端子D2和D4上设置等于1的相同逻辑状态。

顺便说一下,在Studuino板上有3个引脚(GND,VCC,SIG)的连接器中没有D3和D5引脚,但是它们在标准的Arduino连接器上,开发人员将其保留以保持平台兼容性。

同样,电动机也受控制,该电动机连接到M2连接器。对于他来说,旋转方向是通过端子D7和D8的状态指定的,而旋转速度是通过端子D5确定的。

我写的最简单的程序使机器人机器像这样移动:


Servos可以连接到板上红色突出显示的连接器:D2,D4,D7,D8,D9,D10,D11,D12。

伺服连接
连接伺服驱动器

AtMega168微控制器在这些引脚上具有PWM,这是控制伺服驱动器所必需的。如果连接了最大数量的伺服器,则可以得到一些有趣的设计。为了演示,我将一个步行机器人的简单模拟物放在一起,并尝试对其进行一些编程。结果可以在视频中看到:


唯一要记住的是,如果您打算同时使用直流电动机和伺服系统,那么您将不能同时使用2个直流电动机和8个伺服系统,因为它们具有由微控制器控制的公共输出。您可以进行以下配置:2个直流电机+ 4个伺服器,1个直流电机+ 6个伺服器或仅使用8个伺服器。

在任何机器人套件中,除了执行器外,还必须有传感器,它们是任何机器人的“眼睛”和“耳朵”。他们也在这里。在我的集合中,有以下传感器:光传感器,声音传感器,加速度传感器,两个红外传感器,触摸传感器以及LED(绿色,红色,蓝色,白色)和压电传感器。

一组传感器
一组传感器

传感器使用套件随附的电缆连接到中央单元。为了将传感器固定在机器人模型中的外壳上,它们具有长钉,可以将它们固定到结构上。我组装并编程了几个简单的设计,以了解传感器的操作。

触摸传感器的工作方式如下:


这是光传感器的工作方式:


如果套件中没有足够的标准传感器,并且您想扩展其功能,则可以像使用标准Arduino板一样轻松地使用无焊面包板并在那里连接电路。

增强的招聘功能
增强的拨号功能

对于任何机械手套件而言,下一个重要的点是便利的编程环境的可用性。在这里,制造商提供了三种不同的编程选项。

入门级-专为最小的用户而设计,他们仍然不真正懂得阅读,但是已经迈出了进入机器人成人世界的第一步。对于他们来说,提供了最简单的编程环境-象形图。

图标编程
图标编程

在这里,您可以将带有基本操作的象形图提取到程序中(前进,打开,打开LED等)并配置其基本参数。

当掌握了该级别或其功能不足以解决任务时,您可以继续下一步,并开始为Studuino平台使用Scratch编程环境。

Studuino的临时编程
Studuino的Scratch编程

已经有了更多的编程选项:您可以使用变量和数组,逻辑和算术表达式,子例程,以及更灵活地配置各种执行块。

当这些功能还不够用时,您可以继续在Arduino IDE中进行编程,并完全控制Studuino平台的所有硬件功能。要在Arduino IDE中使用Studuino板,您必须根据制造商网站上的说明配置环境(以使环境在支持的板列表中看到Studuino平台)。

制造商提供了一套完整的编程软件,以指导您组装不同的模型并进行编程。该软件本身可在制造商的网站上免费获得。

现在,让我们尝试使用此集合解决一个小的实际问题。

想象一下,我们有一个必须在仓库中前后移动的机器人,我们需要使其停在给定的位置。如果未控制机器人,则会发生事故。此处显示了此类事故的示例:


可以使用直流电动机或伺服器来使机器人向前和向后移动。伺服驱动器解决了如何将机器人停在正确的位置的问题(您可以准确设置伺服器的旋转角度)。此解决方案有一个局限性(我们将使用固定有轮子的一组伺服器)-伺服器不能旋转超过180度的角度,因此我们的机器人的运动将被限制为伺服器上轮子旋转长度的一半,但通常您需要更多。

我们将使用一套带有减速器的直流电动机来向前和向后移动。这些电机没有反馈。启动引擎后,我们无法说清机器人走了多远。您可以检测到在发动机运行期间机器人行进所需距离的时间,并在程序中使用这些延迟将机器人停在正确的位置。这种方法有一个明显的缺点-发动机转速取决于提供给它的电压和所需的努力。由于机器人中使用的电池会在一段时间后稍微放电并且其电压会降低,因此与此同时机器人将开始行驶较短的距离,因此有必要再次选择时间。

您可以使用的最简单的选择是机器人,经过所需的点,触摸触摸传感器,这将是正确位置的停止信号。

我通过在机器人上添加触摸传感器并对设计进行了更改,并沿机器人路径放置了元素,以便机器人在移动时通过触摸传感器触摸它们。


视频显示,机器人到达“仓库”的尽头并用传感器触摸“墙”,然后又回到仓库的另一“墙”,并且在那里也进行了触摸。之后,重复该过程。因此,机器人肯定会“知道”两点-这些是触发触摸传感器时的点。

Studuino的Scratch触摸程序
一个带有Scratch语言的Studuino触摸传感器的程序

有时,这足以解决任务。但是我们想要更多!

我对机器人的设计和程序进行了更改,这就是我得到的:


让我们更详细地考虑我决定对机器人的需求。我认为两个断点对我来说还不够,我还想要更多。为此,我使用了套件中随附的红外传感器。我将其固定在移动的平台上,然后在下方布置了一条纸,该纸上带有由标记预先绘制的黑线,机器人必须在该纸上停下来。我还从机器人上卸下了一个触摸传感器(在右侧)。

红外机器人
机器人具有IR传感器

结果,我有一个三维打印机或数控机床的轴中的一个的装置的一个典型图。打开打印机电源后,打印机将不知道它在哪里,并一直向一侧移动(直到被限位开关触摸),然后打印机将该点视为零,并开始从该点开始计数其位置。

在这种设计中,倒计时发生在纸上的黑色条纹上。这些波段的数量是事先已知的,因此当您到达最后一个波段时,可以返回到零参考点。下面介绍了Studuino的Scratch程序。

Studuino的Scratch IR机器人程序
Studuino的Scratch IR机器人程序

如果仔细看一下程序,会看到40和50的难以理解的值,它们与IR传感器的值进行了比较。要了解这些数字,您需要记住一些有关可以从不同传感器读取哪些信号的信息。有数字和模拟传感器。数字传感器具有固定数量的位置,并且可以从一个位置急剧移动到另一位置,并且没有中间值。最常用的传感器有两个位置。触摸传感器是数字传感器中最引人注目的示例:在按下传感器之前,其逻辑值为1,在按下时-逻辑值为0(在此构造函数中,对于这些传感器,这是一种方案,但是有些方案是相反的:按下-1,未按下-0)。模拟传感器描述了信号与输出电压或电流之间的某种不可分割的关系,并且没有固定值。红外传感器发出模拟光信号,该信号可能取决于各种因素,例如环境光,电池电压甚至环境温度。

Scratch for Studuino的模拟信号被线性转换为数字,范围是0到100。这样做是为了简化与最终用户之间的工作(此编程环境最初是为教孩子而开发的)。在Arduino IDE中,发布了一个从0到1023的``诚实''值范围,该范围对应于Atmega168控制器中存在的10位ADC转换器。如果您查看数字信号和模拟信号之间的图形差异,那么很清楚为什么模拟信号是一个数值范围。

模拟(左)和数字(右)信号
模拟(左)和数字(右)信号

红外传感器用于确定黑色标签线,其原理是捕获反射信号。在图中可以清楚地看到两个元素:IR LED和IR光电探测器。

红外传感器
红外传感器

如果您将障碍物放在反射红外光线的传感器前面,则障碍物反射的光线越好(取决于与障碍物的距离或障碍物的类型),红外光电探测器会吸收的光线越多,传感器返回的光就越多在调查期间对用户有价值。

数字40和50是根据经验选择的。在我的情况下,传感器显示在白色表面上方,值约为65-75。在黑色表面上方,传感器返回的值在18-25范围内。数字40是传感器开始从白色表面转变为黑色的时刻,数字50是从黑色表面转变为白色的时刻。这些数字的边距很小,以便阻止传感器测量中的误差。在开发实际设计时,有必要考虑传感器获取读数的条件(外部照明,传感器的位置等),因为所有这些因素都会影响传感器的读数。您可能必须开发一种算法,以根据外部条件不断调整这些值。

我将总结一个小的结果。考虑了两种解决机器人在仓库中移动问题的方法。这两个选项都需要附加的外部“标签”,以引导机器人。没有他们,有什么办法吗?例如,为了使机器人知道电动机轴转动了多少角度,并根据角度值决定停止或继续前进。有一个简单的解决方案-使用带有编码器(角度传感器)的电动机。

该设备具有带齿轮的直流电动机,但没有编码器。我想到了这个主意:也许我可以尝试从设计人员的各个部分制作一个简单的编码器,尤其是因为该套件中的齿轮具有相当大的模块(齿尺寸)?

编码器的主要要素
编码器的主要要素

主要问题是选择位置并固定红外传感器,使其在旋转时与齿轮齿相交。结果,我得到了一个测试设计,如下图所示。

编码器测试模型
编码器测试模型

如上图所示,红外传感器是固定的,因此齿轮在旋转过程中会用齿穿过其工作测量区域。在红外传感器的对面(位于齿轮的另一侧),我另外设置了一个障碍物来反射红外线,以从传感器获取更多正确的数据。当齿轮旋转并且IR传感器测量信号反射时,当传感器前面有一个齿时将有较大的值,而当齿轮齿之间有一个``孔''时将有较小的值。

用于编码器的程序是在Arduino IDE中开发的。为了测试我的想法的效率,我编写了一个简单的程序,启动引擎以恒定速度旋转并从IR传感器连续输出值到调试控制台。

程序文字
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

void setup() {
  Serial.begin(9600);       //      
  pinMode(M1_A, OUTPUT);    //       " "
  pinMode(M1_B, OUTPUT);    
  analogWrite(M1_PWM, 100); //    
  digitalWrite(M1_A, HIGH); //    
  for (int i=0; i < 2000; i++) {    //   2000    -
    Serial.println(analogRead(SENSOR_PIN));   //      
  }
  digitalWrite(M1_A, LOW);  //   
}

void loop() {
}


根据程序在控制台上显示的数据,我得到了下图:

齿轮旋转过程中红外传感器值的图表
齿轮旋转过程中红外传感器的值变化图

该图的性质类似于齿轮齿的形状,这表明确实可以使用设计者提供的齿轮作为编码器盘,使用此类数据来控制发动机的旋转。为了消除``反弹''磁滞现象,其实现方式如下(图中的符号):MIDDLE是IR传感器读数的最大值和最小值之间的平均值,WIDTH是从MIDDLE到较大或较小值的偏差以创建特定的``误差带'' »信号测量(该频带的总宽度为2 * WIDTH)。 MIDDLE和WIDTH将用于引擎旋转控制算法。发动机旋转过程中用于计算齿轮齿数的算法可以表示如下:

在发动机旋转过程中计算齿轮齿数的算法
用于计算发动机旋转过程中齿轮齿数

的算法,该算法使用以下符号:

  • prev_state-先前的档位状态;
  • cur_state-齿轮的当前状态;
  • count-齿轮齿数;
  • tmp-红外传感器读数。

在此算法中,计算齿轮齿数的原理基于恒定的红外传感器读数读数,以及当信号电平超过“误差带”的上限或下限时cur_state变量的值变化。如果该值超过上限,则变量cur_state等于1,这表示齿轮齿;当超出下边界时,变量cur_state等于0,这意味着齿轮齿之间的间隙。仅当cur_state变量的状态更改时,才添加count变量。

下面介绍了使用此算法的程序。在其中,我描述了一个子例程,该例程等待直到引擎将齿轮旋转预定齿数,然后将控制权转移到主程序。

程序文字
#define M1_A        2       //   1   1
#define M1_B        4       //   2   1
#define M1_PWM      3       //       1
#define SENSOR_PIN  A4      //     IR-sensor

#define MIDDLE      550     //         
                            // ""
#define WIDTH       50      //      ,   
      //    -     
      // 

int enc_tooth = 0;          // ,    
int cur_state = 0;          //   :  (1)  "" (0)
int prev_state = 0;         //   
int tmp;                    //      

void init_enc() {
  enc_tooth = 0;
  cur_state = 0;
  prev_state = 0;

  //         cur_state
  //    ,   = 1,    ""      
  //   0      
  if (analogRead(SENSOR_PIN)>MIDDLE) {
    prev_state = 1;
    cur_state = 1;
    enc_tooth++;
  }  
}

void wait_by_count(int count) {
  //       count,       IR 
  //           ""
  while (enc_tooth <= count) {
    //    IR-    
    tmp = analogRead(SENSOR_PIN);

    //       +  ,    
    if ((tmp + WIDTH) > MIDDLE) {
      cur_state = 1;
    } else {
    //       -  ,    ""
      if ((tmp - WIDTH) < MIDDLE) {
        cur_state = 0;
      }
    }

    //       ,      
    // ,     ""   -  ""  
    if (cur_state != prev_state) {
    //   ,   0  - ,     
    // 
      enc_tooth += cur_state;
    
    //        
      prev_state = cur_state;
    }
  }
}

void setup() {
  //        
  Serial.begin(115200);

  //        ""
  pinMode(M1_A, OUTPUT);
  pinMode(M1_B, OUTPUT);

  //   
  init_enc();

  //    
  analogWrite(M1_PWM, 100);
 
  //    ,      1 (    
  //  0)
  digitalWrite(M1_A, 1);

  // ,    30  
  wait_by_count(30);
  
  //   
  digitalWrite(M1_B, 1);

  Serial.print("  = ");
  Serial.println(enc_tooth);

}

void loop() {
}


程序启动发动机,等待直到齿轮旋转30齿-齿轮中的齿数达到一定数量,然后停止电动机。以下是演示程序操作的视频:


在粘贴在齿轮上的白纸上,您可以跟踪其旋转360度。

关于这一点,我想结束本文。总之,我可以说我不仅止于编码器模型。一个成熟的机器人平台组装了两个电机和两个编码器(每个车轮一个),并编写了一个程序,根据编码器使车轮旋转同步,但这是另一篇文章的主题。

具有基于红外传感器的编码器的机器人平台
具有基于红外传感器的编码器的机器人平台

作为机器人技术的教育设计师,这对于想要参加此类课程的儿童(成人,成年人)是一个不错的选择,尤其是因为制造商已尽一切努力使可以使用该产品的人的年龄范围最大化(存在不同的编程环境) )您可以从最简单,最基础的元素开始,获得基本知识后,再进入机器人技术和电子技术的另一个发展阶段。

All Articles