2013-12-15

嫦娥飞入广寒宫 - 南都网


昨21时11分“嫦娥”飞入广寒宫 中国探测器首登地外天体,中国成第三个独立自主实施月球软着陆国家 2013-12-15

http://paper.nandu.com/nis/201312/15/153360.html

摘要:我国嫦娥三号探测器自12月2日由长征三号乙改二号型运载火箭从西昌卫星发射中心发射升空以来,经过两次轨道中途修正、近月制动、降轨和动力下降等阶段,于14日21时11分成功落月。身披五星红旗的嫦娥登上月球正式驾临广寒宫,“落户”在月宫“新家”———虹湾。

北京飞控中心大屏幕上显示的嫦娥三号探测器监视相机传回的月球表面照片。 (1/10)

探测器传回月球画面

   据新华社电 我国嫦娥三号探测器自12月2日由长征三号乙改二号型运载火箭从西昌卫星发射中心发射升空以来,经过两次轨道中途修正、近月制动、降轨和动力下降等阶段,于14日21时11分成功落月。身披五星红旗的嫦娥登上月球正式驾临广寒宫,“落户”在月宫“新家”———虹湾。中国成为继美国、前苏联之后第三个实现月

面软着陆的国家,人类第130次探月之旅完美上演。也是在1976年苏联“月球24号”探测器登陆月球后第一个重返月球的人类探测器。

   落月是从15公里高度开始的。11分钟的落月过程中,嫦娥三号依靠自主控制,经过了主减速段、快速调整段、接近段、悬停段、避障段、缓速段等6个阶段,相对速度从每秒1 .7公里逐渐减为0。在距离月面100米高度时,探测器暂时停下脚步,利用敏感器对着陆区进行观测,以避开障碍物、选择着陆点。在以自由落体方

式走完最后几米之后,平稳“站”上月面的4条着陆腿触月信号显示,嫦娥三号完美着陆月球虹湾地区。

   这是人类第130次探月活动。12月2日1时30分在西昌卫星发射中心发射升空的嫦娥三号是我国发射的第一个地外软着陆探测器和巡视器,也是在1976年苏联“月球24号”探测器登陆月球后第一个重返月球的人类探测器。

   作为中国探月工程“绕、落、回”三步走的第二步,在实现月球软着陆的同时,嫦娥三号还肩负着突破自动巡视勘查、深空测控通信、月夜生存等关键技术的使命。

   由着陆器和“玉兔”号月球车组成的嫦娥三号月球探测器总重近3.8吨。在接下来的几个小时里,“玉兔”号将驶离着陆器,开始为期约3个月的科学探测,着陆器则

在着陆地点进行原地探测。

北京飞控中心突破5项关键技术

   高精度月面视觉定位技术

   巡视器月面遥操作要利用探测器下传的图像数据,进行高精度视觉定位,只有定位准确才能确定往哪里走、去哪探测。北京飞控中心采用多项新技术新算法,实现了月面巡视器的高精度定位。

   月面巡视动态规划技术

   技术人员设计了基于规划图的状态空间前向搜索算法,构建了三层规划模型,解决了路径规划与巡视勘察自动验证和动态改进的难题

   巡视器行走控制技术

   中心通过建立月面综合环境模型,设计了里程最短、能源最省等最优路径搜索算法,控制巡视器实现盲走、自主规划避障等多种移动方式。

   巡视器可视化操作与控制技术

   实现遥操作控制可视化是地面指挥决策的重要辅助手段。中心建成了月球车手动驾驶系统,应用立体显示技术,实现了人在回路进行控制的遥操作环境。

   多体制深空干涉测量数据处理技术

落月“密码”

   中国“轻功”是怎样练成的?

   减速、悬停、避障,嫦娥有六道密码

   探测器本身加上推进剂共3780公斤的“庞然大物”在11分钟里速度从每秒约1.7公里减到零,从15公里高处降落到一个陌生又崎岖不平的地方,该是怎样的惊心动魄。

“嫦娥”的“轻功”是怎样练成的?专家告诉记者,科研人员在“嫦娥”的“脑子”里输入主减速、快速调整、接近、悬停、避障和缓速下降六道“密码”。

   动力:推得精、变得准

  问:月球上没大气,嫦娥三号是如何实现减速的?

   火箭专家、中国航天科技集团公司第六研究院副院长刘志让:我们为嫦娥三号量身研制了变推力发动机。它朝着嫦娥三号落月运动的反方向作用,从而实现减速。只有发动机“推得精”,嫦娥三号的速度才能“变得准”。嫦娥三号推进分系统由1台7500牛变推力发动机和若干台姿控发动机组成。这台7500牛变推力发动机是我国目前推力变化范围最大的发动机。

   北京飞控中心总体室副主任吴凤雷:短短几分钟内,嫦娥三号在导航制导控制系统的指挥下改变推力大小,完成主减速和快速调整。速度从每秒1.7公里降至大约每秒50米,高度从15公里降至不到3公里。

  制导:聪明的“大脑”

   问:15公里内的动力下降,嫦娥三号是自主导航还是根据地面指令行动?

   嫦娥三号探测器系统副总指挥谭梅:整个动力下降段就十多分钟,时间非常非常短。国外同行把类似这种地面无法直接控制探测器的短暂时间称为“黑色瞬间”。

