下面是将Arduino卡烧写为多通道AD卡的固件程序,点击链接下载:
然后解压缩,并用Arduino编辑器打开drviUNO.ino源码文件,编译后上传到Arduino UNO卡中就可以将Arduino UNO卡变为一个低速的多通道AD卡。该程序也可直接用于Arduino Mega 2560卡,其余型号的Arduino卡未做测试,通常也可用。
如果对ADC的精度、转换速度和采样数据缓冲区大小有要求,建议采用基于 ARM Cortex-M3 的Arduino Due卡(约60元/块)来替代UNO卡,其ADC精度为12位,96K SRAM,84MHz主频,做为AD卡,其ADC精度和最大采样频率都有较大提升。另外,也可以采用新出的基于ARM Cortex-M4的UNO R4卡,其ADC精度为14位,32K SRAM,48MHz主频,其wifi版本还可以设计为USB+Wifi的双功能采集卡,价格也还好,约150元/块。
注意,编写Arduino Due卡程序前,需要从开发板管理器中下载ARM库;编写Arduino UNO R4卡程序前,需要从开发板管理器中下载UNO R4库。另外,采用ARM主控芯片系列的Due卡和UNO R4卡,与采用AVR主控芯片系列的UNO卡的很多库函数都不兼容,上手难度略大。从学习AD卡上下为机编程角度,推荐先使用UNO卡;若有兴趣,再升级到Due卡或R4卡。
'drvi\n':查询命令,返回''drvi\n'
'adc,ch,Fs\n':多通道连续采样命令,Ascii格式逐行返回多通道采样数据,ch<8, Fs<(2000/ch);
'adcb,ch,Fs\n':多通道连续采样命令,Binary格式逐行返回多通道采样数据,ch<8, Fs<(2000/ch)
'adca,ch,Fs,Len\n':多通道数据块连续采样命令,Ascii格式逐块返回多通道采样数据,ch<=2, Fs<(2000/ch), Len<(640/ch)
'adcab,ch,Fs,Len\n':多通道数据块连续采样命令,Binary格式逐块返回多通道采样数据,ch<=2, Fs<(2000/ch), Len<(640/ch)
'ada,ch,Fs,Len\n':多通道单次数据块采样命令,Ascii格式返回多通道采样数据,ch<=2, Fs<(2000/ch), Len<4096
'stop\n':停止AD采样命令,返回''drvi\n'或'stop\n'
'adw,ch,value\n':DAC写命令
'adr,ch\n':ADC读命令
'pinm,ch,mode\n':IO口模式设定
'iow,ch,value\n':IO口写命令
'ior,ch\n':IO口读命令
注意采样频率不要用满,否则下位机过忙,后续命令很难收到;数据缓冲区不能设置超限。Arduino UNO卡单通道最大采样频率约2KHz,采样缓冲区640点;DUE卡单通道最大采样频率约20KHz,采样缓冲区16384点;R4卡单通道最大采样频率约8KHz,采样缓冲区3600点.
Binary格式下,下位机采样数据不做转换,直接传输,下位机任务轻一些,许用的采样频率Fs也比Ascii格式略高一些,但上位机Python程序需要用struct来对收到的二进制数据进行解析,可读性差点。另外,该模式似乎代码有点小问题。
将drvidriverUNO.ino编译、上传到Arduino UNO卡中后就可以进行快速验证,方法是在Arduino编辑器的"工具"菜单中打开"串口监视器",然后输入上述命令。注意,命令中的"\n"代表末尾加换行符。
drviSerialArduino是针对Arduino AD卡编写的Python类库,引用方式为:
import drvi.drviSerial as comDriver
其初始化命令为:
arduino=comDriver.DRArduino(100,4096) #上位机采样数据接收缓冲区刷新频率(ms),上位机各通道缓存数组长度
调用方法包括:
openCOM(mCOM,mBaud) # Arduino链接的COM口号,波特率(默认最大值250000)
closeCOM() #关闭串口
ADCMD(mOrder) #发送AD采样命令,如'adc,2,200\n'=2通道,200Hz连续采样,Ascii格式上传数据
ADStop(mOrder) #停止AD采样,mOrder='stop\n'
addCallBack(fun) #直连绑定采样数据回调函数
注意采样数据接收函数的定义为:def dataRedy(ch1,ch2,ch3,ch4,ch5,ch6,ch7,ch8): ,传入参数ch1,ch2,...,ch8为接收到的滚动推进的各通道采样数组。
为便于Arduino AD卡的应用,在下载的drvidriverUNO.zip文件中附带了一个Python样例程序:
testArduino.py
运行即可。代码不长,很容易看懂。完整应用可参考演示实验:302_ArduinUNO_AD卡信号采集演示程序.py