意义所在

每过一段时间,我就会开始思考:我,我们,至今为止做的这么多事,到底是为了什么。如是过了这么久,那一定会有个意义吧。

的确,是有意义存在的。

我们做的事情可以分为两类:有些用来磨砺自己,有些用来达到梦想。

或许你会夜以继日地为一个很小的问题忙碌着,深陷其中。或许你遭遇困难种种,而依然感到一无所成。或许你曾经怀疑,这条路是否有终点。每个人,可能都会有。

我们总是不断追逐下一个目标,总是让自己面临困境。在一次次最纠结的时候,都做了相同选择——坚持。

当你在机器人身上品味过所有困难、挫折和沮丧,生活中的很多事情都将不再令你恐惧。人世间的难事大抵如此,每个人都需要勇气和毅力。

或许已经习惯了去挑战困难,令自己沉醉其中。但别忘了,最重要的事并非于此。

或许重复昨日的辛苦和喜悦,令人获得一点点满足。但我们永远无法靠这一点点欣慰度过此生。那些你一直期盼的,才是不得不为。

人总有一些对自己非常非常特别的事情要完成,或大或小,可多可少。或许我们都不是天才,一生走过不少弯路;或许我们都不是先知,一生犯下许多错误;或许我们都不是英雄,一生没有功成名就。但至少我们行走于路上,一直在为那些特别,燃烧自己。

我们青春的意义。

工业设计系教学建议

现状

工业设计系目前有两个专业:工业设计与艺术设计。两个专业的主要课程重合,又有些不同。虽然是针对工业设计专业所提,这些建议大部分也适合于艺术设计。

2010级工业设计主要来自第一批科技与创意设计试验班。从第一年接受了部分美术和设计基础课程,但实际上并没有很牢固。这些学生大多数都没有过美术学习经历,只能依样画葫芦,完成作业。而美术基础却是需要时间来反复磨砺的。而由于美术基础课会占用大量时间,科学技术类的课程,如数学、物理,则被大大简化。这对后续的教学产生了深刻影响。
在选择专业的过程当中,又有不少学生从两个工学试验班甚至医学、农学转过来。这部分同学是没有美术基础的。他们往往是在大二、大三甚至大四修读本该大一完成的美术基础课。这就导致整个工业设计专业的培养方案是被颠倒执行的。虽然从结果来看,学生修读完了所有学科的课程,但效果却与制定培养方案的初衷向违背。

艺术设计的学生原就是艺术生,美术积淀比较多,而在一些技术方面非常薄弱。原本工业设计与艺术设计在一起上课交流的目的即是优势互补。但实际上互补并不充分,尤其是对工业设计专业的同学,艺术和科技的能力都不突出。而与其他专业的交流,尤其是与计算机学院其他专业的交流,亦非常有限。

近年来,工业设计专业学生的发展有了更多元化的趋势。做产品设计的人少了,而做信息服务、软件交互设计、网页设计等新方向的人多了。原有的培养方案实际上是一个选择性很小的套餐,而不是像计算机科学与技术那样的模块化培养方案——就像自选餐。可选择不多的原因是工业设计系的课程非常少,而进一步的原因是教师数量太少,再进一步的原因是年轻教师的待遇太差。

工业设计的教师队伍人数不多。很多课程我们需要依赖外聘的老师,来自中国美院或者城市学院。仅有的教师也因为科研项目或者自己的业务经常出差,课程教学工作无法做到与学生充分交流,甚至有课程停上甚至研究生代讲的问题。这也导致了课程计划没能有效开展,甚至一些课程根本没有教学计划。没有执行课程计划,导致效率低下,不能保证教学目标达成,最终的损失还是要学生来承担。

工业设计的教育需要额外的硬件设施,就像计算机专业需要机房和电脑一样。各校办工业设计系,必备的有画室、摄影室、模型工坊。而这些工业设计系目前都没有,我们仅有几间刚刚够用的教室,(每个年级一间)而且硬件设施非常匮乏,投影仪坏了一年多没有修。设施缺乏导致很多课程,如立体造型、色彩构成,都无法开展。学生有一些好的想法,比如一些立体的造型,或者想把设计做成模型测试效果,都是非常困难的。艺术设计的学生学费比普通学生高一倍,但却没有得到相称的教学资源。