只能事先把程序设定好存进去,让嫦娥三号有“足够聪明的大脑”——— 导航制导控制系统。

   中国航天科技集团公司五院西安分院党委书记李军:动力下降段测距测速敏感器发挥重要作用。安装在着陆器上的测距测速天线,像灵敏的“触角”,实时收发射频信号,并及时传递至探测器控制系统,实时掌握嫦娥三号着陆器相对于月球表面的速度和位置。

   吴凤雷:完成快速调整后嫦娥三号进入接近段和悬停段,距离月面高度逐步下降至约百米,然后悬停。

   避障:“我们都是你的眼”

   问:月面崎岖不平,嫦娥三号如何避开岩石大坑?

   嫦娥三号着陆器分系统副总设计师张熇:嫦娥三号在接近段有一次光学成像,先大范围找一个相对平的地方挪到那附近。然后100米悬停的时候再找一个更平坦的小范围。

   谭梅:悬停的目的就是让嫦娥三号避开障碍、搜索安全着陆区。嫦娥三号携带的测距测速仪,激光三维成像敏感器等就相当于嫦娥的“眼睛”。它们对月球表面快速扫描,并绘制出立体影像。

   中科院上海技术物理研究所舒嵘研究员:激光三维成像敏感器的测量范围是50至120米,大约从距月面100米处开始工作,为嫦娥三号提供着陆区三维地形信息,帮助它避障。

  落月:“中华好轻功”

   问:嫦娥一号完成绕月使命后重重撞月香消玉殒,嫦娥三号如何做到轻柔落月?

   吴凤雷:经过粗避障、精避障,嫦娥三号距离自己选择的着陆点只有数米时,接到关机信号发动机关闭,进入无动力下降。着陆时,“嫦娥”的垂直速度不大于4米每秒。

   嫦娥三号探测器系统总设计师孙泽洲:地外探测器的落地缓冲可以用气囊或者缓冲腿,嫦娥三号采用了四条着陆腿。它因此成为我国第一个带腿的航天器。

   着陆缓冲分系统主任设计师杨建中:这四条腿着陆时承受巨大的冲击,却能保证嫦娥三号强、轻、柔、稳地落月。我们骄傲地称之为“中国腿”。

“三姑娘”将在月宫待多久?

   将“永驻”月宫,着陆器和巡视器将互拍

   身披鲜艳五星红旗的嫦娥“三姑娘”将会在月宫待多久,她会回到地球母亲的怀抱么?

   中国探月工程总设计师吴伟仁在接受新华社记者采访时表示,嫦娥三号探测器由着陆器和巡视器组成。按照设计目标,嫦娥着陆器将在月球工作一年,巡视器则工作三个月。我们希望嫦娥三号能够实现这个寿命,更希望它能超过这个寿命,就像嫦娥二号一样。

   嫦娥二号是嫦娥三号的先导星,2010年发射升空,设计寿命半年。如今,超额完成任务的嫦娥二号飞到了距离地球6000万公里以外的深空,变成绕太阳运行的人造小行星。

   据悉,嫦娥三号着陆器将在月面着陆区进行就位探测。巡视器,即“玉兔”号月球车,将在月面“走”起来进行巡视探测。两器将进行互拍,它们将共同完成月表形貌与地质构造调查;月表物质成分和可利用资源调查;地球等离子体层探测和月基光学天文观测。

   专家们表示,嫦娥三号的任务是“落月”,实现我国航天器首次地外天体软着陆。它不是返回式卫星,没有另带一颗运载火箭用于返回地面。完成任务后,嫦娥“三姑娘”就“永驻”月宫了。

   探月工程二期总体部部长刘彤杰在就嫦娥三号任务作科普讲座时介绍,探月工程三期已于2011年批准立项。计划在2017年前后实现月面采样并返回地球。(新华社)

月面软着陆到底有何风险?

   嫦娥落月至少有五大考验

   “月球降落是整个任务最关键阶段。”中国探月工程总设计师吴伟仁说,“在短短几百秒内从15公里安全降落到月面预选着陆区,这是全新也是最重要的考验。”这注定是惊心动魄的720秒:以前的苏联直到第12次尝试才获得成功,美国也在品尝了3次失败苦果后方平安着陆。月面软着陆到底有何风险?专家认为,嫦娥落月至少经历了五大考验。

  落月虹湾面临未知新世界

   与美国、苏联月球探测主要集中在月球赤道附近不同,嫦娥三号选择在虹湾区着陆,这是一个崭新的、充满未知的世界。为了能让嫦娥三号“落”得安全,嫦娥二号已打了“前站”:它用CCD立体相机对虹湾进行了局域超高分辨率立体成像,获得了分辨率约为1米的图像。

  新技术新产品等待登月考验

   月球上没有大气,着陆方式与在地球上完全不同,传统依靠空气摩擦减速的火箭发动机和推进系统在月球上不再奏效。

   “为此,我们首次使用了我国自主设计制造的变推力发动机。”吴伟仁说,发动机具有1500牛到7500牛的大推力变化,能够很好地适应不同飞行阶段对发动机推力的需求。

   这是我国首次将变推力发动机应用于航天器。

  “黑色12分钟”全凭自主控制

   从15公里高度降至月球表面,这惊心动魄的12分钟被称为“黑色12分钟”,嫦娥三号要完全依靠自主控制,完成降低高度、测距、测速、选择着陆点、自由落体着陆等一系列动作。

   这期间,人工干预的可能性几乎为零。这是因为落月过程中的每一个动作都非常短暂,安装在探测器上的传感器一旦获得信息,需要探测器作出极快的响应,而38万公里的地月距离以及信号延迟,根本不足以让信息传回地面再由地面上传指令。

  “中国腿”挑战月面软着陆

   尽管采用了先进的制导导航与控制系统,探测器着陆瞬间还是会对月面产生撞击。为了避免设备受到过大的冲击载荷,探测器上使用了一个着陆缓冲分系统,也就是嫦娥三号的4条“腿”。

   “着陆缓冲机构主要用于缓冲着陆器的冲击能量,俗称着陆腿。”探测器系统着陆器着陆缓冲分系统主任设计师杨建中用8个字概括着陆腿的特点:强、轻、柔、稳、多、新、全、难。

   撞击瞬间考验设备可靠性

   “中国腿”的启用极大降低了着陆时的冲击力,但嫦娥三号上的设备依旧经受了严峻考验。(新华)

