1、将程序上传到板子时Arduino IDE提示“avrdude: stk500_getsync(): not in sync: resp=0x00”
网上查遇到这个问题的人比较多,有说驱动问题的,有说IDE设置问题的。具体到我遇到的这个情况,原因是板子上插了RF24无线传输模块(也许线还没有插对),拔掉以后再上传程序就正常了。
2、nRF24L01+无线透传使用问题
Arduino官网上似乎推荐Mirf这个库,遇到一个问题,接收端运行几分钟后停止响应;试了另外一个RF24库,遇到传输不稳定的问题,一时没有解决,还是回到Mirf了,之前的停止响应问题没有再出现。
这个论坛关于无线透传的讨论不少,虽然用arduino的不多。
Mirf的地址问题:Mirf的address是有长度要求的,例如可以用“serv1”、“clie1”作为地址,长度过短会导致无法传输,例如用“cl2”作为地址。试了好多次才发现这个问题。
nRF24L01模块(使用Mirf库时)的自动应答问题:项目里使用一个nRF24L01(服务端)接收多个nRF24L01(客户端)的消息,发现客户端之间互相收到本应发到服务端的消息,经过多次试验,发现应该与nRF24L01的自动应答机制有关。在Mirf.cpp的setTADDR方法里可以看到,目标地址被同时写到RX_ADDR_P0和TX_ADDR这两个寄存器里,前者是接收自动应答使用的(一个nRF24L01可以有6个接收地址同时工作),导致peer发到服务端的消息也被当作自动应答了。为避免这种干扰,我实验下来的方法是:每个客户端在发送数据之前先setTADDR到一个无效且唯一的地址,在send之前那一刻再使用setTADDR将地址设置到服务端的地址,发送完成后马上setTADDR到那个无效地址。
3、Arduino与Android通过usb通讯
利用usb-serial-for-android这个开源项目。注意,两侧的baudrate要设置一致;android端读取到的数据可能是不完整数据,需要多读几次以便补齐。
“The nature of hardware device interfaces like these is that there is typically no guarantee your data will arrive in a single read(). If you expect 16 bytes of data, you need to read(), successively, until you have received all 16. If you want to read until there is a newline, you will need to scan all characters until you find a newline -- and then save anything received after it for later.” 来源链接
4、关于arduino设备的唯一ID
最后决定使用的方案是:写一个专门的小程序(量产程序),对每个arduino运行一次,在EEPROM里写入唯一的id号。正式程序运行时只需读取,不做修改。代码参考
注意:EEPROM的擦写次数是有限制的,一般标称为10万次,但有人声称实验结果只有100次左右。还好,这个比较靠谱的实验测试结果是超过100万次,总之写入EEPROM时慎重。
5、温湿度传感器DHT11
3.3v/5v通用,接数字信号口,使用DHT11这个库获得数据。DHT11精度不高,若要求高可使用DHT22(也叫AM2302)。
6、同一段代码在两块板子上运行效果不同
两块板子都是uno+sensor shield+nrf24l01,其中一块运行完全正常,另一块无法接收到消息(可以发送消息)。交换sensor shield(连同上面的nrf)无效,交换usb线无效,接外接12v电源无效。最后发现如果在代码的loop()里加delay(100)则基本能接收到消息,但还有部分丢包。两块板子是从不同卖家处购买的,看来还是有区别啊。
7、Arduino nano v3.0接nrf24l01模块不工作问题
nano直接连nrf24l01模块无法收发数据;但用nano先接传感器扩展板(sensor shield,像这种),再把nrf24l01接到扩展板上,则工作正常。仔细检查过连线没有问题,且分别替换过nano和nrf模块usb线等,都没有效果。最后发现nano板子上的3.3v针脚电压不对,几乎是零,联系卖家检查后说是nano上少一根线,要把usb口背后的两个电容(C1和C7)靠近芯片的引脚短接,照此方法问题解决。而扩展板上的3.3v针脚是用asm1117-3.3从5v降压得来,所以没有这个问题。
nano的官方文档说只有用usb供电时3.3v针脚才有电压,但经实验,我手上的这一版(电容短接后)不论用usb供电还是通过vin供电,3.3v针脚都有3.3v电压。
8、无法上传程序到arduino pro mini
使用ft232rl连接arduino pro mini,上传程序时提示:
stk500_getsync(): not in sync: resp=0x00上传时按reset按钮不起作用,DTR线也已经连接。经过反复实验,发现两个问题导致这个现象:1)arduino上的RX应该接ft232rl的TX,TX接RX,我一开始接反了;2)一开始用的FTDI的驱动是最新的2.0.8.30,在这个帖子的提示下,降级到2.0.8.24后问题解决。PS.最好搜索并下载CDM20824_Setup.exe文件以便强制降级。
又测试了一下DTR线的作用,如果连接了DTR线,直接上传程序就可以成功;如果不连接DTR线,在提示Uploading时立刻按一下arduino的reset按钮,也可以上传成功,不按按钮则上传失败。
Update 2014/2/19: 不知道什么原因,ft232rl又无法上传程序到arduino pro mini了。这个帖子里有人提到在DTR线上加一个100nF的电容是关键的一步,但我手边没有这个电容,而且即使我不连接DTR线采用手动reset的方式仍然不行。后来使用PL2303模块的下载线(只有四个脚,与ft232rl相比少了DTR脚)配合手动reset方式可以正常上传程序到arduino。
9、Arduino的数据类型
Arduino的长整型是32位的,而Java里是64位,互传数据时别搞错了。关于arduino里的数据类型