学院的四个专业中,其它三个基本上都是计算机类衍生的,管理和评价方法相似。但工业设计系的情况几乎完全不同,我们很少有计算机课,我们大部分课程属于课堂交流、工作坊形式的。而学院在统计课程评价的时候,经常忽略这一点。比如课程调查问卷,很多项是不符合工业设计特点的。像教学所使用的语言、教材的技术权威性等等。由于只有工业设计系在紫金港校区,学院的很多工作会忽略工业设计系,比如年级大会的主题基本都是与计算机和软件工程专业相关的,少有提及工业设计。

当前教学工作中,大量政治化和商业化因素在入侵。比如市政府办的创意杭州与我们的一些课程直接捆绑。还有一些企业的设计竞赛或活动,直接植入到课程里面。还有老师会将自己与某些公司的业务搬到课堂里面来,作为课程的课题作业。这样做虽然增加了学生实践的机会,但也有弊端。课程是有其专门的目的和安排的。很多精品课程的内容、课题选择、课时安排、教学目标,都是经过仔细推敲和严格控制的。而这些商业和政治活动的引入,将整个秩序都打破了,导致课程碎片化,教学目标偏离。

然后教学工作的监督评价情况。浙江大学对本科生教学工作的规定是非常严格的,但这些并没有在工业设计系的教学工作中充分落实。研究生代讲课、课程取消、到课率低等等情况才会普遍发生。如果学院在查课方面做得更到位,老师自然会更认真地对待教学工作。反之,老师可能会更愿意去忙自己的事情,放任教学工作的荒废。

教学工作组织不力的一大后果是学生的自由化。很多工业设计专业和艺术设计专业的学生感觉课程可上可不上,内容也无法吸引他们,甚至令他们很失望。因此他们会选择开辟自己的道路,由自己决定要做什么事。我们有的同学经常离开学校好几个月,音讯全无,考试不能通过只能休学;还有人在宿舍整日做自己的绘画创作,课程很少参加;还有不少沉迷游戏,无法自拔……而上游对下游的情况非常不了解,缺少沟通是非常可怕的。

培养方案建议

模块化

针对信息媒体设计、设计管理、传统产品设计等设置可选模块。学生只要完成一个模块即可结业,而不必去修读那些自己不感兴趣的课程。

去同质化

一些课程虽然名称不同,但却趋于同质化,比如计算机辅助设计基础,计算机辅助工业设计都是在讲CAD类软件使用。对这些课程进行合并精简,能够提高效率。

调整顺序

课程的先后关系存在一些问题。比如设计思维与表达课程,需要对设计已有比较多的认识才好开展,同时也需要CAD建模能力完成作业。而计算机辅助工业设计和工业设计史却都在这门课之后。

内容调整

建议课程中的电路原理、数字电路课程过于专业化,而缺少对设计整合的可用性,建议已其他课程替代,或者针对工业设计特点推出一门定制化课程。

软件工程课虽然是专业选修,但不在紫金港校区开课,10级几乎没有同学修读。建议在紫金港对工业设计开班,或者从培养方案中取消。

跨专业合作课程

与某个专业同学合上的课程。比如与数字媒体系的同学同上数字媒体设计,不同专业的同学结成一组,通过工作坊的形式合作。跨专业的合作有助于工业设计系的同学进行更深层次的互补,弥补当前工业设计和艺术设计内部交流的不足。

教学工作建议

增加教师数量

教师数量少的弊病如下:
1. 课程数量少,缺乏选择,很多应该跟上时代的课程找不到老师来开
2. 由于课程难以安排,一些老师不得不担任自己不熟悉的课程,课程无法充分开展
3. 部分课程只能启用外聘教师,而外聘教师对浙大工业设计可能并不了解

而增加教师数量必须提高年轻教师的待遇,尊重本科生教学工作取得的成绩。

课程监督有效化