嫦娥为何落“虹湾”?

   虹湾,是月球上一个地理名称,中国探月的首站,也是“嫦娥”“玉兔”的“新家”。虹湾地处月球的北半球、西半球,月球正面的雨海的西北角,跟墨西哥湾差不多大,总体上是一块平原。

   在跟其他四五个候选区进行“P K”后,虹湾被最终确定为嫦娥三号着陆区。因为虹湾区地形平坦、日照充足、通信畅通、轨控有效,并且是月球研究的空白区,此前还没有其他国家勘察过。

   探月之旅

   2007年10月2 4日 嫦娥一号直刺苍穹。作为我国首颗探月卫星,嫦娥一号成功“绕月”。这是继人造地球卫星、载人航天飞行之后我国航天事业发展的又一座里程碑,标志我国进入世界具有深空探测能力的国家行列。

   2010年10月1日 嫦娥二号成功发射,此后获得世界首幅分辨率为7米的全月图;圆满完成既定任务,超额完成拓展任务。目前,已成为我国首个人造太阳系小行星的嫦娥二号,飞到了距离地球6000万公里的遥远深空。

   2013年12月2日 嫦娥三号披挂出征。

   2013年12月14日“三姑娘”瞄准虹湾着陆区稳稳“一落”———月面软着陆。接下来,着陆器将在着陆区就位探测。而“玉兔”将缓缓驶离“走起来”——— 利用各种科学载荷进行月面巡视探测。

  链接·奔月任务

   “嫦娥”两大任务:登月+月面巡察

   被称为“三姑娘”的嫦娥三号是我国首个在地球以外天体实施软着陆的航天器。它有两个主要任务,一是实现月面软着陆,二是实施月面巡视勘察。嫦娥三号是着陆器和巡视器(俗称“月球车”)的组合体,落月后,“嫦娥”会将怀抱的巡视器释放到月面上,成为两个独立的探测器,各自在月面开展探测任务。

   承担月面巡视探测任务的“玉兔”号是中国第一辆月球车。它的质量约140千克,以太阳能为能源,耐受月表真空、强辐射和高温差等极端环境。它能够自主对月面环境和障碍进行感知和识别,同时在地面测控系统和地面应用系统的指挥下对巡视路径进行规划,具备前进、后退、原地转向、行进间转向、20度爬坡、20厘米越障的能力。

   “嫦娥”落月后,将利用降落相机、地形地貌相机、极紫外相机和月基光学望远镜等有效载荷,在着陆区进行为期1年的就位探测。“玉兔”号将在月球表面开展3个月的巡视,期间将依靠各种先进设备对月表进行三维光学成像、红外光谱分析,开展月壤厚度和结构的科学探测,对月表物质主要元素进行现场分析,帮助人们更直接、更准确地了解神秘的月亮。

   嫦娥三号月球软着陆细节全图解

   http://t.cn/8kXIbVT







嫦娥三号完美落月 中国探测器首次登上地外天体  新华社   发表于2013-12-15 07:29

http://www.dfdaily.com/html/21/2013/12/15/1094854.shtml

嫦娥三号探测器14日21时11分在月面预选着陆区域成功着陆,中国成为世界上第三个实现地外天体软着陆的国家,人类第130次探月之旅完美上演。

12月14日21时11分,嫦娥三号携“玉兔”号月球车落月。这是北京飞控中心大屏幕上显示的嫦娥探测器监视相机传回的月表照片。“嫦娥”“玉兔”今天将互留倩影,它们的月宫故事刚刚开始。 新华社 图

  综合新华社消息

  嫦娥三号探测器14日21时11分在月面预选着陆区域成功着陆,中国成为世界上第三个实现地外天体软着陆的国家,人类第130次探月之旅完美上演。

12分钟完美着陆

  落月是从15公里高度开始的。昨日21时00分,首次应用于中国航天器的空间变推力发动机开机,大约12分钟的落月过程中,嫦娥三号依靠自主控制,经过了主减速段、快速调整段、接近段、悬停段、避障段、缓速段等6个阶段。

  在距离月面100米高度时,探测器暂时停下脚步,利用敏感器对着陆区进行观测,以避开障碍物、选择着陆点。11分钟后,在以自由落体方式走完最后几米之后,平稳“站”上月面的4条着陆腿触月信号显示,嫦娥三号完美着陆月球虹湾地区。

  嫦娥三号探测器自12月2日由长征三号乙改二号型运载火箭从西昌卫星发射中心发射升空以来,经过两次轨道中途修正、近月制动、降轨和动力下降等阶段,最终完美抵达了此行的终点站。

  由着陆器和“玉兔”号月球车组成的嫦娥三号月球探测器总重近3.8吨。作为我国首个在地球以外天体实施软着陆的航天器,嫦娥三号有两个主要任务,一是实现月面软着陆,二是实施月面巡视勘察。

  降落后,着陆器上的降落相机第一个开机工作,在“嫦娥”落月过程中获取着陆区域的光学图像。着陆器上的地形地貌相机除了承担月表地形地貌光学图像的科学任务外,还有一项工程任务——对“玉兔”进行静态拍照和动态摄影。在一年的时间里,着陆器将利用降落相机、地形地貌相机、极紫外相机和月基光学望远镜等有效载荷,在着陆区进行就位探测。

“嫦娥”、“玉兔”今将互拍

  在接下来的几个小时内,“玉兔”号将驶离着陆器,开始为期约3个月的科学探测。“玉兔”的全景相机将对着陆区和巡视区月表进行光学成像,用于对巡视区地形地貌、撞击坑、地质构造的综合研究。此外,它会“回望”着陆器,为之拍下“倩影”。之后,“玉兔”号将依靠各种先进设备对月表进行三维光学成像、红外光谱分析,开展月壤厚度和结构的科学探测,对月表物质主要元素进行现场分析,帮助人们更直接、更准确地了解神秘的月亮。

  “玉兔”号是中国第一辆月球车。它的质量约140千克,以太阳能为能源,耐受月表真空、强辐射和高温差等极端环境。它能够自主对月面环境和障碍进行感知和识别,同时在地面测控系统和地面应用系统的指挥下对巡视路径进行规划,具备前进、后退、原地转向、行进间转向、20度爬坡、20厘米越障的能力

  嫦娥三号的探月行动是人类第130次探月活动。据资料统计,在嫦娥三号之前世界上共进行了129次月球探测活动,成功率为51%。其中,只有苏联和美国完成了13次月面无人软着。

