使用Atmega 16/16A的Arduino复制板串口通信
使用Atmega 16/16A的Arduino复制板串口通信
前面我们用Atmega16/16A的“裸片”在Arduino IDE下创建了Arduino开发板的复制板。从Atmega16/16A与Arduino的管脚对应关系上看,我们将拥有31个数字引脚和7个模拟引脚,3路PWM信号引脚,这些都是传统Arduino UNO所不及的——不过我们只是关心它比Arduino板省空间。
但是Atmega16/16A毕竟是复制板,它不支持Arduino常规的串口通信。我们使用的 MightyCore板卡库似乎没有定义Serial库,这在官方说明里介绍过了,所以我们把目光转向了SoftwareSerial库,即虚拟软串口。
结果断断续续调试了一天,最终得到了正确的方案。要点如下:
使用Arduino UNO R3作为烧录器。烧入ArduinoISP,编程器:Arduino As ISP:
接线:
Arduino UNO | Atmega16 |
---|---|
5V | 10(VCC) |
GND | 11(GND) |
10 | 9(RESET) |
11 | 6(MOSI) |
12 | 7(MISO) |
13 | 8(SCK) |
设置Atmega16/16A板。Internal 8MHz、Standard Pinout,使用Upload with Programmer。
代码:
#include <SoftwareSerial.h>
SoftwareSerial mySerial(10, 11); // RX, TX
int pin=14;//注意这句
void setup() {
mySerial.begin(115200);
pinMode(pin, OUTPUT);
}
void loop() {
digitalWrite(pin, HIGH);
mySerial.print("Milliseconds\n");
delay(500);
digitalWrite(pin, LOW);
delay(500);
}
接USB To TTL烧录器。这3条线必须必须必须全要连接,这个是关键。
Atmega16/16A | USB To TTL |
---|---|
16(D10) | TX |
17(D11) | RX |
11(GND) | GND |
使用SSCom调试,正常。估计匹配其他波特率、给Atmega使用外部晶振完全没有问题。
下面说明一下哪些做法是不成功的,避坑之法:
低于9600的软串口波特率设置,基本都是乱码,怎么改动也不行。 虽为软串口,但如果连接Atmega16/16A上的16、17脚到Arduino的D0、D1脚,能够接收到数据,但均为乱码,上图即是。 必须使用另一个USB To TTL连接Atmega16/16A的16、17脚,且同时连接双方的GND,否则接收仍为乱码。 Atmega16/16A的软串口与USB To TTL连接时,用Arduino作为编程器给Atmega16/16A编程,所有连接都不用改动,不必担心串口被占用的问题,也算是提供了一个方便。
至此,使用Atmega系列芯片完全替代Arduino基本实现,在未来的作品上把这些芯片直接焊在万能板上,大概也不必再心疼了。
赞 (0)