目前学院的课程情况调查仅限于教务网的评价与纸质的调查问卷,而缺少实地的课上情况调查。

当前的现状是,在线点评和问卷并不能获得真实的情况,工业设计的教学内容和形式存在特殊性。到课率、老师的考勤都没有得到落实。

建议由专人进行各个课程的调查反馈工作。一方面监督课程的开展情况,一方面与学生互动沟通课程情况。

落实课程计划

每个课程都应当具有一个可执行的课程计划,不然无法保证课程目标的有效达成。这一点应当纳入到课程评价体系当中去。

课程计划的落实情况也应当受到监督反馈。教学计划更改必须有合理原因,教学计划无法完成也应作出解释。

项目与课程分开

像创意杭州这样的项目虽然是锻炼的好机会,但也容易把课程搞得一团乱。应该尽量将两件事分开,在课程中做创意杭州的项目并不明智。一些企业的商业项目则更应当让学生在课余时间自愿参与,系里可以组织相应的工作坊,避免干扰到教学工作的正常展开。

一切应为课程服务,而非课程为项目服务。

教学资源建议

增加必要教室

包括:
1. 模型坊,配备操作台和切割打磨等工具
2. 摄影室,摄像器材和幕布、反光板、灯箱
3. 画室,绘画素材和模型,可与其他专业共用
4. 专业教室,每个班应当有一个教室,三个年级六个班,应该有六个专业教室,但现在只有三个,50个人挤在同一个教室

专业教室优化

包括:
1. 改善网络状况

这些情况曾向学校相关部门反映过,但都不了了之。

天与地

在21岁的时候,我为生命谜题深陷。偶然看到了TVB的电视剧《天与地》,我的疑问慢慢解开。

每个人的21年都值得慢慢品味。那些看来乏味的过往,都在今天熠熠生辉。不要担心会遗忘,因为朋友会串起无数难解片段。怀念年少轻狂,无知懵懂。惋惜物是人非,岁月易老。谁未曾在静静的夜,泣泪两行,点点滴滴。

儿时玩伴如今天各一方,再难聚首。那年龙儿回故乡,匆匆忙忙。现在他是否已娶妻生子,终日为生活忙碌。我每年都会路过他原来住过的地方,小时候的事像默片般历历在目。生活的车轮总是向前滚,让你逐渐忘掉过去的珍贵。等你弄丢了礼物,找不到联系方式,忘记他的样子,才开始怀念。怀念,只有怀念。

我不记得当初发生过什么重要的事情,令我和田行结义。或许生活就是这样平凡,没有波澜壮阔。也不必寻找,或者创造特别的经历。生活就是它原本的样子,是不需要设计的。难以忘记那些在平平淡淡中陪伴我的人,令我感到那样安心幸福。我们会忘记很多重要的事情,即使常常在心里演绎。那些好像不重要的,却会在记忆中慢慢填满。

卓凡离开学校的时候,我们都感到十分难过。我们是很好朋友,虽然是这样。但人总是难以在自己和别人之间找到一个平衡。我们总是自己顾自己,而忘记了朋友需要陪伴,关注。年岁一点点沉淀,我已经无法想起谁,和他聊聊天,不管说些什么。所谓生于世上,无牵无挂,真得好吗?还是当逐渐失去了所有珍贵的牵挂,才会自己坚强?

我不知道范的理想是什么,但我知道他一直有。我曾以为每个人都应该自己撑起所有事情,我曾以为每个人都应该坚强。谁都无法承担所有,谁都无法一直坚强。纵使范一样天赋过人,也有无法越过的鸿沟。我想我可以做些什么,为别人的理想。我相信,亦会有人帮我完成心愿。当我们结束旅程,会在日志里记下沿途的经历,而不是那个从未到达的终点。

如果命运能够重新编排,你是否会和我一样,期望不同结局。如果命运能够提前预见,你是否会和我一样,试图逃脱宿命。

很遗憾,生活只是,一声叹息。

陪伴

有时我觉得需要理想成就,但其实我只是需要陪伴。朋友,请将我记起。

自行车测速器

