蘑菇云创客成员之2019RCJ国际青少年机器人赛
2019-03-056213
AI 快速预览详细
本文介绍了蘑菇云创客成员参加2019RCJ国际青少年机器人赛的过程。队员们设计了一款螃蟹机器人,通过齿轮连动设计解决了齿轮啮合空隙调试难题。项目涉及内部结构设计、输出模块选择以及模块化程序设计。适合青少年科创比赛和STEM教育场景。
|
蘑菇云创客成员之2019RCJ国际青少年机器人赛 2018年的年底,我们在DUDU老师的带领下开始了2019RCJ国际青少年机器人赛中国选拔赛的准备。 我们的队员来自不同的学校,不同的年龄,最大17岁,最小10岁,大家集中在上海蘑菇云创客空间 开始搞事情啦。:P 先讲讲我们的作品第1版的方案,那是个关于海洋动物螃蟹的主题,我们把机器人设计成螃蟹,螃蟹 的足用齿轮连动,不多写,上图吧! ![]() ![]() 螃蟹机器人----齿轮连动的螃蟹(crab)设计 A) 内部结构设计 一:齿轮可以安装在轴承外部,由轴承带动进行传动,齿轮在转动的时候同时带动其他齿轮的转动,轴承与齿轮二者是缺一不可的。 二:齿轮主要提供一个相互的咬合力与扭矩,而轴承主要是提供一个传动功能。齿轮传动需要安装在轴上,而轴承是是为轴提供支撑的构件,有了轴承的支撑更容易使轴及轴上构件有比较准确的运转精度,轴承滚动体可以减少轴承与轴的摩擦。 三:轴承属于易损件,损坏后可以进行更换和维护,这样可以减少轴承的磨损。 制作上的难点是齿轮之间的啮合空隙需要反复试验。调试过程中硬件与软件的配合非常重要。 B) 设计 选择怎样的输出模块也非常重要,步进电机需要4个数字口,舵机只需要1个数字口 C) 程序设计: 采用了模块化设计思路,分别调试每个功能模块 ![]() 如果你也想参加,请扫码联系我! |