嫦娥三号将永驻月球

  专家们表示,嫦娥三号的任务是“落月”,实现我国航天器首次地外天体软着陆。它不是返回式卫星,没有另带一颗运载火箭用于返回地面。完成任务后,嫦娥三号就“永驻”月宫了。中国探月工程按“绕”、“落”、“回”三期分步展开。嫦娥一号完成绕月任务后受控撞月。以“落月”为主要任务的二期由先导星嫦娥二号、主任务星嫦娥三号和备份兼改进星嫦娥四号共同完成。探月工程二期总体部部长刘彤杰在就嫦娥三号任务作科普讲座时介,探月工程三期已于2011年批准立项,计划在2017年前后实现月面采样并返回地球。

实现多个技术突破

  探月工程新闻发言人裴照宇表示,嫦娥三号任务有八大创新:我国航天器首次地外天体软着陆;首次地外天体巡视探测;首次对月面探测器的遥操作;突破多窗口、窄宽度发射和高精度入轨技术;我国首次研建大型深空站,初步建成覆盖行星际的深空测控网;首次在月面开展多种科学探测;首次在航天器上采用同位素热源和两相流体回路技术,满足探测器月夜生存;研制了地球重力模拟等特种实验设施,形成一系列先进实验方法。

  “与其他卫星或探测器相比,嫦娥三号新研比例更高。从着陆器到巡视器,到实验设施实验方法,80%的产品和技术都是新产品、新技术。”嫦娥三号探测器系统总设计师孙泽洲说。

  嫦娥三号是我国航天领域迄今最复杂、难度最大的任务。自2008年批复立项以来,先后经历了21个月的方案设计、26个月的初样研制、19个月正样研制。

Q&A 问与答

  问:月球上空没有大气,嫦娥三号是如何实现减速的?

  中国航天科技集团公司第六研究院副院长刘志让:我们为嫦娥三号量身研制了变推力发动机。它朝着嫦娥三号落月运动的反方向作用,从而实现减速。嫦娥三号推进分系统由1台7500牛变推力发动机和若干台姿控发动机组成。这台7500牛变推力发动机是我国目前推力变化范围最大的发动机。这是变推力发动机在我国探月工程乃至我国航天事业中的首秀。

  北京飞控中心总体室副主任吴凤雷:短短几分钟内,嫦娥三号在导航制导控制系统的指挥下改变推力大小,完成主减速和快速调整。

  问:15公里内的动力下降,嫦娥三号是自主导航还是根据地面指令行动?

  探测器系统副总指挥谭梅:整个动力下降段就十多分钟,时间非常短。国外同行把类似这种地面无法直接控制探测器的短暂时间称为“黑色瞬间”。只能事先把程序设定好存进去。

  中国航天科技集团公司五院西安分院党委书记李军:动力下降段测距测速敏感器发挥重要作用。安装在着陆器上的测距测速天线实时收发射频信号,并及时传递至探测器控制系统,实时掌握嫦娥三号着陆器相对于月球表面的速度和位置。

  吴凤雷:完成快速调整后嫦娥三号进入接近段和悬停段,距离月面高度逐步下降至约百米,然后悬停。

  问:月面崎岖不平,嫦娥三号如何避开岩石大坑?

  着陆器分系统副总设计师张熇:嫦娥三号在接近段有一次光学成像,先大范围找一个相对平的地方挪到那附近。然后一百米悬停的时候再找一个更平坦的小范围。

  谭梅:嫦娥三号预选着陆区虹湾相对平坦。但月球表面仍然存在坡度、石块等不确定地质条件。嫦娥三号携带的测距测速仪,激光三维成像敏感器等就相当于嫦娥的“眼睛”。它们对月球表面快速扫描,并绘制出立体影像。

  中科院上海技术物理研究所研究员舒嵘:激光三维成像敏感器的测量范围是50至120米,大约从距月面100米处开始工作,为嫦娥三号提供着陆区三维地形信息,帮助它避障。

  问:嫦娥一号完成绕月使命后重重撞月香消玉殒,嫦娥三号如何做到轻柔落月?

  吴凤雷:经过粗避障、精避障,嫦娥三号距离自己选择的着陆点只有数米时,接到关机信号发动机关闭,进入无动力下降。着陆时,“嫦娥”的垂直速度不大于4米每秒。

  探测器系统总设计师孙泽洲:地外探测器的落地缓冲可以用气囊或者缓冲腿,嫦娥三号采用了四条着陆腿。它因此成为我国第一个带腿的航天器。

  据新华社电

录入编辑:周子静

关于更多 嫦娥三号 的新闻
 
嫦娥三号已飞行近35万公里 取消第三次中途修正

嫦娥三号器箭分离遨游天际 画面如科幻大片

嫦娥三号昨成功实施首次轨道修正

嫦娥三号进入3小时发射程序 火箭全面检查状态良好


.END

2013-12-10

spi testing notes

































// ***************************************************************************
// Program  - Fong EKG v0.97
// Function - Testing Olimex EKG
// Author   - TL Fong
// Build    - 2013.12.10.01
// Date     - 2013dec10hkt1023
// Hardware - WuyinS/Olimex/CooCox/MagicBlue/WHUT/Somy LPC1114/C14/301
//            Olimex EKG/EMG R.B 2011
// Software - CoIDE 1.7.5, CoLinkEx 1.1, Flash Magic v7.66, GCC ARM 4.7
// **************************************************************************

#include "test050.h"

// ***************************************************************************
// Main Function
// ***************************************************************************

int main()
{
testMax7219DisplayEightDigitV09d();
}

// ***************************************************************************
// End
// ***************************************************************************




// ***********************************************************************
// test050.h 2013dec10hkt1024
// ***********************************************************************

