首先科普一下,当一块通有电流的金属或半导体薄片垂直地放在磁场中时,薄片的两端就会产生电位差,这种现象就称为霍尔效应。霍尔开关则是利用霍尔效应的一种传感器,它可以很方便的把磁信号转换成电信号,具有很高的可靠性和灵敏度。
在Arduino上使用霍尔开关比较简单,电路连接上只需要用专用的传感器连接线,将霍尔开关与传感器扩展板上的相应端口连接起来就可以了:
编程的话使用最简单的数字输入函数digitalRead()进行读取就可以了:
int ledPin = 13; int switchPin = 19; int value = 0; void setup() { pinMode(switchPin, INPUT); pinMode(ledPin, OUTPUT); Serial.begin(9600); } void loop() { value = digitalRead(switchPin); if (HIGH == value) { digitalWrite(ledPin, HIGH); } else { digitalWrite(ledPin, LOW); } }
使用的时候当霍尔开关靠近磁铁的时候,从Arduino相应引脚读出来的值为高,而当霍尔开关远离磁铁的时候,从Arduino相应引脚读出来的值为低。另外这里介绍的霍尔开关模块属于单极性霍尔元件,所以只对磁铁的南极或者北极有响应,实验的时候如果发现不响应的话可以试着换磁铁的另一极使用噢;-)
7段数码管可以用来很方便地显示0-9的数字以及,因此在一些电子制作中经常被使用到。7段数码管顾名思义其实就是由7个LED组成,它们一般按照共阴或者共阳的方式连接在一起,既然原理上这么简单,那么用Arduino来驱动7段数码管的方式自然就不言而喻了:分别将7个LED的引脚连接到Arduino的7个引脚上,然后通过给相应引脚置高或者置低的方式来控制7段数码管上显示出不同的数字来。可是仔细想想你会发现,通常Arduino上只有12个可以使用的数字引脚,如果驱动一个7段数码管就需要占用7个引脚,那驱动两个更者更多7段数码管的话,Arduino的引脚数目马上就告急了!这个时候你就可以考虑我们这里介绍的这个4路7段数码管的电子积木模块了:-)
这个4位7段数码管的模块采用专用的驱动芯片来控制数码管的各个引脚,并且使用I2C总线与Arduino进行连接,也就是说我们只需要用两根数据线就可以用Arduino来控制这一数码管模块了:
连接的方法很简单,只需要用专用的I2C连接线,将这一4位7段数码管与Arduino专用扩展板上的I2C端口连接起来就可以了:
同时注意将模块背面的RS开关设置到ON的位置,使能I2C引脚上的上拉电阻:
测试的时候可以使用如下的代码,该代码可以在数码管上循环显示0-9和a-f,同时还可以控制数码管上的小数点:
#include "Wire.h" // enable I2C bus //byte saa1064 = 0x70 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to GND) byte saa1064 = 0x76 >> 1; // define the I2C bus address for our SAA1064 (pin 1 to VCC) int digits[16]={63, 6, 91, 79, 102, 109, 125,7, 127, 111, 119, 124, 57, 94, 121, 113}; // these are the byte representations of pins required to display each digit 0~9 then A~F void setup() { Wire.begin(); // start up I2C bus delay(500); initDisplay(); } void initDisplay() // turns on dynamic mode and adjusts segment current to 12mA { Wire.beginTransmission(saa1064); Wire.send(B00000000); // this is the instruction byte. Zero means the next byte is the control byte Wire.send(B01000111); // control byte (dynamic mode on, digits 1+3 on, digits 2+4 on, 12mA segment current Wire.endTransmission(); } void displayDigits() // show all digits 0~9, A~F on all digits of display { for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.send(1); // instruction byte - first digit to control is 1 (right hand side) Wire.send(digits[z]); // digit 1 (RHS) Wire.send(digits[z]); // digit 2 Wire.send(digits[z]); // digit 3 Wire.send(digits[z]); // digit 4 (LHS) Wire.endTransmission(); delay(500); } // now repeat but with decimal point for (int z=0; z<16; z++) { Wire.beginTransmission(saa1064); Wire.send(1); // instruction byte - first digit to control is 1 (right hand side) Wire.send(digits[z]+128); // digit 1 (RHS) Wire.send(digits[z]+128); // digit 2 Wire.send(digits[z]+128); // digit 3 Wire.send(digits[z]+128); // digit 4 (LHS) Wire.endTransmission(); delay(500); } } void clearDisplay() // clears all digits { Wire.beginTransmission(saa1064); Wire.send(1); // instruction byte - first digit to control is 1 (right hand side) Wire.send(0); // digit 1 (RHS) Wire.send(0); // digit 2 Wire.send(0); // digit 3 Wire.send(0); // digit 4 (LHS) Wire.endTransmission(); } void loop() { displayDigits(); clearDisplay(); delay(1000); }
运行结果如下图所示:
由于该模块使用的是I2C接口,因此实际上也允许同时接入多个数码管模块,但必须对模块的地址进行设置。在数码管模块的背面有一个ADDR跳线,正是进行这一地址位设置的:
设置的办法是用铬铁将中间的引脚分别与VCC或者GND端连接起来,如果中间引脚与VCC连接时,相应的地址为0×76:
如果中间引脚与GND连接时,相应的地址为0×70:
这一模块在出厂时中间的引脚即不与VCC连接,也不与GND连接,此时的地址也是0×76。
电子积木模块4路MOSFET开关 V02版在原来版本的基础上电路做了相应的调整,但主要的变化还是在元件的布局和连接上,首先将MOSFET管的布局改成卧式的了,虽然这样会占据一定的空间,但相对于以前立式的版本更加美观一些,受到影响的程度也更小一些。
此外的与外界电路的连接上提供了更多的连接端子,这样就避免了以前必须将几条线一同连接到一个端子的现象。按照目前的设计,外接电源还是连接在POWER 所标记的+和-两个引脚上,而外接用电设备(如LED灯带)则可以直接连接在CH1、CH2、CH3、CH4这4个通道的+/-两个引脚上,使用起来更加 方便一些,但缺点是整个电路板的体积比起以前的版本来稍大一些。
最后是背面图,电路走线的宽度增加,为更大电流通过时通过了相应的可能性
有关MOSFET模块的具体使用办法可以参考之前blog上的文章Arduino 电子积木 4路MOSFET开关
No tags
Arduino电机驱动扩展板 L298N V03是我们最新的电机驱动扩展板:
同前一版本的Arduino L298N 电机驱动扩展板相比,V03版本的改动主要是添加了更多的设置开关,以满足不同场合下的应用要求:
- VLO(Voltage Logic Onboard)
电机驱动芯片L298N在工作的时候有两个电压:逻辑电压和电机电压,其中逻辑电压是5V,一般会小于电机电压(比如7.2V,9V或者12V)。为了能够将接在VEX端子上的电机电压转换成5V逻辑电压使用,电机驱动板上提供了相应的电压转换电路。电压转换电路的工作电压是受限的(小于20V),所以如果电机大于20V的时候,就不能使用这个电压转换电路了。VLO开关的作用就是选择是打开(开关置于ON)还是关闭(开关置于OFF)板上这一逻辑转换电路。
- VLC(Voltage Logic Connected)
L298N电机驱动扩展板上的逻辑电压除了可以通过上面介绍的电压转换电路提供之后,也可以通过与Arduino控制板上的5V逻辑电压直接连接来提供。VLC开关的作用是决定是否将电机驱动扩展板上的5V逻辑电压与Arduino控制板上的5V逻辑电压连接起来:当开关置于ON的位置上时连接,当开关置于OFF的位置上时不连接。
- VM(Voltage Motor):
VM的作用是对电机电压进行选择。当L298N电机驱动扩展板与Arduino连接起来之后,有两种办法为电机提供电源:通过Arduino板上的Vin引脚(开关置于VIN)和通过电机驱动扩展板上的VEX端子(开关置于VEX)。
相对于Arduino来讲,L298N电机驱动扩展板所承载的电流和电压都是比较高的,因此在使用的过程中要特别注意连线。下面提供几种典型的电路连接方式供大家在使用中参考:
1. 电机电压为6~12V
一般来讲,Arduino可以通过外接的6V-12V变压器进行供电(Arduino上的Vin引脚),如果你的电机电压正好在这个范围之内,那就正好可以利用这一外接电源来同时为Arduino和电机供电。这种情况下VLO、VLC和VM三者的设置为:
- VLO:OFF,不需要电机驱动扩展板上的电压转换电路
- VLC:ON,与Arduino的5V引脚进行连接,为电机驱动扩展板提供逻辑电压
- VM:VIN,与Arduino的Vin引脚进行连接,为电机驱动扩展板提供电机电压
2. 电机电压小于6V
这种情况下只能通过电机驱动扩展板上的GND和VEX两个端子来给电机供电,此时电机驱动扩展板上的5V逻辑电压转换电路无法正常工作(VEX电压太低),所以我们只能同Arduino板上的5V引脚连接来为电机驱动扩展板提供5V逻辑电压。这种情况下电机驱动扩展板的设置为:
- VLO:OFF,不需要电机驱动扩展板上的电压转换电路
- VLC:ON,与Arduino的5V引脚进行连接,为电机驱动扩展板提供5V逻辑电压
- VM:VEX,通过电机驱动扩展板上的VEX/GND端子为电机提供驱动电压
3. 电机电压为12V-20V
这种情况下也只能是通过电机驱动扩展板上的GND和VEX两个端子来给电机供电,此时电机驱动扩展板上的5V 逻辑电压转换电路可以正常工作。这种情况下电机 驱动扩展板的设置为:
- VLO:ON,需要电机驱动扩展板上的电压转换电路
- VLC:OFF,不与Arduino的5V引脚进行连接,安全隔离
- VM:VEX,通过电机驱动扩展板上的VEX/GND端子为电机提供驱动电压
上述设置中因为VLC并没有将Arduino的5V引脚与电机扩展板上的5V逻辑电压连接起来,因此我们仍需要再额外为Arduino供电(通过USB线或者外接电源),主要是出于安全隔离的考虑,特别是在VEX上的电压比较高的情况下。
4. 电机电压为20V-46V
这种情况下也只能是通过电机驱动扩展板上的GND和VEX两个端子来给电机供电,此时电机驱动扩展板上的5V 逻辑电压转换电路无法正常工作(VEX电压太低)。这种情况下电机 驱动扩展板的设置为:
- VLO:OFF,不需要电机驱动扩展板上的电压转换电路
- VLC:ON,与Arduino的5V引脚进行连接,为电机驱动扩展板提供5V逻辑电压
- VM:VEX,通过电机驱动扩展板上的VEX/GND端子为电机提供驱动电压
除了这些配置上的不同之外,V03与前一版本不存在太大的区别,因此你可以参考Arduino L298N 电机驱动扩展板中的代码进行电机的驱动。
ENC28J60是除W5100之外另一个经常用到的网络芯片,最早出现在Arduino上的网络扩展板就是借助于ENC28J60来完成的,虽然后来Arduino官方提供的网络扩展板是基于W5100实现的,但ENC28J60仍以其稳定可靠的特性被广泛使用着。这里要介绍的这款电子积木正是基于ENC28J60实现的网络模块:
该款网络模块也是基于SPI接口的,因此在电路连接上只需要通过我们的IDC扩展板用相应的6芯连接线将其与Arduino连接起来就可以了:
程序的话我们需要下载相应的库文件EncEthernet.zip,将其解压缩到Arduino安装目录下的libraries目录中并重命名为EncEthernet:
重新启动Arduino之后,就可以在File->Examples->EncEtherent菜单中找到WebServer这一示例程序:
通常你只需要根据自己的网络配置情况修改IP地址就可以了:
static uint8_t myip[4] = {192,168,0,15};
将程序下载到Arduino中之后,你就可以通过浏览器来访问你的Arduino了:
