我们将继续审查免费的在线课程“ 在Arduino上构建机器人和其他设备”。 从交通信号灯到3D打印机 (先前的评论: 第1 周 , 第2周 )
第三周
大家好! 您是否想过Valley与障碍之间的共同点?

至少它们都是机器人 。
在我参加MIPT机器人课程之前,我曾想像过机器人几乎是
但是事实证明,机器人的定义要宽得多:
机器人是一种根据生物体原理创建的自动设备,旨在执行生产和其他操作,该机器人根据预定义的程序进行操作并从传感器接收有关外界的信息,该机器人独立地执行生产和通常由人类执行的其他操作。 同时,机器人既可以与操作员通信(从机器人那里接收命令),也可以自主行动。
如您所见,这个定义比我关于机器人是什么的陈规定型观念要广泛得多。
在第三周,除了编程环境的一些新功能外,我们还将学习如何使用测距仪 , 红外和超声波以及如何使用伺服电机与外部环境进行交互。 首先是第一件事。
让我提醒您,在课程的第二周,我们检查了最简单的传感器(光敏电阻和热敏电阻)的连接。 它们以最简单的方式排列-当环境变化时,它们会改变其电阻,因此,我们可以使用Arduino测量它们上的电压降,并了解外部条件已改变。 我们还学习了如何使用LED指示器和压电动力学来显示信息。
本周,我们将研究测距仪-一种可让您确定到物体或障碍物的距离的设备。

超声波测距仪的工作原理是测量发送信号(频率为40 kHz的声音脉冲)与接收其反射副本之间的时间。

在红外传感器中,反射信号(红外光谱中的光束)穿过透镜到达位置敏感的光电管,该光电管根据接收光束的位置而改变其电导率。
也许读者会对为什么需要两个传感器来做同一件事感兴趣? 这完全取决于传感器的范围,因此红外传感器基于光,因此不适合测量到吸光或透明表面的距离。 另一方面,超声波测距仪不适用于确定到吸音表面的距离,特别是蓬松的:)此外,红外传感器的测量距离范围较小(例如4-30、10-80或80-150 cm),甚至便宜测距仪可确定2到400 cm的距离,只有超声波测距仪才在我的仪器中,因此我仅将其用于实验。

什么是伺服电机 ? 这是一种小型电动机,结合了电位计和控制电路。 通过将PWM信号施加到伺服电机的输入,我们可以设置旋转角度并保持该位置。 通常,最大旋转角度为180度,但有些伺服电机的角度为120至270度。
在分别使用伺服电机和超声波测距仪玩够了之后,我开始考虑本周要组装哪种设备。 当我开车离开购物中心的地下停车场时,这个决定突然来了。 我决定模拟出口处的出口系统,该出口系统设有障碍物和交通信号灯。
为了构建此设备,我使用了从学校时代保存下来的设计器元素。


由于计算机的电源显然不够用,因此该板要定期重启,因此,在最终版本中,使用电源银行供电。

实际上,我们简化的吞吐量系统模型是如何工作的:
- 开启后,红色交通信号灯亮起,护栏设置在关闭位置。 系统等待按钮被按下(模拟读取通行证)。
- 按下按钮后,绿色交通信号灯亮起,并且障碍物打开。 系统等待测距仪低于某个值(车辆行驶)。
- 车辆越过测距仪信号后,红色交通信号灯再次亮起,并且护栏关闭。 系统再次进入待机模式。
在Fritzing环境中,方案如下:

源代码#include <Servo.h> // #define GATE_PIN 3 #define RED_PIN 4 #define GREEN_PIN 5 #define BUTTON_PIN 6 #define SENSOR_TRIG 11 #define SENSOR_ECHO 12 // #define GREEN 1 #define RED 0 #define CLOSE 1 #define OPEN 0 // , #define GATE_OPEN 180 #define GATE_CLOSE 90 // , #define SENSOR_THR 15 Servo gate; void setup() { Serial.begin(9600); // Serial.println(); gate.attach(GATE_PIN); gate.write(CLOSE); // Serial.println(); pinMode(GREEN_PIN, OUTPUT); pinMode(RED_PIN, OUTPUT); pinMode(BUTTON_PIN, INPUT_PULLUP); pinMode(SENSOR_TRIG, OUTPUT); pinMode(SENSOR_ECHO, INPUT); Serial.println(); light(RED); } // - void gateSet(int state) { if (state == CLOSE) { for (int i = GATE_OPEN; i >= GATE_CLOSE; i--) { gate.write(i); delay(15); } } else { for (int i = GATE_CLOSE; i <= GATE_OPEN; i++) { gate.write(i); delay(15); } } } // void light(int col) { if (col == RED) { digitalWrite(GREEN_PIN, LOW); digitalWrite(RED_PIN, HIGH); } else { digitalWrite(GREEN_PIN, HIGH); digitalWrite(RED_PIN, LOW); } } // / int getDistance() { digitalWrite(SENSOR_TRIG, HIGH); digitalWrite(SENSOR_TRIG, LOW); int distance = pulseIn(SENSOR_ECHO, HIGH) / 54; Serial.println( + String(distance)); return distance; } // , bool waitCar() { while (getDistance() > SENSOR_THR) { delay(10); } while (getDistance() <= SENSOR_THR) { delay(10); } } void loop() { Serial.println(); while (digitalRead(BUTTON_PIN)) { delay(10); } Serial.println(); light(GREEN); Serial.println(); gateSet(OPEN); Serial.println(); waitCar(); Serial.println(); light(RED); Serial.println(); gateSet(CLOSE); Serial.println(); }
演示组装设备的操作
总结一下。 本周,我们学习了如何与测距仪一起使用以及如何控制伺服驱动器。 这些元素是许多轮式或步行机器人以及各种机械手的基础,因此为创造力提供了广阔的空间。
以前的评论 :
以及指向该课程的链接: 在Arduino上构建机器人和其他设备。 从交通灯到3D打印机