Arduino制作一个电子骰子(2)

俗话说“小赌怡情,大赌兴业”,经过考证我们能够确信这个叫做”俗话“的名人是赌场老板—-看过余华先生的《活着》对此肯定深有体会,再多说一句,我个人不觉得这部小说讲述的是一个悲剧故事,生活就是这样而已,过去是这样现在依然是这样。小说没有被禁,但是对应的电影在国内是禁片。有这样一种说法”昨晚在暨大演讲,有同学问我《活着》改编电影时什么事情印象深刻?我说这是18年前的事了,还记得当时张艺谋时常说原作里的什么细节要改动,审查才能通过。看他胸有成竹的模样,心想他如此了解xxx,对他十分钦佩。可是张艺谋拍摄完成电影后,审查还是没有通过。我不再钦佩张艺谋,我钦佩xxx了“【参考1】。

从概率的角度来说,哪怕对方比你获胜的概率只高了2%,在你”根本停不下“的情况下,蚀本只是时间问题…….

前面介绍了一个 Arduino 打造的”电子骰子“,我们下面要对它进行改装,让你”稳赢不输“。

我们再添加一个遥控设备,它在我们之前的《用 Arduino 打造PPT遥控器》中出场过,是目很容易买到价格低廉的遥控设备。

remote

和之前的相比,只是多了一个接收器。接收器上有5个Pin,这个接收器和 Arduino 的连接如下:

5V    <——> 5v (我试过如果用 3.3v的话不工作)
GND<——>  GND
D0   <——> D4
D1   <——> D5
D2   <——> D6
D3   <——> D7

按键比较少,所以只支持对应了从3到6个点数。改造之前的程序,加入检查遥控按键是否被按下的代码。

/*
日期:2014-7-2
功能:MAX7219驱动8*8点阵
作者:Z.t
IDE:1.0.5
硬件:最小系统UNO
说明:本代码主要参考了官方的示例程序
*/

//官方的库
#include "LedControl.h"

/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
第一个参数:pin 12 is connected to the DataIn 
第二个参数:pin 11 is connected to the CLK 
第三个参数:pin 10 is connected to LOAD 
第四个参数:We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=50;
int ButtonPin=3;
int PinA=4;
int PinB=5;
int PinC=6;
int PinD=7;
int Current=1;
int Actual=0xFF; 
boolean MarkStart=false;  //标记是否按键抬起

void setup() {
  /*
   The MAX72XX is in power-saving mode on startup,
   we have to do a wakeup call
   */
  lc.shutdown(0,false);
  /* Set the brightness to a medium values */
  lc.setIntensity(0,8);
  /* and clear the display */
  lc.clearDisplay(0);

  randomSeed(analogRead(0));
  pinMode(ButtonPin, INPUT);    
  pinMode(PinA, INPUT);   
  pinMode(PinB, INPUT);   
  pinMode(PinC, INPUT);   
  pinMode(PinD, INPUT);    
}