Vcc 和 Gnd 接5v DC 电源,但不推荐用独立电源给它供电,应使用树莓派或单片机的 GPIO 口输出 5v 和 Gnd 给它供电。不然会影响这个模块的运行。
Trig 引脚用来接收来自树莓派的控制信号。接任意GPIO 口。
Echo 引脚用来发送测距结果给树莓派。接任意 GPIO口。
(注意 Echo 返回的是 5v信号,而树莓派的 GPIO 接收超过 3.3v 的信号可能会被烧毁,因此需要加一个分压电路)
HC-SR04 [font=宋体]的测距过程[/font]
1. 树莓派向 Trig 脚发送一个持续 10us 的脉冲信号。
2. HC-SR04 接收到树莓派发送的脉冲信号,开始发送超声波(start sending ultrasoun),并把 Echo置为高电平。 然后准备接收返回的超声波。
3. 当 HC-SR04 接收到返回的超声波 (receive returned ultrasound) 时,把 Echo 置为低电平。
从上述过程可以看出, Echo 高电平持续的时间就是超声波从发射到返回所经过的时间间隔 ~
接线跟前文所说的一样。 GPIO 2 脚接 Trig , GPIO 3 脚接Echo 。树莓派的 +5v 和 Gnd 与 HC-SR04 的 Vcc 和 Gnd相连。还有一个分压电路,一端接 Echo ,另一端接 Gnd。
[align=left][font=宋体] 1k [/font][font=宋体]和 2k 电阻组成了一个分压电路,使 GPIO 3 脚的电压降到了 3.3v 左右。[/font][/align][font="]python [/font][font=宋体]程序[/font][align=left] 2 脚连 Trig ,设为输出模式; 3 脚连 Echo,设为输入模式。[/align][align=left]然后向Trig 引脚输入10us 的脉冲:[/align][align=left] [/align][align=left]time.sleep() 接收的参数单位为 s ,于是把10 us 转换为0.00001 s 。[/align][align=left]接收到这个脉冲后,HC-SR04发射出超声波,同时把Echo 置为高电平。在发射之前,Echo一直为低电平。[/align][align=left]据此编写程序,记录超声波发射时的时间。[/align][align=left] 然后记录超声波返回时的时间。 这样就获得了我们需要的数据pulse_start 和 pulse_end ,可以算出距离了~[/align][align=left]测得距离(单位:m) = (pulse_end - pulse_start) * 声波速度 / 2 [/align][font=Arial]测得距离[/font][font="]([/font][font=Arial]单位[/font][font="]:m) = (pulse_end - pulse_start) * [/font][font=Arial]声波速度[/font][font="] / 2 [/font]声波速度取 343m/s 。
[align=left][font=宋体]然后再把测得的距离转换为 cm。[/font][/align][align=left][font=宋体]测得距离(单位:cm) = (pulse_end - pulse_start) * 声波速度 / 2 * 100 [/font][/align][align=left][font=宋体] = (pulse_end - pulse_start) *17150 [/font][/align][align=left] [/align][align=left] [/align][align=left] [/align][table=98%]
[tr] [td] [align=left][font=黑体]黑[/font]-GND[/align] [align=left][font=黑体]红[/font]-VCC[/align] [align=left][font=黑体]黄[/font]-SCL[/align] [align=left][font=黑体]棕[/font]-SDA[/align]
[/td] [/tr]
[/table] [font="] [/font][font="] [/font]
STM32 F103T8U6 [font=黑体]数字指南针[/font]
[align=left] [/align][align=left] [/align][align=left] [/align][align=left] [/align][align=left] [/align][align=left] [/align][align=left] [/align][align=left] [/align][table=98%]
[tr] [td] [align=left]1-VCC[/align] [align=left]2-VCC[/align] [align=left]3-SCL[/align] [align=left]4-GND[/align]
[/td] [/tr]
[/table]
[/font][font=黑体]舵机齿轮程序[/font][/align][align=left][font=黑体]子函数[/font]foot()[/align][align=left][font=黑体]流程图[/font]:[/align][align=left]2[font=黑体]个超声波模块同时放置[/font],[font="] [/font][font="]程序很容易,关键是要避开回波干扰[/font][/align][align=left]void csb(){[/align][align=left] ////////////////1[font=黑体]号超声波[/font]//////////////////////////////////// [/align][align=left] digitalWrite(Tr1, LOW); //[font=黑体]低高低电平发一个短时间脉冲去[/font]TrigPin [/align][align=left] delayMicroseconds(2); // delayMicroseconds[font=黑体]在更小的时间内延时准确[/font][/align][align=left] digitalWrite(Tr1, HIGH); [/align][align=left] delayMicroseconds(10); [/align][align=left] digitalWrite(Tr1, LOW); //[font=黑体]通过这里控制超声波的发射[/font][/align][align=left] cm1 = pulseIn(Ec1, HIGH) / 58.0; //[font=黑体]将回波时间换算成[/font]cm[/align][align=left] ////////////////2[font=黑体]号超声波[/font]//////////////////////////////////// [/align][align=left] digitalWrite(Tr2, LOW);[/align][align=left] delayMicroseconds(2); // delayMicroseconds[font=黑体]在更小的时间内延时准确[/font][/align][align=left] digitalWrite(Tr2, HIGH); [/align][align=left] delayMicroseconds(10); [/align][align=left] digitalWrite(Tr2, LOW);[/align][align=left] cm2 = pulseIn(Ec2, HIGH) / 58.0; [/align][align=left] Serial.print(cm1); [/align][align=left] Serial.print("cm1"); [/align][align=left] Serial.println(); [/align][align=left] Serial.print(cm2); [/align][align=left] Serial.print("cm2"); [/align][align=left] Serial.println(); [/align][align=left]}[/align][align=left]void trackA()[/align][align=left]{ [/align][align=left] forward();[/align][align=left] csb(); [/align][align=left] if( cm1 <50)[/align][align=left] {[/align][align=left] stopped();delay(100);[/align][align=left] right(); [/align][align=left] delay(200);[/align][align=left] }[/align][align=left]else if(cm2 <50)[/align][align=left] {[/align][align=left] stopped();delay(100);[/align][align=left] left();[/align][align=left] delay(200);[/align][align=left] }[/align]
[/align]