Arduino:修订间差异
无编辑摘要 |
无编辑摘要 |
||
第151行: | 第151行: | ||
}} | }} | ||
== | ==通信== | ||
如果使用同一电源,不用连接地线。 | |||
{| class="wikitable" | |||
=== | ! 名称 | ||
以下示例,Arduino和语言识别模块[[ASRPRO]]通过串口通信,对ASRPRO说开,当ASRPRO识别到开,发送字符串'o'到Arduino,Arduino接收到'o',打开板载灯。 | ! 线数 | ||
! 通信模式 | |||
! 拓扑结构 | |||
! 描述 | |||
|- | |||
| 串口通信<br />UART | |||
| 2 (TX, RX) | |||
| 异步 | |||
| 点对点 | |||
| 适用于简单的点对点通信。 | |||
|- | |||
| I2C通信 | |||
| 2 (SDA, SCL) | |||
| 同步 | |||
| 多主多从 | |||
| 适用于需要多个设备通信的嵌入式系统,节省引脚资源但速度中等。 | |||
|- | |||
| SPI通信 | |||
| 4(MOSI, MISO, SCK, SS/CS) | |||
| 同步 | |||
| 主从 | |||
| 高速数据传输,速度快但需要更多引脚。 | |||
|} | |||
===串口通信=== | |||
[[串口]]主要用于按位进行传输数据。arduino uno只有一组硬件串口,但可以使用多个软串口。 以下示例,Arduino和语言识别模块[[ASRPRO]]通过串口通信,对ASRPRO说开,当ASRPRO识别到开,发送字符串'o'到Arduino,Arduino接收到'o',打开板载灯。 | |||
ASRPRO可以使用3组。使用板载默认组为PB_5(TX),PB_6(RX)。另外两组可以指定端口。 | ASRPRO可以使用3组。使用板载默认组为PB_5(TX),PB_6(RX)。另外两组可以指定端口。 | ||
第187行: | 第211行: | ||
} | } | ||
</syntaxhighlight> | |||
===I2C通信=== | |||
arduino和[[树莓派]]通过I2C通信示例。 | |||
* '''1. 硬件连接''' | |||
Arduino 的 SDA 引脚连接到树莓派的SDA(Pin3)。 <br /> | |||
Arduino 的 SCL 引脚连接到树莓派的SCL(Pin5)。<br /> | |||
Arduino和树莓派的地线 (GND) 必须连接。<br /> | |||
* '''2. 开启树莓派 I2C 接口''' | |||
图形界面,在开始菜单》首选项》Raspberry Pi Configuration》Interfaces中开启I2C接口,然后重启。也可以使用命令启动 : | |||
<syntaxhighlight lang="bash" > | |||
sudo raspi-config | |||
# 选择 Interfacing Options -> I2C -> Enable | |||
sudo reboot | |||
</syntaxhighlight> | |||
* '''3. Arduino 代码''' | |||
确保 Arduino 上的代码正确配置为 I2C 从机,并且地址正确。例如,使用地址 0x08: | |||
<syntaxhighlight lang="cpp" > | |||
#include <Wire.h> | |||
void setup() { | |||
Wire.begin(0x08); // 初始化 I2C 从机,地址为 0x08 | |||
Wire.onReceive(receiveEvent); // 注册接收事件 | |||
Wire.onRequest(requestEvent); // 注册请求事件 | |||
Serial.begin(9600); | |||
} | |||
void loop() { | |||
delay(100000); //延迟100秒,不影响I2C通信 | |||
} | |||
void receiveEvent(int howMany) { | |||
while (Wire.available()) { | |||
char c = Wire.read(); | |||
Serial.print(c); | |||
} | |||
Serial.println(); | |||
} | |||
void requestEvent() { | |||
Wire.write("Hello from Arduino!"); | |||
} | |||
</syntaxhighlight> | |||
* '''4. 查看是否连接''' | |||
在树莓派上,使用<code>sudo i2cdetect -y 1</code>查看是否连接,如上面设置的08地址: | |||
<syntaxhighlight lang="text" > | |||
0 1 2 3 4 5 6 7 8 9 a b c d e f | |||
00: 08 -- -- -- -- -- -- -- | |||
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- | |||
70: -- -- -- -- -- -- -- -- | |||
</syntaxhighlight> | |||
如果命令不能使用,是没有安装好i2c-tools: | |||
<syntaxhighlight lang="bash" > | |||
sudo apt-get update | |||
sudo apt-get upgrade | |||
sudo apt-get install -y i2c-tools | |||
</syntaxhighlight> | |||
* '''5. 测试简单的 Python 脚本''' | |||
<syntaxhighlight lang="python" > | |||
import smbus | |||
import time | |||
# 初始化I2C总线 | |||
bus = smbus.SMBus(1) | |||
address = 0x08 | |||
while True: | |||
# 从Arduino请求数据 | |||
data = bus.read_i2c_block_data(address, 0, 16) | |||
print(f"Received from Arduino: {''.join(chr(i) for i in data if i != 0)}") | |||
# 向Arduino发送数据 | |||
bus.write_i2c_block_data(address, 0, list(b"Hello from Pi")) | |||
time.sleep(1) | |||
</syntaxhighlight> | </syntaxhighlight> | ||
2024年8月3日 (六) 14:48的最新版本
Arduino是一款开源的硬件和软件电子平台,适用于制作交互式项目。
简介
时间轴
相似
快速入门
- 1.买一块Arduino版,如Arduino UNO R3。
- 2.下载Arduino IDE,https://www.arduino.cc/en/software
- 3.打开Arduino IDE,写一个闪灯程序。
/*
setup函数块,启动时执行一次,
loop函数块,启动后一直循环执行。
*/
void setup() {
pinMode(13,OUTPUT);
}
void loop() {
digitalWrite(13, 1);//点亮LED
delay(1000);
digitalWrite(13, 0);//关闭LED
delay(1000);
}
- 4.将Arduino连接到电脑,板子选择Arduino UNO,选择连接的接口,点击upload(→图标),将程序上传到板子。
硬件
Arduino 已经发布了 100 多种硬件产品:板、扩展板、载体、套件和其他配件。Arduino硬件主要包括Nano系列,MKR系列,Classic系列和Mega系列。
了解更多 >> Arduino 官网:硬件
Classic系列
Classic系列是Arduino项目的支柱,包括最受欢迎的Arduino UNO,以及Leonardo&Micro等其他经典产品。
名称 | 微控制器 | 描述 |
---|---|---|
Arduino UNO R4 Minima | ||
Arduino UNO R4 WiFi | ||
Arduino UNO R3 | ATmega328P | |
Arduino Leonardo | ||
Arduino UNO Mini Limited Edition | ||
Arduino Micro | ||
Arduino Zero | ||
Arduino UNO WiFi Rev2 |
了解更多 >> Arduino 官网:硬件
Nano系列
Nano 系列是主要特点是小。
名称 | 微控制器 | 描述 |
---|---|---|
Arduino Nano 33 IoT | ||
Arduino Nano RP2040 Connect | ||
Arduino Nano ESP32 | ESP32 | |
Arduino Nano 33 BLE Sense | ||
nano ble | ||
nano every | ||
nano | ||
nano motor carrier | ||
Arduino Nano 33 BLE | ||
Arduino Nano Every | ||
Arduino Nano | ||
Arduino Nano Motor Carrier |
了解更多 >> Arduino 官网:硬件
MKR系列
了解更多 >> Arduino 官网:硬件
Mega系列
了解更多 >> Arduino 官网:硬件
停产产品
了解更多 >> Arduino 官网:硬件
通信
如果使用同一电源,不用连接地线。
名称 | 线数 | 通信模式 | 拓扑结构 | 描述 |
---|---|---|---|---|
串口通信 UART |
2 (TX, RX) | 异步 | 点对点 | 适用于简单的点对点通信。 |
I2C通信 | 2 (SDA, SCL) | 同步 | 多主多从 | 适用于需要多个设备通信的嵌入式系统,节省引脚资源但速度中等。 |
SPI通信 | 4(MOSI, MISO, SCK, SS/CS) | 同步 | 主从 | 高速数据传输,速度快但需要更多引脚。 |
串口通信
串口主要用于按位进行传输数据。arduino uno只有一组硬件串口,但可以使用多个软串口。 以下示例,Arduino和语言识别模块ASRPRO通过串口通信,对ASRPRO说开,当ASRPRO识别到开,发送字符串'o'到Arduino,Arduino接收到'o',打开板载灯。
ASRPRO可以使用3组。使用板载默认组为PB_5(TX),PB_6(RX)。另外两组可以指定端口。
// 上电初始化
// 系统应用初始化
// 设置Serial波特率9600,TX口为PB_5,RX口为PB_6
// ASR_CODE
//
Arduino的默认串口端口为位于 0(RX)和 1(TX)的两个引脚。 将ASRPRO的PB_5(发送端口)连接到Arduino的0(接收端口),另一个也相应连接,地线连接在一起。
int data_read = 0; // 定义变量用于接收串口数据
void setup()
{
Serial.begin(9600); // 启动串口,设置波特率为 9600 bps
}
void loop()
{
data_read = Serial.read();
if (data_read == 'o'){
// 开灯
}
}
I2C通信
arduino和树莓派通过I2C通信示例。
- 1. 硬件连接
Arduino 的 SDA 引脚连接到树莓派的SDA(Pin3)。
Arduino 的 SCL 引脚连接到树莓派的SCL(Pin5)。
Arduino和树莓派的地线 (GND) 必须连接。
- 2. 开启树莓派 I2C 接口
图形界面,在开始菜单》首选项》Raspberry Pi Configuration》Interfaces中开启I2C接口,然后重启。也可以使用命令启动 :
sudo raspi-config
# 选择 Interfacing Options -> I2C -> Enable
sudo reboot
- 3. Arduino 代码
确保 Arduino 上的代码正确配置为 I2C 从机,并且地址正确。例如,使用地址 0x08:
#include <Wire.h>
void setup() {
Wire.begin(0x08); // 初始化 I2C 从机,地址为 0x08
Wire.onReceive(receiveEvent); // 注册接收事件
Wire.onRequest(requestEvent); // 注册请求事件
Serial.begin(9600);
}
void loop() {
delay(100000); //延迟100秒,不影响I2C通信
}
void receiveEvent(int howMany) {
while (Wire.available()) {
char c = Wire.read();
Serial.print(c);
}
Serial.println();
}
void requestEvent() {
Wire.write("Hello from Arduino!");
}
- 4. 查看是否连接
在树莓派上,使用sudo i2cdetect -y 1
查看是否连接,如上面设置的08地址:
0 1 2 3 4 5 6 7 8 9 a b c d e f
00: 08 -- -- -- -- -- -- --
10: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
20: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
30: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
40: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
50: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
60: -- -- -- -- -- -- -- -- -- -- -- -- -- -- -- --
70: -- -- -- -- -- -- -- --
如果命令不能使用,是没有安装好i2c-tools:
sudo apt-get update
sudo apt-get upgrade
sudo apt-get install -y i2c-tools
- 5. 测试简单的 Python 脚本
import smbus
import time
# 初始化I2C总线
bus = smbus.SMBus(1)
address = 0x08
while True:
# 从Arduino请求数据
data = bus.read_i2c_block_data(address, 0, 16)
print(f"Received from Arduino: {''.join(chr(i) for i in data if i != 0)}")
# 向Arduino发送数据
bus.write_i2c_block_data(address, 0, list(b"Hello from Pi"))
time.sleep(1)
资源
官网
- Arduino 官网:https://www.arduino.cc
- Arduino 文档:https://docs.arduino.cc
- Arduino 源代码:https://github.com/arduino