void showNum(int x) {
  /* here is the data for the characters */
  byte one[8]={     
B00000000,
B00000000,
B00000000,
B00111000,
B00111000,
B00000000,
B00000000,
B00000000};

  byte two[8]={   
B00000000,
B00000110,
B00000110,
B00000000,
B00000000,
B01100000,
B01100000,
B00000000};

  byte three[8]={   
B00000000,
B00111000,
B00111000,
B00000000,
B01100110,
B01100110,
B01100110,
B00000000};

  byte four[8]={   
B00000000,
B01100110,
B01100110,
B00000000,
B00000000,
B01100110,
B01100110,
B00000000};

  byte five[8]={   
B00000000,
B01100110,
B01100110,
B00011000,
B00011000,
B01100110,
B01100110,
B00000000};

  byte six[8]={   
B01100110,
B01100110,
B00000000,
B01100110,
B01100110,
B00000000,
B01100110,
B01100110};

switch (x) {
case 1:
  lc.setRow(0,0,one[0]);
  lc.setRow(0,1,one[1]);
  lc.setRow(0,2,one[2]);
  lc.setRow(0,3,one[3]);
  lc.setRow(0,4,one[4]);
  lc.setRow(0,5,one[5]);
  lc.setRow(0,6,one[6]);
  lc.setRow(0,7,one[7]);
  break;
case 2:
  lc.setRow(0,0,two[0]);
  lc.setRow(0,1,two[1]);
  lc.setRow(0,2,two[2]);
  lc.setRow(0,3,two[3]);
  lc.setRow(0,4,two[4]);
  lc.setRow(0,5,two[5]);
  lc.setRow(0,6,two[6]);
  lc.setRow(0,7,two[7]);
  break;
case 3:
  lc.setRow(0,0,three[0]);
  lc.setRow(0,1,three[1]);
  lc.setRow(0,2,three[2]);
  lc.setRow(0,3,three[3]);
  lc.setRow(0,4,three[4]);
  lc.setRow(0,5,three[5]);
  lc.setRow(0,6,three[6]);
  lc.setRow(0,7,three[7]);
  break;

case 4:
  lc.setRow(0,0,four[0]);
  lc.setRow(0,1,four[1]);
  lc.setRow(0,2,four[2]);
  lc.setRow(0,3,four[3]);
  lc.setRow(0,4,four[4]);
  lc.setRow(0,5,four[5]);
  lc.setRow(0,6,four[6]);
  lc.setRow(0,7,four[7]);
  break;
case 5:
  lc.setRow(0,0,five[0]);
  lc.setRow(0,1,five[1]);
  lc.setRow(0,2,five[2]);
  lc.setRow(0,3,five[3]);
  lc.setRow(0,4,five[4]);
  lc.setRow(0,5,five[5]);
  lc.setRow(0,6,five[6]);
  lc.setRow(0,7,five[7]);
  break;

case 6:
  lc.setRow(0,0,six[0]);
  lc.setRow(0,1,six[1]);
  lc.setRow(0,2,six[2]);
  lc.setRow(0,3,six[3]);
  lc.setRow(0,4,six[4]);
  lc.setRow(0,5,six[5]);
  lc.setRow(0,6,six[6]);
  lc.setRow(0,7,six[7]);
  break;
} 
}

void loop() { 
  int Next;

  if (digitalRead(PinA)==HIGH) {Actual=3;}
  if (digitalRead(PinB)==HIGH) {Actual=4;}
  if (digitalRead(PinC)==HIGH) {Actual=5;}
  if (digitalRead(PinD)==HIGH) {Actual=6;}

  if (digitalRead(ButtonPin)==LOW) {
      showNum(Current);
      do {
         Next=random(1,7);
         }  
      while (Current==Next); //因为如果两次出现相同的数字,看起来
			     //会觉得没有变,所以这里要保证生成不同
      Current=Next; 
      delay(delaytime);
    MarkStart=true;  

  }

  if ((MarkStart==true) && (digitalRead(ButtonPin)==HIGH)){  //按键抬起,生成实际显示的结果
	MarkStart=false; 
	if (Actual==0xFF) {showNum(random(1,7));}  //如果当前未收到选择,随机生成一个
	else
	  {showNum(Actual);}         //收到过选择,那么就显示
	Actual=0xFF;  
	}

}

和上一个电子骰子相比,这个接线看起来复杂多了,这是视觉差异而已,看起来多了很多线因为5V和GND用的比较多而已,所以导入面包板,都从上面取电而已。

20140703980

 

程序下载 dice2

最后这篇文章告诉大家了一个非常重要的事实就是:不要和电子的赌博机游戏,因为你根本不可能赢。如果真的有人对你这样炫耀,存在的三种可能性是:

1.他在作弊
2.机器坏了
3.他想拉你一起入伙(这个可能性最大)

参考:
1:很早之前听说过这个事情,但是一直没有找到出处。从目前能够搜索到的资料看,来源应该是余华的微博
http://tieba.baidu.com/p/1621656047

2.http://www.lab-z.com/arduinodice1/  本系列的第一篇文章

3.http://www.lab-z.com/%E7%94%A8-arduino-%E6%89%93%E9%80%A0ppt%E9%81%A5%E6%8E%A7%E5%99%A8/   用-arduino-打造ppt遥控器

制作一个电子骰子(1)

有一种说法,说赌场的英文单词 CASINO 是中国人发明的:

“据说这也是中国人发明的。十八世纪,美国从中国广东引进了大批的劳工修铁路。美国的西部牛仔就开设赌局,赚这帮广东人的血汗钱。他们白天干活,晚上赌博消磨时光。一到傍晚赌局开始的时候,这帮劳工就争相吆喝“开始了”___石毓智:也谈华人为什么好赌 http://t.cn/zYOPz3e”。