#include "led050.h"
#include "key050.h"
#include "adc050.h"
#include "eeprom050.h"
#include "spi080.h"
#include "mled080.h"

#define DEBUG 1
#define NO_DEBUG 0

void testMax7219DisplayEightDigitV09d()
{
printf("\n*** testMax7219DisplayEightDigit() ***\n\n");
// *** Set up SPI channels ***
printf("\n*** Set up SPI channels ***\n\n");
setupOneSpiChannel080(SPI_CHANNEL_0);
setupOneSpiChannel080(SPI_CHANNEL_1);

// *** Set up SPI slave select ports ***
printf("\n*** Set up Slave select ports ***\n\n");
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_0);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_1);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_2);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_3);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_0);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_4);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_5);
setupSpiSlaveSelectPortV0909(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_6);

// *** Set up Max7219 display mode ***
printf("\n*** Set up Max7219 display mode ***\n\n");

setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_0);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_1);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_2);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_3);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_0);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_4);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_5);
setupMax7219DigitModeV090c(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_6);

// *** Display 8 digits ***
printf("\n*** Display 8 digits ***\n\n");
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_0, TEST_DIGIT_ARRAY_00);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_1, TEST_DIGIT_ARRAY_01);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_2, TEST_DIGIT_ARRAY_02);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_0, SLAVE_SELECT_3, TEST_DIGIT_ARRAY_03);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_0, TEST_DIGIT_ARRAY_10);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_4, TEST_DIGIT_ARRAY_14);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_5, TEST_DIGIT_ARRAY_15);
displayMax7219EightDigitV090d(WUYINS_01, SPI_CHANNEL_1, SLAVE_SELECT_6, TEST_DIGIT_ARRAY_16);
}

// ***************************************************************************
// End
// ***************************************************************************



// ***********************************************************************
// mled080.h 2013dec03hkt2139
// ***********************************************************************

#include "ledcode080.h"

// *** MAX7219 Register Addresses ***
#define NO_OP_ADDR 0x00
#define DIGIT_ADDR_0 0x01
#define DIGIT_ADDR_1 0x02
#define DIGIT_ADDR_2 0x03
#define DIGIT_ADDR_3 0x04
#define DIGIT_ADDR_4 0x05
#define DIGIT_ADDR_5 0x06
#define DIGIT_ADDR_6 0x07
#define DIGIT_ADDR_7 0x08
#define DECODE_MODE_ADDR 0x09
#define INTENSITY_ADDR     0x0a
#define SCAN_LIMIT_ADDR 0x0b
#define OPERATION_ADDR   0x0c // Shutdown address actually
#define DISPLAY_TEST_ADDR   0x0f

// *** MAX7219 Commands ***
#define SHUT_DOWN              0x00
#define NORMAL                 0x01
#define CODE_B_ALL_DIGITS      0xff
#define NO_DECODE_ALL_DIGITS   0x00
#define DECODE_ALL_8_DIGITS    0xff
#define NO_DECODE_ALL_8_DIGITS 0x00
#define NO_DECODE_ALL_8_ROWS   0x00
#define DISPLAY_8_DIGITS       0x07
#define SCAN_ALL_8_DIGITS      0x07
#define SCAN_ALL_8_ROWS        0x07

// *** Data Constants ***

#define MATRIX_0 0
#define MATRIX_1 1
#define MATRIX_2 2
#define MATRIX_3 3
#define MATRIX_4 4
#define MATRIX_5 5
#define MATRIX_6 6

#define DIGIT_0 0
#define DIGIT_1 1
#define DIGIT_2 2
#define DIGIT_3 3
#define DIGIT_4 4
#define DIGIT_5 5
#define DIGIT_6 6
#define DIGIT_7 7
#define DIGIT_8 8
#define DIGIT_9 9
#define CHAR_HYPHEN 10
#define CHAR_E 11
#define CHAR_H 12
#define CHAR_L 13
#define CHAR_P 14
#define CHAR_BLANK 15

#define PATTERN_ALL_ON 0xff
#define PATTERN_ALL_OFF 0x00

#define ADDRESS_INDEX 0
#define DATA_INDEX 1

#define MAX_MATRIX_NUMBER 16
#define MAX_BUFFER_SIZE 32

// ***************************************************************************
// MAx7219 Functions
// ***************************************************************************

#define TEST_DIGIT_ARRAY_00 0
#define TEST_DIGIT_ARRAY_01 1
#define TEST_DIGIT_ARRAY_02 2
#define TEST_DIGIT_ARRAY_03 3
#define TEST_DIGIT_ARRAY_10 4
#define TEST_DIGIT_ARRAY_14 5
#define TEST_DIGIT_ARRAY_15 6
#define TEST_DIGIT_ARRAY_16 7

typedef int eightDigitArray[8];
typedef eightDigitArray *eightDigitArrayPointerArray[8];

eightDigitArray EightDigitArraySpi00 = {5, 14, 1, 15, 0, 0, 15, 0};
eightDigitArray EightDigitArraySpi01 = {5, 14, 1, 15, 0, 1, 15, 1};
eightDigitArray EightDigitArraySpi02 = {5, 14, 1, 15, 0, 2, 15, 2};
eightDigitArray EightDigitArraySpi03 = {5, 14, 1, 15, 0, 3, 15, 3};
eightDigitArray EightDigitArraySpi10 = {5, 14, 1, 15, 1, 0, 15, 4};
eightDigitArray EightDigitArraySpi14 = {5, 14, 1, 15, 1, 4, 15, 5};
eightDigitArray EightDigitArraySpi15 = {5, 14, 1, 15, 1, 5, 15, 6};
eightDigitArray EightDigitArraySpi16 = {5, 14, 1, 15, 1, 6, 15, 7};

