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

  1. 安装: 解压后移动到/opt目录下, 然后sudo ./install.sh 会自动创建应用程序图表
  2. 运行Arduino IDE. 在Tools / Board 下选择 Arduino/Genuino UNO, 在Port下选择端口. IDE右下角看到“Arduino XXXX on /dev/XXXX”, 分别指示了当前指定的设备类型和连接的端口. 类型和端口不能选错, 否则无法写入设备.
  3. 写入测试代码
void setup() {
  Serial.begin(9600);

}

void loop() {
  Serial.println("Hello World");
  delay(1000);
}
  1. 点击左上角的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 当前用户名
  1. 打开 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;
}

posted on 2018-02-08 16:49  Milton  阅读(817)  评论(0编辑  收藏  举报

导航