和STM32比起来,Arduino相对好学多了,直接使用库函数就行了,不用涉及到寄存器底层配置和开发;和STM32库函数方式比起来,它应该也会好学很多(我现在也是刚开始)。我学习Arduino的主要原因就是自己买了个机械臂,控制板子是某宝买的基于arduino mega328的舵机控制板,想让臂和ros系统进行通讯,以便进行后续的扩展学习。下面记录一下自己学习arduino的过程。
Arduino程序结构
居然没有main函数,厉害厉害!
这就是我的第一感受。
其实并不是Arduino没有main函数,而是main函数的定义隐藏在了Arduino的核心库文件中。Arduino开发一般不直接操作main函数,而是使用Setup和loop这个两个函数。基本结构如下:
void setup()
{
// 在这里加入你的setup代码,它只会运行一次:
}
void loop()
{
// 在这里加入你的loop代码,它会不断重复运行:
}
setup()
:
Arduino控制器通电或复位后,即会开始执行setup() 函数中的程序,该部分只会执行一次。通常我们会在setup() 函数中完成Arduino的初始化设置,如配置I/O口状态,初始化串口等操作。
loop()
:
在setup() 函数中的程序执行完后,Arduino会接着执行loop() 函数中的程序。而loop()函数是一个死循环,其中的程序会不断的重复运行。通常我们会在loop() 函数中完成程序的主要功能,如驱动各种模块,采集数据等。
数字I/O的使用
数字信号是以0、1表示的电平不连续变化的信号,也就是以二进制的形式表示的信号。 在Arduino中数字信号通过高低电平来表示,高电平则为数字信号1,低电平则为数字信号0 。
Arduino上每一个带有数字编号的引脚,都是数字引脚,包括写有“A”编号的模拟输入引脚。使用这些引脚,可以完成输入输出数字信号的功能。在使用输入或输出功能前,你需要先通过pinMode()
函数配置引脚的模式为输入模式或输出模式。
pinMode(pin, mode)
其中,参数pin为指定配置的引脚编号;参数mode为指定的配置模式。
mode有三种模式供选择:
INPUT 输入模式
OUTPUT 输出模式
INPUT_PULLUP 输入上拉模式
三种模式的具体含义见DigitalPins
例子:
int ledPin = 13; // LED connected to digital pin 13
void setup()
{
pinMode(ledPin, OUTPUT); // 把13号引脚配置为输出模式
}
void loop()
{
digitalWrite(ledPin, HIGH); // 让13号引脚输出高电平
delay(1000); // waits for a second
digitalWrite(ledPin, LOW); // 让13号引脚输出低电平
delay(1000); // waits for a second
}
数字引脚除了用于输出信号外,还可以用digitalRead() 函数读取外部输入的数字信号,其调用形式为:val = digitalRead(inPin);
其中,参数inPin为指定读取状态的引脚编号;返回值value为获取到的信号状态,1为高电平,0为低电平。
例子如下:
int ledPin = 13; // LED connected to digital pin 13
int inPin = 7; // pushbutton connected to digital pin 7
int val = 0; // variable to store the read value
void setup()
{
pinMode(ledPin, OUTPUT); // sets the digital pin 13 as output
pinMode(inPin, INPUT); // sets the digital pin 7 as input
}
void loop()
{
val = digitalRead(inPin); // read the input pin
digitalWrite(ledPin, val); // sets the LED to the button's value
}
模拟I/O的使用
模拟信号就是指声音、温度等信号,是用连续变化的物理量表示的信息,信息随时间连续变化。模拟输入功能需要使用analogRead()
函数。其调用形式为:value = analogRead(pin);
例子(电压检测及报警):
#define BEEP_PIN 12
#define VOLTAGE_THRESHOLD 7 //电压阈值,测量值低于实际值0.3V------二极管压降导致
/*========================================低压报警功能=======================================
函数名:handleVoltage()
功能介绍:检测控制器输入电源是否小于8,小于则报警
函数参数:无
返回值: 无
===============================================================================================*/
void handleVoltage() {
if((analogRead(A7)/(1024.0)*5*4+0.3) < VOLTAGE_THRESHOLD){
digitalWrite(BEEP_PIN, LOW);
delay(500);
digitalWrite(BEEP_PIN, HIGH);
delay(500);
Serial.println((analogRead(A7)/(1024.0)*5*4+0.3));//打印实际电压值,计算方法:采集值/总量程*参考电压值*四分之一分压值+压降
}
}
void setup() {
//put your setup code here, to run once:
pinMode(BEEP_PIN,OUTPUT);
digitalWrite(BEEP_PIN, HIGH);//默认状态下蜂鸣器高电平不响
Serial.begin(115200);//串口初始化
}
void loop() {
//put your main code here, to run repeatedly:
handleVoltage();
}
串口的使用
概念啥的就不用解释了,stm32中很详细了,而且和stm32中的串口相比,Arduino串口初始化太简单,不需要另外写初始化函数、串口中断服务子函数等。Arduino串口常用函数如下:
Serial.begin(speed);//串口初始化函数
其中,参数speed是指串口通信波特率,这是设定串口通信速率的参数。
Serial.print(val);//串口输出
其中,参数val是你要输出的数据,各种类型的数据均可。
Serial.println(val);//串口输出
该语句也是串口输出函数,同的是println() 函数会在输出完指定数据后,再输出一组回车换行符。
Serial.read();//串口输入函数
如果单独使用该函数,串口打印会有乱码出现,这是因为串口缓冲区中没有可读数据。当缓冲区中没有可读数据时,read()函数会返回int型值-1,而int型-1对应的char型数据便是乱码。在使用串口时,Arduino Uno会在SRAM中开辟一段大小为256 bytes的空间,串口接收到的数据都会被暂时存放进这个空间中,这个存储空间,我们称之为缓冲区。当你调用Serial.read()语句时,Arduino便会从缓冲区取出一个字节的数据。
因此,需要搭配Serial.available();
,该函数返回值为当前缓冲区中接收到的数据字节数。
例子如下:
void setup() {
// 初始化串口
Serial.begin(115200);
}
void loop() {
// 如果缓冲区中有数据,则读取并输出
if(Serial.available()>0)
{
char ch=Serial.read();
Serial.print(ch);
}
}