今天做了一个为自行车测速的传感器。原理很明了:在自行车轮圈上均布贴上黑色贴条,而轮圈接近白色,转动时灰度传感器就会采集到黑白交替的频率,以此确定速度。

灰度传感器模块由光电对射管和放大器电路组成,能以某一基准分辨反射灰度是偏黑还是偏白。这个基准可以通过调节电位器来改变。灰度传感器采集的是反射灰度,而非颜色实际的灰度,反射面的角度和距离都会产生影响。即使是黑色,在足够近的情况下也能反射足够多红外线。因此在使用过程中要调节。

采集频率是简单的,但如何采集到可靠稳定的数据就有不少麻烦。于是我们采用了连续采样拟合的办法,尽量避免速度的异常波动。

在控制指示灯的过程中,我们的电路装在自行车上,不易于连接电脑调试。我们用蓝牙模块接在Arduino板上,通过手机接收,解决了这个麻烦。

那么勇敢

这一篇,写给另一位挚友。纪念年轻的勇气,无知无畏。

记得初次见面,我就感觉到,我们应当是同样的人。怀着对世界的憧憬与质问,从来不会轻易相信。因为珍视自我,而无法甘心平凡。来到大学找一个梦想,却发现什么也没有。所有宝贵的东西,都要自己营造。

我会把画板丢到一边,跑去做自己的机器人。你会去尝试很多新奇的事,环保,急救,做志愿者。我们不是不喜欢设计学呀,只是怀有一点希望。希望一生的路,更多自己选择。

年少无知是最难得,可以把握自己,一起否定世界的观点。我们争论很多问题,仿佛总是关于自我的意义。我们走过那么多地方,你会看来往的人,而我只关心风景。青春让不同的人,思考相同的问题。

那一次雨中,你我困在博物馆,待过好久。聊了很多,也许不算多。我们都是没有梦想的人,没有一件一定要做的事。但愿望是存在的啊,比任何人都强。或许是自由无拘,或许是寻求改变,或许只是向现在这样,无目的地否定。可能只有这样,才能找到真的自我,虽然已经如此接近。

但是呀,我们终究还是不同,我没有你那样勇敢。

你我都看到了现实与自我无法相容的真相。大学给我们的梦早就过了保质期。你走了,去寻找自己真正的归宿,为实现自由。或许此刻你在某个画展上找到了新的启发,欣喜若狂。而我,依旧留在原地。在等待中放弃一些自我,只为濒死的愿望能短暂存活。

你寻找自由的路一定不平坦吧。你会遇到那么多挫折,却不必与谁说。迷失的思考,追寻中受伤,生活的磨难,还有很多误解。这些,都算不得什么。路上那么多风景,有趣的事情,是他们无法体会。我一直能看到,你离我们的自由越来越近,那是最最重要的。

我一直希望像你一样,那么勇敢。我有一天,也会踏上你走过的路,站在自由的顶端。

给亲爱的卓凡

Arduino与Processing的串口通信

在网络上普遍存在的Arduino与Processing互动的例子,都具有一个很简单的构造:Arduino上用Serial.print()发送,在Processing中用Serial.readString()读取,或者反过来。然而实际应用过程中大家就会发现这个简单的逻辑模型会发生莫名其妙的错误。最显著的是有时候会收到空值,即使用Serial.available()检测,也会有时收到间断的字符串或者多个字符串混在一起了。

下面是一个经典的Processing与Arduino通信实例:

//Processing Code
import processing.serial.*;

Serial myPort;

void setup(){
  myPort = new Serial(this,"/dev/ttyACM0", 115200); //Set Serial Port

}

void draw(){
  if(myPort.available()>0){
    String message = myPort.readString();
    println(message);
  }
}
//Arduino code
int data=12345; 
void setup()
{
  Serial.begin(115200);//rate
}
void loop()
{
  Serial.print(data); //send data
  delay(1000);
}

然后我们期待着每次获取“12345”并显示在屏幕上,但事与愿违,我们得到的情况是这样的:

12345
123
45
12345
12345

输出时的中断是怎样产生的呢?要探究这个问题的根源,需要重新审视串口通信的原理。