eightDigitArrayPointerArray EightDigitArrayPointerArrayTest01 = \
{
&EightDigitArraySpi00, \
&EightDigitArraySpi01, \
&EightDigitArraySpi02, \
&EightDigitArraySpi03, \
&EightDigitArraySpi10, \
&EightDigitArraySpi14, \
&EightDigitArraySpi15, \
&EightDigitArraySpi16
};

void displayMax7219EightDigitV090d(uint8_t mcuBoardNumber, uint8_t spiChannelNumber, uint8_t slaveSelectNumber, \
                          uint8_t testDigitArrayNumber)
{
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
OPERATION_ADDR, SHUT_DOWN);

writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_7, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[0]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_6, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[1]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_5, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[2]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_4, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[3]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_3, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[4]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_2, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[5]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_1, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[6]);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
DIGIT_ADDR_0, (*EightDigitArrayPointerArrayTest01[testDigitArrayNumber])[7]);

writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
OPERATION_ADDR, NORMAL);
}

void writeMax7219CommandV0909(uint8_t spiChannelNumber, uint8_t slaveSelectNumber, \
                     portPinArray *portPinArrayPointer, \
                              uint8_t commandRegisterAddress, uint8_t command)
{
uint8_t txBuffer[2];
uint8_t rxBuffer[2];

SSP_DATA_SETUP_Type xferConfig;
    xferConfig.tx_data = txBuffer;
    xferConfig.rx_data = rxBuffer;
    xferConfig.length =  2;

    txBuffer[ADDRESS_INDEX] = commandRegisterAddress;
txBuffer[DATA_INDEX] = command;

    spiTransmit0909(spiChannelNumber, slaveSelectNumber, portPinArrayPointer, xferConfig);
}

void setupMax7219DigitModeV090c(uint8_t mcuBoardNumber, uint8_t spiChannelNumber, uint8_t slaveSelectNumber)
{
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
                OPERATION_ADDR, SHUT_DOWN);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
                DECODE_MODE_ADDR, DECODE_ALL_8_DIGITS);
writeMax7219CommandV0909(spiChannelNumber, slaveSelectNumber, \
(*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber], \
                SCAN_LIMIT_ADDR, SCAN_ALL_8_DIGITS);
}

// ***************************************************************************
// End
// ***************************************************************************




// ***********************************************************************
// spi080.h 2013dec10hkt1027
// ***********************************************************************

#include "gpio050.h"
#include "led050.h"
#include "lpc11xx_ssp.h"
#include "semihosting.h"
#include "stdio.h"
#include "config050.h"

#ifndef SPI_HEADER_SEEN
#define SPI_HEADER_SEEN

// *** SPI #defines ***

#define MAX_SPI_CHANNEL_NUMBER 2
#define MAX_SPI_SLAVE_SELECT_NUMBER 9

#define SPI_CHANNEL_TOTAL 2
#define SPI_SLAVE_SELECT_TOTAL 9

#define SPI_CHANNEL_0 0
#define SPI_CHANNEL_1 1

#define SLAVE_SELECT_0 0
#define SLAVE_SELECT_1 1
#define SLAVE_SELECT_2 2
#define SLAVE_SELECT_3 3
#define SLAVE_SELECT_4 4
#define SLAVE_SELECT_5 5
#define SLAVE_SELECT_6 6
#define SLAVE_SELECT_7 8
#define SLAVE_SELECT_8 8

typedef int slaveSelectPortPinArray[2];
typedef slaveSelectPortPinArray *slaveSelectPortPinArrayPointerArray[SPI_SLAVE_SELECT_TOTAL];
typedef slaveSelectPortPinArrayPointerArray *slaveSelectPortPinArrayPointerArrayPointerArray[SPI_CHANNEL_TOTAL];

slaveSelectPortPinArray SlaveSelectPortPinArray00 = {PORT0, PIN2};
slaveSelectPortPinArray SlaveSelectPortPinArray01 = {PORT3, PIN0};
slaveSelectPortPinArray SlaveSelectPortPinArray02 = {PORT3, PIN1};
slaveSelectPortPinArray SlaveSelectPortPinArray03 = {PORT3, PIN2};
slaveSelectPortPinArray SlaveSelectPortPinArray04 = {PORT3, PIN3};
slaveSelectPortPinArray SlaveSelectPortPinArray05 = {PORT2, PIN6};
slaveSelectPortPinArray SlaveSelectPortPinArray06 = {PORT2, PIN7};
slaveSelectPortPinArray SlaveSelectPortPinArray07 = {PORT2, PIN8};
slaveSelectPortPinArray SlaveSelectPortPinArray08 = {PORT2, PIN9};

slaveSelectPortPinArray SlaveSelectPortPinArray10 = {PORT2, PIN0};
slaveSelectPortPinArray SlaveSelectPortPinArray11 = {PORT3, PIN0};
slaveSelectPortPinArray SlaveSelectPortPinArray12 = {PORT3, PIN1};
slaveSelectPortPinArray SlaveSelectPortPinArray13 = {PORT3, PIN2};
slaveSelectPortPinArray SlaveSelectPortPinArray14 = {PORT3, PIN3};
slaveSelectPortPinArray SlaveSelectPortPinArray15 = {PORT2, PIN6};
slaveSelectPortPinArray SlaveSelectPortPinArray16 = {PORT2, PIN7};
slaveSelectPortPinArray SlaveSelectPortPinArray17 = {PORT2, PIN8};
slaveSelectPortPinArray SlaveSelectPortPinArray18 = {PORT2, PIN9};

slaveSelectPortPinArrayPointerArray WuyinsSlaveSelectPortPinArrayPointerArraySp0V095[SPI_SLAVE_SELECT_TOTAL] = \
{&SlaveSelectPortPinArray00, &SlaveSelectPortPinArray01, &SlaveSelectPortPinArray02, \
    &SlaveSelectPortPinArray03, &SlaveSelectPortPinArray04, &SlaveSelectPortPinArray05, \
    &SlaveSelectPortPinArray06, &SlaveSelectPortPinArray07, &SlaveSelectPortPinArray08};