这样的解释听上去有些道理,“开始喽”发音也和 Casino 很类似…….经过考证非常遗憾实际上并不是这样,具体的来源是意大利。【参考1】

骰子是一种简单方便的赌博工具,具有体积小便于携带,低噪音,节能环保,便于广大人民群众学习裂解等等特点,记得高中时代,电视热播《赌神》《赌圣》系列,我们班上的几个同学放课后便去学校边上的小公园,模仿电影中的样子猜大小,赌注不大也觉得刺激。当然,作为一个好孩子是不会直接参加赌局的,通常只是提供用具偶尔抽水而已…….

dice

这里介绍用 arduino 做一个电子的骰子,材料清单如下:

Arduino Uno x1
Max7219 + 8×8 LED点阵 x1
按键开关 x1
杜邦线 若干

Max7219 + 8×8 LED点阵是下面这个样子,用来显示当前的点数。当然,还以用数码管,只是那样看起来太不专业了。

max7219

电路方面,连接如下:

按钮三个Pin很简单,分别连到Ardudice1ino上的 GND,3.3V 和 D2

MAX7219五个Pin连接如下

VCC  <—–> 5V
GND  <—–> GND
DIN    <—–> D12
CS     <—–> D10
CLK   <—–> D11

下面的程序核心有2部分,一部分是用来处理按下按钮时,让LED看起来在不断跳动;另外一部分是直接生成最终的结果。这样做的原因是为了保证概率上的公平以及代码的简洁。

/*
日期:2014-7-2
功能:MAX7219驱动8*8点阵
作者:Z.t
IDE:1.0.5
硬件:最小系统UNO
说明:本代码主要参考了官方的示例程序
*/

//官方的库
#include "LedControl.h"

/*
Now we need a LedControl to work with.
***** These pin numbers will probably not work with your hardware *****
第一个参数:pin 12 is connected to the DataIn
第二个参数:pin 11 is connected to the CLK
第三个参数:pin 10 is connected to LOAD
第四个参数:We have only a single MAX72XX.
*/
LedControl lc=LedControl(12,11,10,1);

/* we always wait a bit between updates of the display */
unsigned long delaytime=50;
int ButtonPin=3;
int Current=1;

void setup() {
/*
The MAX72XX is in power-saving mode on startup,
we have to do a wakeup call
*/
lc.shutdown(0,false);
/* Set the brightness to a medium values */
lc.setIntensity(0,8);
/* and clear the display */
lc.clearDisplay(0);

randomSeed(analogRead(0));
pinMode(ButtonPin, INPUT);
}

void showNum(int x) {
/* here is the data for the characters */
byte one[8]={
B00000000,
B00000000,
B00000000,
B00111000,
B00111000,
B00000000,
B00000000,
B00000000};

byte two[8]={
B00000000,
B00000110,
B00000110,
B00000000,
B00000000,
B01100000,
B01100000,
B00000000};

byte three[8]={
B00000000,
B00111000,
B00111000,
B00000000,
B01100110,
B01100110,
B01100110,
B00000000};

byte four[8]={
B00000000,
B01100110,
B01100110,
B00000000,
B00000000,
B01100110,
B01100110,
B00000000};

byte five[8]={
B00000000,
B01100110,
B01100110,
B00011000,
B00011000,
B01100110,
B01100110,
B00000000};

byte six[8]={
B01100110,
B01100110,
B00000000,
B01100110,
B01100110,
B00000000,
B01100110,
B01100110};

switch (x) {
case 1:
lc.setRow(0,0,one[0]);
lc.setRow(0,1,one[1]);
lc.setRow(0,2,one[2]);
lc.setRow(0,3,one[3]);
lc.setRow(0,4,one[4]);
lc.setRow(0,5,one[5]);
lc.setRow(0,6,one[6]);
lc.setRow(0,7,one[7]);
break;
case 2:
lc.setRow(0,0,two[0]);
lc.setRow(0,1,two[1]);
lc.setRow(0,2,two[2]);
lc.setRow(0,3,two[3]);
lc.setRow(0,4,two[4]);
lc.setRow(0,5,two[5]);
lc.setRow(0,6,two[6]);
lc.setRow(0,7,two[7]);
break;
case 3:
lc.setRow(0,0,three[0]);
lc.setRow(0,1,three[1]);
lc.setRow(0,2,three[2]);
lc.setRow(0,3,three[3]);
lc.setRow(0,4,three[4]);
lc.setRow(0,5,three[5]);
lc.setRow(0,6,three[6]);
lc.setRow(0,7,three[7]);
break;

case 4:
lc.setRow(0,0,four[0]);
lc.setRow(0,1,four[1]);
lc.setRow(0,2,four[2]);
lc.setRow(0,3,four[3]);
lc.setRow(0,4,four[4]);
lc.setRow(0,5,four[5]);
lc.setRow(0,6,four[6]);
lc.setRow(0,7,four[7]);
break;
case 5:
lc.setRow(0,0,five[0]);
lc.setRow(0,1,five[1]);
lc.setRow(0,2,five[2]);
lc.setRow(0,3,five[3]);
lc.setRow(0,4,five[4]);
lc.setRow(0,5,five[5]);
lc.setRow(0,6,five[6]);
lc.setRow(0,7,five[7]);
break;

case 6:
lc.setRow(0,0,six[0]);
lc.setRow(0,1,six[1]);
lc.setRow(0,2,six[2]);
lc.setRow(0,3,six[3]);
lc.setRow(0,4,six[4]);
lc.setRow(0,5,six[5]);
lc.setRow(0,6,six[6]);
lc.setRow(0,7,six[7]);
break;
}
}