串口通讯就像一趟公共汽车,每个字节是一个在等车的人。他来到车站(发送数据),车还没有来,所以新来的人就一直等待(缓存)。当公共汽车来了的时候,将这些人一次接走(读取数据),当然车也是有容量的,只能载一定数量的人(缓存大小)。现在有一个旅行团(字符串/字符数组),一部分人走在前面刚刚赶上了车(被读取),而另一部分人没赶上,只能等待下一班车(下一次读取)。另一种情况是,两个旅行团都在车站等车,被同一班车接走了。这就是为什么我们读取的时候字符串会断成两节,或者并起来。

核心原因是:串口流通的数据都是bytes而没有字符串概念,所有发送数据都会按一个byte一个byte缓存,不论是否是连续字符串;而读取时会取走所有缓存bytes,不论它们是否是一个、半个还是多个字符串。

Arduino和Processing的数据收发速度是不一样的。如果用Arduino延时较长时间,Processing可能读取一个字符串或字符串的一部分。如果Arduino延时较短,Processing可能读取多个字符串,但不一定完整。在读取字符串的时候,无法确定上一个字符串是否被读取了,当前字符串是否缓存完毕,因为字符串都已经切成了bytes,连成一串。这个问题是串口通信本身造成的,一定会出现。

一种解决方法是,通过在接收端缓存数据来解决这个问题。为传输数据设置一个结束标记,如'\n'(换行符),就能在接收到的数据流中识别到一个字符串的结尾。当未遇到结束标记,就一直将串口数据保存在一个buffer变量中,继续接收。

Processing的SerialEvent事件类型就提供了这种方式,使用bufferUntil(ch)可以在遇到某个指定字符时才完成缓存。

程序实例:

//Processing Code
import processing.serial.*;

Serial myPort;

void setup(){
  myPort = new Serial(this,"/dev/ttyACM0", 115200);  //in fact, any rate is ok...
  myPort.bufferUntil('\n');  //buffer until meet '\n', then call the event listener
}

void draw(){
  
}

//listen to the event. when buffer filled, run this method
void serialEvent(Serial p) {
  String inString = p.readString();
  print(inString);
}

//then the buffer will reveive all the bytes
//Arduino Code
int data=12345; 
void setup()
{
  Serial.begin(115200);//rate
}
void loop()
{
  Serial.println(data); //send data, end up with '\n'
  delay(1000);
}

当然,这种方法也可以用在普通的串口通信中,不必使用SerialEvent。接收的数据不直接使用,而是作为缓存。若未遇到结束标记,就继续读取下一次。当遇到结束标记,即完成缓存。

程序实例:

//Processing Code
import processing.serial.*;

String message;
String temp;
Serial myPort;

void setup(){
  myPort = new Serial(this,"/dev/ttyACM0", 115200); //Set Serial Port
}

void draw(){
  if(myPort.available()>0){
    temp = myPort.readString(); //temp for read bytes
    for(int i = 0; i < temp.length(); i++){
      //if meet the end mark
      if(temp.charAt(i) == '\n'){
        println(message);
        message = "";  //clean string
      }
      else
        message += temp.charAt(i);  //store byte
    }
  }
}
//Arduino Code
int data=12345; 
void setup()
{
  Serial.begin(115200);//rate
}
void loop()
{
  Serial.println(data); //send data, end up with '\n'
  delay(1000);
}

遥控变色灯

课程作业总是没完没了。有时候不得不日复一日地做同样的事情,虽然明明知道不久就会全忘掉。

早晨起来就开始琢磨这次信息产品课要做点什么。淘宝上买的蓝牙模块还没有送到,电脑无线互动做不了。而且第一周是基本练习,包括数字输入输出,模拟输入输出,串口上载和下载,开关。原材料也很少,电阻,LED,一个全彩LED,遥控器,还有光敏二极管,电位器,开关,小键盘什么的。最后选择了全彩LED和红外遥控器。全彩LED我是第一次用,红外遥控看起来很酷。他们拼起来便是一个遥控变色灯。

