Ubuntu16.04 Arduino开发
Arduino开发语言介绍
数据类型
TYPE | BYTE | RANGE |
---|---|---|
boolean | 1 | false / true |
char | 1 | -128 - 127 |
byte | 1 | 0 - 255 |
int | 2 | -32768 - 32768 |
unsigned int | 2 | 0 - 65535 |
long | 4 | |
unsigned long | 4 | |
float | 4 | |
double | ||
string | ||
array | ||
void |
常量
- HIGH | LOW
表示数字IO口的高低电平。HIGH 表示高电1,LOW 表示低电平0 - INPUT | OUTPUT
表示数字IO口的方向, INPUT 表示输入(高阻态), OUTPUT 表示输出, AVR单片机能提供5V电压40mA电流 - true | false
true 表示真1, false表示假0
程序结构
// 声明变量及接口名称例如: int i;int ledPin=13;
// 函数在程序开始时使用,初始化变量,管脚模式,调用库函数等(例如:pinMode(ledPin,OUTUPT);)
void setup() {
//...
}
// 在void setup()函数之后,即初始化之后,loop() 让你的程序循环地被执行。使用它来运转Arduino。
void loop() {
//...
}
数字IO操作
数字I/O, pin为0 ~ 13
// 数字IO口输入输出模式定义函数, pin表示为0~13, mode表示INPUT或OUTPUT
pinMode(pin, mode);
// 数字IO口输出电平定义函数, pin表示为0~13, value表示为HIGH或LOW. 必须先定义为输入或输出模式digitalWrite才能生效.
digitalWrite(pin, value) ;
// 数字IO口读输入电平函数, pin表示为0~13, value表示为HIGH或LOW, 比如可以读数字传感器.
int digitalRead(pin);
模拟IO操作
与模拟I/O相关的pin为 AD: 0 ~ 5, PWM pin为 3, 5, 6, 9, 10, 11
// 模拟IO口读函数, Arduino nano 的AD IO pin为0 ~ 7, 可以读模拟传感器, 10位AD, 0~5V表示为0 ~ 1023.
int analogRead(pin);
// 数字IO口PWM输出函数,在引脚的旁边标注~的表示可以用PWM, Arduino Nano的PWM口为3, 5, 6, 9, 10, 11.
// PWM输出的 value 为 0 ~ 255, 可用于电机调速或LED调光
analogWrite(pin, value) - PWM
扩展IO
// SPI外部IO扩展函数,通常使用带SPI接口的74HC595做8个IO扩展,dataPin为数据口,clockPin为时钟口,bitOrder为数据传输方向(MSBFIRST高位在前,LSBFIRST低位在前),value表示所要传送的数据(0~255),另外还需要一个IO口做74HC595的使能控制。
shiftOut(dataPin, clockPin, bitOrder,value);
// 脉冲长度记录函数,返回时间参数(us),pin表示为0~13,value为HIGH或LOW。比如value为HIGH,那么当pin输入为高电平时,开始计时,当pin输入为低电平时,停止计时,然后返回该时间。
unsigned long pulseIn(pin, value);
时间函数
- unsigned long millis()
返回时间函数(单位ms),该函数是指,当程序运行就开始计时并返回记录的参数,该参数溢出大概需要50天时间。 - delay(ms)
延时函数(单位ms)。 - delayMicroseconds(us)
延时函数(单位us)。
数学函数
- min(x, y) 求最小值
- max(x, y) 求最大值
- abs(x) 计算绝对值
- constrain(x, a, b) 约束函数,下限a,上限b,x必须在ab之间才能返回
- map(value, fromLow, fromHigh, toLow,toHigh) 约束函数,value必须在fromLow与toLow之间和fromHigh与toHigh之间
- pow(base, exponent);开方函数,base的exponent次方
- sq(x) 平方
- sqrt(x) 开根号
- 三角函数
- sin(rad)
- cos(rad)
- tan(rad)
随机数函数
- randomSeed(seed);随机数端口定义函数,seed表示读模拟口analogRead(pin)函数 。
- long random(max);随机数函数,返回数据大于等于0,小于max。
- long random(min, max);随机数函数,返回数据大于等于min,小于max。
外部中断函数
- attachInterrupt(interrupt, ISR, mode)
外部中断只能用到数字IO口2和3, interrupt表示中断口初始0或1, ISR(Interrupt Service Routines) 表示一个函数(中断服务函数), mode:LOW低电平中断, CHANGE有变化就中断, RISING上升沿中断, FALLING 下降沿中断, HIGH 高电平中断- 在中断服务函数里面delay() 不能正常工作的
- millis()返回值不会增加
- 串口接收的数据可能会丢失
- 如果在中断函数中要修改全局变量, 需要把全局变量声明为volatile
- detachInterrupt(interrupt)
中断开关, interrupt=1 开, interrupt=0 关 - interrupts()
中断使能函数, 用于使能中断 - noInterrupts()
中断禁止函数, 禁止中断
串口收发函数
- Serial.begin(speed)
串口定义波特率函数,speed表示波特率, 如9600, 115200 等 - int Serial.available()
判断缓冲器状态 - int Serial.read()
读串口并返回收到参数。 - Serial.flush()
清空缓冲器。 - Serial.print(data)
串口输出数据 - Serial.print(数据,数据的进制)
默认为十进制(DEC) - Serial.println(data)
串口输出数据并带回车符
Ubuntu16.04 Arduino 开发
Arduino UNO
设备连接
直接用USB连接开发板与PC, 在Ubuntu16.04下不需要驱动, 能直接认出ch341设备
$ lsmod
Module Size Used by
ch341 16384 0
usbserial 45056 1 ch341
$ dmesg
...
[16219.440832] usb 2-1.2: new full-speed USB device number 3 using ehci-pci
[16219.550581] usb 2-1.2: New USB device found, idVendor=1a86, idProduct=7523
[16219.550589] usb 2-1.2: New USB device strings: Mfr=0, Product=2, SerialNumber=0
[16219.550603] usb 2-1.2: Product: USB2.0-Serial
[16220.585604] usbcore: registered new interface driver usbserial
[16220.585633] usbcore: registered new interface driver usbserial_generic
[16220.585651] usbserial: USB Serial support registered for generic
[16220.588829] usbcore: registered new interface driver ch341
[16220.588951] usbserial: USB Serial support registered for ch341-uart
[16220.588973] ch341 2-1.2:1.0: ch341-uart converter detected
[16220.590330] usb 2-1.2: ch341-uart converter now attached to ttyUSB0
开发环境
Arduino下载 https://www.arduino.cc/en/Main/Software Linux 64bit版本 https://downloads.arduino.cc/arduino-1.8.5-linux64.tar.xz
- 安装: 解压后移动到/opt目录下, 然后sudo ./install.sh 会自动创建应用程序图表
- 运行Arduino IDE. 在Tools / Board 下选择 Arduino/Genuino UNO, 在Port下选择端口. IDE右下角看到“Arduino XXXX on /dev/XXXX”, 分别指示了当前指定的设备类型和连接的端口. 类型和端口不能选错, 否则无法写入设备.
- 写入测试代码
void setup() {
Serial.begin(9600);
}
void loop() {
Serial.println("Hello World");
delay(1000);
}
- 点击左上角的Verify图标检查, 通过后点击右箭头Upload图标上载到开发板
如果出现 avrdude: ser_open(): can't open device "/dev/ttyUSB0": Permission denied 错误, 则检查一下/dev/ttyUSB0所属的用户组, 将当前用户加入用户组, 执行完后要退出当前登录用户, 再次登录后才有效
$ ll /dev/tty*
crw-rw---- 1 root dialout 4, 73 Feb 8 11:05 /dev/ttyS9
crw-rw---- 1 root dialout 188, 0 Feb 8 16:50 /dev/ttyUSB0
$ sudo usermod -a -G dialout 当前用户名
- 打开 Tools / Serial Monitor 查看从开发板发来的串口消息, 如果上述步骤正常的话, 就能每隔一秒收到一条"Hello World"数据
开发板LED闪灯测试
开发板自带的发光LED在第13脚, 可以通过以下代码让LED以半秒的间隔亮和灭
int ledPin = 13;
int ledMode = HIGH;
void setup() {
Serial.begin(115200);
pinMode(ledPin, OUTPUT);
}
void loop() {
Serial.println("Hello World");
if (ledMode == HIGH) {
ledMode = LOW;
}else {
ledMode = HIGH;
}
digitalWrite(ledPin, ledMode);
delay(500);
}
LED呼吸灯测试
改自自带的样例程序Fade
int led1 = 3;
int led2 = 5;
int led3 = 6;
int led4 = 9;
int led5 = 10;
int led6 = 11;
int brightness = 0;
int fadeAmount = 5; // how many points to fade the LED by
// the setup routine runs once when you press reset:
void setup() {
// declare pin 9 to be an output:
pinMode(led1, OUTPUT);
pinMode(led2, OUTPUT);
pinMode(led3, OUTPUT);
pinMode(led4, OUTPUT);
pinMode(led5, OUTPUT);
pinMode(led6, OUTPUT);
}
void loop() {
analogWrite(led1, brightness);
analogWrite(led2, brightness);
analogWrite(led3, brightness);
analogWrite(led4, brightness);
analogWrite(led5, brightness);
analogWrite(led6, brightness);
// change the brightness for next time through the loop:
brightness = brightness + fadeAmount;
// reverse the direction of the fading at the ends of the fade:
if (brightness <= 0 || brightness >= 255) {
fadeAmount = -fadeAmount;
}
// wait for 30 milliseconds to see the dimming effect
delay(30);
}
外部中断(按钮)测试
Pin 13 = PB5, 是Nano板自带的LED, 用D2和相邻的GND外接一个按钮作为中断源, 每次按下后, LED会切换亮灭的状态
const byte ledPin = 13;
const byte interruptPin = 2;
volatile byte state = LOW;
void setup() {
pinMode(ledPin, OUTPUT);
pinMode(interruptPin, INPUT_PULLUP);
attachInterrupt(digitalPinToInterrupt(interruptPin), blink, LOW);
}
void loop() {
digitalWrite(ledPin, state);
}
void blink() {
state = !state;
}