void loop() {
int Next;
boolean MarkStart=false; //标记是否按键抬起

if (digitalRead(ButtonPin)==LOW) {
showNum(Current);
do {
Next=random(1,7);
}
while (Current==Next); //因为如果两次出现相同的数字,看起来
//会觉得没有变,所以这里要保证生成不同
Current=Next;
delay(delaytime);
MarkStart=true;
}

if ((MarkStart==true) && (digitalRead(ButtonPin)==HIGH)){ //按键抬起,生成实际显示的结果
MarkStart=false;
showNum(random(1,7));
}
}

 

 

 

 

 

程序设计上有个很有趣的地方,

之前我是使用下面的代码来做最后的显示,但是经过考虑这是不妥当的,你能说出为什么要修改吗?答案见最下面。

if ((MarkStart==true) && (digitalRead(ButtonPin)==HIGH)){ //按键抬起,生成实际显示的结果
MarkStart=false;
showNum(Next);
}

要是有个外壳能更好看一点

20140702977

程序下载 dice1

参考:
1.http://blog.sina.com.cn/s/blog_507de1780102eyec.html 程阳:赌场的英文单词 CASINO 来源自哪?

因为这样做导致结果不公平,比如我在抬起按键之前看到点数是 6,那么最后出现的结果肯定是 1-5 之间,无形之中导致了不公平…….

解决 DocuPrint P255 dw 导致的网络异常

最近入手一台激光打印机,型号是 FUJI XEROX DocuPrint P255 dw 。之所以选择这个型号,主要是听从朋友的建议从下面几点考虑:

1.激光打印机相比喷墨打印机,放置一段时间后不会出现墨干的情况(很多年前用过 connon 的一台喷墨打印机,觉得墨盒贵,省着用,结果越是不用,打印头越是容易干掉,每次都要清洗打印头;后来家里买了一台集打印复印于一体的多功能喷墨打印机,同样也有这样的问题)。

2.出于污染之类的考虑,据说喷墨的打印机墨水之类的有毒性。朋友讲她的朋友曾经在一家专业生产打印机的企业负责兼容墨水的测试(通常打印机厂都非常厌恶兼容耗材的事情,因为耗材才是他们打印机最重要的利润来源,但是没办法,这是趋势。从最开始的墨盒打洞,芯片清零,到现在的连续供墨系统等等。不断降低自身的成本是人类前进的巨大推动力)。她的朋友非常不幸,四十几岁就罹患癌症,英年早逝。他的家人和朋友也都认为这和他长期接触各种墨水有关系。

3.同样是出于污染的考虑,我在选择打印机的时候考虑随处放置的问题,因此一定要有无线功能。

4.基于成本的考虑,墨粉之类的一定要便于替换。网上看了一圈如何拆硒鼓,感觉自己非要浪费一个硒鼓才能真正学会…..

最后选择了上面这个型号的打印机。支持无线,还有双面打印(自动的,意味着如果你想直接打印一本书,不必计算如何手工放置纸张),此外,硒鼓和粉盒是分离的,购买的套餐中,卖家提供了5瓶碳粉,根据理论计算一瓶可以打印20K左右……..因此对于家庭来说足够使用。