原理设想比较简单,通过红外遥控输入控制信号,使R,G,B值增减,单片机控制三路PWM输出的占空比,从而达到变幻颜色的目的。电路也很快搭好了,只接了两个元件:全彩LED,红外接收器。全彩LED使用了9,10,11三个PWM端口,而红外接收器接在13端口。
遥控彩灯原理图示意
Arduino有现成的红外接收库。一开始就非常顺利地接收了红外遥控的信号,并记录下了每个键所对应的值,这是通过串口发送电脑回来的。很特别的是,当一直按下一个键时,后续会重复返回FFFFFFFF。然后根据按键控制红灯的亮度,并设计成若一直按下,则会重复动作,这样就不必按很多次按钮了。

当我们如法炮制,添加了绿灯,一切正常,添加了蓝灯,却无法工作。按下蓝灯控制键,程序便会中断。这是为什么呢?我们开始一直以为是遥控的原因,更换了遥控上的其他键来控制,情况是一样的。后来我们又检查程序,将可能的错误修正。但依旧是红绿灯正常,而蓝灯不能使用。三个灯应该是对等的,如果其他两个没有问题,说明程序是可行的。既然该换了按键也没有用,说明遥控这部分也没有问题。我们将蓝绿调换,发现蓝色可以正常工作,说明全彩LED正常。所以最终有问题的是电路板硬件或者连接。蓝灯接入的11端口可能存在问题,便将其该换到6号端口,如此就解决了问题。

AVR单片机的6路PWM是有差异的。Arduino将其同质化处理,虽然简化了认知过程,但导致很多问题无法解释。机器人协会曾经也讨论过是否要引进Arduino,但后来还是否定了这个计划。因为Arduino的思维方式虽然在早期能够快速入门,但却导致在进阶的过程中处处遭遇困难。以后再去认识硬件细节的设计,摒弃原有的理解,是非常困难的。

IMG_0054

IMG_0055

IMG_0056

#include "IRremote.h"

int RECV_PIN = 13;

int red = 0;
int blue = 0;
int green = 0;

int last = 0;
int now = 0;
 
IRrecv irrecv(RECV_PIN);
 
decode_results results;
 
void setup() {
  Serial.begin(9600);
  irrecv.enableIRIn();
  pinMode(9, OUTPUT);
  pinMode(10, OUTPUT);
  pinMode(6, OUTPUT);
}
 
void loop() {
  
  if (irrecv.decode(&results)) {
    now = results.value;
    Serial.println(now);
    
    if(now==-1)
      now = last;
    
    switch(now){
      case -23971:
	if(red==0)
	  red=255;
	else
	  red--;
	break;
      case 25245:
	if(red==255)
	  red=0;
	else
	  red++;
	break;
      case 8925:
	if(green==0)
	  green=255;
	else
	  green--;
	break;
      case 765:
	if(green==255)
	  green=0;
	else
	  green++;
	break;
      case -8161:
	if(blue==0)
	  blue=255;
	else
	  blue--;
	break;
      case -22441:
	if(blue==255)
	  blue=0;
	else
	  blue++;
	break;
      case -7651:
	red=0;
	green=0;
	blue=0;
	break;
      default:break;
    }
    irrecv.resume();
    last = now;
  }
  
  color(red, green, blue);            
}

void color(int r, int g, int b){
  analogWrite(9, r);
  analogWrite(10, g);
  analogWrite(6, b);
}

机器人:俱乐部与实验室的差异

在大学里,我接触到了两个和机器人有关的地方:学生组建的机器人俱乐部,学校组织的机器人实验室。

这是两个不同群体的代表,在很多方面代表了深刻的差异。

机器人俱乐部是一个被兴趣驱动的群体,他们是非常社会化的。俱乐部的目标或许可以用其他语言来表示,但本质即是:自我的乐趣。不论是机器人带来的乐趣,还是这个过程产生的乐趣。我们是在玩机器人,不必去在意是否有用。

而实验室是有现实目的的,不论是研究成果,还是应用价值。被关注对象之外的东西牵制,导致这个过程逐渐模式化。引入工程管理方法,提高产出效率。这是在造机器人,有用的机器人。