slaveSelectPortPinArrayPointerArray WuyinsSlaveSelectPortPinArrayPointerArraySp1V095[SPI_SLAVE_SELECT_TOTAL] = \
{&SlaveSelectPortPinArray10, &SlaveSelectPortPinArray11, &SlaveSelectPortPinArray12, \
    &SlaveSelectPortPinArray13, &SlaveSelectPortPinArray14, &SlaveSelectPortPinArray15, \
    &SlaveSelectPortPinArray16, &SlaveSelectPortPinArray17, &SlaveSelectPortPinArray18};

slaveSelectPortPinArrayPointerArrayPointerArray \
        WuyinsSlaveSelectPortPinArrayPointerArrayPointerArrayV095[SPI_CHANNEL_TOTAL] = \
{&WuyinsSlaveSelectPortPinArrayPointerArraySp0V095, \
    &WuyinsSlaveSelectPortPinArrayPointerArraySp1V095};

slaveSelectPortPinArrayPointerArray SlaveSelectPortPinArrayPointerArrayWuyinsSpi0 = \
{
        &SlaveSelectPortPinArray00, \
        &SlaveSelectPortPinArray01, \
        &SlaveSelectPortPinArray02, \
        &SlaveSelectPortPinArray03, \
        &SlaveSelectPortPinArray04, \
        &SlaveSelectPortPinArray05, \
        &SlaveSelectPortPinArray06, \
        &SlaveSelectPortPinArray07, \
        &SlaveSelectPortPinArray08
};

slaveSelectPortPinArrayPointerArray SlaveSelectPortPinArrayPointerArrayWuyinsSpi1 = \
{
        &SlaveSelectPortPinArray10, \
        &SlaveSelectPortPinArray11, \
        &SlaveSelectPortPinArray12, \
        &SlaveSelectPortPinArray13, \
        &SlaveSelectPortPinArray14, \
        &SlaveSelectPortPinArray15, \
        &SlaveSelectPortPinArray16, \
        &SlaveSelectPortPinArray17, \
        &SlaveSelectPortPinArray18
};

slaveSelectPortPinArrayPointerArrayPointerArray SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi = \
{
        &SlaveSelectPortPinArrayPointerArrayWuyinsSpi0, \
        &SlaveSelectPortPinArrayPointerArrayWuyinsSpi1
};

// *** SPI PortPinArray assignment ***

portPinArray PortPinArraySsel0  = {PORT0, PIN2};
portPinArray PortPinArraySsel1  = {PORT2, PIN0};

portPinArray PortPinArraySsel00 = {PORT0, PIN2};
portPinArray PortPinArraySsel01 = {PORT3, PIN0};
portPinArray PortPinArraySsel02 = {PORT3, PIN1};
portPinArray PortPinArraySsel03 = {PORT3, PIN2};
portPinArray PortPinArraySsel04 = {PORT3, PIN3};
portPinArray PortPinArraySsel05 = {PORT2, PIN6};
portPinArray PortPinArraySsel06 = {PORT2, PIN7};
portPinArray PortPinArraySsel07 = {PORT2, PIN8};
portPinArray PortPinArraySsel08 = {PORT2, PIN9};

portPinArray PortPinArraySsel10 = {PORT2, PIN0};
portPinArray PortPinArraySsel11 = {PORT3, PIN0};
portPinArray PortPinArraySsel12 = {PORT3, PIN1};
portPinArray PortPinArraySsel13 = {PORT3, PIN2};
portPinArray PortPinArraySsel14 = {PORT3, PIN3};
portPinArray PortPinArraySsel15 = {PORT2, PIN6};
portPinArray PortPinArraySsel16 = {PORT2, PIN7};
portPinArray PortPinArraySsel17 = {PORT2, PIN8};
portPinArray PortPinArraySsel18 = {PORT2, PIN9};

portPinArray *Olimex2SlaveSelectPortPinArrayPointerArray0[] = {&PortPinArraySsel00, \
    &PortPinArraySsel01, &PortPinArraySsel02, &PortPinArraySsel03, \
    &PortPinArraySsel04, &PortPinArraySsel05, &PortPinArraySsel06};

portPinArray *Olimex2SlaveSelectPortPinArrayPointerArray1[] = {&PortPinArraySsel10, \
    &PortPinArraySsel11, &PortPinArraySsel12, &PortPinArraySsel13, \
    &PortPinArraySsel14, &PortPinArraySsel15, &PortPinArraySsel16};

portPinArray *Olimex20SlaveSelectPortPinArrayPointerArrayArray[2][7] = \
     {&PortPinArraySsel00, &PortPinArraySsel01, &PortPinArraySsel02, \
          &PortPinArraySsel03, &PortPinArraySsel04, &PortPinArraySsel05, \
          &PortPinArraySsel06, \
          &PortPinArraySsel10, &PortPinArraySsel11, &PortPinArraySsel12, \
          &PortPinArraySsel13, &PortPinArraySsel14, &PortPinArraySsel15, \
          &PortPinArraySsel16};

portPinArray *Olimex21SlaveSelectPortPinArrayPointerArrayArray[2][7] = \
     {Olimex2SlaveSelectPortPinArrayPointerArray0, \
          Olimex2SlaveSelectPortPinArrayPointerArray1};

portPinArray *WuyinsSpi0SselPortPinArrayPointerArray[] = {&PortPinArraySsel00, \
    &PortPinArraySsel01, &PortPinArraySsel02, &PortPinArraySsel03, \
    &PortPinArraySsel04, &PortPinArraySsel05, &PortPinArraySsel06};

portPinArray *WuyinsSpi1SselPortPinArrayPointerArray[] = {&PortPinArraySsel10, \
    &PortPinArraySsel11, &PortPinArraySsel12, &PortPinArraySsel13, \
    &PortPinArraySsel14, &PortPinArraySsel15, &PortPinArraySsel16};

