本帖最后由 ntwhq 于 2016-12-15 21:25 编辑
开发版和教育版都试用了下,开发版和Arduino IDE区别不是太大,最大的亮点是函数名有了联想功能,写代码方便多了。
这里主要测评一下教育版,针对一个具体的项目,通过编程体验说一下自己的感想。
项目是做一个超声波避障的小车,超声波传感器装在舵机上,当发现前方有障碍体时再分别测量左右方障碍物的距离,然后选择转向障碍物距离较大的方向继续前行。
下面以工作的顺序谈一些看法:
1.在编程前首先要搭建硬件电路,感觉这种方式很好,将硬件和软件结合在一起更加直观,容易理解。但在使用过程发现少了直流电机模块或直流电机驱动模块,我只有用4个LED来替代两个电机的接口,不然无法编程,因为编程模块不支持手工填写端口号,因此建议建议增加电机模块,同时增加通用的输入、输出模块,用以代替缺失的模块。在使用中发现有时改硬件模块的名字无效,保存后重新调用又恢复成老名字了。
2.编程区分全局变量函数、Setup、Loop三个功能区,结构很清晰,有利于学习者从图形编程向文本代码的自然过渡,同时自动生成的源码非常具有可读性。
3.输入框最好能自动改变大小,以适应不同内容的长度,比如函数名的输入框,当函数名较长时就只能显示部分内容了。
4.自定义函数都是无参函数,能否考虑也能使用有参函数,同时考虑允许有返回值,这样调用函数就更方便了,比如我这里使用的几个子函数,如果能加入速度参数,程序就更简化了。
5.编程功能模块中的“数学函数”建议还是改成“数学”,要么把“函数”改成自定义函数,不然两都容易混淆。
6.在“数学函数”中建议增加三角函数等函数。
7.编程中有些模块功能要进一步完善,比如“全角度电机(360度电机)”没有调速模块,只能是最大速或停止。
8.项目只能保存在网上,不能导出,建议增加导出和导入功能。
9.教育版不能设置、查看COM口,建议增加这一功能。
10.最后提一个可能不靠谱的建议:既然电路都搭建了,能否增加在线仿真的功能?
先就说一下初步的想法,有了新的想法再补充。有什么不对的地方请指教。
附上程序代码,第一次使用啃萝卜,错误的地方请指正。(因为硬件中没有电机模块,只好用LED替代,原先改名为端口号,重新调用又恢复成原名了)
下面是自动生成源码:
[mw_shl_code=cpp,true]/**
* Copyright(C), 2016-2038, KenRobot.com
* FileName: 智能小车超声波避障.ino
* Author: ntwhq
* Create: 2016/12/14
* Modify: 2016/12/14
*/
#include <SR04.h>
#include <Servo.h>
int led_0 = 3;
int led_1 = 5;
int led_2 = 6;
int led_3 = 9;
Servo servo_0;
SR04 ultrasound_0(8, 7);
float x = 0;
float M = 0;
float L = 0;
float R = 0;
void forward() {
digitalWrite(led_0, false);
analogWrite(led_1, x);
digitalWrite(led_3, false);
analogWrite(led_2, x);
}
void back() {
digitalWrite(led_0, true);
analogWrite(led_1, (255 - x));
digitalWrite(led_3, true);
analogWrite(led_2, (255 - x));
}
void stop() {
digitalWrite(led_0, false);
analogWrite(led_1, 0);
digitalWrite(led_3, false);
analogWrite(led_2, 0);
}
void turnright() {
digitalWrite(led_0, false);
analogWrite(led_1, x);
digitalWrite(led_3, true);
analogWrite(led_2, (255 - x));
}
void turnleft() {
digitalWrite(led_0, true);
analogWrite(led_1, (255 - x));
digitalWrite(led_3, false);
analogWrite(led_2, x);
}
void middleDistance() {
servo_0.write(90);
delay(100);
M = ultrasound_0.Distance();
}
void leftDistance() {
servo_0.write(170);
delay(150);
L = ultrasound_0.Distance();
}
void rightDistance() {
servo_0.write(10);
delay(300);
R = ultrasound_0.Distance();
}
void setup() {
pinMode(led_0, OUTPUT);
pinMode(led_1, OUTPUT);
pinMode(led_2, OUTPUT);
pinMode(led_3, OUTPUT);
servo_0.attach(10);
}
void loop() {
middleDistance();
if (M < 20) {
stop();
delay(50);
x = 120;
back();
delay(200);
} else {
if (M > 40) {
x = 160;
forward();
delay(200);
} else {
stop();
delay(50);
leftDistance();
rightDistance();
if (L > R) {
x = 160;
turnleft();
delay(300);
stop();
delay(50);
} else {
x = 160;
turnright();
delay(300);
stop();
delay(50);
}
}
}
}[/mw_shl_code]
|