不料,到手安装之后,问题随之而来。这个打印机会导致我的无线网络断线!具体现象是:打印机开机,能够正确获得IP,能够正常打印出来测试页,但是每隔一段时间,无线就会掉线,所以当我打印机开机的时候,经常会听到老婆发出的吼声“怎么网络又断了!”网上搜索一番未果,拨打富士施乐的售后电话,对方听我说完型号,抱歉的告诉我这个型号未在国内销售,让我只能联系经销商。我只得去找Taobao卖家,卖家还不错,帮我远程了一番,花了大约1个小时(中间不断掉线啊!)最后告诉我设置下面的位置,同样的在路由器那边也进行设置。实验成功故障消失。

路由器设置 (示例)

brd

打印机设置 (需要和前面的匹配,这里只是示例)

p255

猜测产生问题的原因:路由器只是设定了一个大概的安全类型,而没有选择具体的安全选项和加密方法,这导致打印机无法正确识别,不停尝试一些安全方面的命令,最后导致路由器通过关闭无线来拒绝。

小游戏 2048 Delphi 命令行复刻版

最近的一款名为 2048 的小游戏很火

可以在 http://gabrielecirulli.github.io/2048/ 这里看到一个网页版,基于 HTML5,只需要用方向键让两两相同的数字碰撞就会诞生一个翻倍的数字,初始数字由 2 或者 4 构成,直到游戏界面全部被填满,游戏结束。

0