portPinArray *WuyinsSpi0SselPortPinArrayPointerArrayV092[] = {&PortPinArraySsel00, \
    &PortPinArraySsel01, &PortPinArraySsel02, &PortPinArraySsel03, \
    &PortPinArraySsel04, &PortPinArraySsel05, &PortPinArraySsel06, \
    &PortPinArraySsel07, &PortPinArraySsel08};

portPinArray *WuyinsSpi1SselPortPinArrayPointerArrayV092[] = {&PortPinArraySsel10, \
    &PortPinArraySsel11, &PortPinArraySsel12, &PortPinArraySsel13, \
    &PortPinArraySsel14, &PortPinArraySsel15, &PortPinArraySsel16, \
    &PortPinArraySsel17, &PortPinArraySsel18};

slaveSelectPortPinArrayPointerArray *WuyinsSpi1SselPortPinArrayPointerArrayArrayV094[] = \
{&WuyinsSpi0SselPortPinArrayPointerArrayV092, \
    &WuyinsSpi0SselPortPinArrayPointerArrayV092};

// typedef int portPinArray[2];
// typedef portPinArray *portPinArrayPointerArray[MAX_DEVICE_NUMBER];
// typedef portPinArray *slaveSelectPortPinArrayPointerArray[MAX_SLAVE_SELECT_NUMBER];

slaveSelectPortPinArrayPointerArray *WuyinsSpi0SselPortPinArrayPointerArrayV095[] = \
    {&PortPinArraySsel00, &PortPinArraySsel01, &PortPinArraySsel02, \
         &PortPinArraySsel03, &PortPinArraySsel04, &PortPinArraySsel05, \
         &PortPinArraySsel06, &PortPinArraySsel07, &PortPinArraySsel08};

slaveSelectPortPinArrayPointerArray *WuyinsSpi1SselPortPinArrayPointerArrayV095[] = \
    {&PortPinArraySsel10, &PortPinArraySsel11, &PortPinArraySsel12, \
         &PortPinArraySsel13, &PortPinArraySsel14, &PortPinArraySsel15, \
         &PortPinArraySsel16, &PortPinArraySsel17, &PortPinArraySsel18};

slaveSelectPortPinArrayPointerArray *WuyinsSpiSselPortPinArrayPointerArrayArrayV095[] = \
{&WuyinsSpi0SselPortPinArrayPointerArrayV092, \
    &WuyinsSpi0SselPortPinArrayPointerArrayV092};

// ***************************************************************************
// SPI Functions
// ***************************************************************************

void setupSpiSlaveSelectPortV0909(uint8_t mcuBoardNumber, uint8_t spiChannelNumber, uint8_t slaveSelectNumber)
{
initializeOutputPin01HighV093((*SlaveSelectPortPinArrayPointerArrayPointerArrayWuyinsSpi[spiChannelNumber])[slaveSelectNumber]);
}

void spiTransmit0909(uint8_t spiChannelNumber, uint8_t slaveSelectNumber, \
            portPinArray *portPinArrayPointer, \
                     SSP_DATA_SETUP_Type xferConfig)
{
setGpioDataPinLow01(*portPinArrayPointer);
if (spiChannelNumber == 0)
SSP_ReadWrite(LPC_SSP0, &xferConfig, SSP_TRANSFER_POLLING);
else // (spiChannelNumber == 1)
SSP_ReadWrite(LPC_SSP1, &xferConfig, SSP_TRANSFER_POLLING);
    setGpioDataPinHigh01(*portPinArrayPointer);
}


// ***************************************************************************
// End
// ***************************************************************************


.END



















2013-12-05

Android founder Andy Rubin's secret Google project: building real robots - By Sean Hollister


Android founder Andy Rubin's secret Google project: building real robots - By Sean Hollister on December 4, 2013

http://www.theverge.com/2013/12/4/5173524/android-founder-andy-rubins-secret-google-project-building-real-robots

When Android founder Andy Rubin stepped away from the mobile operating system he helped create, rumors suggested he would pursue his lifelong love of real robots instead. Now, The New York Times reports that those rumors were true: Google has purchased seven different robot companies for a secretive new robotics initiative — and placed Rubin at its head.

"I HAVE A HISTORY OF MAKING MY HOBBIES INTO A CAREER."

The story apparently comes from Rubin himself, who granted the Times an interview but wouldn't provide many details about Google's plans. Apparently, the robot group is distinct from the Google X lab, which has become synonymous with the company's crazier hardware projects, such as self-driving cars and balloon-powered internet. However, Rubin said that the new division — which could even be spun off as a separate company — is still pursuing a "moonshot" of that sort. Currently, Rubin is hiring roboticists for the project, which the Times reports will maintain offices in both Palo Alto and Japan.

It's not clear what kind of robots the group will build, but several of the companies involved previously built humanoid robots and robotic arms, and it seems like Rubin is suggesting that Google's creation might be able to move, reach, and grab things like a person. According to "several people with specific knowledge of the project," the robots will likely be used in manufacturing rather than sold to consumers, and might specifically be used in electronics assembly — which could fit well with the tech industry's recent push for Made in the USA products. China's Foxconn, which produces many consumer electronics devices including Apple products, began replacing workers with robots last year. US companies attempting to reduce dependance on China might want to follow suit. There's already one company building a robot that attempts to fill that niche: Baxter, a $22,000 "coworking" robot designed to assist humans with basic assembly line tasks without risk of injury.

For Rubin, manufacturing is a return to the past. According to a 2007 profile, Rubin began as a robot engineer at lens manufacturer Carl Zeiss and had a brief stint at Apple as a manufacturing engineer before devoting his working hours to developing computers instead. However, robotics remained a hobby, with Rubin both building his own and amassing a collection of robots from Japan. The Android operating system's name was no accident: Rubin's coworkers at Apple started calling him "Android" because of his love of robots, and he adopted the name for his own purposes years later.

Now, Google has allowed him to build those robots all day long. "I have a history of making my hobbies into a career," Rubin told the Times. "This is the world's greatest job. Being an engineer and a tinkerer, you start thinking about what you would want to build for yourself."

.END