重要参考:
课程链接:https://www.bilibili.com/video/BV1Ci4y1L7ZZ
讲义链接:Introduction · Autolabor-ROS机器人入门课程《ROS理论与实践》零基础教程
8.2.1 arduino 开发环境搭建
基于Arduino的开发实现,毋庸置疑的必须先要准备Arduino电路板(建议型号:Arduino Mega 2560),除了硬件之外,还需要准备软件环境,安装 Arduino IDE,在 Ubuntu 下,Arduino 开发环境的搭建步骤如下:
- 硬件准备: Arduino电路板连接 ubuntu
- 软件准备: 安装 Arduino IDE
- 编写 Arduino 程序并上传至 Arduino电路板。
1.Arduino 连接 Ubuntu
你需要确保你对这个接口有访问的权限。假设你的Arduino连接的是 /dev/ttyACM0 ,那么就运行下面这个命令:
$ ls -l /dev/ttyACM0
然后你就可以看到类似于下面的输出结果:
crw-rw—- 1 root dialout 166, 0 2013-02-24 08:31 /dev/ttyACM0
我们注意到在上面的结果中,只有root和"dialout"组才有读写权限。因此,你需要成为dialout组的一个成员。
命令如下:
$ sudo usermod -a -G dialout your_user_name
在这个命令中 your_user_name 就是你在Linux下登录的用户名。然后需要重启使之生效。执行完上面的操作之后,你可以运行下面的命令查看一下:
$ groups
然后如果你可以在列出的组中找到dialout,这就说明你已经加入到dialout中了。
2.安装 Arduino IDE
1.下载arduino ide安装包
官方下载链接:Software | Arduino
选择对应版本即可
可以选择捐款,或者 JUST DOWNLOAD。
2.使用tar命令对压缩包解压
tar -xvf arduino-1.x.y-linux64.tar.xz
3.将解压后的文件移动到/opt下
sudo mv arduino-1.x.y /opt
4.进入安装目录,对 install.sh 添加可执行权限,并执行安装
cd /opt/arduino-1.x.y
sudo chmod +x install.sh
sudo ./install.sh
5.启动并配置 Arduino IDE
在命令行直接输入:arduino,或者点击左下的显示应用程序搜索 arduino IDE。启动如下:
Arduino IDE 配置如下:
3.Hello World实现
Arduino IDE 中已经内置了一些相关案例,在此,我们通过一个经典的控制 LED 等闪烁案例来演示 Arduino 的使用流程:
1.案例调用
2.编译及上传
先点击左上的编译按钮,可用于语法检测,编译无异常,再点击右侧的上传按钮,上传至 Arduino 电路板
3.运行结果
电路板上的 LED 灯闪烁
4.代码解释
// 初始化函数
void setup() {
//将LED灯引脚(引脚值为13,被封装为了LED_BUTLIN)设置为输出模式
pinMode(LED_BUILTIN, OUTPUT);
}
// 循环执行函数
void loop() {
digitalWrite(LED_BUILTIN, HIGH); // 打开LED灯
delay(1000); // 休眠1000毫秒
digitalWrite(LED_BUILTIN, LOW); // 关闭LED灯
delay(1000); // 休眠1000毫秒
}
setup 与 loop 函数是固定格式。
8.2.2 arduino 基本语法概述
Arduino 的语言系统在设计时参考了C、C++、Java,是一种综合性的简洁语言,语法更类似于C++,但是不支持C++的异常处理,没有STL库,你可以把它当作是精简后的C++。
Arduino 基本语法中,注释、宏定义、库文件包含、变量、函数、流程控制、类、继承、多态..... 都与 C++ 高度类似,在此不再赘述,着重要介绍的是,Arduino中的一些API实现。
1.程序结构
一个 Arduino 程序分为两大部分:setup() 与 loop() 函数。
-
void setup():在这个函数里初始化Arduino的程序,使主循环程序在开始之前设置好相关参数,初始化变量、设置针脚的输出\输入类型、设置波特率...。该函数只会在上电或重启时执行一次。
-
void loop():这是Arduino的主函数。这套程序会一直重复执行,直到电源被断开。
2.常量
在 Arduino 中封装了一些常用常量,比如:
-
HIGH | LOW(引脚电压定义)
-
INPUT|OUTPUT(数字引脚(Digital pins)定义)
-
true | false(逻辑层定义)
3.通信_Serial
Serial用于Arduino控制板和一台计算机或其他设备之间的通信。您可以使用Arduino IDE内置的串口监视器与Arduino板通信。点击工具栏上的串口监视器按钮,调用begin()函数(选择相同的波特率)。
-
Serial.begin() 初始化串口波特率
描述:将串行数据传输速率设置为位/秒(波特)。与计算机进行通信时,可以使用这些波特率:300,1200,2400,4800,9600,14400,19200,28800,38400,57600或115200。当然,您也可以指定其他波特率 - 例如,引脚0和1和一个元件进行通信,它需要一个特定的波特率。
语法:Serial.begin(speed)
参数:speed: 位/秒 (波特) - long
返回:无
-
Serial.print() 从串口打印输出数据
需求:
以人们可读的ASCII文本形式打印数据到串口输出。此命令可以采取多种形式。每个数字的打印输出使用的是ASCII字符。浮点型同样打印输出的是ASCII字符,保留到小数点后两位。Bytes型则打印输出单个字符。字符和字符串原样打印输出。Serial.print()打印输出数据不换行,Serial.println()打印输出数据自动换行处理。
语法:Serial.print(val)
参数
val:打印输出的值 - 任何数据类型
返回:字节 print()将返回写入的字节数,但是否使用(或读出)这个数字是可设定的
-
Serial.println() 打印输出数据自动换行处理。参考 Serial.print();
-
Serial.available()
描述:获取从串口读取有效的字节数(字符)。这是已经传输到,并存储在串行接收缓冲区(能够存储64个字节)的数据。 available()继承了 Stream类。
语法:Serial.available()
参数:无
返回:可读取的字节数
-
Serial.read()
描述:读取传入的串口的数据。read() 继承自 Stream 类。
语法:serial.read()
参数:无
返回:传入的串口数据的第一个字节(或-1,如果没有可用的数据)
4.函数_数字IO
-
pinMode()
描述:将指定的引脚配置成输出或输入。
语法:pinMode(pin, mode)
参数
pin:要设置模式的引脚
mode:INPUT或OUTPUT
返回:无
-
digitalWrite()
描述:给一个数字引脚写入HIGH或者LOW。
语法:digitalWrite(pin, value)
参数
pin: 引脚编号(如1,5,10,A0,A3)
value: HIGH or LOW
返回:无
-
digitalRead()
描述:读取指定引脚的值,HIGH或LOW。
语法:digitalRead(PIN)
参数
pin:你想读取的引脚号(int)
返回:HIGH 或 LOW
注意:如果引脚悬空,digitalRead()会返回HIGH或LOW(随机变化)
5.函数_模拟IO
-
analogWrite() PWM
描述:从一个引脚输出模拟值(PWM)。可用于让LED以不同的亮度点亮或驱动电机以不同的速度旋转。analogWrite()输出结束后,该引脚将产生一个稳定的特殊占空比方波,直到下次调用analogWrite()(或在同一引脚调用digitalRead()或digitalWrite())。PWM信号的频率大约是490赫兹。
在大多数arduino板(ATmega168或ATmega328),只有引脚3,5,6,9,10和11可以实现该功能。在aduino Mega上,引脚2到13可以实现该功能。老的Arduino板(ATmega8)的只有引脚9、10、11可以使用analogWrite()。在使用analogWrite()前,你不需要调用pinMode()来设置引脚为输出引脚。
语法:analogWrite(pin,value)
参数
pin:用于输入数值的引脚。
value:占空比:0(完全关闭)到255(完全打开)之间。
返回:无
6.函数_时间
-
delay()
描述:使程序暂定设定的时间(单位毫秒)。(一秒等于1000毫秒)
语法:delay(ms)
参数
ms:暂停的毫秒数(unsigned long)
返回:无
-
millis()
描述:返回Arduino开发板从运行当前程序开始的毫秒数。这个数字将在约50天后溢出(归零)。
参数:无
返回:返回从运行当前程序开始的毫秒数(无符号长整数)。
7.函数_中断
-
attachInterrupt()
描述:当发生外部中断时,调用一个指定函数。当中断发生时,该函数会取代正在执行的程序。大多数的Arduino板有两个外部中断:0(数字引脚2)和1(数字引脚3)。
arduino Mege还有其它有四个外部中断:数字2(引脚21),3(引脚20),4(引脚19),5(引脚18)。
语法:attachInterrupt(interrupt, function, mode)
interrupt:中断引脚数
function:中断发生时调用的函数,此函数必须不带参数和不返回任何值。该函数有时被称为中断服务程序。
mode:定义何时发生中断以下四个contstants预定有效值:
-
LOW 当引脚为低电平时,触发中断
-
CHANGE 当引脚电平发生改变时,触发中断
-
RISING 当引脚由低电平变为高电平时,触发中断
-
FALLING 当引脚由高电平变为低电平时,触发中断.
返回:无
注意事项:当中断函数发生时,delay()和millis()的数值将不会继续变化。当中断发生时,串口收到的数据可能会丢失。你应该声明一个变量来在未发生中断时储存变量。
-
-
noInterrupts()(禁止中断)
描述:禁止中断(重新使能中断interrupts())。中断允许在后台运行一些重要任务,默认使能中断。禁止中断时部分函数会无法工作,通信中接收到的信息也可能会丢失。
中断会稍影响计时代码,在某些特定的代码中也会失效。
参数:无
返回:无
-
interrupts()(中断)
描述:重新启用中断(使用noInterrupts()命令后将被禁用)。中断允许一些重要任务在后台运行,默认状态是启用的。禁用中断后一些函数可能无法工作,并传入信息可能会被忽略。中断会稍微打乱代码的时间,但是在关键部分可以禁用中断。
参数:无
返回:无
Arduino 的API还有很多,但是受于篇幅限制,当前只是简单介绍了和本教程相关的一些API实现。