我使用 delphi 编写了一个 console 版的,速度更快,不过界面没有原来的版本好看 :( 和人类打交道不是我的长项……

2048

2048

源程序2048re

用 Arduino 打造PPT遥控器

前文提到,用Arduino模拟了USB键盘。做了一个自动锁屏幕装置外,又思考了一下用途还可以做个PPT的遥控器。为了实现遥控功能,需要搭配如下的元件。发射器和接收器是配对的。发射器上面有4个按钮,对应的接收器有D0-D3四个输出Pin.这个东西的名称叫做“2262/2272四路无线遥控套件M4非锁接收板 配四键无线遥控器”,价格不超过15元……

a

首先实验这个元件,直插面包板上,5V电是从USB口上取出来的。

b

用万用表验证,当按下A按钮时,D0会输出高电平。非锁的意思就是按一下就是一下(与之对应的是锁存,按一下后面会keep一段时间)。Enough,下面就可以继续其他。

简单的说,工作分为两步:第一步,制作Arduino模拟USB键盘;第二步,让这个模拟键盘发出左箭头和右箭头的键盘码。

使用的BOM如下:
A.USB公头(有供电和通讯能力的USB头皆可) x1
B.120欧电阻(原文建议68欧,但是我刚好没有。并联120欧充当60欧) x4
C. 2.2K欧电阻 x1
D.3.6伏稳压管 x2
E.遥控发射接收器(上面图片上的)

先说第一步,根据 《Arduino学习笔记A11 – Arduino模拟电脑键盘(基于AVR-USB的USB-HID设备)》参考[1]。使用到BOM中提到的A-D,具体电路如下

c

按照上图设计,首先用面包板进行搭建,确定键盘能够正常工作。具体怎么做一个USB键盘这里就不说了。然后加入接收板。我使用大头针来作为引脚针,砍掉上面的大头,搭配杜邦线使用。用普通的排针总有太短没插到位的感觉,大头针长度足够,粗细也适合。

d

四个输出脚,只用了2个,D0和D3,间距大方便而已。如果有朋友喜欢还可以定义更多的功能。分别插在Arduino的D8和D10上。

f

程序如下:

最后实测,可以正常遥控,蓝色的USB线是下载程序用的,真正的USB是插在笔记本左边。

g

后面再考虑一下遥控的其他用途,比如:放炮点火什么的………多说一下,使用Arduino模拟USB之后,他上面的资源就非常非常少了,个人感觉能实现的功能还是挺有限的,做起来玩玩还可以,要想投入产品是够呛的。比如:因为速度的缘故,PC识别它模拟出来的USB键盘鼠标就要挺长时间。真打算做USB设备还是考虑传统的那些C51+D12之类的比较靠谱吧。

参考:
1. http://www.geek-workshop.com/forum.php?mod=viewthread&tid=1137
2. http://www.lab-z.com/arduino-usb-keyboard-debug%E7%BB%8F%E9%AA%8C/
3. http://www.geek-workshop.com/thread-4006-1-1.html 利用Arduino上的atmega8u2制作红外遥控版PPT控制器

修理电饭锅的故障

我的松下电饭锅经过四年的使用出现了一个问题:每次做饭的时候伴随着蒸汽会从排气孔向外喷水,一方面这让会让电饭煲每次都脏兮兮的,另一方面做出来的米饭下面有焦糊的情况。

网上搜索了一下,有人遇到同样的现象,解释是:在这种智能电饭煲的锅盖上,有着负责感应水汽的传感器(打开之后是有三组线,一个地,一个应该是温度传感器,还有一个不认识的线)。当出现带着水的蒸汽达到锅盖的时候,传感器会通知处理器,这时候处理器会让电饭锅加热部分断电(继电器),这也就是为什么我们在正常使用的情况下经常听到的“啪,啪”的声音。停止加热后,水汽不会溢出,然后会再次加热,这个过程反复进行,直到电饭锅中的水已经被米饭之类的完全吸收。米饭在没有液态水的状态下会达到105度(之前看到的一个原理介绍,具体的品牌有可能设定不同)。然后整个蒸饭的过程就结束了,新鲜的米饭即可出锅。

拆解了电饭锅对几根线进行了测量,发现确实有一个断掉了。

psb1

因为锅盖和传感器是一体的,只好求助于万能的淘宝。还真找到了卖家,145一套。卖家刚开始得知我是自己维修,不肯卖,后来商量了很久才同意卖给我。

psb2

拿到手就开始了安装。基本上都是塑料件,安装并没有难度,也没有出现因为尺寸差别导致的不好安装

底座:

psb3

正面

psb4

内胆,中间包裹的是一层保温材料,特地摸了一下,肯定不是石棉……话说前一段刚知道我们经常用的热宝,中间居然用石棉隔热保温,太TMD有创造力了

psb5

布线

psb6

煮饭测试,没问题,只是有轻微的水蒸气的痕迹。

psb7

于是顺利收工,不用担心喷的到处都是。

最后顺便说两句:

1.我的电饭锅是松下的,拆开之后看起来做工不错,一方面是改包裹的都包起来了,另一方面是他的各种机构件标准度很高。有做机械的朋友可以解释一下;

2.未来的维修基本上就是更换各种配件了。所谓的“芯片级”维修,除了RD工程师为了研究问题才会去干,恐怕不会有人去干,一方面是成本的问题,更换配件要远比检查省时省力(维修人力成本很高);另一方面是设计的问题,都会尽量模块话,这样对于生成以及降低成本很有帮助,可以做到外包或者使用标准件。

3.说起来电饭煲/电饭锅,很多人都会提起来当年的“三角牌”。但是这个牌子早已经不存在了。历史大约是,刚开始这是一个国有企业的牌子,后来因为质量很好口碑不错,就开始了贴牌,再后来就是卖牌子,相当于授权经营的意思吧,于是就没落了。即使现在看到“三角牌”也早就不是最初我们认识的那个品牌了。当时我用的是“美的”的电饭锅,用了一年就出了问题,总结经验是:不要买“美的” 品牌超过200的东西。为了买新的电饭锅,当时做了很多功课,最后的结论是:还是日本品牌最靠谱。如果你对生活品质有追求,不妨还是考虑买一个好点的日系的电饭锅吧。我所能知道是:你购买一个日本的产品,自己能用的爽,这个品牌在国内产生的价值比给日本的要多。即便日本人真的用这些钱去买子弹造大炮那也是孙子才需要考虑的事情。如果这笔钱捐给了gov,你是否能有孙子都是一个问题。

就是这样。

Arduino SENSOR SHIELD v4.0

我是在淘宝上买的Arduino UNO兼容版,同时还购买了 Arduino SENSOR SHIELD v4.0 (又叫做扩展卡,多媒体卡?)主要是为了方便实验。不过不知道该卡的扩展脚的连接,询问卖家,他随手给了Arduino的官网,但是实际上官网上并没有这个Shield的电路图。好在google可以找到

SensorShieldV4-TK1-crop-1024

上述资料来自 http://arduino-info.wikispaces.com/SensorShield

正好搭配我购买的双母头杜邦线(不知道真的假的)。